diff --git a/biscuit/apps/chronos/models.py b/biscuit/apps/chronos/models.py index bd8bb51350a971fad85c4205e4892f93fdac87e6..0556b89a5c5a8ca2b6dcedb254054c3bac2ea811 100644 --- a/biscuit/apps/chronos/models.py +++ b/biscuit/apps/chronos/models.py @@ -9,7 +9,7 @@ from django.utils.translation import ugettext_lazy as _ from biscuit.core.mixins import SchoolRelated -from .util import current_week +from .util import CalendarWeek class TimePeriod(SchoolRelated): @@ -102,6 +102,13 @@ class Lesson(SchoolRelated): def group_names(self, sep: Optional[str] = ', ') -> str: return sep.join([group.short_name for group in self.groups.all()]) + def get_calendar_week(self, week: int): + year = self.date_start.year + if week < int(self.date_start.strftime('%V')): + year += 1 + + return CalendarWeek(year=year, week=week) + class Meta: ordering = ['date_start'] indexes = [models.Index(fields=['date_start', 'date_end'])] @@ -109,7 +116,7 @@ class Lesson(SchoolRelated): class LessonSubstitution(SchoolRelated): week = models.IntegerField(verbose_name=_('Week'), - default=current_week) + default=CalendarWeek().week) lesson_period = models.ForeignKey( 'LessonPeriod', models.CASCADE, 'substitutions') @@ -146,7 +153,7 @@ class LessonPeriod(SchoolRelated): room = models.ForeignKey('Room', models.CASCADE, null=True, related_name='lesson_periods') def get_substitution(self, week: Optional[int] = None) -> LessonSubstitution: - wanted_week = week or getattr(self, '_week', None) or current_week() + wanted_week = week or getattr(self, '_week', None) or CalendarWeek().week # We iterate over all substitutions because this can make use of # prefetching when this model is loaded from outside, in contrast diff --git a/biscuit/apps/chronos/urls.py b/biscuit/apps/chronos/urls.py index 15fe30acf23423a061b3a462e164cdd5efa82aae..2972068e96db8a2f5f8c3de7e5870ac819bb55d8 100644 --- a/biscuit/apps/chronos/urls.py +++ b/biscuit/apps/chronos/urls.py @@ -5,7 +5,7 @@ from . import views urlpatterns = [ path('timetable', views.timetable, name='timetable'), - path('timetable/<int:week>', views.timetable, name='timetable_by_week'), + path('timetable/<int:year>/<int:week>', views.timetable, name='timetable_by_week'), path('lessons', views.lessons_day, name='lessons_day'), path('lessons/<when>', views.lessons_day, name='lessons_day_by_date'), path('lessons/<int:id_>/<int:week>/substition', views.edit_substitution, name='edit_substitution'), diff --git a/biscuit/apps/chronos/views.py b/biscuit/apps/chronos/views.py index 67939a88148ca8c2c04c4dca9cf4e1dbaa647177..7d35a4212b568e00741b3fd7512028cc6ca7d9aa 100644 --- a/biscuit/apps/chronos/views.py +++ b/biscuit/apps/chronos/views.py @@ -22,11 +22,11 @@ from .tables import LessonsTable @login_required -def timetable(request: HttpRequest, week: Optional[int] = None) -> HttpResponse: +def timetable(request: HttpRequest, year: Optional[int], week: Optional[int] = None) -> HttpResponse: context = {} - if week: - wanted_week = CalendarWeek(week) # FIXME Respect year as well + if year and week: + wanted_week = CalendarWeek(year=year, week=week) else: wanted_week = CalendarWeek() @@ -38,7 +38,7 @@ def timetable(request: HttpRequest, week: Optional[int] = None) -> HttpResponse: ).prefetch_related( 'lesson__groups', 'lesson__teachers', 'substitutions' ).extra( - select={'_week': wanted_week.week} # FIXME respect year as well + select={'_week': wanted_week.week} ) if request.GET.get('group', None) or request.GET.get('teacher', None) or request.GET.get('room', None): @@ -48,7 +48,7 @@ def timetable(request: HttpRequest, week: Optional[int] = None) -> HttpResponse: Q(lesson__groups__pk=int(request.GET['group'])) | Q(lesson__groups__parent_groups__pk=int(request.GET['group']))) if 'teacher' in request.GET and request.GET['teacher']: lesson_periods = lesson_periods.filter( - Q(substitutions__teachers__pk=int(request.GET['teacher']), substitutions__week=wanted_week.week) | Q(lesson__teachers__pk=int(request.GET['teacher']))) # FIXME Respect year as well + Q(substitutions__teachers__pk=int(request.GET['teacher']), substitutions__week=wanted_week.week) | Q(lesson__teachers__pk=int(request.GET['teacher']))) if 'room' in request.GET and request.GET['room']: lesson_periods = lesson_periods.filter( room__pk=int(request.GET['room'])) @@ -124,7 +124,7 @@ def lessons_day(request: HttpRequest, when: Optional[str] = None) -> HttpRespons ) # Build table - lessons_table = LessonsTable(lesson_periods.extra(select={'_week': week.week}).all()) # FIXME Respect year as well + lessons_table = LessonsTable(lesson_periods.extra(select={'_week': week.week}).all()) RequestConfig(request).configure(lessons_table) context['current_head'] = _('Lessons') @@ -142,18 +142,15 @@ def lessons_day(request: HttpRequest, when: Optional[str] = None) -> HttpRespons def edit_substitution(request: HttpRequest, id_: int, week: int) -> HttpResponse: context = {} - wanted_week = CalendarWeek(week=week) # FIXME Respect year as well - - lesson_period = get_object_or_404(LessonPeriod, pk=id_) lesson_substitution = LessonSubstitution.objects.filter( - week=wanted_week.week, lesson_period=lesson_period).first() # FIXME Respect year as well + week=wanted_week.week, lesson_period=lesson_period).first() if lesson_substitution: edit_substitution_form = LessonSubstitutionForm( request.POST or None, instance=lesson_substitution) else: edit_substitution_form = LessonSubstitutionForm( - request.POST or None, initial={'week': wanted_week.week, 'lesson_period': lesson_period}) # FIXME Respect year as well + request.POST or None, initial={'week': wanted_week.week, 'lesson_period': lesson_period}) context['substitution'] = lesson_substitution @@ -173,10 +170,11 @@ def edit_substitution(request: HttpRequest, id_: int, week: int) -> HttpResponse def delete_substitution(request: HttpRequest, id_: int, week: int) -> HttpResponse: context = {} - wanted_week = CalendarWeek(week=week) # FIXME Respect year as well + lesson_period = get_object_or_404(LessonPeriod, pk=id_) + wanted_week = lesson_period.lesson.get_calendar_week(week) LessonSubstitution.objects.filter( - week=wanted_week.week, lesson_period__id=id_ # FIXME Respect year as well + week=wanted_week.week, lesson_period=lesson_period ).delete() messages.success(request, _('The substitution has been deleted.'))