From 3eb68a45b6bf31179940b8eee4f97725b77e222a Mon Sep 17 00:00:00 2001 From: Reinout van Rees Date: Thu, 19 Dec 2024 11:31:55 +0100 Subject: [PATCH] Overzicht voor feest/vrije dagen gemaakt --- trs/templates/trs/base.html | 5 +++ trs/templates/trs/free_overview.html | 58 ++++++++++++++++++++++++++ trs/urls.py | 5 +++ trs/views.py | 61 +++++++++++++++++++++++++++- 4 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 trs/templates/trs/free_overview.html diff --git a/trs/templates/trs/base.html b/trs/templates/trs/base.html index 7a6fb0f..7533bf7 100644 --- a/trs/templates/trs/base.html +++ b/trs/templates/trs/base.html @@ -263,6 +263,11 @@

percentages. +
+ Afas en TRS qua vrije dagen gelijktrekken? + + Zie het verlofoverzicht. +
{% endif %} {% endblock %} diff --git a/trs/templates/trs/free_overview.html b/trs/templates/trs/free_overview.html new file mode 100644 index 0000000..c97c98c --- /dev/null +++ b/trs/templates/trs/free_overview.html @@ -0,0 +1,58 @@ +{% extends "trs/base.html" %} +{% load trs_formatting %} + +{% block full-width %} +

Overzicht vrije dagen / feestdagen {{ view.person }} {{ view.year }}

+ +

Noot: ik filter op projecten met "feest" en "verlof" in de naam.

+ +
+
+

+ Je kan op het weeknummer klikken om de uren van die week te bewerken. +

+ + + + + + + {% for project in view.free_projects %} + + {% endfor %} + + + + {% for line in view.lines %} + + + + {% for hour in line.hours %} + + {% endfor %} + +
WeekBegindag{{ project.as_widget }}
+ + Week {{ line.year_week.week }} + + + + {{ line.year_week.formatted_first_day }} + + {{ hour|hours }} + {% endfor %} +
+ +
+
+

Beschikbare jaren:

+
    + {% for year in view.available_years %} +
  • {{ year }}
  • + {% endfor %} +
+ +
+
+ +{% endblock %} diff --git a/trs/urls.py b/trs/urls.py index 258928c..fb6629f 100644 --- a/trs/urls.py +++ b/trs/urls.py @@ -134,6 +134,11 @@ views.BookingOverview.as_view(), name="trs.booking.overview", ), + re_path( + r"^persons/(?P\d+)/freeoverview/$", + views.FreeOverview.as_view(), + name="trs.booking.free-overview", + ), re_path( r"^overviews/wbso_projects/(?P\d+)/$", views.WbsoProjectView.as_view(), diff --git a/trs/views.py b/trs/views.py index 5873624..e82e699 100644 --- a/trs/views.py +++ b/trs/views.py @@ -83,7 +83,7 @@ class LoginAndPermissionsRequiredMixin(object): """See http://stackoverflow.com/a/10304880/27401""" - def has_form_permissions(self): + def has_form_permissions(self) -> bool: """Especially for forms, return whether we have the necessary perms. Overwrite this in subclasses. @@ -735,6 +735,65 @@ def lines(self): return result +class FreeOverview(PersonView): + template_name = "trs/free_overview.html" + + def has_form_permissions(self): + if self.can_see_everything: + return True + if self.active_person == self.person: + return True + return False + + @cached_property + def year(self): + return int(self.request.GET.get("year", this_year_week().year)) + + @cached_property + def available_years(self): + years_i_booked_in = list( + Booking.objects.filter(booked_by=self.person) + .values("year_week__year") + .distinct() + .values_list("year_week__year", flat=True) + ) + current_year = this_year_week().year + if current_year not in years_i_booked_in: + # Corner case if you haven't booked yet in this year :-) + years_i_booked_in.append(current_year) + return years_i_booked_in + + @cached_property + def free_projects(self): + return self.all_projects.filter( + Q(description__icontains="verlof") | Q(description__icontains="feest")).filter( + bookings__year_week__year=self.year, + bookings__booked_by=self.active_person + ) + + @cached_property + def lines(self): + booked_this_year_per_week_per_project = ( + Booking.objects.filter(booked_by=self.person, year_week__year=self.year, booked_on__in=self.free_projects) + .values("year_week__week", "booked_on") + .annotate(models.Sum("hours")) + ) + weeks = {} + empty_week = {} + for project in self.free_projects: + empty_week[project.id] = 0 + for year_week in YearWeek.objects.filter(year=self.year): + weeks[year_week.week] = deepcopy(empty_week) + for booking in booked_this_year_per_week_per_project: + weeks[booking["year_week__week"]][booking["booked_on"]] = booking["hours__sum"] + result = [] + for year_week in YearWeek.objects.filter(year=self.year): + hours = [weeks[year_week.week][project.id] for project in self.free_projects] + line = {"year_week": year_week, "hours": hours} + result.append(line) + return result + + class ProjectsView(BaseView): @cached_property def results_for_selection_pager(self):