Time tracking you can host anywhere, built on Django. Full export support in multiple formats and easily extensible.
djangodockerhandcodedpythonself-hostedtime-trackingtimetracker
1from django.views import View
2from django.views.generic.base import TemplateView
3from django.contrib.auth.mixins import LoginRequiredMixin
4from django.http import HttpResponse, HttpResponseForbidden
5from django.template.defaultfilters import slugify
6
7from .admin import EntryResource
8from .models import Entry
9
10
11class AppView(LoginRequiredMixin, TemplateView):
12 template_name = "core/app.html"
13
14
15class ReportExportView(LoginRequiredMixin, View):
16 def get(self, request):
17 if not request.user.is_staff:
18 return HttpResponseForbidden("Not enough permissions to export.")
19
20 query_dict = request.GET.copy()
21 filters = {}
22 filter_dict = {
23 "min_date": "date__gte",
24 "max_date": "date__lte",
25 "project": "project",
26 "user": "user",
27 "task": "task",
28 "project__client": "project__client",
29 }
30 for key in request.GET:
31 value = request.GET.get(key)
32 if value and key in filter_dict:
33 filters[filter_dict[key]] = value
34
35 if filters:
36 queryset = Entry.objects.filter(**filters)
37 dataset = EntryResource().export(queryset)
38 else:
39 queryset = Entry.objects.all()
40 dataset = EntryResource().export(queryset)
41
42 allowed_formats = ["csv", "xls", "tsv", "ods", "json", "yaml", "html"]
43 export_format = query_dict.get("export_format", "csv")
44 if export_format not in allowed_formats:
45 export_format = "csv"
46
47 filename = "report" + slugify(filters) + "." + export_format
48
49 response = HttpResponse(
50 getattr(dataset, export_format), content_type="text/" + export_format
51 )
52 response["Content-Disposition"] = 'attachment; filename="{0}"'.format(filename)
53 return response