Skip to content
Snippets Groups Projects
Verified Commit f717a83a authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Fix week view code

- Fix select form
- Fix names
- Fix URLs
parent 684c19f0
No related branches found
No related tags found
1 merge request!48Review use of Materialize
from datetime import datetime from datetime import datetime
from aleksis.apps.chronos.managers import TimetableType
from django import forms from django import forms
from django.core.exceptions import ValidationError
from django.db.models import Count from django.db.models import Count
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
...@@ -50,15 +52,24 @@ class SelectForm(forms.Form): ...@@ -50,15 +52,24 @@ class SelectForm(forms.Form):
required=False, required=False,
widget=Select2Widget, widget=Select2Widget,
) )
room = forms.ModelChoiceField(
queryset=Room.objects.annotate(lessons_count=Count("lesson_periods")).filter(
lessons_count__gt=0
),
label=_("Room"),
required=False,
widget=Select2Widget,
)
def clean(self) -> dict:
data = super().clean()
if data.get("group") and not data.get("teacher") :
type_ = TimetableType.GROUP
instance = data["group"]
elif data.get("teacher") and not data.get("group"):
type_ = TimetableType.TEACHER
instance = data["teacher"]
elif not data.get("teacher") and not data.get("group"):
return data
else:
raise ValidationError(_("You can't select a group and a teacher both."))
data["type_"] = type_
data["instance"] = instance
return data
PersonalNoteFormSet = forms.modelformset_factory( PersonalNoteFormSet = forms.modelformset_factory(
PersonalNote, form=PersonalNoteForm, max_num=0, extra=0 PersonalNote, form=PersonalNoteForm, max_num=0, extra=0
......
...@@ -11,6 +11,8 @@ urlpatterns = [ ...@@ -11,6 +11,8 @@ urlpatterns = [
), ),
path("week", views.week_view, name="week_view"), path("week", views.week_view, name="week_view"),
path("week/<int:year>/<int:week>", views.week_view, name="week_view_by_week"), path("week/<int:year>/<int:week>", views.week_view, name="week_view_by_week"),
path("week/<str:type_>/<int:id_>/", views.week_view, name="week_view"),
path("week/<int:year>/<int:week>/<str:type_>/<int:id_>/", views.week_view, name="week_view_by_week"),
path("print/group/<int:id_>", views.full_register_group, name="full_register_group"), path("print/group/<int:id_>", views.full_register_group, name="full_register_group"),
path("absence/new", views.register_absence, name="register_absence"), path("absence/new", views.register_absence, name="register_absence"),
path("filters/list", views.list_personal_note_filters, name="list_personal_note_filters",), path("filters/list", views.list_personal_note_filters, name="list_personal_note_filters",),
......
from datetime import date, datetime, timedelta from datetime import date, datetime, timedelta
from typing import Optional from typing import Optional
from aleksis.apps.chronos.managers import TimetableType
from aleksis.apps.chronos.util.chronos_helpers import get_el_by_pk
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.db.models import Count, Exists, OuterRef, Q, Sum from django.db.models import Count, Exists, OuterRef, Q, Sum
from django.http import Http404, HttpRequest, HttpResponse from django.http import Http404, HttpRequest, HttpResponse, HttpResponseNotFound
from django.shortcuts import get_object_or_404, redirect, render from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse from django.urls import reverse
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
...@@ -74,7 +76,7 @@ def lesson( ...@@ -74,7 +76,7 @@ def lesson(
lesson_period=lesson_period, week=wanted_week.week lesson_period=lesson_period, week=wanted_week.week
) )
lesson_documentation_form = LessonDocumentationForm( lesson_documentation_form = LessonDocumentationForm(
request.POST or None, instance=lesson_documentation, prefix="leson_documentation", request.POST or None, instance=lesson_documentation, prefix="lesson_documentation",
) )
# Create a formset that holds all personal notes for all persons in this lesson # Create a formset that holds all personal notes for all persons in this lesson
...@@ -107,7 +109,7 @@ def lesson( ...@@ -107,7 +109,7 @@ def lesson(
def week_view( def week_view(
request: HttpRequest, year: Optional[int] = None, week: Optional[int] = None request: HttpRequest, year: Optional[int] = None, week: Optional[int] = None, type_: Optional[str] = None, id_: Optional[int] = None
) -> HttpResponse: ) -> HttpResponse:
context = {} context = {}
...@@ -124,45 +126,62 @@ def week_view( ...@@ -124,45 +126,62 @@ def week_view(
) )
).in_week(wanted_week) ).in_week(wanted_week)
group = None # FIXME workaround for #38 group = None
if ( if type_ and id_:
request.GET.get("group", None) instance = get_el_by_pk(request, type_, id_)
or request.GET.get("teacher", None)
or request.GET.get("room", None) if isinstance(instance, HttpResponseNotFound):
): return HttpResponseNotFound()
lesson_periods = lesson_periods.filter_from_query(request.GET)
if "group" in request.GET and request.GET["group"]: type_ = TimetableType.from_string(type_)
group = Group.objects.get(pk=request.GET["group"])
else: if type_ == TimetableType.GROUP:
group = None group = instance
lesson_periods = lesson_periods.filter_from_type(type_, instance)
elif hasattr(request, "user") and hasattr(request.user, "person"): elif hasattr(request, "user") and hasattr(request.user, "person"):
group = request.user.person.owner_of.first() instance = request.user.person
if group: if request.user.person.lessons_as_teacher.exists():
lesson_periods = lesson_periods.filter_group(group)
elif request.user.person.lessons_as_teacher.exists():
lesson_periods = lesson_periods.filter_teacher(request.user.person) lesson_periods = lesson_periods.filter_teacher(request.user.person)
type_ = TimetableType.TEACHER
else: else:
lesson_periods = lesson_periods.filter_participant(request.user.person) lesson_periods = lesson_periods.filter_participant(request.user.person)
else: else:
lesson_periods = None lesson_periods = None
# Add a form to filter the view
if type_:
initial = {type_.value: instance}
else:
initial = {}
select_form = SelectForm(request.POST or None, initial=initial)
if request.method == "POST":
if select_form.is_valid():
if "type_" not in select_form.cleaned_data:
return redirect("week_view_by_week", wanted_week.year, wanted_week.week)
else:
return redirect("week_view_by_week", wanted_week.year, wanted_week.week,
select_form.cleaned_data["type_"].value, select_form.cleaned_data["instance"].pk)
if lesson_periods: if lesson_periods:
# Aggregate all personal notes for this group and week # Aggregate all personal notes for this group and week
lesson_periods_pk = lesson_periods.values_list("pk", flat=True)
persons = ( persons = (
Person.objects.filter(is_active=True) Person.objects.filter(is_active=True)
.filter(member_of__lessons__lesson_periods__in=lesson_periods) .filter(member_of__lessons__lesson_periods__in=lesson_periods_pk)
.distinct() .distinct()
.prefetch_related("personal_notes") .prefetch_related("personal_notes")
.annotate( .annotate(
absences=Count( absences_count=Count(
"personal_notes__absent", "personal_notes__absent",
filter=Q( filter=Q(
personal_notes__lesson_period__in=lesson_periods, personal_notes__lesson_period__in=lesson_periods_pk,
personal_notes__week=wanted_week.week, personal_notes__week=wanted_week.week,
personal_notes__absent=True, personal_notes__absent=True,
), ),
), ),
unexcused=Count( unexcused_count=Count(
"personal_notes__absent", "personal_notes__absent",
filter=Q( filter=Q(
personal_notes__lesson_period__in=lesson_periods, personal_notes__lesson_period__in=lesson_periods,
...@@ -171,7 +190,7 @@ def week_view( ...@@ -171,7 +190,7 @@ def week_view(
personal_notes__excused=False, personal_notes__excused=False,
), ),
), ),
tardiness=Sum( tardiness_sum=Sum(
"personal_notes__late", "personal_notes__late",
filter=Q( filter=Q(
personal_notes__lesson_period__in=lesson_periods, personal_notes__lesson_period__in=lesson_periods,
...@@ -183,15 +202,15 @@ def week_view( ...@@ -183,15 +202,15 @@ def week_view(
else: else:
persons = None persons = None
# Add a form to filter the view # Resort lesson periods manually because an union queryset doesn't support order_by
select_form = SelectForm(request.GET or None) lesson_periods = sorted(lesson_periods, key=lambda x: (x.period.weekday, x.period.period))
context["current_head"] = str(wanted_week)
context["week"] = wanted_week context["week"] = wanted_week
context["lesson_periods"] = lesson_periods context["lesson_periods"] = lesson_periods
context["persons"] = persons context["persons"] = persons
context["group"] = group context["group"] = group
context["select_form"] = select_form context["select_form"] = select_form
context["instance"] = instance
week_prev = wanted_week - 1 week_prev = wanted_week - 1
week_next = wanted_week + 1 week_next = wanted_week + 1
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment