|
16 | 16 | User = get_user_model() |
17 | 17 |
|
18 | 18 |
|
19 | | -class DefaultProjectCover(models.Model): |
| 19 | +class AbstractDefaultProjectImage(models.Model): |
20 | 20 | """ |
21 | | - Default cover model for projects, is chosen randomly at project creation |
22 | | -
|
23 | | - Attributes: |
24 | | - image: A ForeignKey referencing the image of the cover. |
25 | | - datetime_created: A DateTimeField indicating date of creation. |
26 | | - datetime_updated: A DateTimeField indicating date of update. |
| 21 | + Абстрактная модель для хранения изображений проекта по умолчанию. |
27 | 22 | """ |
28 | 23 |
|
29 | 24 | image = models.ForeignKey( |
30 | 25 | UserFile, |
31 | 26 | on_delete=models.CASCADE, |
32 | | - related_name="default_covers", |
33 | 27 | null=True, |
34 | 28 | blank=True, |
35 | 29 | ) |
| 30 | + datetime_created = models.DateTimeField(auto_now_add=True) |
| 31 | + datetime_updated = models.DateTimeField(auto_now=True) |
36 | 32 |
|
37 | | - datetime_created = models.DateTimeField( |
38 | | - verbose_name="Дата создания", |
39 | | - null=False, |
40 | | - auto_now_add=True, |
41 | | - ) |
42 | | - datetime_updated = models.DateTimeField( |
43 | | - verbose_name="Дата изменения", |
44 | | - null=False, |
45 | | - auto_now=True, |
46 | | - ) |
| 33 | + class Meta: |
| 34 | + abstract = True |
47 | 35 |
|
48 | 36 | @classmethod |
49 | | - def get_random_file(cls): |
50 | | - # FIXME: this is not efficient, but for ~10 default covers it should be ok |
51 | | - return cls.objects.order_by("?").first().image |
| 37 | + def get_random_file(cls) -> Optional[UserFile]: |
| 38 | + if not cls.objects.exists(): |
| 39 | + return None |
| 40 | + obj = cls.objects.order_by("?").first() |
| 41 | + return obj.image if obj and obj.image else None |
52 | 42 |
|
53 | 43 | @classmethod |
54 | | - def get_random_file_link(cls): |
55 | | - # FIXME: this is not efficient, but for ~10 default covers it should be ok |
56 | | - return ( |
57 | | - cls.objects.order_by("?").first().image.link |
58 | | - if cls.objects.order_by("?").first().image |
59 | | - else None |
60 | | - ) |
| 44 | + def get_random_file_link(cls) -> Optional[str]: |
| 45 | + file = cls.get_random_file() |
| 46 | + return file.link if file else None |
61 | 47 |
|
| 48 | + |
| 49 | +class DefaultProjectCover(AbstractDefaultProjectImage): |
62 | 50 | class Meta: |
63 | 51 | verbose_name = "Обложка проекта" |
64 | 52 | verbose_name_plural = "Обложки проектов" |
65 | 53 |
|
66 | 54 |
|
| 55 | +class DefaultProjectAvatar(AbstractDefaultProjectImage): |
| 56 | + class Meta: |
| 57 | + verbose_name = "Аватарка проекта" |
| 58 | + verbose_name_plural = "Аватарки проектов" |
| 59 | + |
| 60 | + |
67 | 61 | class Project(models.Model): |
68 | 62 | """ |
69 | 63 | Project model |
@@ -193,9 +187,13 @@ def __str__(self): |
193 | 187 | return f"Project<{self.id}> - {self.name}" |
194 | 188 |
|
195 | 189 | def save(self, *args, **kwargs): |
196 | | - """Set random cover image if `cover_image_address` blank.""" |
197 | | - if self.cover_image_address is None: |
| 190 | + """Set random cover and avatar images if not provided.""" |
| 191 | + if not self.cover_image_address: |
198 | 192 | self.cover_image_address = DefaultProjectCover.get_random_file_link() |
| 193 | + |
| 194 | + if not self.image_address: |
| 195 | + self.image_address = DefaultProjectAvatar.get_random_file_link() |
| 196 | + |
199 | 197 | super().save(*args, **kwargs) |
200 | 198 |
|
201 | 199 | class Meta: |
|
0 commit comments