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:
parent
75da08d9f4
commit
4f83548b49
|
@ -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
|
||||
|
|
|
@ -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))))
|
||||
|
|
|
@ -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
|
||||
'''
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
22
ietf/meeting/migrations/0057_meeting_days.py
Normal file
22
ietf/meeting/migrations/0057_meeting_days.py
Normal 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'),
|
||||
),
|
||||
]
|
|
@ -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),
|
||||
]
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Reference in a new issue