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 serializers
4
5from core.models import Client, Project, Entry
6from core.fields import DurationField
7
8from core.models import Task
9
10
11class PermissionSerializer(serializers.HyperlinkedModelSerializer):
12 class Meta:
13 model = Permission
14 fields = ("id", "url", "name", "codename")
15
16
17class UserSerializer(serializers.HyperlinkedModelSerializer):
18 perms = serializers.SerializerMethodField()
19
20 class Meta:
21 model = User
22 fields = (
23 "id",
24 "url",
25 "username",
26 "is_active",
27 "is_staff",
28 "is_superuser",
29 "perms",
30 # "groups",
31 )
32
33 def get_perms(self, obj):
34 perms = {}
35 if obj.is_superuser:
36 queryset = Permission.objects.all()
37 else:
38 queryset = Permission.objects.filter(user=obj)
39 for perm in queryset.values():
40 perms[perm["codename"]] = perm
41 return perms
42
43
44class ClientSerializer(serializers.HyperlinkedModelSerializer):
45 total_projects = serializers.SerializerMethodField()
46 total_duration = serializers.SerializerMethodField()
47
48 class Meta:
49 model = Client
50 fields = (
51 "id",
52 "url",
53 "name",
54 "payment_id",
55 "archive",
56 "total_projects",
57 "total_duration",
58 )
59
60 def get_queryset(self):
61 queryset = super().get_queryset()
62 return queryset.filter(archive=False)
63
64 def get_total_projects(self, obj):
65 return obj.get_total_projects()
66
67 def get_total_duration(self, obj):
68 return obj.get_total_duration()
69
70
71class ProjectSerializer(serializers.HyperlinkedModelSerializer):
72 total_entries = serializers.SerializerMethodField()
73 total_duration = serializers.SerializerMethodField()
74 percent_done = serializers.SerializerMethodField()
75
76 class Meta:
77 model = Project
78 fields = (
79 "id",
80 "url",
81 "client",
82 "name",
83 "archive",
84 "estimate",
85 "total_entries",
86 "total_duration",
87 "percent_done",
88 )
89
90 def get_queryset(self):
91 queryset = super().get_queryset()
92 return queryset.filter(archive=False)
93
94 def get_total_entries(self, obj):
95 return obj.get_total_entries()
96
97 def get_total_duration(self, obj):
98 return obj.get_total_duration()
99
100 def get_percent_done(self, obj):
101 return obj.get_percent_done()
102
103
104class TaskSerializer(serializers.HyperlinkedModelSerializer):
105 class Meta:
106 model = Task
107 fields = ("id", "url", "name", "hourly_rate")
108
109
110class EntrySerializer(serializers.HyperlinkedModelSerializer):
111 duration = DurationField()
112
113 class Meta:
114 model = Entry
115 fields = (
116 "id",
117 "url",
118 "project",
119 "task",
120 "user",
121 "date",
122 "duration",
123 "datetime_start",
124 "datetime_end",
125 "note",
126 )