From fe1dc9cb42908917b981dcf1ba2ba1d08226b5ed Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Sun, 3 May 2020 15:53:00 +0200
Subject: [PATCH] Add docstrings in managers.py

---
 aleksis/apps/chronos/managers.py | 50 +++++++++++++++++++++++++++++++-
 1 file changed, 49 insertions(+), 1 deletion(-)

diff --git a/aleksis/apps/chronos/managers.py b/aleksis/apps/chronos/managers.py
index 1087f8e0..6a082568 100644
--- a/aleksis/apps/chronos/managers.py
+++ b/aleksis/apps/chronos/managers.py
@@ -11,6 +11,8 @@ from django.http import QueryDict
 from aleksis.core.models import Person, Group
 
 class TimetableType(Enum):
+    """Enum for different types of timetables."""
+
     GROUP = "group"
     TEACHER = "teacher"
     ROOM = "room"
@@ -160,6 +162,8 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
         return qs1.union(qs2)
 
     def group_by_periods(self, is_person: bool = False) -> dict:
+        """Group a QuerySet of objects with attribute period by period numbers and weekdays."""
+
         per_period = {}
         for obj in self:
             period = obj.period.period
@@ -179,6 +183,8 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
         return per_period
 
     def filter_from_type(self, type_: TimetableType, pk: int) -> Optional[models.QuerySet]:
+        """Filter lesson data for a group, teacher or room by provided type."""
+
         if type_ == TimetableType.GROUP:
             return self.filter_group(pk)
         elif type_ == TimetableType.TEACHER:
@@ -189,6 +195,8 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
             return None
 
     def filter_from_person(self, person: Person) -> Optional[models.QuerySet]:
+        """Filter lesson data for a person."""
+
         type_ = person.timetable_type
 
         if type_ == TimetableType.TEACHER:
@@ -206,6 +214,8 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
             return None
 
     def daily_lessons_for_person(self, person: Person, wanted_day: date) -> Optional[models.QuerySet]:
+        """Filter lesson data on a day by a person."""
+
         if person.timetable_type is None:
             return None
 
@@ -234,11 +244,15 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
 
 
 class LessonPeriodQuerySet(LessonDataQuerySet):
+    """QuerySet with custom query methods for lesson periods."""
+
     _period_path = ""
     _subst_path = "substitutions__"
 
 
 class LessonSubstitutionQuerySet(LessonDataQuerySet):
+    """QuerySet with custom query methods for substitutions."""
+
     _period_path = "lesson_period__"
     _subst_path = ""
 
@@ -265,6 +279,11 @@ class LessonSubstitutionQuerySet(LessonDataQuerySet):
 
 
 class DateRangeQuerySet(models.QuerySet):
+    """QuerySet with custom query methods for models with date and period ranges.
+
+    Filterable fields: date_start, date_end, period_from, period_to
+    """
+
     def within_dates(self, start: date, end: date):
         """ Filter for all events within a date range. """
 
@@ -292,6 +311,8 @@ class DateRangeQuerySet(models.QuerySet):
 
 
 class AbsenceQuerySet(DateRangeQuerySet):
+    """QuerySet with custom query methods for absences."""
+
     def absent_teachers(self):
         return Person.objects.filter(absences__in=self).annotate(absences_count=Count("absences"))
 
@@ -303,11 +324,16 @@ class AbsenceQuerySet(DateRangeQuerySet):
 
 
 class HolidayQuerySet(DateRangeQuerySet):
+    """QuerySet with custom query methods for holidays."""
     pass
 
 
 class SupervisionQuerySet(models.QuerySet, WeekQuerySetMixin):
+    """QuerySet with custom query methods for supervisions."""
+
     def filter_by_weekday(self, weekday: int):
+        """Filter supervisions by weekday."""
+
         self.filter(
             Q(break_item__before_period__weekday=weekday)
             | Q(break_item__after_period__weekday=weekday)
@@ -330,7 +356,7 @@ class SupervisionQuerySet(models.QuerySet, WeekQuerySetMixin):
 
 
 class TimetableQuerySet(models.QuerySet):
-    """ Common filters
+    """Common query set methods for objects in timetables.
 
      Models need following fields:
      - groups
@@ -371,6 +397,8 @@ class TimetableQuerySet(models.QuerySet):
             return self.filter(room=room)
 
     def filter_from_type(self, type_: TimetableType, pk: int) -> Optional[models.QuerySet]:
+        """Filter data for a group, teacher or room by provided type."""
+
         if type_ == TimetableType.GROUP:
             return self.filter_group(pk)
         elif type_ == TimetableType.TEACHER:
@@ -381,6 +409,8 @@ class TimetableQuerySet(models.QuerySet):
             return None
 
     def filter_from_person(self, person: Person) -> Optional[models.QuerySet]:
+        """Filter data by person."""
+
         type_ = person.timetable_type
 
         if type_ == TimetableType.TEACHER:
@@ -399,6 +429,8 @@ class TimetableQuerySet(models.QuerySet):
 
 
 class EventQuerySet(DateRangeQuerySet, TimetableQuerySet):
+    """QuerySet with custom query methods for events."""
+
     def annotate_day(self, day: date):
         """ Annotate all events in the QuerySet with the provided date. """
 
@@ -406,9 +438,13 @@ class EventQuerySet(DateRangeQuerySet, TimetableQuerySet):
 
 
 class ExtraLessonQuerySet(TimetableQuerySet):
+    """QuerySet with custom query methods for extra lessons."""
+
     _multiple_rooms = False
 
     def within_dates(self, start: date, end: date):
+        """Filter all extra lessons within a specific time range."""
+
         week_start = CalendarWeek.from_date(start)
         week_end = CalendarWeek.from_date(end)
 
@@ -420,10 +456,17 @@ class ExtraLessonQuerySet(TimetableQuerySet):
         )
 
     def on_day(self, day:date):
+        """Filter all extra lessons on a day."""
+
         return self.within_dates(day, day)
 
 
 class GroupPropertiesMixin:
+    """Mixin for common group properties.
+
+    Needed field: `groups`
+    """
+
     @property
     def group_names(self, sep: Optional[str] = ", ") -> str:
         return sep.join([group.short_name for group in self.groups.all()])
@@ -442,6 +485,11 @@ class GroupPropertiesMixin:
 
 
 class TeacherPropertiesMixin:
+    """Mixin for common teacher properties.
+
+    Needed field: `teacher`
+    """
+
     @property
     def teacher_names(self, sep: Optional[str] = ", ") -> str:
         return sep.join([teacher.full_name for teacher in self.teachers.all()])
-- 
GitLab