feat: group people by role priority

This commit is contained in:
mohamad
2026-10-29 03:53:39 +08:00
parent 7c186b4230
commit 641f4e6cee
15 changed files with 186 additions and 45 deletions
+12 -14
View File
@@ -4,6 +4,7 @@ from django.urls import reverse
from django.utils import timezone
from django.utils.text import slugify
from apps.core.people import person_sort_key
from apps.core.utils import CONTENT_FORMAT_CHOICES, FORMAT_MARKDOWN, FORMAT_PLAIN, render_content
from apps.core.video import VideoBlockMixin
from apps.pages.contact_uploads import (
@@ -157,12 +158,7 @@ class AboutSection(VideoBlockMixin, models.Model):
@property
def ordered_people_items(self):
def sort_key(item):
role = item.role.strip().casefold()
priority = 0 if role == "organizer" else 1 if role == "collaborator" else 2
return priority, item.order, item.pk or 0
return sorted(self.items.all(), key=sort_key)
return sorted(self.items.all(), key=person_sort_key)
def clean(self):
super().clean()
@@ -183,7 +179,7 @@ class AboutSectionItem(models.Model):
"Role / group",
max_length=100,
blank=True,
help_text="For People sections: Organizer, Collaborator, or any custom role name.",
help_text="For People sections: Lead, Leader, Organizer, Collaborator, or any custom role name.",
)
content = models.TextField(blank=True, help_text="Description text or link label for History links.")
read_more_content = models.BooleanField(default=False, help_text="Collapse this text with a Read more button.")
@@ -212,7 +208,7 @@ class AboutSectionItem(models.Model):
@property
def role_label(self):
if self.role.casefold() in {"organizer", "collaborator"}:
if self.role.casefold() in {"lead", "leader", "organizer", "collaborator"}:
return self.role.title()
return self.role
@@ -415,7 +411,7 @@ class BlogPostPartner(models.Model):
"Role / group",
max_length=100,
default="Collaborator",
help_text="Type Organizer, Collaborator, or any other role name you want to display.",
help_text="Type Lead, Leader, Organizer, Collaborator, or any other role name.",
)
name = models.CharField(max_length=200)
description = models.TextField(blank=True)
@@ -426,15 +422,17 @@ class BlogPostPartner(models.Model):
order = models.PositiveIntegerField(
"Display order",
default=0,
help_text="Smaller numbers appear first. Organizers appear before collaborators, then custom roles.",
help_text="Smaller numbers appear first within each role. Leads/Leaders, Organizers, Collaborators, then custom roles.",
)
class Meta:
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),
models.When(role__iexact="lead", then=models.Value(0)),
models.When(role__iexact="leader", then=models.Value(0)),
models.When(role__iexact="organizer", then=models.Value(1)),
models.When(role__iexact="collaborator", then=models.Value(2)),
default=models.Value(3),
output_field=models.IntegerField(),
),
"order",
@@ -448,7 +446,7 @@ class BlogPostPartner(models.Model):
@property
def role_label(self):
if self.role.casefold() in {self.ORGANIZER, self.COLLABORATOR}:
if self.role.casefold() in {"lead", "leader", self.ORGANIZER, self.COLLABORATOR}:
return self.role.title()
return self.role