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.7 KB · 52 lines · Python Raw History
 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        )