diff --git a/aleksis/apps/alsijil/data_checks.py b/aleksis/apps/alsijil/data_checks.py index 98decd9aaa5cfac0ace215146ab9740a19a1927b..be36446beaf9d1bfc2474df29242f47a23d9a1c8 100644 --- a/aleksis/apps/alsijil/data_checks.py +++ b/aleksis/apps/alsijil/data_checks.py @@ -56,11 +56,15 @@ class NoPersonalNotesInCancelledLessonsDataCheck(DataCheck): def check_data(cls): from .models import PersonalNote - personal_notes = PersonalNote.objects.filter( - lesson_period__substitutions__cancelled=True, - lesson_period__substitutions__week=F("week"), - lesson_period__substitutions__year=F("year"), - ).prefetch_related("lesson_period", "lesson_period__substitutions") + personal_notes = ( + PersonalNote.objects.not_empty() + .filter( + lesson_period__substitutions__cancelled=True, + lesson_period__substitutions__week=F("week"), + lesson_period__substitutions__year=F("year"), + ) + .prefetch_related("lesson_period", "lesson_period__substitutions") + ) for note in personal_notes: logging.info(f"Check personal note {note}") @@ -119,9 +123,9 @@ class LessonDocumentationOnHolidaysDataCheck(DataCheck): holidays = Holiday.objects.all() - documentations = LessonDocumentation.objects.filter( - ~Q(topic="") | ~Q(group_note="") | ~Q(homework="") - ).annotate(actual_date=weekday_to_date) + documentations = LessonDocumentation.objects.not_empty().annotate( + actual_date=weekday_to_date + ) q = Q() for holiday in holidays: @@ -155,9 +159,7 @@ class PersonalNoteOnHolidaysDataCheck(DataCheck): holidays = Holiday.objects.all() - personal_notes = PersonalNote.objects.filter( - ~Q(remarks="") | Q(absent=True) | ~Q(late=0) | Q(extra_marks__isnull=False) - ).annotate(actual_date=weekday_to_date) + personal_notes = PersonalNote.objects.not_empty().annotate(actual_date=weekday_to_date) q = Q() for holiday in holidays: diff --git a/aleksis/apps/alsijil/managers.py b/aleksis/apps/alsijil/managers.py index b2589345adac4c2c02159ea54fc872fe9055408a..7350cf375a12205b7ebe56b9d5fd57bd045a2477 100644 --- a/aleksis/apps/alsijil/managers.py +++ b/aleksis/apps/alsijil/managers.py @@ -1,3 +1,6 @@ +from django.db.models import QuerySet +from django.db.models.query_utils import Q + from aleksis.core.managers import CurrentSiteManagerWithoutMigrations @@ -21,3 +24,21 @@ class PersonalNoteManager(CurrentSiteManagerWithoutMigrations): ) .prefetch_related("extra_marks") ) + + +class PersonalNoteQuerySet(QuerySet): + def not_empty(self): + """Get all not empty personal notes.""" + return self.filter( + ~Q(remarks="") | Q(absent=True) | ~Q(late=0) | Q(extra_marks__isnull=False) + ) + + +class LessonDocumentationManager(CurrentSiteManagerWithoutMigrations): + pass + + +class LessonDocumentationQuerySet(QuerySet): + def not_empty(self): + """Get all not empty lesson documentations.""" + return self.filter(~Q(topic="") | ~Q(group_note="") | ~Q(homework="")) diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py index 3102329858671792d55ea193add494b1584a7500..5a41074b78c25e98ea2daecb94bd769ed647d694 100644 --- a/aleksis/apps/alsijil/models.py +++ b/aleksis/apps/alsijil/models.py @@ -12,7 +12,12 @@ from aleksis.apps.alsijil.data_checks import ( NoPersonalNotesInCancelledLessonsDataCheck, PersonalNoteOnHolidaysDataCheck, ) -from aleksis.apps.alsijil.managers import PersonalNoteManager +from aleksis.apps.alsijil.managers import ( + LessonDocumentationManager, + LessonDocumentationQuerySet, + PersonalNoteManager, + PersonalNoteQuerySet, +) from aleksis.apps.chronos.mixins import WeekRelatedMixin from aleksis.apps.chronos.models import LessonPeriod from aleksis.apps.chronos.util.date import get_current_year @@ -60,7 +65,7 @@ class PersonalNote(ExtensibleModel, WeekRelatedMixin): ExcusesWithoutAbsences, ] - objects = PersonalNoteManager() + objects = PersonalNoteManager.from_queryset(PersonalNoteQuerySet)() person = models.ForeignKey("core.Person", models.CASCADE, related_name="personal_notes") groups_of_person = models.ManyToManyField("core.Group", related_name="+") @@ -138,6 +143,8 @@ class LessonDocumentation(ExtensibleModel, WeekRelatedMixin): Non-personal, includes the topic and homework of the lesson. """ + objects = LessonDocumentationManager.from_queryset(LessonDocumentationQuerySet)() + data_checks = [LessonDocumentationOnHolidaysDataCheck] week = models.IntegerField() diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py index d5bbf061469b6e6b146fc715edbfc94ae0c32161..170978aad3e22983357f7bf0facaf9031f421ad4 100644 --- a/aleksis/apps/alsijil/views.py +++ b/aleksis/apps/alsijil/views.py @@ -407,7 +407,7 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse: .prefetch_related( "lesson_period__substitutions", "lesson_period__lesson__teachers", "groups_of_person" ) - .filter(~Q(remarks="") | Q(absent=True) | ~Q(late=0) | Q(extra_marks__isnull=False)) + .not_empty() .filter( Q(lesson_period__lesson__groups=group) | Q(lesson_period__lesson__groups__parent_groups=group) @@ -415,7 +415,7 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse: ) documentations = ( LessonDocumentation.objects.select_related("lesson_period") - .filter(~Q(topic="") | ~Q(group_note="") | ~Q(homework="")) + .not_empty() .filter( Q(lesson_period__lesson__groups=group) | Q(lesson_period__lesson__groups__parent_groups=group) @@ -625,9 +625,7 @@ def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResp unexcused_absences = allowed_personal_notes.filter(absent=True, excused=False) context["unexcused_absences"] = unexcused_absences - personal_notes = allowed_personal_notes.filter( - Q(absent=True) | Q(late__gt=0) | ~Q(remarks="") | Q(extra_marks__isnull=False) - ).order_by( + personal_notes = allowed_personal_notes.not_empty().order_by( "-lesson_period__lesson__validity__date_start", "-week", "lesson_period__period__weekday",