From 6ce4029cce35e5928d1c9492e29438a7ee8994d2 Mon Sep 17 00:00:00 2001 From: Jorran de Wit <jorrandewit@outlook.com> Date: Tue, 29 Jan 2019 08:19:36 +0100 Subject: [PATCH] Prepare old code --- finances/forms.py | 66 +++++++++---------- finances/templates/finances/timesheets.html | 16 +++-- .../finances/timesheets_detailed.html | 3 +- finances/urls.py | 51 ++++---------- finances/views.py | 20 +++--- 5 files changed, 64 insertions(+), 92 deletions(-) diff --git a/finances/forms.py b/finances/forms.py index 424dd0f0c..348c7b0fb 100644 --- a/finances/forms.py +++ b/finances/forms.py @@ -1,6 +1,7 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)" __license__ = "AGPL v3" +import datetime from django import forms from django.contrib.auth import get_user_model @@ -10,12 +11,11 @@ from django.utils import timezone from ajax_select.fields import AutoCompleteSelectField +from common.forms import MonthYearWidget from scipost.fields import UserModelChoiceField from .models import Subsidy, WorkLog -today = timezone.now().date() - class SubsidyForm(forms.ModelForm): organization = AutoCompleteSelectField('organization_lookup') @@ -47,54 +47,48 @@ class WorkLogForm(forms.ModelForm): } -class LogsActiveFilter(forms.Form): +class LogsFilter(forms.Form): """ Filter work logs given the requested date range and users. """ employee = UserModelChoiceField( - queryset=get_user_model().objects.filter(work_logs__isnull=False).distinct(), 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))]) + queryset=get_user_model().objects.filter(work_logs__isnull=False).distinct(), + required=False) + start = forms.DateField(widget=MonthYearWidget(required=True), required=True) # Month + end = forms.DateField(widget=MonthYearWidget(required=True, end=True), required=True) # Month + # 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): - if not kwargs.get('data', False) and not args[0]: - args = list(args) - args[0] = { - 'month': today.month, - 'year': today.year - } - args = tuple(args) - kwargs['initial'] = { - 'month': today.month, - 'year': today.year - } super().__init__(*args, **kwargs) + today = timezone.now().date() + self.initial['start'] = today.today() + self.initial['end'] = today.today() def filter(self): - """Filter work logs and return in output-convenient format.""" + """Filter work logs and return in convenient format.""" output = [] if self.is_valid(): - user_qs = get_user_model().objects.filter( - work_logs__isnull=False, work_logs__work_date__year=self.cleaned_data['year']) 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() + user_qs = get_user_model().objects.filter(id=self.cleaned_data['employee'].id) + else: + user_qs = get_user_model().objects.filter(work_logs__isnull=False) + user_qs = user_qs.filter( + work_logs__work_date__gte=self.cleaned_data['start'], + work_logs__work_date__lte=self.cleaned_data['end']).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, - }) + logs = user.work_logs.filter( + work_date__gte=self.cleaned_data['start'], + work_date__lte=self.cleaned_data['end']).distinct() + + # If logs exists for given filters + output.append({ + 'logs': logs, + 'duration': logs.aggregate(total=Sum('duration')), + 'user': user, + }) return output diff --git a/finances/templates/finances/timesheets.html b/finances/templates/finances/timesheets.html index 1c616cd18..a776c4f6d 100644 --- a/finances/templates/finances/timesheets.html +++ b/finances/templates/finances/timesheets.html @@ -1,10 +1,11 @@ -{% extends 'scipost/base.html' %} +{% extends 'finances/base.html' %} {% block breadcrumb_items %} - <span class="breadcrumb-item">Team Timesheets</span> + {{ block.super }} + <span class="breadcrumb-item">Team timesheets</span> {% endblock %} -{% block pagetitle %}: Team Timesheets{% endblock pagetitle %} +{% block pagetitle %}: Team timesheets{% endblock pagetitle %} {% load bootstrap %} {% load scipost_extras %} @@ -13,9 +14,12 @@ <div class="row"> <div class="col-12"> - <h1 class="highlight">Team Timesheets</h1> + <h1 class="highlight">Timesheets</h1> + <a href="{% url 'finances:timesheets_detailed' %}">See detailed timesheets</a> + <br> + <br> - <form method="get" action="{% url 'finances:timesheets' %}"> + <form method="get"> {{ form|bootstrap }} <input type="submit" class="btn btn-primary" value="Filter"> </form> @@ -24,7 +28,7 @@ <div class="row"> <div class="col-12"> - <h2 class="mb-2 mt-4">Team Timesheets</h2> + <h2 class="mb-2 mt-4">Team timesheets</h2> {% for user_log in user_logs %} <h4 class="mb-1">{{ user_log.user.first_name }} {{ user_log.user.last_name }}</h4> <table class="table"> diff --git a/finances/templates/finances/timesheets_detailed.html b/finances/templates/finances/timesheets_detailed.html index 5c27a4338..f03dd4944 100644 --- a/finances/templates/finances/timesheets_detailed.html +++ b/finances/templates/finances/timesheets_detailed.html @@ -16,6 +16,7 @@ <div class="row"> <div class="col-12"> <h1 class="highlight">Detailed timesheets</h1> + <br> <form method="get"> {{ form|bootstrap }} @@ -27,7 +28,7 @@ <div class="row"> <div class="col-12"> <h2 class="mb-2 mt-4">Team timesheets</h2> - {% for user_log in user_logs %} + {% for user_log in form.filter %} <h4 class="mb-1">{{ user_log.user.first_name }} {{ user_log.user.last_name }}</h4> <table class="table"> <thead class="thead-default"> diff --git a/finances/urls.py b/finances/urls.py index 218eca065..31bd7da08 100644 --- a/finances/urls.py +++ b/finances/urls.py @@ -8,48 +8,19 @@ from django.views.generic import TemplateView from . import views urlpatterns = [ - url( - r'^$', - TemplateView.as_view(template_name='finances/finances.html'), - name='finances' - ), + url(r'^$', TemplateView.as_view(template_name='finances/finances.html'), name='finances'), # Subsidies - url( - r'^subsidies/$', - views.SubsidyListView.as_view(), - name='subsidies' - ), - url( - r'^subsidies/add/$', - views.SubsidyCreateView.as_view(), - name='subsidy_create' - ), - url( - r'^subsidies/(?P<pk>[0-9]+)/update/$', - views.SubsidyUpdateView.as_view(), - name='subsidy_update' - ), - url( - r'^subsidies/(?P<pk>[0-9]+)/delete/$', - views.SubsidyDeleteView.as_view(), - name='subsidy_delete' - ), - url( - r'^subsidies/(?P<pk>[0-9]+)/$', - views.SubsidyDetailView.as_view(), - name='subsidy_details' - ), + url(r'^subsidies/$', views.SubsidyListView.as_view(), name='subsidies'), + url(r'^subsidies/add/$', views.SubsidyCreateView.as_view(), name='subsidy_create'), + url(r'^subsidies/(?P<pk>[0-9]+)/update/$', views.SubsidyUpdateView.as_view(), + name='subsidy_update'), + url(r'^subsidies/(?P<pk>[0-9]+)/delete/$', views.SubsidyDeleteView.as_view(), + name='subsidy_delete'), + url(r'^subsidies/(?P<pk>[0-9]+)/$', views.SubsidyDetailView.as_view(), name='subsidy_details'), # Timesheets - url( - r'^timesheets$', - views.timesheets, - name='timesheets' - ), - url( - r'^logs/(?P<slug>\d+)/delete$', - views.LogDeleteView.as_view(), - name='log_delete' - ), + url(r'^timesheets$', views.timesheets, name='timesheets'), + url(r'^timesheets/detailed$', views.timesheets_detailed, name='timesheets_detailed'), + url(r'^logs/(?P<slug>\d+)/delete$', views.LogDeleteView.as_view(), name='log_delete'), ] diff --git a/finances/views.py b/finances/views.py index 25945357a..90f6c2103 100644 --- a/finances/views.py +++ b/finances/views.py @@ -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, LogsActiveFilter +from .forms import SubsidyForm, LogsFilter from .models import Subsidy, WorkLog from .utils import slug_to_id @@ -85,17 +85,19 @@ class SubsidyDetailView(DetailView): @permission_required('scipost.can_view_timesheets', raise_exception=True) def timesheets(request): """ - See an overview per month of all timesheets. + Overview of all timesheets including comments and related objects. """ - form = LogsActiveFilter(request.GET or None) - context = { - 'form': form, - } + form = LogsFilter(request.GET or None) + context = {'form': form} + return render(request, 'finances/timesheets.html', context) - # if form.is_valid(): - context['user_logs'] = form.filter() - return render(request, 'finances/timesheets.html', context) +@permission_required('scipost.can_view_timesheets', raise_exception=True) +def timesheets_detailed(request): + """Overview of all timesheets. """ + form = LogsFilter(request.GET or None) + context = {'form': form} + return render(request, 'finances/timesheets_detailed.html', context) class LogDeleteView(LoginRequiredMixin, DeleteView): -- GitLab