SciPost Code Repository

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

Add finance format

parent 6ce4029c
No related branches found
No related tags found
No related merge requests found
......@@ -10,6 +10,7 @@ from django.db.models import Sum
from django.utils import timezone
from ajax_select.fields import AutoCompleteSelectField
from dateutil.rrule import rrule, MONTHLY
from common.forms import MonthYearWidget
from scipost.fields import UserModelChoiceField
......@@ -54,12 +55,9 @@ class LogsFilter(forms.Form):
employee = UserModelChoiceField(
queryset=get_user_model().objects.filter(work_logs__isnull=False).distinct(),
required=False)
required=False, empty_label='Show all')
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):
super().__init__(*args, **kwargs)
......@@ -67,7 +65,16 @@ class LogsFilter(forms.Form):
self.initial['start'] = today.today()
self.initial['end'] = today.today()
def filter(self):
def clean(self):
data = super().clean()
data['months'] = [dt for dt in rrule(MONTHLY, dtstart=data['start'], until=data['end'])]
return data
def get_months(self):
return self.cleaned_data['months']
def filter_per_month(self):
"""Filter work logs and return in convenient format."""
output = []
if self.is_valid():
......@@ -81,14 +88,13 @@ class LogsFilter(forms.Form):
output = []
for user in user_qs:
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')),
'logs': [],
'user': user,
})
for dt in self.get_months():
output[-1]['logs'].append(
user.work_logs.filter(
work_date__year=dt.year, work_date__month=dt.month).aggregate(total=Sum('duration'))['total'])
return output
......@@ -20,7 +20,19 @@
<br>
<form method="get">
{{ form|bootstrap }}
{{form.employee|bootstrap }}
<label>Date from</label>
<div class="form-row">
{{ form.start }}
</div>
<label>Date until</label>
<div class="form-row">
{{ form.end }}
</div>
<br>
<input type="submit" class="btn btn-primary" value="Filter">
</form>
</div>
......@@ -28,38 +40,34 @@
<div class="row">
<div class="col-12">
<h2 class="mb-2 mt-4">Team timesheets</h2>
{% for user_log in user_logs %}
{% if form.is_bound %}
<h2 class="mb-2 mt-4">Team timesheets</h2>
<h4 class="mb-1">{{ user_log.user.first_name }} {{ user_log.user.last_name }}</h4>
<table class="table">
<thead class="thead-default">
<tr>
<th>Date</th>
<th>Related to object</th>
<th>Log type</th>
<th>Comments</th>
<th>Duration</th>
<th>Employee</th>
{% for month in form.get_months %}
<th>{{ month|date:'N Y' }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for log in user_log.logs %}
{% for user_log in form.filter %}
<tr>
<td>{{ log.work_date }}</td>
<td>{{ log.content }}</td>
<td>{{ log.log_type }}</td>
<td>{{ log.comments }}</td>
<td>{{ log.duration|duration }}</td>
<td>{{ user_log.user.last_name }}, {{ user_log.user.first_name }}</td>
{% for log in user_log.logs %}
<td>{{ log|duration }}</td>
{% endfor %}
</tr>
{% empty %}
<tr><td colspan="5">No logs found.</td></tr>
{% endfor %}
<tr>
<td colspan="4" class="text-right">Total:</td>
<td><strong>{{ user_log.duration.total|duration }}</strong></td>
</tr>
</tbody>
</table>
{% empty %}
<p>No logs found.</p>
{% endfor %}
{% else %}
<p class="text-danger">First submit the filter form to retrieve results.</p>
{% endif %}
</div>
</div>
{% endblock %}
......@@ -19,7 +19,19 @@
<br>
<form method="get">
{{ form|bootstrap }}
{{form.employee|bootstrap }}
<label>Date from</label>
<div class="form-row">
{{ form.start }}
</div>
<label>Date until</label>
<div class="form-row">
{{ form.end }}
</div>
<br>
<input type="submit" class="btn btn-primary" value="Filter">
</form>
</div>
......@@ -27,38 +39,42 @@
<div class="row">
<div class="col-12">
<h2 class="mb-2 mt-4">Team timesheets</h2>
{% 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">
<tr>
<th>Date</th>
<th>Related to object</th>
<th>Log type</th>
<th>Comments</th>
<th>Duration</th>
</tr>
</thead>
<tbody>
{% for log in user_log.logs %}
{% if form.is_bound %}
<h2 class="mb-2 mt-4">Team timesheets</h2>
{% 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">
<tr>
<th>Date</th>
<th>Related to object</th>
<th>Log type</th>
<th>Comments</th>
<th>Duration</th>
</tr>
</thead>
<tbody>
{% for log in user_log.logs %}
<tr>
<td>{{ log.work_date }}</td>
<td>{{ log.content }}</td>
<td>{{ log.log_type }}</td>
<td>{{ log.comments }}</td>
<td>{{ log.duration|duration }}</td>
</tr>
{% endfor %}
<tr>
<td>{{ log.work_date }}</td>
<td>{{ log.content }}</td>
<td>{{ log.log_type }}</td>
<td>{{ log.comments }}</td>
<td>{{ log.duration|duration }}</td>
<td colspan="4" class="text-right">Total:</td>
<td><strong>{{ user_log.duration.total|duration }}</strong></td>
</tr>
{% endfor %}
<tr>
<td colspan="4" class="text-right">Total:</td>
<td><strong>{{ user_log.duration.total|duration }}</strong></td>
</tr>
</tbody>
</table>
{% empty %}
<p>No logs found.</p>
{% endfor %}
</tbody>
</table>
{% empty %}
<p>No logs found.</p>
{% endfor %}
{% else %}
<p class="text-danger">First submit the filter form to retrieve results.</p>
{% endif %}
</div>
</div>
{% endblock %}
......@@ -44,7 +44,7 @@ Whoosh==2.7.4 # Directly related to Haystack.
# Python Utils
ithenticate-api-python==0.8
mailchimp3==2.0.15
python-dateutil==2.6.0 # Doesn't Django have this functionality built-in? -- JdW
python-dateutil==2.6.0
Pillow==3.4.2 # Latest version is v4.2.1; need to know about usage before upgrade. -- JdW
html2text
......
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