Skip to content

Commit

Permalink
Merge pull request #453 from ox-it/speaker-order
Browse files Browse the repository at this point in the history
Speaker order
  • Loading branch information
markdoub committed May 4, 2016
2 parents 55c02ba + 4dc642a commit 87f6557
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 4 deletions.
30 changes: 29 additions & 1 deletion talks/contributors/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class EventForm(forms.ModelForm):

def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
self.request = kwargs.pop('request', None)
super(EventForm, self).__init__(*args, **kwargs)
# Customise the group selector so that:
# - It's only possible to pick talks which the user has edit permissions for
Expand Down Expand Up @@ -179,7 +180,34 @@ def save(self):
for user in self.cleaned_data['editor_set']:
event.editor_set.add(user)

self._update_people('speakers', event, models.ROLES_SPEAKER)
#reorder the speakers to be in the order they arrived in the post data (after that point the ordering is lost)
speakers_posted = self.request.POST.copy().pop('event-speakers', [])
speakers_current = getattr(event, 'speakers')
speakers_cleaned = self.cleaned_data['speakers']

#determine if the list of speakers has changed
should_replace_speakers = False
if speakers_current.count() != len(speakers_posted):
#definitely different if lists are different lengths
should_replace_speakers = True
else:
#compare item-by-item to see if lists contain the same elements
for idx, speaker in enumerate(speakers_current):
if int(speakers_posted[idx]) != speaker.id:
# order is not the same
should_replace_speakers = True
break

if should_replace_speakers:
#remove all speakers
for person in speakers_current:
rel = models.PersonEvent.objects.get(person=person, event=event, role=models.ROLES_SPEAKER)
rel.delete()
#add new speakers in the order they were in the posted data
for speaker_id in speakers_posted:
person = models.Person.objects.get(id=speaker_id)
models.PersonEvent.objects.create(person=person, event=event, role=models.ROLES_SPEAKER)

self._update_people('organisers', event, models.ROLES_ORGANISER)
self._update_people('hosts', event, models.ROLES_HOST)

Expand Down
4 changes: 2 additions & 2 deletions talks/contributors/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def edit_event(request, event_slug):
'speakers': event.speakers.all(), # different of person_set
'organisers': event.organisers.all(),
'hosts': event.hosts.all()}
form = EventForm(request.POST or None, instance=event, initial=initial, prefix='event', user=request.user)
form = EventForm(request.POST or None, instance=event, initial=initial, prefix='event', user=request.user, request=request)
context = {
'event': event,
'event_form': form,
Expand Down Expand Up @@ -69,7 +69,7 @@ def create_event(request, group_slug=None):
'department_organiser': organising_dept,
}

PrefixedEventForm = partial(EventForm, prefix='event', initial=initial, user=request.user)
PrefixedEventForm = partial(EventForm, prefix='event', initial=initial, user=request.user, request=request)

if request.method == 'POST':
context = {
Expand Down
2 changes: 1 addition & 1 deletion talks/events/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ class Event(models.Model):

@property
def speakers(self):
return self.person_set.filter(personevent__role=ROLES_SPEAKER)
return self.person_set.filter(personevent__role=ROLES_SPEAKER).order_by('personevent__id')

@property
def organisers(self):
Expand Down

0 comments on commit 87f6557

Please sign in to comment.