From 4c6d3bfa3d754ea58af94e4effd94e49aff51711 Mon Sep 17 00:00:00 2001 From: Marsel Date: Mon, 2 Dec 2024 15:40:36 +0300 Subject: [PATCH] Added the ability to set a cover to projects --- .../0023_project_cover_image_address.py | 24 +++++++++++++++++++ projects/models.py | 20 ++++++++++++++++ projects/serializers.py | 1 + 3 files changed, 45 insertions(+) create mode 100644 projects/migrations/0023_project_cover_image_address.py diff --git a/projects/migrations/0023_project_cover_image_address.py b/projects/migrations/0023_project_cover_image_address.py new file mode 100644 index 00000000..9748562c --- /dev/null +++ b/projects/migrations/0023_project_cover_image_address.py @@ -0,0 +1,24 @@ +# Generated by Django 4.2.11 on 2024-12-02 11:40 + +from django.db import migrations, models +import projects.models + + +class Migration(migrations.Migration): + + dependencies = [ + ("projects", "0022_alter_project_options_project_is_company"), + ] + + operations = [ + migrations.AddField( + model_name="project", + name="cover_image_address", + field=models.URLField( + blank=True, + default=projects.models.DefaultProjectCover.get_random_file_link, + help_text="If left blank, will set a link to the image from the 'Обложки проектов'", + null=True, + ), + ), + ] diff --git a/projects/models.py b/projects/models.py index 0f728ba0..b38a939e 100644 --- a/projects/models.py +++ b/projects/models.py @@ -50,6 +50,11 @@ def get_random_file(cls): # FIXME: this is not efficient, but for ~10 default covers it should be ok return cls.objects.order_by("?").first().image + @classmethod + def get_random_file_link(cls): + # FIXME: this is not efficient, but for ~10 default covers it should be ok + return cls.objects.order_by("?").first().image.link if cls.objects.order_by("?").first().image else None + class Meta: verbose_name = "Обложка проекта" verbose_name_plural = "Обложки проектов" @@ -71,6 +76,7 @@ class Project(models.Model): leader: A ForeignKey referring to the User model. draft: A boolean indicating if Project is a draft. is_company: A boolean indicating if Project is a company. + cover_image_address: A URLField cover image URL address. cover: A ForeignKey referring to the UserFile model, which is the image cover of the project. datetime_created: A DateTimeField indicating date of creation. datetime_updated: A DateTimeField indicating date of update. @@ -101,6 +107,14 @@ class Project(models.Model): draft = models.BooleanField(blank=False, default=True) is_company = models.BooleanField(null=False, default=False) + cover_image_address = models.URLField( + null=True, + blank=True, + default=DefaultProjectCover.get_random_file_link, + help_text="If left blank, will set a link to the image from the 'Обложки проектов'", + ) + + # TODO DELETE (deprecated field) after full migrate `cover_image_address`. cover = models.ForeignKey( UserFile, default=DefaultProjectCover.get_random_file, @@ -136,6 +150,12 @@ def get_collaborators_user_list(self) -> list[User]: def __str__(self): return f"Project<{self.id}> - {self.name}" + def save(self, *args, **kwargs): + """Set random cover image if `cover_image_address` blank.""" + if self.cover_image_address is None: + self.cover_image_address = DefaultProjectCover.get_random_file_link() + super().save(*args, **kwargs) + class Meta: ordering = ["-is_company", "-hidden_score", "-datetime_created"] verbose_name = "Проект" diff --git a/projects/serializers.py b/projects/serializers.py index 3f4605b7..a68cadb4 100644 --- a/projects/serializers.py +++ b/projects/serializers.py @@ -128,6 +128,7 @@ class Meta: "datetime_updated", "views_count", "cover", + "cover_image_address", "partner_programs_tags", ] read_only_fields = [