Skip to content

Commit

Permalink
Overzicht voor feest/vrije dagen gemaakt
Browse files Browse the repository at this point in the history
  • Loading branch information
reinout committed Dec 19, 2024
1 parent 375f176 commit 3eb68a4
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 1 deletion.
5 changes: 5 additions & 0 deletions trs/templates/trs/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,11 @@ <h2>
<a href="{% url 'trs.person.kpi' pk=view.sidebar_person.id %}">
percentages</a>.
</div>
<div>
Afas en TRS qua vrije dagen gelijktrekken?
<a href="{% url 'trs.booking.free-overview' pk=view.sidebar_person.id %}">
Zie het verlofoverzicht</a>.
</div>

{% endif %}
{% endblock %}
Expand Down
58 changes: 58 additions & 0 deletions trs/templates/trs/free_overview.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
{% extends "trs/base.html" %}
{% load trs_formatting %}

{% block full-width %}
<h1>Overzicht vrije dagen / feestdagen {{ view.person }} {{ view.year }}</h1>

<p>Noot: ik filter op projecten met "feest" en "verlof" in de naam.</p>

<div class="row">
<div class="col-md-10">
<p>
Je kan op het weeknummer klikken om de uren van die week te bewerken.
</p>

<table class="table table-hover table-condensed table-fixed-header">
<thead class="header">
<tr>
<th>Week</th>
<th>Begindag</th>
{% for project in view.free_projects %}
<th class="text-right">{{ project.as_widget }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for line in view.lines %}
<tr>
<td>
<a href="{% url 'trs.booking' pk=view.person.id year=line.year_week.year week=line.year_week.week %}">
Week {{ line.year_week.week }}
</a>
</td>
<td>
<span class="year-date-hint">
{{ line.year_week.formatted_first_day }}
</span>
</td>
{% for hour in line.hours %}
<td class="text-right {% if hour %}success{% endif %}">{{ hour|hours }}</th>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>

</div>
<div class="col-md-2">
<p>Beschikbare jaren:</p>
<ul>
{% for year in view.available_years %}
<li><a href="?year={{ year }}">{{ year }}</a></li>
{% endfor %}
</ul>

</div>
</div>

{% endblock %}
5 changes: 5 additions & 0 deletions trs/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,11 @@
views.BookingOverview.as_view(),
name="trs.booking.overview",
),
re_path(
r"^persons/(?P<pk>\d+)/freeoverview/$",
views.FreeOverview.as_view(),
name="trs.booking.free-overview",
),
re_path(
r"^overviews/wbso_projects/(?P<pk>\d+)/$",
views.WbsoProjectView.as_view(),
Expand Down
61 changes: 60 additions & 1 deletion trs/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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):
Expand Down

0 comments on commit 3eb68a4

Please sign in to comment.