feat: add people to projects and articles

This commit is contained in:
mohamad
2026-10-28 22:10:43 +08:00
parent 473637f477
commit 7c186b4230
14 changed files with 288 additions and 18 deletions
+65
View File
@@ -207,6 +207,10 @@ class Article(models.Model):
def rendered_description(self):
return render_content(self.description, self.description_format)
@property
def people_heading_id(self):
return f"article-{self.pk}-people"
def clean(self):
super().clean()
has_main = self.main_product_id is not None
@@ -220,6 +224,67 @@ class Article(models.Model):
return self.title
class ProjectPerson(models.Model):
role = models.CharField(
"Role / group", max_length=100, default="Collaborator",
help_text="Type Organizer, Collaborator, or any other role name.",
)
name = models.CharField(max_length=200)
description = models.TextField(blank=True)
read_more_description = models.BooleanField(
default=False, help_text="Collapse this person's description with Read more when it is long."
)
image = models.ImageField(upload_to="products/people/", blank=True, null=True)
image_alt = models.CharField(max_length=240, blank=True)
url = models.URLField(blank=True)
order = models.PositiveIntegerField(
"Display order", default=0,
help_text="Smaller numbers appear first. Organizers appear before collaborators, then custom roles.",
)
class Meta:
abstract = True
ordering = [
models.Case(
models.When(role__iexact="organizer", then=models.Value(0)),
models.When(role__iexact="collaborator", then=models.Value(1)),
default=models.Value(2), output_field=models.IntegerField(),
),
"order", "pk",
]
@property
def role_label(self):
return self.role.title() if self.role.casefold() in {"organizer", "collaborator"} else self.role
def __str__(self):
return f"{self.name} ({self.role_label})"
class MainProductPerson(ProjectPerson):
main_product = models.ForeignKey(MainProduct, on_delete=models.CASCADE, related_name="people")
class Meta(ProjectPerson.Meta):
verbose_name = "Main project person"
verbose_name_plural = "Main project people"
class SubProductPerson(ProjectPerson):
sub_product = models.ForeignKey(SubProduct, on_delete=models.CASCADE, related_name="people")
class Meta(ProjectPerson.Meta):
verbose_name = "Sub-project person"
verbose_name_plural = "Sub-project people"
class ArticlePerson(ProjectPerson):
article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name="people")
class Meta(ProjectPerson.Meta):
verbose_name = "Project article person"
verbose_name_plural = "Project article people"
class SubProductVersion(models.Model):
main_product = models.ForeignKey(
MainProduct,