Time tracking you can host anywhere, built on Django. Full export support in multiple formats and easily extensible.
djangodockerhandcodedpythonself-hostedtime-trackingtimetracker
1import conf.managers
2from django.conf import settings
3from django.db import migrations, models
4import django.db.models.deletion
5import django.db.models.manager
6
7
8class Migration(migrations.Migration):
9
10 initial = True
11
12 dependencies = [
13 ("sites", "0002_alter_domain_unique"),
14 migrations.swappable_dependency(settings.AUTH_USER_MODEL),
15 ]
16
17 operations = [
18 migrations.CreateModel(
19 name="Client",
20 fields=[
21 (
22 "id",
23 models.AutoField(
24 auto_created=True,
25 primary_key=True,
26 serialize=False,
27 verbose_name="ID",
28 ),
29 ),
30 ("name", models.CharField(max_length=255)),
31 ("archive", models.BooleanField(default=False)),
32 ("payment_id", models.CharField(blank=True, max_length=255, null=True)),
33 (
34 "invoice_email",
35 models.EmailField(blank=True, max_length=255, null=True),
36 ),
37 ("sites", models.ManyToManyField(to="sites.Site")),
38 ],
39 options={
40 "default_permissions": ("view", "add", "change", "delete"),
41 "ordering": ["-id"],
42 },
43 managers=[
44 ("objects", django.db.models.manager.Manager()),
45 ("on_site", conf.managers.CurrentSiteManager()),
46 ],
47 ),
48 migrations.CreateModel(
49 name="Entry",
50 fields=[
51 (
52 "id",
53 models.AutoField(
54 auto_created=True,
55 primary_key=True,
56 serialize=False,
57 verbose_name="ID",
58 ),
59 ),
60 ("date", models.DateField(blank=True)),
61 ("duration", models.DurationField(blank=True)),
62 ("note", models.TextField(blank=True, null=True)),
63 ],
64 options={
65 "verbose_name_plural": "Entries",
66 "ordering": ["-date", "-id"],
67 "default_permissions": ("view", "add", "change", "delete"),
68 },
69 managers=[
70 ("objects", django.db.models.manager.Manager()),
71 ("on_site", conf.managers.CurrentSiteManager()),
72 ],
73 ),
74 migrations.CreateModel(
75 name="Invoice",
76 fields=[
77 (
78 "id",
79 models.AutoField(
80 auto_created=True,
81 primary_key=True,
82 serialize=False,
83 verbose_name="ID",
84 ),
85 ),
86 ("created", models.DateTimeField(auto_now_add=True)),
87 ("paid", models.DateTimeField(blank=True, null=True)),
88 (
89 "transaction_id",
90 models.CharField(blank=True, max_length=255, null=True),
91 ),
92 (
93 "client",
94 models.ForeignKey(
95 on_delete=django.db.models.deletion.CASCADE, to="core.Client"
96 ),
97 ),
98 (
99 "entries",
100 models.ManyToManyField(related_name="invoices", to="core.Entry"),
101 ),
102 (
103 "site",
104 models.ForeignKey(
105 default=1,
106 on_delete=django.db.models.deletion.CASCADE,
107 to="sites.Site",
108 ),
109 ),
110 ],
111 options={"default_permissions": ("view", "add", "change", "delete")},
112 managers=[
113 ("objects", django.db.models.manager.Manager()),
114 ("on_site", conf.managers.CurrentSiteManager()),
115 ],
116 ),
117 migrations.CreateModel(
118 name="Project",
119 fields=[
120 (
121 "id",
122 models.AutoField(
123 auto_created=True,
124 primary_key=True,
125 serialize=False,
126 verbose_name="ID",
127 ),
128 ),
129 ("name", models.CharField(max_length=255)),
130 ("archive", models.BooleanField(default=False)),
131 (
132 "estimate",
133 models.DecimalField(
134 blank=True, decimal_places=2, max_digits=10, null=True
135 ),
136 ),
137 (
138 "client",
139 models.ForeignKey(
140 on_delete=django.db.models.deletion.CASCADE,
141 related_name="projects",
142 to="core.Client",
143 ),
144 ),
145 ],
146 options={
147 "default_permissions": ("view", "add", "change", "delete"),
148 "ordering": ["client", "-id"],
149 },
150 ),
151 migrations.CreateModel(
152 name="Task",
153 fields=[
154 (
155 "id",
156 models.AutoField(
157 auto_created=True,
158 primary_key=True,
159 serialize=False,
160 verbose_name="ID",
161 ),
162 ),
163 ("name", models.CharField(max_length=255)),
164 (
165 "hourly_rate",
166 models.DecimalField(
167 blank=True, decimal_places=2, max_digits=10, null=True
168 ),
169 ),
170 ("sites", models.ManyToManyField(to="sites.Site")),
171 ],
172 options={
173 "default_permissions": ("view", "add", "change", "delete"),
174 "ordering": ["-id"],
175 },
176 managers=[
177 ("objects", django.db.models.manager.Manager()),
178 ("on_site", conf.managers.CurrentSiteManager()),
179 ],
180 ),
181 migrations.AddField(
182 model_name="entry",
183 name="project",
184 field=models.ForeignKey(
185 on_delete=django.db.models.deletion.CASCADE,
186 related_name="entries",
187 to="core.Project",
188 ),
189 ),
190 migrations.AddField(
191 model_name="entry",
192 name="site",
193 field=models.ForeignKey(
194 default=1, on_delete=django.db.models.deletion.CASCADE, to="sites.Site"
195 ),
196 ),
197 migrations.AddField(
198 model_name="entry",
199 name="task",
200 field=models.ForeignKey(
201 blank=True,
202 null=True,
203 on_delete=django.db.models.deletion.CASCADE,
204 related_name="entries",
205 to="core.Task",
206 ),
207 ),
208 migrations.AddField(
209 model_name="entry",
210 name="user",
211 field=models.ForeignKey(
212 on_delete=django.db.models.deletion.CASCADE,
213 related_name="entries",
214 to=settings.AUTH_USER_MODEL,
215 ),
216 ),
217 ]