Time tracking you can host anywhere, built on Django. Full export support in multiple formats and easily extensible.
djangodockerhandcodedpythonself-hostedtime-trackingtimetracker
1from django.contrib.auth.models import User, Permission
2
3from rest_framework import viewsets, permissions, filters
4import django_filters
5
6from core.models import Client, Project, Entry, Task
7from .serializers import (
8 UserSerializer,
9 ClientSerializer,
10 PermissionSerializer,
11 ProjectSerializer,
12 EntrySerializer,
13 TaskSerializer,
14)
15from .pagination import LimitOffsetPaginationWithTotals
16
17
18class UserViewSet(viewsets.ModelViewSet):
19 queryset = User.objects.all()
20 serializer_class = UserSerializer
21 pagination_class = None
22
23 def get_permissions(self):
24 # Prevent rest_framework from checking for the "view" perm.
25 return (permissions.IsAuthenticated(),)
26
27 def get_queryset(self):
28 if self.request.user.is_superuser:
29 queryset = User.objects.all()
30 else:
31 queryset = User.objects.filter(id=self.request.user.id)
32 return queryset
33
34
35class PermissionViewSet(viewsets.ModelViewSet):
36 queryset = Permission.objects.all()
37 serializer_class = PermissionSerializer
38 pagination_class = None
39
40 def get_permissions(self):
41 # Prevent rest_framework from checking for the "view" perm.
42 return (permissions.IsAuthenticated(),)
43
44 def get_queryset(self):
45 if self.request.user.is_superuser:
46 queryset = Permission.objects.all()
47 else:
48 queryset = Permission.objects.filter(user=self.request.user)
49 return queryset
50
51
52class ClientViewSet(viewsets.ModelViewSet):
53 queryset = Client.on_site.filter(archive=False)
54 serializer_class = ClientSerializer
55 pagination_class = None
56 filter_fields = ("id",)
57
58 def get_queryset(self):
59 return Client.on_site.all()
60
61
62class ProjectViewSet(viewsets.ModelViewSet):
63 queryset = Project.objects.filter(archive=False)
64 serializer_class = ProjectSerializer
65 pagination_class = None
66 filter_fields = ("id", "client")
67
68
69class EntryFilter(django_filters.rest_framework.FilterSet):
70 min_date = django_filters.DateFilter(field_name="date", lookup_expr="gte")
71 max_date = django_filters.DateFilter(field_name="date", lookup_expr="lte")
72
73 class Meta:
74 model = Entry
75 fields = ("id", "date", "user", "task", "project", "project__client")
76
77
78class EntryViewSet(viewsets.ModelViewSet):
79 queryset = Entry.objects.all()
80 serializer_class = EntrySerializer
81 pagination_class = LimitOffsetPaginationWithTotals
82 filter_class = EntryFilter
83 filter_backends = (
84 filters.SearchFilter,
85 django_filters.rest_framework.DjangoFilterBackend,
86 filters.OrderingFilter,
87 )
88 ordering_fields = (
89 "date",
90 "user__username",
91 "task__name",
92 "project__name",
93 "project__client__name",
94 )
95 ordering = ("-date", "-id")
96 search_fields = (
97 "id",
98 "date",
99 "note",
100 "user__username",
101 "task__name",
102 "project__name",
103 "project__client__name",
104 )
105
106 def get_queryset(self):
107 return Entry.on_site.all()
108
109
110class TaskViewSet(viewsets.ModelViewSet):
111 queryset = Task.objects.all()
112 serializer_class = TaskSerializer
113 pagination_class = None
114
115 def get_queryset(self):
116 return Task.on_site.all()