diff --git a/ietf/doc/expire.py b/ietf/doc/expire.py index 86a161706..72b95a1e0 100644 --- a/ietf/doc/expire.py +++ b/ietf/doc/expire.py @@ -55,11 +55,13 @@ def in_draft_expire_freeze(when=None): if when == None: when = datetime.datetime.now() - d = Meeting.get_second_cut_off() + meeting = Meeting.objects.filter(type='ietf', date__gte=when-datetime.timedelta(days=7)).order_by('date').first() + + d = meeting.get_second_cut_off() # for some reason, the old Perl code started at 9 am second_cut_off = datetime.datetime.combine(d, datetime.time(9, 0)) - d = Meeting.get_ietf_monday() + d = meeting.get_ietf_monday() ietf_monday = datetime.datetime.combine(d, datetime.time(0, 0)) return second_cut_off <= when < ietf_monday diff --git a/ietf/doc/tests_draft.py b/ietf/doc/tests_draft.py index 3a8235b0e..2c9ab69d2 100644 --- a/ietf/doc/tests_draft.py +++ b/ietf/doc/tests_draft.py @@ -578,11 +578,11 @@ class ExpireIDsTests(TestCase): def test_in_draft_expire_freeze(self): from ietf.doc.expire import in_draft_expire_freeze - Meeting.objects.create(number="123", + meeting = Meeting.objects.create(number="123", type=MeetingTypeName.objects.get(slug="ietf"), date=datetime.date.today()) - second_cut_off = Meeting.get_second_cut_off() - ietf_monday = Meeting.get_ietf_monday() + second_cut_off = meeting.get_second_cut_off() + ietf_monday = meeting.get_ietf_monday() self.assertTrue(not in_draft_expire_freeze(datetime.datetime.combine(second_cut_off - datetime.timedelta(days=7), datetime.time(0, 0, 0)))) self.assertTrue(not in_draft_expire_freeze(datetime.datetime.combine(second_cut_off, datetime.time(0, 0, 0)))) diff --git a/ietf/meeting/factories.py b/ietf/meeting/factories.py index 324ef29df..2783eda2b 100644 --- a/ietf/meeting/factories.py +++ b/ietf/meeting/factories.py @@ -37,6 +37,13 @@ class MeetingFactory(factory.DjangoModelFactory): else: return 'interim-%d-%s-%02d'%(self.date.year,GroupFactory().acronym,n) + @factory.lazy_attribute + def days(self): + if self.type_id == 'ietf': + return 7 + else: + return 1 + @factory.post_generation def populate_agenda(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument ''' diff --git a/ietf/meeting/forms.py b/ietf/meeting/forms.py index d586d9b63..dfa830361 100644 --- a/ietf/meeting/forms.py +++ b/ietf/meeting/forms.py @@ -89,6 +89,7 @@ class InterimSessionInlineFormSet(BaseInlineFormSet): if date - last_date != datetime.timedelta(days=1): raise forms.ValidationError('For Multi-Day meetings, days must be consecutive') last_date = date + self.days = len(dates) return # formset doesn't have cleaned_data class InterimMeetingModelForm(forms.ModelForm): @@ -173,6 +174,7 @@ class InterimMeetingModelForm(forms.ModelForm): if not meeting.number: meeting.number = get_next_interim_number(group.acronym, date) meeting.date = date + meeting.days = 1 if kwargs.get('commit', True): # create schedule with meeting meeting.save() # pre-save so we have meeting.pk for schedule diff --git a/ietf/meeting/helpers.py b/ietf/meeting/helpers.py index 015661257..0e120c7e4 100644 --- a/ietf/meeting/helpers.py +++ b/ietf/meeting/helpers.py @@ -374,6 +374,7 @@ def create_interim_meeting(group, date, city='', country='', timezone='UTC', number=number, type_id='interim', date=date, + days=1, city=city, country=country, time_zone=timezone) diff --git a/ietf/meeting/migrations/0057_meeting_days.py b/ietf/meeting/migrations/0057_meeting_days.py new file mode 100644 index 000000000..604949ff8 --- /dev/null +++ b/ietf/meeting/migrations/0057_meeting_days.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2017-10-25 03:17 +from __future__ import unicode_literals + +import django +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('meeting', '0056_fix-slide-name-slugs'), + ] + + operations = [ + migrations.AddField( + model_name='meeting', + name='days', + field=models.IntegerField(default=7, validators=[django.core.validators.MinValueValidator(1)], + help_text=b'The number of days the meeting lasts'), + ), + ] diff --git a/ietf/meeting/migrations/0058_set_new_field_meeting_days_values.py b/ietf/meeting/migrations/0058_set_new_field_meeting_days_values.py new file mode 100644 index 000000000..db8efbbc6 --- /dev/null +++ b/ietf/meeting/migrations/0058_set_new_field_meeting_days_values.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2017-10-25 03:22 +from __future__ import unicode_literals + +from django.db import migrations + + +def forwards(apps, schema_editor): + Meeting = apps.get_model('meeting', 'Meeting') + for m in Meeting.objects.all(): + if m.type_id == 'ietf': + if m.number.isdigit() and int(m.number) >= 100: + m.days = 7 + else: + m.days = 6 + else: + m.days = 1 + m.save() + +def backwards(apps, schema_editor): + pass + + +class Migration(migrations.Migration): + + dependencies = [ + ('meeting', '0057_meeting_days'), + ] + + operations = [ + migrations.RunPython(forwards, backwards), + ] diff --git a/ietf/meeting/models.py b/ietf/meeting/models.py index 1701aa98e..9009bcbb9 100644 --- a/ietf/meeting/models.py +++ b/ietf/meeting/models.py @@ -9,6 +9,7 @@ import string import debug # pyflakes:ignore +from django.core.validators import MinValueValidator from django.db import models from django.db.models import Max from django.conf import settings @@ -53,6 +54,8 @@ class Meeting(models.Model): # is not used to determine date for timeslot instances thereafter, as # they have their own datetime field. date = models.DateField() + days = models.PositiveIntegerField(default=7, null=False, validators=[MinValueValidator(1)], + help_text="The number of days the meeting lasts") city = models.CharField(blank=True, max_length=255) country = models.CharField(blank=True, max_length=2, choices=countries) # We can't derive time-zone from country, as there are some that have @@ -101,12 +104,7 @@ class Meeting(models.Model): return self.date + datetime.timedelta(days=offset) def end_date(self): - if self.type_id == 'ietf': - return self.get_meeting_date(5) - else: - # TODO: Once interims have timeslots assigned, - # look for the last ending timeslot instead - return self.date + return self.get_meeting_date(self.days-1) def get_00_cutoff(self): start_date = datetime.datetime(year=self.date.year, month=self.date.month, day=self.date.day, tzinfo=pytz.utc) @@ -143,20 +141,17 @@ class Meeting(models.Model): def get_current_meeting(cls, type="ietf"): return cls.objects.filter(type=type, date__gte=datetime.datetime.today()-datetime.timedelta(days=7) ).order_by('date').first() - @classmethod - def get_first_cut_off(cls): - meeting = cls.get_current_meeting() - return meeting.get_00_cutoff() + def get_first_cut_off(self): + return self.get_00_cutoff() - @classmethod - def get_second_cut_off(cls): - meeting = cls.get_current_meeting() - return meeting.get_01_cutoff() + def get_second_cut_off(self): + return self.get_01_cutoff() - @classmethod - def get_ietf_monday(cls): - date = cls.objects.all().filter(type="ietf").order_by('-date')[0].date - return date + datetime.timedelta(days=-date.weekday(), weeks=1) + def get_ietf_monday(self): + for offset in range(self.days): + date = self.date+datetime.timedelta(days=offset) + if date.weekday() == 0: # Monday is 0 + return date def get_materials_path(self): return os.path.join(settings.AGENDA_PATH,self.number) diff --git a/ietf/secr/drafts/reports.py b/ietf/secr/drafts/reports.py index 12097a3d4..3a8e58ad8 100644 --- a/ietf/secr/drafts/reports.py +++ b/ietf/secr/drafts/reports.py @@ -44,7 +44,7 @@ def report_id_activity(start,end): approved = events.filter(type='iesg_approved').count() # get 4 weeks - monday = Meeting.get_ietf_monday() + monday = Meeting.get_current_meeting().get_ietf_monday() cutoff = monday + datetime.timedelta(days=3) ff1_date = cutoff - datetime.timedelta(days=28) #ff2_date = cutoff - datetime.timedelta(days=21) @@ -100,4 +100,4 @@ def report_progress_report(start_date,end_date): report = render_to_string('drafts/report_progress_report.txt', context) - return report \ No newline at end of file + return report diff --git a/ietf/secr/meetings/tests.py b/ietf/secr/meetings/tests.py index cd10c69e4..122f136f2 100644 --- a/ietf/secr/meetings/tests.py +++ b/ietf/secr/meetings/tests.py @@ -70,6 +70,7 @@ class SecrMeetingTestCase(TestCase): url = reverse('ietf.secr.meetings.views.add') post_data = dict(number=number,city='Toronto',date='2014-07-20',country='CA', time_zone='America/New_York',venue_name='Hilton', + days=6, venue_addr='100 First Ave', idsubmit_cutoff_day_offset_00=13, idsubmit_cutoff_day_offset_01=20, @@ -106,6 +107,7 @@ class SecrMeetingTestCase(TestCase): ) url = reverse('ietf.secr.meetings.views.edit_meeting',kwargs={'meeting_id':1}) post_data = dict(number='1',date='2014-07-20',city='Toronto', + days=7, idsubmit_cutoff_day_offset_00=13, idsubmit_cutoff_day_offset_01=20, idsubmit_cutoff_time_utc =datetime.timedelta(hours=23, minutes=59, seconds=59),