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