diff --git a/src/core/models/events.py b/src/core/models/events.py index ef18c9cc5797cdce3fa622ceea1ddc5c36580d95..c05859c5818348c64210734f4037a2a62c5651b5 100644 --- a/src/core/models/events.py +++ b/src/core/models/events.py @@ -425,10 +425,10 @@ class Event(TaggedItemMixin, BackendMixin, ActivityLogMixin, models.Model): if 'speakers' in data: if speaker_lookup is not None: obj.save() # TODO: check if we can do this better, but we need the model saved for adding speakers - for item in data['speakers']: + for order, item in enumerate(data['speakers']): speaker = speaker_lookup(item) if speaker is not None: - obj.ensure_speaker(speaker) + obj.ensure_speaker(speaker, order) else: raise RuntimeWarning('Event.from_dict() got data with "speakers" but no speaker_lookup was provided.') if pop_used_keys: @@ -632,7 +632,7 @@ class Event(TaggedItemMixin, BackendMixin, ActivityLogMixin, models.Model): # we require a configured BigBlueButton integration return settings.INTEGRATIONS_BBB - def ensure_speaker(self, user: PlatformUser): + def ensure_speaker(self, user: PlatformUser, order: int): entry, created = self.participants.get_or_create(participant=user) if created: logger.info( @@ -646,6 +646,7 @@ class Event(TaggedItemMixin, BackendMixin, ActivityLogMixin, models.Model): entry.role = EventParticipant.Role.SPEAKER entry.is_public = True entry.is_accepted = True + entry.order = order entry.save() logger.info( 'Forced participant #%s (%s) of event %s to accepted+public+speaker.', @@ -714,7 +715,7 @@ class EventParticipant(models.Model): ) # Future TODO: evaluate https://pypi.org/project/django-sortedm2m/ but for now we just use a simple order field - order = models.PositiveIntegerField() + order = models.PositiveIntegerField(default=0) 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')) @@ -733,7 +734,7 @@ 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 + if not self.order: # 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