diff --git a/cfp/forms.py b/cfp/forms.py index 91b0cb1..4ab5b90 100644 --- a/cfp/forms.py +++ b/cfp/forms.py @@ -373,8 +373,11 @@ class ConferenceForm(forms.ModelForm): class Meta: model = Conference fields = [ - 'name', 'venue', 'city', 'contact_email', 'acceptances_disclosure_date', 'schedule_publishing_date', 'schedule_redirection_url', - 'volunteers_opening_date', 'volunteers_closing_date', 'video_publishing_date', 'reply_email', 'secure_domain', 'staff', + 'name', 'venue', 'city', 'contact_email', 'acceptances_disclosure_date', + 'schedule_publishing_date', 'schedule_redirection_url', + 'volunteers_opening_date', 'volunteers_closing_date', + 'end_date', 'video_publishing_date', + 'reply_email', 'secure_domain', 'staff', ] widgets = { 'staff': UsersWidget(), diff --git a/cfp/migrations/0026_conference_end_date.py b/cfp/migrations/0026_conference_end_date.py new file mode 100644 index 0000000..83cc1b7 --- /dev/null +++ b/cfp/migrations/0026_conference_end_date.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0 on 2019-06-08 10:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cfp', '0025_auto_20171216_1546'), + ] + + operations = [ + migrations.AddField( + model_name='conference', + name='end_date', + field=models.DateTimeField(blank=True, default=None, null=True, verbose_name='End of the conference date'), + ), + ] diff --git a/cfp/models.py b/cfp/models.py index ff9d025..3a18b7f 100644 --- a/cfp/models.py +++ b/cfp/models.py @@ -42,6 +42,7 @@ class Conference(models.Model): volunteers_opening_date = models.DateTimeField(null=True, blank=True, default=None, verbose_name=_('Volunteers enrollment opening date')) volunteers_closing_date = models.DateTimeField(null=True, blank=True, default=None, verbose_name=_('Volunteers enrollment closing date')) video_publishing_date = models.DateTimeField(null=True, blank=True, default=None, verbose_name=_('Video publishing date')) + end_date = models.DateTimeField(null=True, blank=True, default=None, verbose_name=_('End of the conference date')) custom_css = models.TextField(blank=True) external_css_link = models.URLField(blank=True) @@ -52,6 +53,10 @@ class Conference(models.Model): closing = self.volunteers_closing_date return opening and opening < now and (not closing or closing > now) + @property + def completed(self): + return self.end_date and self.end_date <= timezone.now() + @property def opened_categories(self): now = timezone.now() diff --git a/cfp/views.py b/cfp/views.py index 88a217f..b329875 100644 --- a/cfp/views.py +++ b/cfp/views.py @@ -14,6 +14,7 @@ from django.core.mail import send_mail from django.forms import modelform_factory from django import forms from django.views.decorators.http import require_http_methods +from django.core.cache import cache from django_select2.views import AutoResponseView @@ -426,7 +427,7 @@ def proposal_talk_edit(request, speaker, talk_id=None): def proposal_talk_acknowledgment(request, speaker, talk_id, confirm): # TODO: handle multiple speakers case talk = get_object_or_404(Talk, site=request.conference.site, speakers__pk=speaker.pk, pk=talk_id) - if not request.conference.disclosed_acceptances or not talk.accepted: + if not request.conference.disclosed_acceptances or not talk.accepted or request.conference.completed: raise PermissionDenied if talk.confirmed == confirm: if confirm: @@ -1312,5 +1313,12 @@ def staff_schedule(request, program_format): return schedule(request, program_format=program_format, pending=True, template='cfp/staff/schedule.html', cache=False) +@staff_required +def schedule_evict(request): + cache.clear() + messages.success(request, _('Schedule evicted from cache.')) + return redirect('/') + + class Select2View(StaffRequiredMixin, AutoResponseView): pass