diff --git a/aleksis/apps/alsijil/model_extensions.py b/aleksis/apps/alsijil/model_extensions.py index 7ab840196988b80bffa63c9c4d3a5aa20aedffef..f45e752f120084ecb12aefe83fdcdc5af5431bd0 100644 --- a/aleksis/apps/alsijil/model_extensions.py +++ b/aleksis/apps/alsijil/model_extensions.py @@ -10,7 +10,7 @@ from calendarweek import CalendarWeek from django_global_request.middleware import get_request from reversion import set_user -from aleksis.apps.chronos.models import LessonPeriod +from aleksis.apps.chronos.models import Event, ExtraLesson, LessonPeriod from aleksis.core.models import Group, Person from .models import ExcuseType, ExtraMark, LessonDocumentation, PersonalNote @@ -184,6 +184,19 @@ def get_lesson_documentation( return None +def get_lesson_documentation_simple( + self, week: Optional[CalendarWeek] = None +) -> Union[LessonDocumentation, None]: + """Get lesson documentation object for this event/extra lesson.""" + if self.documentations.exists(): + return self.documentations.all()[0] + return None + + +Event.method(get_lesson_documentation_simple, "get_lesson_documentation") +ExtraLesson.method(get_lesson_documentation_simple, "get_lesson_documentation") + + @LessonPeriod.method def get_or_create_lesson_documentation( self, week: Optional[CalendarWeek] = None @@ -197,6 +210,20 @@ def get_or_create_lesson_documentation( return lesson_documentation +def get_or_create_lesson_documentation_simple( + self, week: Optional[CalendarWeek] = None +) -> LessonDocumentation: + """Get or create lesson documentation object for this event/extra lesson.""" + lesson_documentation, created = LessonDocumentation.objects.get_or_create( + **{"event" if isinstance(self, Event) else "extra_lesson": self} + ) + return lesson_documentation + + +Event.method(get_or_create_lesson_documentation_simple, "get_or_create_lesson_documentation") +ExtraLesson.method(get_or_create_lesson_documentation_simple, "get_or_create_lesson_documentation") + + @LessonPeriod.method def get_absences(self, week: Optional[CalendarWeek] = None) -> Iterator: """Get all personal notes of absent persons for this lesson.""" @@ -209,6 +236,11 @@ def get_absences(self, week: Optional[CalendarWeek] = None) -> Iterator: ) +def get_absences_simple(self, week: Optional[CalendarWeek] = None) -> Iterator: + """Get all personal notes of absent persons for this event/extra lesson.""" + return self.personal_notes.all() + + @LessonPeriod.method def get_excused_absences(self, week: Optional[CalendarWeek] = None) -> QuerySet: """Get all personal notes of excused absent persons for this lesson.""" @@ -217,6 +249,11 @@ def get_excused_absences(self, week: Optional[CalendarWeek] = None) -> QuerySet: return self.personal_notes.filter(week=week.week, year=week.year, absent=True, excused=True) +def get_excused_absences_simple(self, week: Optional[CalendarWeek] = None) -> QuerySet: + """Get all personal notes of excused absent persons for this event/extra lesson.""" + return self.personal_notes.filter(absent=True, excused=True) + + @LessonPeriod.method def get_unexcused_absences(self, week: Optional[CalendarWeek] = None) -> QuerySet: """Get all personal notes of unexcused absent persons for this lesson.""" @@ -225,6 +262,11 @@ def get_unexcused_absences(self, week: Optional[CalendarWeek] = None) -> QuerySe return self.personal_notes.filter(week=week.week, year=week.year, absent=True, excused=False) +def get_unexcused_absences_simple(self, week: Optional[CalendarWeek] = None) -> QuerySet: + """Get all personal notes of unexcused absent persons for this event/extra lesson.""" + return self.personal_notes.filter(absent=True, excused=False) + + @LessonPeriod.method def get_tardinesses(self, week: Optional[CalendarWeek] = None) -> QuerySet: """Get all personal notes of late persons for this lesson.""" @@ -233,6 +275,11 @@ def get_tardinesses(self, week: Optional[CalendarWeek] = None) -> QuerySet: return self.personal_notes.filter(week=week.week, year=week.year, late__gt=0) +def get_tardinesses_simple(self, week: Optional[CalendarWeek] = None) -> QuerySet: + """Get all personal notes of late persons for this event/extra lesson.""" + return self.personal_notes.filter(late__gt=0) + + @LessonPeriod.method def get_extra_marks(self, week: Optional[CalendarWeek] = None) -> Dict[ExtraMark, QuerySet]: """Get all statistics on extra marks for this lesson.""" @@ -248,6 +295,17 @@ def get_extra_marks(self, week: Optional[CalendarWeek] = None) -> Dict[ExtraMark return stats +def get_extra_marks_simple(self, week: Optional[CalendarWeek] = None) -> Dict[ExtraMark, QuerySet]: + """Get all statistics on extra marks for this event/extra lesson.""" + stats = {} + for extra_mark in ExtraMark.objects.all(): + qs = self.personal_notes.filter(extra_marks=extra_mark) + if qs: + stats[extra_mark] = qs + + return stats + + @Group.class_method def get_groups_with_lessons(cls: Group): """Get all groups which have related lessons or child groups with related lessons."""