diff --git a/cfp/forms.py b/cfp/forms.py index 125cf1b..d406d3b 100644 --- a/cfp/forms.py +++ b/cfp/forms.py @@ -12,17 +12,28 @@ from django_select2.forms import ModelSelect2MultipleWidget from .models import Participant, Talk, TalkCategory, Track, Conference, Room, Volunteer -STATUS_CHOICES = [ +ACCEPTATION_CHOICES = [ ('pending', _('Pending decision')), ('accepted', _('Accepted')), ('declined', _('Declined')), ] -STATUS_VALUES = [ +ACCEPTATION_VALUES = [ ('pending', None), ('accepted', True), ('declined', False), ] +CONFIRMATION_CHOICES = [ + ('waiting', _('Waiting')), + ('confirmed', _('Confirmed')), + ('desisted', _('Desisted')), +] +CONFIRMATION_VALUES = [ + ('waiting', None), + ('confirmed', True), + ('desisted', False), +] + class TalkForm(forms.ModelForm): def __init__(self, *args, **kwargs): @@ -69,11 +80,17 @@ class TalkFilterForm(forms.Form): widget=forms.CheckboxSelectMultiple, choices=[], ) - status = forms.MultipleChoiceField( - label=_('Status'), + accepted = forms.MultipleChoiceField( + label=_('Accepted'), required=False, widget=forms.CheckboxSelectMultiple, - choices=STATUS_CHOICES, + choices=ACCEPTATION_CHOICES, + ) + confirmed = forms.MultipleChoiceField( + label=_('Confirmed'), + required=False, + widget=forms.CheckboxSelectMultiple, + choices=CONFIRMATION_CHOICES, ) track = forms.MultipleChoiceField( label=_('Track'), @@ -145,11 +162,17 @@ class ParticipantFilterForm(forms.Form): widget=forms.CheckboxSelectMultiple, choices=[], ) - status = forms.MultipleChoiceField( - label=_('Status'), + accepted = forms.MultipleChoiceField( + label=_('Accepted'), required=False, widget=forms.CheckboxSelectMultiple, - choices=STATUS_CHOICES, + choices=ACCEPTATION_CHOICES, + ) + confirmed = forms.MultipleChoiceField( + label=_('Confirmed'), + required=False, + widget=forms.CheckboxSelectMultiple, + choices=CONFIRMATION_CHOICES, ) track = forms.MultipleChoiceField( label=_('Track'), diff --git a/cfp/migrations/0012_talk_confirmed.py b/cfp/migrations/0012_talk_confirmed.py new file mode 100644 index 0000000..0036220 --- /dev/null +++ b/cfp/migrations/0012_talk_confirmed.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.1 on 2017-10-06 16:36 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cfp', '0011_auto_20171005_2328'), + ] + + operations = [ + migrations.AddField( + model_name='talk', + name='confirmed', + field=models.NullBooleanField(default=None), + ), + ] diff --git a/cfp/models.py b/cfp/models.py index 2f57337..09863b3 100644 --- a/cfp/models.py +++ b/cfp/models.py @@ -243,6 +243,7 @@ class TalkManager(models.Manager): qs = qs.annotate(score=Coalesce(Avg('vote__vote'), 0)) return qs + def talks_materials_destination(talk, filename): return join(talk.site.name, talk.slug, filename) @@ -258,7 +259,6 @@ class Talk(PonyConfModel): ) site = models.ForeignKey(Site, on_delete=models.CASCADE) - speakers = models.ManyToManyField(Participant, verbose_name=_('Speakers')) title = models.CharField(max_length=128, verbose_name=_('Talk Title')) slug = AutoSlugField(populate_from='title', unique=True) @@ -276,6 +276,7 @@ class Talk(PonyConfModel): max_length=10, verbose_name=_("Video licence")) sound = models.BooleanField(_("I need sound"), default=False) accepted = models.NullBooleanField(default=None) + confirmed = models.NullBooleanField(default=None) start_date = models.DateTimeField(null=True, blank=True, default=None, verbose_name=_('Beginning date and time')) duration = models.PositiveIntegerField(default=0, verbose_name=_('Duration (min)')) room = models.ForeignKey(Room, blank=True, null=True, default=None) @@ -283,15 +284,11 @@ class Talk(PonyConfModel): materials = models.FileField(null=True, upload_to=talks_materials_destination, verbose_name=_('Materials'), help_text=_('You can use this field to share some materials related to your intervention.')) video = models.URLField(max_length=1000, blank=True, default='', verbose_name='Video URL') - token = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) - conversation = models.OneToOneField(MessageThread) - objects = TalkManager() - class Meta: ordering = ('title',) @@ -307,6 +304,32 @@ class Talk(PonyConfModel): else: return ', '.join(speakers[:-1]) + ' & ' + str(speakers[-1]) + def get_status_str(self): + if self.accepted is True: + if self.confirmed is True: + return _('Confirmed') + elif self.confirmed is False: + return _('Cancelled') + else: + return _('Waiting confirmation') + elif self.accepted is False: + return _('Refused') + else: + return _('Pending decision, score: %(score).1f') % {'score': self.score} + + def get_status_color(self): + if self.accepted is True: + if self.confirmed is True: + return 'success' + elif self.confirmed is False: + return 'danger' + else: + return 'info' + elif self.accepted is False: + return 'muted' + else: + return 'warning' + @property def estimated_duration(self): return self.duration or self.category.duration diff --git a/cfp/templates/cfp/staff/participant_list.html b/cfp/templates/cfp/staff/participant_list.html index d2afe24..0efad02 100644 --- a/cfp/templates/cfp/staff/participant_list.html +++ b/cfp/templates/cfp/staff/participant_list.html @@ -15,7 +15,8 @@