|
| 1 | +import textwrap |
| 2 | +import typing |
| 3 | + |
1 | 4 | from django.db import models |
| 5 | +from django.db.models.functions import Now |
| 6 | +from django.utils.translation import gettext_lazy as _ |
2 | 7 |
|
3 | 8 | from apps.common.models import UserResource |
4 | | - |
5 | | -# from apps.user.models import User |
6 | | - |
7 | | - |
8 | | -# class DailyUserStandup(models.Model): |
9 | | -# user = models.ForeignKey(User, on_delete=models.CASCADE) |
10 | | -# date = models.DateField() |
11 | | - |
12 | | -# slack_thread_id = models.CharField(max_length=200) # TODO: Check length |
13 | | -# text = models.TextField() # TODO: Do we need this? |
| 9 | +from apps.user.models import User |
14 | 10 |
|
15 | 11 |
|
16 | 12 | class Quote(UserResource): |
17 | 13 | text = models.TextField() |
18 | 14 | author = models.CharField(max_length=225) |
19 | 15 | last_viewed = models.DateTimeField(null=True, blank=True) |
| 16 | + |
| 17 | + @classmethod |
| 18 | + def get_random_quote(cls, track_last_viewed=False) -> typing.Self | None: |
| 19 | + quote = cls.objects.order_by( |
| 20 | + models.F("last_viewed").asc(nulls_first=True), |
| 21 | + ).first() |
| 22 | + if quote and track_last_viewed: |
| 23 | + cls.objects.filter(pk=quote.pk).update(last_viewed=Now()) |
| 24 | + return quote |
| 25 | + |
| 26 | + @typing.override |
| 27 | + def __str__(self): |
| 28 | + _text = textwrap.shorten(self.text, width=20, placeholder="...") |
| 29 | + return f"Quote: {self.author} - {_text}" |
| 30 | + |
| 31 | + |
| 32 | +# TODO: Add created_at, created_by, modified_by, modified_at |
| 33 | +class DailyUserStandup(models.Model): |
| 34 | + date = models.DateField(unique=True) |
| 35 | + |
| 36 | + quote = models.ForeignKey(Quote, on_delete=models.SET_NULL, null=True, blank=True) |
| 37 | + |
| 38 | + conductor = models.ForeignKey( |
| 39 | + User, |
| 40 | + help_text=_("User responsible for conducting the stand-up"), |
| 41 | + related_name="+", |
| 42 | + on_delete=models.SET_NULL, |
| 43 | + null=True, |
| 44 | + blank=True, |
| 45 | + ) |
| 46 | + fallback_conductor = models.ForeignKey( |
| 47 | + User, |
| 48 | + help_text=_("Fallback user when conductor is not available"), |
| 49 | + related_name="+", |
| 50 | + on_delete=models.SET_NULL, |
| 51 | + null=True, |
| 52 | + blank=True, |
| 53 | + ) |
| 54 | + |
| 55 | + slack_thread_ts = models.CharField(max_length=20, null=True, blank=True) |
| 56 | + |
| 57 | + # typing hints |
| 58 | + quote_id: int | None |
| 59 | + conductor_id: int | None |
| 60 | + fallback_conductor_id: int | None |
| 61 | + |
| 62 | + @typing.override |
| 63 | + def __str__(self): |
| 64 | + return str(self.date) |
0 commit comments