From 1484f4859594dca456e27bb7fa408b447c3d135d Mon Sep 17 00:00:00 2001 From: Tom Teichler <tom.teichler@teckids.org> Date: Sun, 3 May 2020 20:31:42 +0200 Subject: [PATCH] [Reformat] docstrings --- aleksis/apps/chronos/managers.py | 74 ++++++++++--------- aleksis/apps/chronos/model_extensions.py | 12 +-- aleksis/apps/chronos/models.py | 21 +++--- aleksis/apps/chronos/preferences.py | 8 +- aleksis/apps/chronos/rules.py | 2 +- aleksis/apps/chronos/templatetags/common.py | 3 +- .../apps/chronos/templatetags/week_helpers.py | 6 +- aleksis/apps/chronos/util/build.py | 1 - aleksis/apps/chronos/util/date.py | 4 - aleksis/apps/chronos/util/format.py | 2 + aleksis/apps/chronos/util/js.py | 2 +- aleksis/apps/chronos/util/predicates.py | 2 +- aleksis/apps/chronos/views.py | 6 +- 13 files changed, 75 insertions(+), 68 deletions(-) diff --git a/aleksis/apps/chronos/managers.py b/aleksis/apps/chronos/managers.py index ae8a1162..e6ef49cd 100644 --- a/aleksis/apps/chronos/managers.py +++ b/aleksis/apps/chronos/managers.py @@ -1,10 +1,9 @@ from datetime import date, datetime, timedelta from enum import Enum -from typing import Optional, OrderedDict, Union +from typing import Optional, Union from django.db import models from django.db.models import Count, F, Q -from django.http import QueryDict from calendarweek import CalendarWeek @@ -12,6 +11,8 @@ from aleksis.apps.chronos.util.date import week_weekday_from_date from aleksis.core.models import Group, Person from aleksis.core.util.core_helpers import get_site_preferences +from .models import LessonPeriod + class TimetableType(Enum): """Enum for different types of timetables.""" @@ -26,10 +27,10 @@ class TimetableType(Enum): class LessonPeriodManager(models.Manager): - """ Manager adding specific methods to lesson periods. """ + """Manager adding specific methods to lesson periods.""" def get_queryset(self): - """ Ensures all related lesson data is loaded as well. """ + """Ensure all related lesson data is loaded as well.""" return ( super() @@ -40,10 +41,10 @@ class LessonPeriodManager(models.Manager): class LessonSubstitutionManager(models.Manager): - """ Manager adding specific methods to lesson substitutions. """ + """Manager adding specific methods to lesson substitutions.""" def get_queryset(self): - """ Ensures all related lesson data is loaded as well. """ + """Ensure all related lesson data is loaded as well.""" return ( super() @@ -61,7 +62,7 @@ class LessonSubstitutionManager(models.Manager): class WeekQuerySetMixin: def annotate_week(self, week: Union[CalendarWeek, int]): - """ Annotate all lessons in the QuerySet with the number of the provided calendar week. """ + """Annotate all lessons in the QuerySet with the number of the provided calendar week.""" if isinstance(week, CalendarWeek): week_num = week.week @@ -95,7 +96,7 @@ class GroupByPeriodsMixin: class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin): - """ Overrides default QuerySet to add specific methods for lesson data. """ + """Overrides default QuerySet to add specific methods for lesson data.""" # Overridden in the subclasses. Swaps the paths to the base lesson period # and to any substitutions depending on whether the query is run on a @@ -104,7 +105,7 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin): _subst_path = None def within_dates(self, start: date, end: date): - """ Filter for all lessons within a date range. """ + """Filter for all lessons within a date range.""" return self.filter( **{ @@ -114,7 +115,7 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin): ) def in_week(self, wanted_week: CalendarWeek): - """ Filter for all lessons within a calendar week. """ + """Filter for all lessons within a calendar week.""" return self.within_dates( wanted_week[0] + timedelta(days=1) * (F(self._period_path + "period__weekday") - 1), @@ -122,7 +123,7 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin): ).annotate_week(wanted_week) def on_day(self, day: date): - """ Filter for all lessons on a certain day. """ + """Filter for all lessons on a certain day.""" week, weekday = week_weekday_from_date(day) @@ -133,7 +134,7 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin): ) def at_time(self, when: Optional[datetime] = None): - """ Filter for the lessons taking place at a certain point in time. """ + """Filter for the lessons taking place at a certain point in time.""" now = when or datetime.now() week, weekday = week_weekday_from_date(now.date()) @@ -149,7 +150,7 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin): ).annotate_week(week) def filter_participant(self, person: Union[Person, int]): - """ Filter for all lessons a participant (student) attends. """ + """Filter for all lessons a participant (student) attends.""" return self.filter( Q(**{self._period_path + "lesson__groups__members": person}) @@ -157,7 +158,7 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin): ) def filter_group(self, group: Union[Group, int]): - """ Filter for all lessons a group (class) regularly attends. """ + """Filter for all lessons a group (class) regularly attends.""" if isinstance(group, int): group = Group.objects.get(pk=group) @@ -172,7 +173,7 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin): ) def filter_teacher(self, teacher: Union[Person, int]): - """ Filter for all lessons given by a certain teacher. """ + """Filter for all lessons given by a certain teacher.""" qs1 = self.filter(**{self._period_path + "lesson__teachers": teacher}) qs2 = self.filter( @@ -182,7 +183,7 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin): return qs1.union(qs2) def filter_room(self, room: Union["Room", int]): - """ Filter for all lessons taking part in a certain room. """ + """Filter for all lessons taking part in a certain room.""" qs1 = self.filter(**{self._period_path + "room": room}) qs2 = self.filter( @@ -235,7 +236,7 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin): return lesson_periods def next(self, reference: "LessonPeriod", offset: Optional[int] = 1) -> "LessonPeriod": - """ Get another lesson in an ordered set of lessons. + """Get another lesson in an ordered set of lessons. By default, it returns the next lesson in the set. By passing the offset argument, the n-th next lesson can be selected. By passing a negative number, the n-th @@ -268,20 +269,23 @@ class LessonSubstitutionQuerySet(LessonDataQuerySet): _subst_path = "" def affected_lessons(self): - """ Return all lessons which are affected by selected substitutions """ + """Return all lessons which are affected by selected substitutions.""" from .models import Lesson # noaq return Lesson.objects.filter(lesson_periods__substitutions__in=self) def affected_teachers(self): - """ Return all teachers which are affected by selected substitutions (as substituted or substituting) """ + """Get affected teachers. + + Return all teachers which are affected by + selected substitutions (as substituted or substituting).""" return Person.objects.filter( Q(lessons_as_teacher__in=self.affected_lessons()) | Q(lesson_substitutions__in=self) ).annotate(lessons_count=Count("lessons_as_teacher")) def affected_groups(self): - """ Return all groups which are affected by selected substitutions """ + """Return all groups which are affected by selected substitutions.""" return Group.objects.filter(lessons__in=self.affected_lessons()).annotate( lessons_count=Count("lessons") @@ -295,22 +299,22 @@ class DateRangeQuerySet(models.QuerySet): """ def within_dates(self, start: date, end: date): - """ Filter for all events within a date range. """ + """Filter for all events within a date range.""" return self.filter(date_start__lte=end, date_end__gte=start) def in_week(self, wanted_week: CalendarWeek): - """ Filter for all events within a calendar week. """ + """Filter for all events within a calendar week.""" return self.within_dates(wanted_week[0], wanted_week[6]) def on_day(self, day: date): - """ Filter for all events on a certain day. """ + """Filter for all events on a certain day.""" return self.within_dates(day, day) def at_time(self, when: Optional[datetime] = None): - """ Filter for the events taking place at a certain point in time. """ + """Filter for the events taking place at a certain point in time.""" now = when or datetime.now() @@ -350,7 +354,7 @@ class SupervisionQuerySet(models.QuerySet, WeekQuerySetMixin): ) def filter_by_teacher(self, teacher: Union[Person, int]): - """ Filter for all supervisions given by a certain teacher. """ + """Filter for all supervisions given by a certain teacher.""" if self.count() > 0: if hasattr(self[0], "_week"): @@ -371,21 +375,21 @@ class SupervisionQuerySet(models.QuerySet, WeekQuerySetMixin): class TimetableQuerySet(models.QuerySet): """Common query set methods for objects in timetables. - Models need following fields: - - groups - - teachers - - rooms (_multiple_rooms=True)/room (_multiple_rooms=False) - """ + Models need following fields: + - groups + - teachers + - rooms (_multiple_rooms=True)/room (_multiple_rooms=False) + """ _multiple_rooms = True def filter_participant(self, person: Union[Person, int]): - """ Filter for all objects a participant (student) attends. """ + """Filter for all objects a participant (student) attends.""" return self.filter(Q(groups_members=person)) def filter_group(self, group: Union[Group, int]): - """ Filter for all objects a group (class) attends. """ + """Filter for all objects a group (class) attends.""" if isinstance(group, int): group = Group.objects.get(pk=group) @@ -397,12 +401,12 @@ class TimetableQuerySet(models.QuerySet): return self.filter(Q(groups=group) | Q(groups__parent_groups=group)) def filter_teacher(self, teacher: Union[Person, int]): - """ Filter for all lessons given by a certain teacher. """ + """Filter for all lessons given by a certain teacher.""" return self.filter(teachers=teacher) def filter_room(self, room: Union["Room", int]): - """ Filter for all objects taking part in a certain room. """ + """Filter for all objects taking part in a certain room.""" if self._multiple_rooms: return self.filter(rooms=room) @@ -445,7 +449,7 @@ 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. """ + """Annotate all events in the QuerySet with the provided date.""" return self.annotate(_date=models.Value(day, models.DateField())) diff --git a/aleksis/apps/chronos/model_extensions.py b/aleksis/apps/chronos/model_extensions.py index 774f992d..91b40aa1 100644 --- a/aleksis/apps/chronos/model_extensions.py +++ b/aleksis/apps/chronos/model_extensions.py @@ -12,14 +12,14 @@ from .models import Lesson, LessonPeriod @Person.property def is_teacher(self): - """ Check if the user has lessons as a teacher """ + """Check if the user has lessons as a teacher.""" return self.lesson_periods_as_teacher.exists() @Person.property def timetable_type(self) -> Optional[TimetableType]: - """ Return which type of timetable this user has """ + """Return which type of timetable this user has.""" if self.is_teacher: return TimetableType.TEACHER @@ -31,7 +31,7 @@ def timetable_type(self) -> Optional[TimetableType]: @Person.property def timetable_object(self) -> Optional[Union[Group, Person]]: - """ Return the object which has the user's timetable """ + """Return the object which has the user's timetable.""" type_ = self.timetable_type @@ -45,7 +45,7 @@ def timetable_object(self) -> Optional[Union[Group, Person]]: @Person.property def lessons_as_participant(self): - """ Return a `QuerySet` containing all `Lesson`s this person + """Return a `QuerySet` containing all `Lesson`s this person participates in (as student). .. note:: Only available when AlekSIS-App-Chronos is installed. @@ -60,7 +60,7 @@ def lessons_as_participant(self): @Person.property def lesson_periods_as_participant(self): - """ Return a `QuerySet` containing all `LessonPeriod`s this person + """Return a `QuerySet` containing all `LessonPeriod`s this person participates in (as student). .. note:: Only available when AlekSIS-App-Chronos is installed. @@ -75,7 +75,7 @@ def lesson_periods_as_participant(self): @Person.property def lesson_periods_as_teacher(self): - """ Return a `QuerySet` containing all `Lesson`s this person + """Return a `QuerySet` containing all `Lesson`s this person gives (as teacher). .. note:: Only available when AlekSIS-App-Chronos is installed. diff --git a/aleksis/apps/chronos/models.py b/aleksis/apps/chronos/models.py index a35a9332..6d7c3027 100644 --- a/aleksis/apps/chronos/models.py +++ b/aleksis/apps/chronos/models.py @@ -31,11 +31,10 @@ from aleksis.apps.chronos.managers import ( SupervisionQuerySet, TeacherPropertiesMixin, ) -from aleksis.apps.chronos.util.date import week_weekday_from_date from aleksis.apps.chronos.util.format import format_m2m from aleksis.core.mixins import ExtensibleModel -from aleksis.core.models import DashboardWidget, Group, Person -from aleksis.core.util.core_helpers import get_site_preferences, has_person +from aleksis.core.models import DashboardWidget +from aleksis.core.util.core_helpers import has_person class TimePeriod(ExtensibleModel): @@ -77,7 +76,7 @@ class TimePeriod(ExtensibleModel): def get_next_relevant_day( cls, day: Optional[date] = None, time: Optional[time] = None, prev: bool = False ) -> date: - """ Returns next (previous) day with lessons depending on date and time """ + """Return next (previous) day with lessons depending on date and time.""" if day is None: day = timezone.now().date() @@ -105,7 +104,7 @@ class TimePeriod(ExtensibleModel): @classmethod def get_prev_next_by_day(cls, day: date, url: str) -> Tuple[str, str]: - """ Build URLs for previous/next day """ + """Build URLs for previous/next day.""" day_prev = cls.get_next_relevant_day(day - timedelta(days=1), prev=True) day_next = cls.get_next_relevant_day(day + timedelta(days=1)) @@ -235,7 +234,7 @@ class LessonSubstitution(ExtensibleModel): default=False, verbose_name=_("Cancelled for teachers?") ) - comment = models.TextField(verbose_name=_("Comment"), blank=True, null=True) + comment = models.TextField(verbose_name=_("Comment"), blank=True) def clean(self) -> None: if self.subject and self.cancelled: @@ -441,7 +440,7 @@ class Absence(ExtensibleModel): null=True, related_name="+", ) - comment = models.TextField(verbose_name=_("Comment"), blank=True, null=True) + comment = models.TextField(verbose_name=_("Comment"), blank=True) def __str__(self): if self.teacher: @@ -482,7 +481,7 @@ class Exam(ExtensibleModel): ) title = models.CharField(verbose_name=_("Title"), max_length=255) - comment = models.TextField(verbose_name=_("Comment"), blank=True, null=True) + comment = models.TextField(verbose_name=_("Comment"), blank=True) class Meta: ordering = ["date"] @@ -497,7 +496,7 @@ class Holiday(ExtensibleModel): title = models.CharField(verbose_name=_("Title"), max_length=255) date_start = models.DateField(verbose_name=_("Start date"), null=True) date_end = models.DateField(verbose_name=_("End date"), null=True) - comments = models.TextField(verbose_name=_("Comments"), null=True, blank=True) + comments = models.TextField(verbose_name=_("Comments"), blank=True) @classmethod def on_day(cls, day: date) -> Optional["Holiday"]: @@ -674,7 +673,7 @@ class Event(ExtensibleModel, GroupPropertiesMixin, TeacherPropertiesMixin): objects = models.Manager.from_queryset(EventQuerySet)() - title = models.CharField(verbose_name=_("Title"), max_length=255, blank=True, null=True) + title = models.CharField(verbose_name=_("Title"), max_length=255, blank=True) date_start = models.DateField(verbose_name=_("Start date"), null=True) date_end = models.DateField(verbose_name=_("End date"), null=True) @@ -750,7 +749,7 @@ class ExtraLesson(ExtensibleModel, GroupPropertiesMixin): "Room", models.CASCADE, null=True, related_name="extra_lessons", verbose_name=_("Room"), ) - comment = models.CharField(verbose_name=_("Comment"), blank=True, null=True, max_length=255) + comment = models.CharField(verbose_name=_("Comment"), blank=True, max_length=255) def __str__(self): return f"{self.week}, {self.period}, {self.subject}" diff --git a/aleksis/apps/chronos/preferences.py b/aleksis/apps/chronos/preferences.py index 31b1fdb1..10906276 100644 --- a/aleksis/apps/chronos/preferences.py +++ b/aleksis/apps/chronos/preferences.py @@ -3,7 +3,10 @@ from django.utils.translation import gettext as _ from dynamic_preferences.preferences import Section from dynamic_preferences.types import BooleanPreference, IntegerPreference -from aleksis.core.registries import person_preferences_registry, site_preferences_registry +from aleksis.core.registries import ( + person_preferences_registry, + site_preferences_registry, +) chronos = Section("chronos", verbose_name=_("Chronos")) @@ -37,7 +40,8 @@ class ShortenGroupsLimit(IntegerPreference): default = 4 verbose_name = _("Limit of groups for shortening of groups") help_text = _( - "If an user activates shortening of groups, they will be collapsed if there are more groups than this limit." + "If an user activates shortening of groups," + "they will be collapsed if there are more groups than this limit." ) diff --git a/aleksis/apps/chronos/rules.py b/aleksis/apps/chronos/rules.py index 6feb45b5..7ee9d1e0 100644 --- a/aleksis/apps/chronos/rules.py +++ b/aleksis/apps/chronos/rules.py @@ -1,4 +1,4 @@ -from rules import add_perm, always_allow +from rules import add_perm from aleksis.core.util.predicates import ( has_any_object, diff --git a/aleksis/apps/chronos/templatetags/common.py b/aleksis/apps/chronos/templatetags/common.py index cfdec15c..5a066c90 100644 --- a/aleksis/apps/chronos/templatetags/common.py +++ b/aleksis/apps/chronos/templatetags/common.py @@ -20,7 +20,8 @@ class SetVarNode(template.Node): @register.tag(name="set") def set_var(parser, token): - """ + """Set var. + {% set some_var = '123' %} """ parts = token.split_contents() diff --git a/aleksis/apps/chronos/templatetags/week_helpers.py b/aleksis/apps/chronos/templatetags/week_helpers.py index acfb3a3a..054d3f9e 100644 --- a/aleksis/apps/chronos/templatetags/week_helpers.py +++ b/aleksis/apps/chronos/templatetags/week_helpers.py @@ -4,7 +4,11 @@ from typing import Optional, Union from django import template from django.db.models.query import QuerySet -from aleksis.apps.chronos.util.date import CalendarWeek, week_period_to_date, week_weekday_to_date +from aleksis.apps.chronos.util.date import ( + CalendarWeek, + week_period_to_date, + week_weekday_to_date, +) register = template.Library() diff --git a/aleksis/apps/chronos/util/build.py b/aleksis/apps/chronos/util/build.py index d816403f..a5290ebb 100644 --- a/aleksis/apps/chronos/util/build.py +++ b/aleksis/apps/chronos/util/build.py @@ -3,7 +3,6 @@ from datetime import date from typing import List, Tuple, Union from django.apps import apps -from django.db.models import QuerySet from calendarweek import CalendarWeek diff --git a/aleksis/apps/chronos/util/date.py b/aleksis/apps/chronos/util/date.py index 68bfcd38..026439d0 100644 --- a/aleksis/apps/chronos/util/date.py +++ b/aleksis/apps/chronos/util/date.py @@ -1,11 +1,7 @@ from datetime import date from typing import List, Tuple, Union -from django.utils import timezone -from django.utils.translation import gettext_lazy as _ - from calendarweek import CalendarWeek -from calendarweek.django import i18n_day_names def week_weekday_from_date(when: date) -> Tuple[CalendarWeek, int]: diff --git a/aleksis/apps/chronos/util/format.py b/aleksis/apps/chronos/util/format.py index ee9be702..b5bf35c7 100644 --- a/aleksis/apps/chronos/util/format.py +++ b/aleksis/apps/chronos/util/format.py @@ -2,6 +2,8 @@ from datetime import date from django.utils.formats import date_format +from ..models import TimePeriod + def format_m2m(f, attr: str = "short_name") -> str: """Join a attribute of all elements of a ManyToManyField.""" diff --git a/aleksis/apps/chronos/util/js.py b/aleksis/apps/chronos/util/js.py index 9449fd2c..d906e9bf 100644 --- a/aleksis/apps/chronos/util/js.py +++ b/aleksis/apps/chronos/util/js.py @@ -2,7 +2,7 @@ from datetime import date, datetime, time def date_unix(value: date) -> int: - """ Converts a date object to an UNIX timestamp """ + """Convert a date object to an UNIX timestamp.""" value = datetime.combine(value, time(hour=0, minute=0)) return int(value.timestamp()) * 1000 diff --git a/aleksis/apps/chronos/util/predicates.py b/aleksis/apps/chronos/util/predicates.py index c011acbd..e310f6cd 100644 --- a/aleksis/apps/chronos/util/predicates.py +++ b/aleksis/apps/chronos/util/predicates.py @@ -9,7 +9,7 @@ from aleksis.core.models import Group, Person @predicate def has_timetable_perm(user: User, obj: Model) -> bool: - """ Predicate which checks whether the user is allowed to access the requested timetable """ + """Predicate which checks whether the user is allowed to access the requested timetable.""" if obj.model is Group: return obj in user.person.member_of diff --git a/aleksis/apps/chronos/views.py b/aleksis/apps/chronos/views.py index 87621266..04e975f7 100644 --- a/aleksis/apps/chronos/views.py +++ b/aleksis/apps/chronos/views.py @@ -1,8 +1,6 @@ -from collections import OrderedDict -from datetime import date, datetime, timedelta -from typing import Optional, Tuple +from datetime import datetime, timedelta +from typing import Optional -from django.contrib.auth.decorators import login_required from django.db.models import Count from django.http import HttpRequest, HttpResponse, HttpResponseNotFound from django.shortcuts import get_object_or_404, redirect, render -- GitLab