Added a new field Meeting.days to capture the length of a meeting. This is necessary now that we have previous meetings officially starting Sunday, lasting to Friday, and future meetings starting Saturday, Lasting to Friday. We use Meeting.days to calculate Meeting.end_date(). Meeting.get_ietf_monday() and two cut_off() methods have also been updated to be instance methods instead of class methods, and to not assume that a meeting starts on Sunday.

- Legacy-Id: 14225
This commit is contained in:
Henrik Levkowetz 2017-10-25 13:38:15 +00:00
parent 75da08d9f4
commit 4f83548b49
10 changed files with 88 additions and 25 deletions

View file

@ -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

View file

@ -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))))

View file

@ -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
'''

View file

@ -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

View file

@ -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)

View file

@ -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'),
),
]

View file

@ -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),
]

View file

@ -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)

View file

@ -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
return report

View file

@ -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),