feat: group people by role priority
This commit is contained in:
+12
-14
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user