Time tracking you can host anywhere, built on Django. Full export support in multiple formats and easily extensible.
djangodockerhandcodedpythonself-hostedtime-trackingtimetracker
1
2
3
4<!doctype html>
5<html lang="en" class="no-js">
6 <head>
7
8 <meta charset="utf-8">
9 <meta name="viewport" content="width=device-width,initial-scale=1">
10
11 <meta name="description" content="Docs for the Timestrap project.">
12
13
14 <link rel="canonical" href="https://timestrap.bythewood.me/sites/">
15
16
17 <meta name="author" content="Isaac Bythewood">
18
19 <link rel="shortcut icon" href="../assets/images/favicon.png">
20 <meta name="generator" content="mkdocs-1.2.4, mkdocs-material-5.4.0">
21
22
23
24 <title>Sites - Timestrap Docs</title>
25
26
27
28 <link rel="stylesheet" href="../assets/stylesheets/main.fe0cca5b.min.css">
29
30 <link rel="stylesheet" href="../assets/stylesheets/palette.a46bcfb3.min.css">
31
32
33
34
35 <meta name="theme-color" content="#3f51b5">
36
37
38
39
40
41 <link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
42 <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700%7CRoboto+Mono&display=fallback">
43 <style>body,input{font-family:"Roboto",-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono",SFMono-Regular,Consolas,Menlo,monospace}</style>
44
45
46
47
48
49
50
51
52 </head>
53
54
55
56
57
58 <body dir="ltr" data-md-color-scheme="" data-md-color-primary="indigo" data-md-color-accent="indigo">
59
60
61 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
62 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
63 <label class="md-overlay" for="__drawer"></label>
64 <div data-md-component="skip">
65
66
67 <a href="#sites" class="md-skip">
68 Skip to content
69 </a>
70
71 </div>
72 <div data-md-component="announce">
73
74 </div>
75
76 <header class="md-header" data-md-component="header">
77 <nav class="md-header-nav md-grid" aria-label="Header">
78 <a href="https://timestrap.bythewood.me/" title="Timestrap Docs" class="md-header-nav__button md-logo" aria-label="Timestrap Docs">
79
80
81 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 003-3 3 3 0 00-3-3 3 3 0 00-3 3 3 3 0 003 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54z"/></svg>
82
83 </a>
84 <label class="md-header-nav__button md-icon" for="__drawer">
85 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
86 </label>
87 <div class="md-header-nav__title" data-md-component="header-title">
88
89 <div class="md-header-nav__ellipsis">
90 <span class="md-header-nav__topic md-ellipsis">
91 Timestrap Docs
92 </span>
93 <span class="md-header-nav__topic md-ellipsis">
94
95 Sites
96
97 </span>
98 </div>
99
100 </div>
101
102 <label class="md-header-nav__button md-icon" for="__search">
103 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0116 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
104 </label>
105
106<div class="md-search" data-md-component="search" role="dialog">
107 <label class="md-search__overlay" for="__search"></label>
108 <div class="md-search__inner" role="search">
109 <form class="md-search__form" name="search">
110 <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" data-md-state="active">
111 <label class="md-search__icon md-icon" for="__search">
112 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0116 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
113 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
114 </label>
115 <button type="reset" class="md-search__icon md-icon" aria-label="Clear" data-md-component="search-reset" tabindex="-1">
116 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
117 </button>
118 </form>
119 <div class="md-search__output">
120 <div class="md-search__scrollwrap" data-md-scrollfix>
121 <div class="md-search-result" data-md-component="search-result">
122 <div class="md-search-result__meta">
123 Initializing search
124 </div>
125 <ol class="md-search-result__list"></ol>
126 </div>
127 </div>
128 </div>
129 </div>
130</div>
131
132
133 <div class="md-header-nav__source">
134
135<a href="https://github.com/overshard/timestrap/" title="Go to repository" class="md-source">
136 <div class="md-source__icon md-icon">
137
138 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05L244 40.45a28.87 28.87 0 00-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 01-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 000 40.81l195.61 195.6a28.86 28.86 0 0040.8 0l194.69-194.69a28.86 28.86 0 000-40.81z"/></svg>
139 </div>
140 <div class="md-source__repository">
141 overshard/timestrap
142 </div>
143</a>
144 </div>
145
146 </nav>
147</header>
148
149 <div class="md-container" data-md-component="container">
150
151
152
153
154
155
156 <main class="md-main" data-md-component="main">
157 <div class="md-main__inner md-grid">
158
159
160 <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
161 <div class="md-sidebar__scrollwrap">
162 <div class="md-sidebar__inner">
163 <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
164 <label class="md-nav__title" for="__drawer">
165 <a href="https://timestrap.bythewood.me/" title="Timestrap Docs" class="md-nav__button md-logo" aria-label="Timestrap Docs">
166
167
168 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 003-3 3 3 0 00-3-3 3 3 0 00-3 3 3 3 0 003 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54z"/></svg>
169
170 </a>
171 Timestrap Docs
172 </label>
173
174 <div class="md-nav__source">
175
176<a href="https://github.com/overshard/timestrap/" title="Go to repository" class="md-source">
177 <div class="md-source__icon md-icon">
178
179 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05L244 40.45a28.87 28.87 0 00-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 01-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 000 40.81l195.61 195.6a28.86 28.86 0 0040.8 0l194.69-194.69a28.86 28.86 0 000-40.81z"/></svg>
180 </div>
181 <div class="md-source__repository">
182 overshard/timestrap
183 </div>
184</a>
185 </div>
186
187 <ul class="md-nav__list" data-md-scrollfix>
188
189
190
191
192
193
194 <li class="md-nav__item">
195 <a href=".." title="Home" class="md-nav__link">
196 Home
197 </a>
198 </li>
199
200
201
202
203
204
205
206 <li class="md-nav__item">
207 <a href="../screenshots/" title="Screenshots" class="md-nav__link">
208 Screenshots
209 </a>
210 </li>
211
212
213
214
215
216
217
218 <li class="md-nav__item">
219 <a href="../configuration/" title="Configuration" class="md-nav__link">
220 Configuration
221 </a>
222 </li>
223
224
225
226
227
228
229
230 <li class="md-nav__item">
231 <a href="../permissions/" title="Permissions" class="md-nav__link">
232 Permissions
233 </a>
234 </li>
235
236
237
238
239
240
241
242
243
244 <li class="md-nav__item md-nav__item--active">
245
246 <input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
247
248
249
250
251 <label class="md-nav__link md-nav__link--active" for="__toc">
252 Sites
253 <span class="md-nav__icon md-icon">
254 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 9h14V7H3v2m0 4h14v-2H3v2m0 4h14v-2H3v2m16 0h2v-2h-2v2m0-10v2h2V7h-2m0 6h2v-2h-2v2z"/></svg>
255 </span>
256 </label>
257
258 <a href="./" title="Sites" class="md-nav__link md-nav__link--active">
259 Sites
260 </a>
261
262
263<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
264
265
266
267
268
269 <label class="md-nav__title" for="__toc">
270 <span class="md-nav__icon md-icon">
271 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
272 </span>
273 Table of contents
274 </label>
275 <ul class="md-nav__list" data-md-scrollfix>
276
277 <li class="md-nav__item">
278 <a href="#single-site" class="md-nav__link">
279 Single Site
280 </a>
281
282</li>
283
284 <li class="md-nav__item">
285 <a href="#multiple-sites" class="md-nav__link">
286 Multiple Sites
287 </a>
288
289 <nav class="md-nav" aria-label="Multiple Sites">
290 <ul class="md-nav__list">
291
292 <li class="md-nav__item">
293 <a href="#data-sharing" class="md-nav__link">
294 Data Sharing
295 </a>
296
297</li>
298
299 <li class="md-nav__item">
300 <a href="#example-big-project-builders-inc" class="md-nav__link">
301 Example: Big Project Builders, Inc.
302 </a>
303
304</li>
305
306 </ul>
307 </nav>
308
309</li>
310
311 </ul>
312
313</nav>
314
315 </li>
316
317
318
319
320
321
322
323 <li class="md-nav__item">
324 <a href="../uses/" title="Uses" class="md-nav__link">
325 Uses
326 </a>
327 </li>
328
329
330
331
332
333
334
335 <li class="md-nav__item">
336 <a href="../docs/" title="Docs" class="md-nav__link">
337 Docs
338 </a>
339 </li>
340
341
342
343
344
345
346
347 <li class="md-nav__item">
348 <a href="../contributing/" title="Contributing" class="md-nav__link">
349 Contributing
350 </a>
351 </li>
352
353
354
355
356
357
358
359 <li class="md-nav__item">
360 <a href="../license/" title="License" class="md-nav__link">
361 License
362 </a>
363 </li>
364
365
366 </ul>
367</nav>
368 </div>
369 </div>
370 </div>
371
372
373 <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
374 <div class="md-sidebar__scrollwrap">
375 <div class="md-sidebar__inner">
376
377<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
378
379
380
381
382
383 <label class="md-nav__title" for="__toc">
384 <span class="md-nav__icon md-icon">
385 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
386 </span>
387 Table of contents
388 </label>
389 <ul class="md-nav__list" data-md-scrollfix>
390
391 <li class="md-nav__item">
392 <a href="#single-site" class="md-nav__link">
393 Single Site
394 </a>
395
396</li>
397
398 <li class="md-nav__item">
399 <a href="#multiple-sites" class="md-nav__link">
400 Multiple Sites
401 </a>
402
403 <nav class="md-nav" aria-label="Multiple Sites">
404 <ul class="md-nav__list">
405
406 <li class="md-nav__item">
407 <a href="#data-sharing" class="md-nav__link">
408 Data Sharing
409 </a>
410
411</li>
412
413 <li class="md-nav__item">
414 <a href="#example-big-project-builders-inc" class="md-nav__link">
415 Example: Big Project Builders, Inc.
416 </a>
417
418</li>
419
420 </ul>
421 </nav>
422
423</li>
424
425 </ul>
426
427</nav>
428 </div>
429 </div>
430 </div>
431
432
433 <div class="md-content">
434 <article class="md-content__inner md-typeset">
435
436
437 <a href="https://github.com/overshard/timestrap/edit/master/docs/src/sites.md" title="Edit this page" class="md-content__button md-icon">
438 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg>
439 </a>
440
441
442
443
444
445 <h1 id="sites">Sites<a class="headerlink" href="#sites" title="Permanent link">¶</a></h1>
446<p>Timestrap takes advantage of <a href="https://docs.djangoproject.com/en/1.11/ref/contrib/sites/">Django's "sites" framework</a>
447to support running multiple Timestrap "sites" from a single instance of the
448application. This an optional enhancement, and the base Timestrap application
449will work fine as a single site without any advanced configuration.</p>
450<h2 id="single-site">Single Site<a class="headerlink" href="#single-site" title="Permanent link">¶</a></h2>
451<p>Out of the box, Timestrap is a single site using the fake domain <code>time.strap</code>
452and name <code>Timestrap</code>. Both the name and the domain name are configurable on
453the admin.</p>
454<p>Any domain will fall back to the default site, but it is recommended to at
455least set the site domain setting be updated to match the actual site domain
456since emails will use this domain when sending.</p>
457<h2 id="multiple-sites">Multiple Sites<a class="headerlink" href="#multiple-sites" title="Permanent link">¶</a></h2>
458<p>Timestrap supports setting up multiple sites with configurations options
459available on a per-site basis. This functionality may be useful if, for
460example, there is a need to separate departments or functional teams within a
461larger group of organization.</p>
462<p>Sites can be managed by any user with admin access and appropriate permissions:
463either <code>superuser</code> or the various <code>site</code> and <code>conf</code> permissions. Sites are
464based on domain and use two primary settings, <code>domain</code> and <code>name</code> in addition
465to the various configuration options available.</p>
466<h3 id="data-sharing">Data Sharing<a class="headerlink" href="#data-sharing" title="Permanent link">¶</a></h3>
467<p>All Timestrap data will be related to either one or multiple sites.</p>
468<ul>
469<li><strong>Clients</strong> and <strong>Tasks</strong> can be related to <em>multiple</em> sites.</li>
470<li><strong>Entries</strong> can be related to a <em>single</em> site.</li>
471</ul>
472<p>Data with a single-site relationship will automatically be related to the site
473it was entered on. This settings can be changed from the admin site.</p>
474<p>Currently, multiple site relationships can only be controlled from the admin
475site. To use a Client or Task on multiple sites, it must be added to one
476site and then modified in the admin site to be related to additional sites.</p>
477<h3 id="example-big-project-builders-inc">Example: Big Project Builders, Inc.<a class="headerlink" href="#example-big-project-builders-inc" title="Permanent link">¶</a></h3>
478<p>Big Project Builders, Inc. (BPB) uses Timestrap to keep track of its progress
479for various projects & clients. However, with many different teams a single
480Timestrap instance would have <em>a lot</em> of data and it may come difficulty for
481individual employees to keep track of progress. So BPB decides to break the
482instance in to multiple sites -</p>
483<ul>
484<li><strong>timestrap.bpb.io</strong> is the primary instance site, where admin superusers add
485the Clients and Projects that BPB is working on.</li>
486<li><strong>design.timestrap.bpb.io</strong> is used by BPB's designers to assign and track
487graphics and design work for projects.</li>
488<li><strong>development.timestrap.bpb.io</strong> is used by BPB's developers to assign and
489track project development.</li>
490<li><strong>testing.timestrap.bpb.io</strong> is used bu BPB's testing team to record time
491spent executing and reporting on project tests.</li>
492</ul>
493
494
495
496
497
498
499
500 </article>
501 </div>
502 </div>
503 </main>
504
505
506<footer class="md-footer">
507
508 <div class="md-footer-nav">
509 <nav class="md-footer-nav__inner md-grid" aria-label="Footer">
510
511 <a href="../permissions/" title="Permissions" class="md-footer-nav__link md-footer-nav__link--prev" rel="prev">
512 <div class="md-footer-nav__button md-icon">
513 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
514 </div>
515 <div class="md-footer-nav__title">
516 <div class="md-ellipsis">
517 <span class="md-footer-nav__direction">
518 Previous
519 </span>
520 Permissions
521 </div>
522 </div>
523 </a>
524
525
526 <a href="../uses/" title="Uses" class="md-footer-nav__link md-footer-nav__link--next" rel="next">
527 <div class="md-footer-nav__title">
528 <div class="md-ellipsis">
529 <span class="md-footer-nav__direction">
530 Next
531 </span>
532 Uses
533 </div>
534 </div>
535 <div class="md-footer-nav__button md-icon">
536 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4z"/></svg>
537 </div>
538 </a>
539
540 </nav>
541 </div>
542
543 <div class="md-footer-meta md-typeset">
544 <div class="md-footer-meta__inner md-grid">
545 <div class="md-footer-copyright">
546
547 <div class="md-footer-copyright__highlight">
548 Copyright © 2019 Isaac Bythewood
549 </div>
550
551 Made with
552 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
553 Material for MkDocs
554 </a>
555 </div>
556
557 </div>
558 </div>
559</footer>
560
561 </div>
562
563 <script src="../assets/javascripts/vendor.d710d30a.min.js"></script>
564 <script src="../assets/javascripts/bundle.b39636ac.min.js"></script><script id="__lang" type="application/json">{"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents"}</script>
565
566 <script>
567 app = initialize({
568 base: "..",
569 features: [],
570 search: Object.assign({
571 worker: "../assets/javascripts/worker/search.a68abb33.min.js"
572 }, typeof search !== "undefined" && search)
573 })
574 </script>
575
576
577 </body>
578</html>