From b365364a560aefb27e1034f1df28b6a821f12f4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Mon, 27 Nov 2017 21:17:20 +0100 Subject: [PATCH] add conference videos publishing date --- cfp/forms.py | 2 +- .../0021_conference_video_publishing_date.py | 51 +++++++++++++++++++ cfp/models.py | 5 ++ cfp/planning.py | 15 +++--- cfp/tests.py | 27 ++++++++++ 5 files changed, 92 insertions(+), 8 deletions(-) create mode 100644 cfp/migrations/0021_conference_video_publishing_date.py diff --git a/cfp/forms.py b/cfp/forms.py index d7488a8..0f913c2 100644 --- a/cfp/forms.py +++ b/cfp/forms.py @@ -260,7 +260,7 @@ class ConferenceForm(forms.ModelForm): model = Conference fields = [ 'name', 'venue', 'city', 'contact_email', 'schedule_publishing_date', 'schedule_redirection_url', - 'volunteers_opening_date', 'volunteers_closing_date', 'reply_email', 'secure_domain', 'staff', + 'volunteers_opening_date', 'volunteers_closing_date', 'video_publishing_date', 'reply_email', 'secure_domain', 'staff', ] widgets = { 'staff': UsersWidget(), diff --git a/cfp/migrations/0021_conference_video_publishing_date.py b/cfp/migrations/0021_conference_video_publishing_date.py new file mode 100644 index 0000000..73c6c37 --- /dev/null +++ b/cfp/migrations/0021_conference_video_publishing_date.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.7 on 2017-11-27 19:59 +from __future__ import unicode_literals + +import cfp.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cfp', '0020_auto_20171116_0940'), + ] + + operations = [ + migrations.AddField( + model_name='conference', + name='video_publishing_date', + field=models.DateTimeField(blank=True, default=None, null=True, verbose_name='Video publishing date'), + ), + migrations.AlterField( + model_name='room', + name='capacity', + field=models.IntegerField(default=0, verbose_name='Capacity'), + ), + migrations.AlterField( + model_name='room', + name='label', + field=models.CharField(blank=True, default='', max_length=256, verbose_name='Label'), + ), + migrations.AlterField( + model_name='room', + name='name', + field=models.CharField(blank=True, default='', max_length=256, verbose_name='Name'), + ), + migrations.AlterField( + model_name='talk', + name='description', + field=models.TextField(help_text='This description will be visible on the program.', verbose_name='Description of your talk'), + ), + migrations.AlterField( + model_name='talk', + name='materials', + field=models.FileField(blank=True, help_text='You can use this field to share some materials related to your intervention.', null=True, upload_to=cfp.models.talks_materials_destination, verbose_name='Materials'), + ), + migrations.AlterField( + model_name='talk', + name='notes', + field=models.TextField(blank=True, help_text='If you have any constraint or if you have anything that may help you to select your talk, like a video or slides of your talk, please write it down here. This field will only be visible by organizers.', verbose_name='Message to organizers'), + ), + ] diff --git a/cfp/models.py b/cfp/models.py index c7feab2..c7ed501 100644 --- a/cfp/models.py +++ b/cfp/models.py @@ -41,6 +41,7 @@ class Conference(models.Model): help_text=_('If specified, schedule tab will redirect to this URL.')) 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')) custom_css = models.TextField(blank=True) external_css_link = models.URLField(blank=True) @@ -67,6 +68,10 @@ class Conference(models.Model): def schedule_available(self): return self.schedule_publishing_date and self.schedule_publishing_date <= timezone.now() + @property + def videos_available(self): + return self.video_publishing_date and self.video_publishing_date <= timezone.now() + def from_email(self): return self.name+' <'+self.contact_email+'>' diff --git a/cfp/planning.py b/cfp/planning.py index e30b616..a0268b2 100644 --- a/cfp/planning.py +++ b/cfp/planning.py @@ -195,12 +195,13 @@ class Program: elt.text = ', '.join(map(lambda x: x.strip(), self.conference.venue.split('\n'))) elt = ET.SubElement(conference, 'city') elt.text = self.conference.city - elt = ET.SubElement(conference, 'start_date') - elt.text = sorted(self.days.keys())[0].strftime('%Y-%m-%d') - elt = ET.SubElement(conference, 'end_date') - elt.text = sorted(self.days.keys(), reverse=True)[0].strftime('%Y-%m-%d') - elt = ET.SubElement(conference, 'days_count') - elt.text = str(len(self.days)) + if self.days: + elt = ET.SubElement(conference, 'start_date') + elt.text = sorted(self.days.keys())[0].strftime('%Y-%m-%d') + elt = ET.SubElement(conference, 'end_date') + elt.text = sorted(self.days.keys(), reverse=True)[0].strftime('%Y-%m-%d') + elt = ET.SubElement(conference, 'days_count') + elt.text = str(len(self.days)) for index, day in enumerate(sorted(self.days.keys())): day_elt = ET.SubElement(schedule, 'day', index=str(index+1), date=day.strftime('%Y-%m-%d')) @@ -252,7 +253,7 @@ class Program: if talk.materials: elt = ET.SubElement(links_elt, 'link', tag='slides') elt.text = talk.materials.url - if talk.video: + if talk.video and self.conference.videos_available: elt = ET.SubElement(links_elt, 'link', tag='video') elt.text = talk.video diff --git a/cfp/tests.py b/cfp/tests.py index 43af3cd..35f7425 100644 --- a/cfp/tests.py +++ b/cfp/tests.py @@ -359,6 +359,8 @@ class StaffTest(TestCase): conf = Conference.objects.get(site=site) conf.name = 'PonyConf' conf.save() + room1 = Room.objects.create(site=site, name='Room 1') + room2 = Room.objects.create(site=site, name='Room 2') category_conf = TalkCategory.objects.create(site=site, name='Conference', label='conference') category_ws = TalkCategory.objects.create(site=site, name='Workshop', label='workshop') speaker1 = Participant.objects.create(site=site, name='Speaker 1', email='1@example.org') @@ -580,6 +582,31 @@ class StaffTest(TestCase): conf.save() self.assertFalse(conf.disclosed_acceptances) + def test_conference_videos_available(self): + conf = Conference.objects.get(name='PonyConf') + talk = Talk.objects.get(title='Talk 1') + talk.room = Room.objects.filter(site=conf.site).first() + talk.start_date = timezone.now() + talk.duration = 60 + talk.accepted = True + talk.video = 'this-is-a-video-location' + talk.save() + xml_url = reverse('public-schedule') + 'xml/' + conf.schedule_publishing_date = timezone.now() - timedelta(hours=1) + conf.video_publishing_date = None + conf.save() + self.assertContains(self.client.get(xml_url), 'Talk 1') + self.assertFalse(conf.videos_available) + self.assertNotContains(self.client.get(xml_url), talk.video) + conf.video_publishing_date = timezone.now() + timedelta(hours=1) + conf.save() + self.assertFalse(conf.videos_available) + self.assertNotContains(self.client.get(xml_url), talk.video) + conf.video_publishing_date = timezone.now() - timedelta(hours=1) + conf.save() + self.assertTrue(conf.videos_available) + self.assertContains(self.client.get(xml_url), talk.video) + def test_talk_decide(self): talk = Talk.objects.get(title='Talk 1') talk.accepted = None