@@ -50,6 +50,11 @@ def get_random_file(cls):
5050 # FIXME: this is not efficient, but for ~10 default covers it should be ok
5151 return cls .objects .order_by ("?" ).first ().image
5252
53+ @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 cls .objects .order_by ("?" ).first ().image .link if cls .objects .order_by ("?" ).first ().image else None
57+
5358 class Meta :
5459 verbose_name = "Обложка проекта"
5560 verbose_name_plural = "Обложки проектов"
@@ -71,6 +76,7 @@ class Project(models.Model):
7176 leader: A ForeignKey referring to the User model.
7277 draft: A boolean indicating if Project is a draft.
7378 is_company: A boolean indicating if Project is a company.
79+ cover_image_address: A URLField cover image URL address.
7480 cover: A ForeignKey referring to the UserFile model, which is the image cover of the project.
7581 datetime_created: A DateTimeField indicating date of creation.
7682 datetime_updated: A DateTimeField indicating date of update.
@@ -101,6 +107,14 @@ class Project(models.Model):
101107 draft = models .BooleanField (blank = False , default = True )
102108 is_company = models .BooleanField (null = False , default = False )
103109
110+ cover_image_address = models .URLField (
111+ null = True ,
112+ blank = True ,
113+ default = DefaultProjectCover .get_random_file_link ,
114+ help_text = "If left blank, will set a link to the image from the 'Обложки проектов'" ,
115+ )
116+
117+ # TODO DELETE (deprecated field) after full migrate `cover_image_address`.
104118 cover = models .ForeignKey (
105119 UserFile ,
106120 default = DefaultProjectCover .get_random_file ,
@@ -136,6 +150,12 @@ def get_collaborators_user_list(self) -> list[User]:
136150 def __str__ (self ):
137151 return f"Project<{ self .id } > - { self .name } "
138152
153+ def save (self , * args , ** kwargs ):
154+ """Set random cover image if `cover_image_address` blank."""
155+ if self .cover_image_address is None :
156+ self .cover_image_address = DefaultProjectCover .get_random_file_link ()
157+ super ().save (* args , ** kwargs )
158+
139159 class Meta :
140160 ordering = ["-is_company" , "-hidden_score" , "-datetime_created" ]
141161 verbose_name = "Проект"
0 commit comments