repos
/ timestrap-django master

timestrap-django

mirror archived upstream

Time tracking you can host anywhere, built on Django. Full export support in multiple formats and easily extensible.

djangodockerhandcodedpythonself-hostedtime-trackingtimetracker

1.8 KB · 54 lines · Python Raw History
 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