Time tracking you can host anywhere, built on Django. Full export support in multiple formats and easily extensible.
djangodockerhandcodedpythonself-hostedtime-trackingtimetracker
1from collections import OrderedDict
2
3from django.db.models import Sum
4
5from rest_framework.pagination import LimitOffsetPagination
6from rest_framework.response import Response
7
8from core.utils import duration_decimal
9
10
11class LimitOffsetPaginationWithTotals(LimitOffsetPagination):
12 total_duration = None
13 subtotal_duration = None
14
15 def paginate_queryset(self, queryset, request, view=None):
16 self.total_duration = queryset.aggregate(Sum("duration"))["duration__sum"]
17
18 self.limit = self.get_limit(request)
19 if self.limit is None:
20 return None
21
22 self.offset = self.get_offset(request)
23 try:
24 self.count = queryset.count()
25 except (AttributeError, TypeError):
26 self.count = len(queryset)
27 self.request = request
28 if self.count > self.limit and self.template is not None:
29 self.display_page_controls = True
30
31 if self.count == 0 or self.offset > self.count:
32 return []
33
34 queryset = queryset[self.offset : self.offset + self.limit] # noqa: E203
35 self.subtotal_duration = queryset.aggregate(Sum("duration"))["duration__sum"]
36
37 return list(queryset)
38
39 def get_paginated_response(self, data):
40 return Response(
41 OrderedDict(
42 [
43 ("count", self.count),
44 ("next", self.get_next_link()),
45 ("previous", self.get_previous_link()),
46 ("total_duration", duration_decimal(self.total_duration)),
47 ("subtotal_duration", duration_decimal(self.subtotal_duration)),
48 ("results", data),
49 ]
50 )
51 )