SciPost Code Repository

Skip to content
Snippets Groups Projects
Commit e930186b authored by Jorran de Wit's avatar Jorran de Wit
Browse files

Improve team timesheets page format

parent b3ab3a95
No related branches found
No related tags found
No related merge requests found
......@@ -45,8 +45,15 @@ class WorkLogForm(forms.ModelForm):
}
class LogsMonthlyActiveFilter(forms.Form):
month = forms.ChoiceField(choices=[(k, v) for k, v in MONTHS.items()])
class LogsActiveFilter(forms.Form):
"""
Filter work logs given the requested date range and users.
"""
employee = forms.ModelChoiceField(
queryset=get_user_model().objects.filter(work_logs__isnull=False), required=False)
month = forms.ChoiceField(
choices=[(None, 9 * '-')] + [(k, v) for k, v in MONTHS.items()], required=False)
year = forms.ChoiceField(choices=[(y, y) for y in reversed(range(today.year-6, today.year+1))])
def __init__(self, *args, **kwargs):
......@@ -63,22 +70,28 @@ class LogsMonthlyActiveFilter(forms.Form):
}
super().__init__(*args, **kwargs)
def get_totals(self):
# Make accessible without need to explicitly check validity of form.
self.is_valid()
users = get_user_model().objects.filter(
work_logs__work_date__month=self.cleaned_data['month'],
work_logs__work_date__year=self.cleaned_data['year']).distinct()
def filter(self):
"""Filter work logs and return in output-convenient format."""
output = []
for user in users:
logs = user.work_logs.filter(
work_date__month=self.cleaned_data['month'],
work_date__year=self.cleaned_data['year'])
output.append({
'logs': logs,
'duration': logs.aggregate(total=Sum('duration')),
'user': user
})
if self.is_valid():
user_qs = get_user_model().objects.filter(work_logs__isnull=False)
if self.cleaned_data['employee']:
# Get as a queryset instead of single instead.
user_qs = user_qs.filter(id=self.cleaned_data['employee'].id)
user_qs = user_qs.distinct()
output = []
for user in user_qs:
logs = user.work_logs.filter(work_date__year=self.cleaned_data['year'])
if self.cleaned_data['month']:
logs = logs.filter(work_date__month=self.cleaned_data['month'])
logs = logs.distinct()
if logs:
# If logs exists for given filters
output.append({
'logs': logs,
'duration': logs.aggregate(total=Sum('duration')),
'user': user,
})
return output
......@@ -25,8 +25,8 @@
<div class="row">
<div class="col-12">
<h2 class="mb-2 mt-4">Team Timesheets</h2>
{% for total in totals %}
<h3 class="mb-1">{{ total.user.first_name }} {{ total.user.last_name }}</h3>
{% for user_log in user_logs %}
<h4 class="mb-1">{{ user_log.user.first_name }} {{ user_log.user.last_name }}</h4>
<table class="table">
<thead class="thead-default">
<tr>
......@@ -38,7 +38,7 @@
</tr>
</thead>
<tbody>
{% for log in total.logs %}
{% for log in user_log.logs %}
<tr>
<td>{{ log.work_date }}</td>
<td>{{ log.content }}</td>
......@@ -48,13 +48,13 @@
</tr>
{% endfor %}
<tr>
<td colspan="4"></td>
<td><strong>{{ total.duration.total }}</strong></td>
<td colspan="4" class="text-right">Total:</td>
<td><strong>{{ user_log.duration.total|duration }}</strong></td>
</tr>
</tbody>
</table>
{% empty %}
<h3>Timesheet is empty for this month.</h3>
<p>No logs found.</p>
{% endfor %}
</div>
</div>
......
......@@ -12,7 +12,7 @@ from django.views.generic.detail import DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.views.generic.list import ListView
from .forms import SubsidyForm, LogsMonthlyActiveFilter
from .forms import SubsidyForm, LogsActiveFilter
from .models import Subsidy, WorkLog
from .utils import slug_to_id
......@@ -87,13 +87,13 @@ def timesheets(request):
"""
See an overview per month of all timesheets.
"""
form = LogsMonthlyActiveFilter(request.GET or None)
form = LogsActiveFilter(request.GET or None)
context = {
'form': form,
}
# if form.is_valid():
context['totals'] = form.get_totals()
context['user_logs'] = form.filter()
return render(request, 'finances/timesheets.html', context)
......
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