|
11 | 11 |
|
12 | 12 | # pylint: disable-next=imported-auth-user
|
13 | 13 | from django.contrib.auth.models import User as _User
|
14 |
| -from django.contrib.auth.models import UserManager |
| 14 | +from django.contrib.auth.models import UserManager as _UserManager |
15 | 15 | from django.db.models import F
|
16 | 16 | from django.db.models.query import QuerySet
|
17 | 17 | from django.utils.crypto import get_random_string
|
@@ -157,13 +157,28 @@ def anonymize(self):
|
157 | 157 | AnyUser = t.TypeVar("AnyUser", bound=User)
|
158 | 158 |
|
159 | 159 |
|
160 |
| -# pylint: disable-next=missing-class-docstring,too-few-public-methods |
161 |
| -class ContactableUserManager(UserManager[AnyUser], t.Generic[AnyUser]): |
| 160 | +# pylint: disable-next=missing-class-docstring |
| 161 | +class UserManager(_UserManager[AnyUser], t.Generic[AnyUser]): |
| 162 | + def filter_users(self, queryset: QuerySet[User]): |
| 163 | + """Filter the users to the specific type. |
| 164 | +
|
| 165 | + Args: |
| 166 | + queryset: The queryset of users to filter. |
| 167 | +
|
| 168 | + Returns: |
| 169 | + A subset of the queryset of users. |
| 170 | + """ |
| 171 | + return queryset |
| 172 | + |
162 | 173 | # pylint: disable-next=missing-function-docstring
|
163 | 174 | def get_queryset(self):
|
164 |
| - return ( |
165 |
| - super().get_queryset().exclude(email__isnull=True).exclude(email="") |
166 |
| - ) |
| 175 | + return self.filter_users(super().get_queryset()) |
| 176 | + |
| 177 | + |
| 178 | +# pylint: disable-next=missing-class-docstring,too-few-public-methods |
| 179 | +class ContactableUserManager(UserManager[AnyUser], t.Generic[AnyUser]): |
| 180 | + def filter_users(self, queryset: QuerySet[User]): |
| 181 | + return queryset.exclude(email__isnull=True).exclude(email="") |
167 | 182 |
|
168 | 183 |
|
169 | 184 | class ContactableUser(User):
|
@@ -238,15 +253,16 @@ def create_user( # type: ignore[override]
|
238 | 253 |
|
239 | 254 | return user
|
240 | 255 |
|
241 |
| - # pylint: disable-next=missing-function-docstring |
242 |
| - def get_queryset(self): |
| 256 | + def filter_users(self, queryset: QuerySet[User]): |
243 | 257 | return (
|
244 | 258 | super()
|
245 |
| - .get_queryset() |
| 259 | + .filter_users(queryset) |
246 | 260 | .filter(new_teacher__isnull=False, new_student__isnull=True)
|
247 |
| - .prefetch_related("new_teacher") |
248 | 261 | )
|
249 | 262 |
|
| 263 | + def get_queryset(self): |
| 264 | + return super().get_queryset().prefetch_related("new_teacher") |
| 265 | + |
250 | 266 |
|
251 | 267 | class TeacherUser(ContactableUser):
|
252 | 268 | """A user that is a teacher."""
|
@@ -287,9 +303,12 @@ def create_user( # type: ignore[override]
|
287 | 303 | **extra_fields,
|
288 | 304 | )
|
289 | 305 |
|
290 |
| - # pylint: disable-next=missing-function-docstring |
291 |
| - def get_queryset(self): |
292 |
| - return super().get_queryset().filter(new_teacher__school__isnull=False) |
| 306 | + def filter_users(self, queryset: QuerySet[User]): |
| 307 | + return ( |
| 308 | + super() |
| 309 | + .filter_users(queryset) |
| 310 | + .filter(new_teacher__school__isnull=False) |
| 311 | + ) |
293 | 312 |
|
294 | 313 |
|
295 | 314 | # pylint: disable-next=too-many-ancestors
|
@@ -317,9 +336,8 @@ def teacher(self):
|
317 | 336 | class AdminSchoolTeacherUserManager(
|
318 | 337 | SchoolTeacherUserManager["AdminSchoolTeacherUser"]
|
319 | 338 | ):
|
320 |
| - # pylint: disable-next=missing-function-docstring |
321 |
| - def get_queryset(self): |
322 |
| - return super().get_queryset().filter(new_teacher__is_admin=True) |
| 339 | + def filter_users(self, queryset: QuerySet[User]): |
| 340 | + return super().filter_users(queryset).filter(new_teacher__is_admin=True) |
323 | 341 |
|
324 | 342 |
|
325 | 343 | # pylint: disable-next=too-many-ancestors
|
@@ -347,9 +365,10 @@ def teacher(self):
|
347 | 365 | class NonAdminSchoolTeacherUserManager(
|
348 | 366 | SchoolTeacherUserManager["NonAdminSchoolTeacherUser"]
|
349 | 367 | ):
|
350 |
| - # pylint: disable-next=missing-function-docstring |
351 |
| - def get_queryset(self): |
352 |
| - return super().get_queryset().filter(new_teacher__is_admin=False) |
| 368 | + def filter_users(self, queryset: QuerySet[User]): |
| 369 | + return ( |
| 370 | + super().filter_users(queryset).filter(new_teacher__is_admin=False) |
| 371 | + ) |
353 | 372 |
|
354 | 373 |
|
355 | 374 | # pylint: disable-next=too-many-ancestors
|
@@ -377,9 +396,12 @@ def teacher(self):
|
377 | 396 |
|
378 | 397 | # pylint: disable-next=missing-class-docstring,too-few-public-methods
|
379 | 398 | class NonSchoolTeacherUserManager(TeacherUserManager["NonSchoolTeacherUser"]):
|
380 |
| - # pylint: disable-next=missing-function-docstring |
381 |
| - def get_queryset(self): |
382 |
| - return super().get_queryset().filter(new_teacher__school__isnull=True) |
| 399 | + def filter_users(self, queryset: QuerySet[User]): |
| 400 | + return ( |
| 401 | + super() |
| 402 | + .filter_users(queryset) |
| 403 | + .filter(new_teacher__school__isnull=True) |
| 404 | + ) |
383 | 405 |
|
384 | 406 |
|
385 | 407 | # pylint: disable-next=too-many-ancestors
|
@@ -440,20 +462,17 @@ def create_user( # type: ignore[override]
|
440 | 462 |
|
441 | 463 | return user
|
442 | 464 |
|
443 |
| - # pylint: disable-next=missing-function-docstring |
444 |
| - def get_queryset(self): |
445 |
| - return ( |
446 |
| - super() |
447 |
| - .get_queryset() |
448 |
| - .filter( |
449 |
| - new_teacher__isnull=True, |
450 |
| - new_student__isnull=False, |
451 |
| - # TODO: remove in new model |
452 |
| - new_student__class_field__isnull=False, |
453 |
| - ) |
454 |
| - .prefetch_related("new_student") |
| 465 | + def filter_users(self, queryset: QuerySet[User]): |
| 466 | + return queryset.filter( |
| 467 | + new_teacher__isnull=True, |
| 468 | + new_student__isnull=False, |
| 469 | + # TODO: remove in new model |
| 470 | + new_student__class_field__isnull=False, |
455 | 471 | )
|
456 | 472 |
|
| 473 | + def get_queryset(self): |
| 474 | + return super().get_queryset().prefetch_related("new_student") |
| 475 | + |
457 | 476 |
|
458 | 477 | class StudentUser(User):
|
459 | 478 | """A user that is a student."""
|
@@ -509,20 +528,21 @@ def set_password(self, raw_password: t.Optional[str] = None):
|
509 | 528 |
|
510 | 529 | # pylint: disable-next=missing-class-docstring,too-few-public-methods
|
511 | 530 | class IndependentUserManager(ContactableUserManager["IndependentUser"]):
|
512 |
| - # pylint: disable-next=missing-function-docstring |
513 |
| - def get_queryset(self): |
514 |
| - # TODO: student__isnull=True in new model |
| 531 | + def filter_users(self, queryset: QuerySet[User]): |
515 | 532 | return (
|
516 | 533 | super()
|
517 |
| - .get_queryset() |
| 534 | + .filter_users(queryset) |
518 | 535 | .filter(
|
519 | 536 | new_teacher__isnull=True,
|
| 537 | + # TODO: student__isnull=True in new model |
520 | 538 | new_student__isnull=False,
|
521 | 539 | new_student__class_field__isnull=True,
|
522 | 540 | )
|
523 |
| - .prefetch_related("new_student") |
524 | 541 | )
|
525 | 542 |
|
| 543 | + def get_queryset(self): |
| 544 | + return super().get_queryset().prefetch_related("new_student") |
| 545 | + |
526 | 546 | def create_user( # type: ignore[override]
|
527 | 547 | self,
|
528 | 548 | first_name: str,
|
|
0 commit comments