From 5c01e31fb7102ac958dfde46fb0e499c44036489 Mon Sep 17 00:00:00 2001
From: Andreas Hubel <andi@saerdnaer.de>
Date: Wed, 4 Dec 2024 23:02:02 +0100
Subject: [PATCH] feat: add order to EventParticipant (draft)

---
 src/core/models/events.py | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/core/models/events.py b/src/core/models/events.py
index d2dfb2f09..ef18c9cc5 100644
--- a/src/core/models/events.py
+++ b/src/core/models/events.py
@@ -695,6 +695,9 @@ class EventAttachment(models.Model):
 
 
 class EventParticipant(models.Model):
+    class Meta:
+        ordering = ['order']
+
     class Role(models.TextChoices):
         SPEAKER = 'speaker', _('EventParticipant__type-speaker')
         ANGEL = 'angel', _('EventParticipant__type-angel')
@@ -710,6 +713,9 @@ class EventParticipant(models.Model):
         max_length=20, choices=Role.choices, default=Role.REGULAR, help_text=_('EventParticipant__role__help'), verbose_name=_('EventParticipant__role')
     )
 
+    # Future TODO: evaluate https://pypi.org/project/django-sortedm2m/ but for now we just use a simple order field
+    order = models.PositiveIntegerField()
+
     is_accepted = models.BooleanField(default=False, help_text=_('EventParticipant__is_accepted__help'), verbose_name=_('EventParticipant__is_accepted'))
     is_public = models.BooleanField(default=False, help_text=_('EventParticipant__is_public__help'), verbose_name=_('EventParticipant__is_public'))
 
@@ -727,6 +733,10 @@ class EventParticipant(models.Model):
         except ConferenceMember.DoesNotExist:
             raise ValidationError(_('EventParticipant__must_be_conference_member'))
 
+        if self.order is None:  # if 'order' is not explicitly set
+            last_order = EventParticipant.objects.filter(event=self.event).aggregate(models.Max('order')).get('order__max')
+            self.order = (last_order or 0) + 1
+
     def __str__(self):
         result = self.participant.username
         if self.role in [self.Role.SPEAKER, self.Role.ANGEL]:
-- 
GitLab