Skip to content

Commit 4f83548

Browse files
committed
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
1 parent 75da08d commit 4f83548

10 files changed

Lines changed: 88 additions & 25 deletions

File tree

ietf/doc/expire.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,13 @@ def in_draft_expire_freeze(when=None):
5555
if when == None:
5656
when = datetime.datetime.now()
5757

58-
d = Meeting.get_second_cut_off()
58+
meeting = Meeting.objects.filter(type='ietf', date__gte=when-datetime.timedelta(days=7)).order_by('date').first()
59+
60+
d = meeting.get_second_cut_off()
5961
# for some reason, the old Perl code started at 9 am
6062
second_cut_off = datetime.datetime.combine(d, datetime.time(9, 0))
6163

62-
d = Meeting.get_ietf_monday()
64+
d = meeting.get_ietf_monday()
6365
ietf_monday = datetime.datetime.combine(d, datetime.time(0, 0))
6466

6567
return second_cut_off <= when < ietf_monday

ietf/doc/tests_draft.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -578,11 +578,11 @@ def write_draft_file(self, name, size):
578578
def test_in_draft_expire_freeze(self):
579579
from ietf.doc.expire import in_draft_expire_freeze
580580

581-
Meeting.objects.create(number="123",
581+
meeting = Meeting.objects.create(number="123",
582582
type=MeetingTypeName.objects.get(slug="ietf"),
583583
date=datetime.date.today())
584-
second_cut_off = Meeting.get_second_cut_off()
585-
ietf_monday = Meeting.get_ietf_monday()
584+
second_cut_off = meeting.get_second_cut_off()
585+
ietf_monday = meeting.get_ietf_monday()
586586

587587
self.assertTrue(not in_draft_expire_freeze(datetime.datetime.combine(second_cut_off - datetime.timedelta(days=7), datetime.time(0, 0, 0))))
588588
self.assertTrue(not in_draft_expire_freeze(datetime.datetime.combine(second_cut_off, datetime.time(0, 0, 0))))

ietf/meeting/factories.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ def number(self,n):
3737
else:
3838
return 'interim-%d-%s-%02d'%(self.date.year,GroupFactory().acronym,n)
3939

40+
@factory.lazy_attribute
41+
def days(self):
42+
if self.type_id == 'ietf':
43+
return 7
44+
else:
45+
return 1
46+
4047
@factory.post_generation
4148
def populate_agenda(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument
4249
'''

ietf/meeting/forms.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ def clean(self):
8989
if date - last_date != datetime.timedelta(days=1):
9090
raise forms.ValidationError('For Multi-Day meetings, days must be consecutive')
9191
last_date = date
92+
self.days = len(dates)
9293
return # formset doesn't have cleaned_data
9394

9495
class InterimMeetingModelForm(forms.ModelForm):
@@ -173,6 +174,7 @@ def save(self, *args, **kwargs):
173174
if not meeting.number:
174175
meeting.number = get_next_interim_number(group.acronym, date)
175176
meeting.date = date
177+
meeting.days = 1
176178
if kwargs.get('commit', True):
177179
# create schedule with meeting
178180
meeting.save() # pre-save so we have meeting.pk for schedule

ietf/meeting/helpers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,7 @@ def create_interim_meeting(group, date, city='', country='', timezone='UTC',
374374
number=number,
375375
type_id='interim',
376376
date=date,
377+
days=1,
377378
city=city,
378379
country=country,
379380
time_zone=timezone)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.10.8 on 2017-10-25 03:17
3+
from __future__ import unicode_literals
4+
5+
import django
6+
from django.db import migrations, models
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('meeting', '0056_fix-slide-name-slugs'),
13+
]
14+
15+
operations = [
16+
migrations.AddField(
17+
model_name='meeting',
18+
name='days',
19+
field=models.IntegerField(default=7, validators=[django.core.validators.MinValueValidator(1)],
20+
help_text=b'The number of days the meeting lasts'),
21+
),
22+
]
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.10.8 on 2017-10-25 03:22
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations
6+
7+
8+
def forwards(apps, schema_editor):
9+
Meeting = apps.get_model('meeting', 'Meeting')
10+
for m in Meeting.objects.all():
11+
if m.type_id == 'ietf':
12+
if m.number.isdigit() and int(m.number) >= 100:
13+
m.days = 7
14+
else:
15+
m.days = 6
16+
else:
17+
m.days = 1
18+
m.save()
19+
20+
def backwards(apps, schema_editor):
21+
pass
22+
23+
24+
class Migration(migrations.Migration):
25+
26+
dependencies = [
27+
('meeting', '0057_meeting_days'),
28+
]
29+
30+
operations = [
31+
migrations.RunPython(forwards, backwards),
32+
]

ietf/meeting/models.py

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import debug # pyflakes:ignore
1111

12+
from django.core.validators import MinValueValidator
1213
from django.db import models
1314
from django.db.models import Max
1415
from django.conf import settings
@@ -53,6 +54,8 @@ class Meeting(models.Model):
5354
# is not used to determine date for timeslot instances thereafter, as
5455
# they have their own datetime field.
5556
date = models.DateField()
57+
days = models.PositiveIntegerField(default=7, null=False, validators=[MinValueValidator(1)],
58+
help_text="The number of days the meeting lasts")
5659
city = models.CharField(blank=True, max_length=255)
5760
country = models.CharField(blank=True, max_length=2, choices=countries)
5861
# We can't derive time-zone from country, as there are some that have
@@ -101,12 +104,7 @@ def get_meeting_date (self,offset):
101104
return self.date + datetime.timedelta(days=offset)
102105

103106
def end_date(self):
104-
if self.type_id == 'ietf':
105-
return self.get_meeting_date(5)
106-
else:
107-
# TODO: Once interims have timeslots assigned,
108-
# look for the last ending timeslot instead
109-
return self.date
107+
return self.get_meeting_date(self.days-1)
110108

111109
def get_00_cutoff(self):
112110
start_date = datetime.datetime(year=self.date.year, month=self.date.month, day=self.date.day, tzinfo=pytz.utc)
@@ -143,20 +141,17 @@ def get_reopen_time(self):
143141
def get_current_meeting(cls, type="ietf"):
144142
return cls.objects.filter(type=type, date__gte=datetime.datetime.today()-datetime.timedelta(days=7) ).order_by('date').first()
145143

146-
@classmethod
147-
def get_first_cut_off(cls):
148-
meeting = cls.get_current_meeting()
149-
return meeting.get_00_cutoff()
144+
def get_first_cut_off(self):
145+
return self.get_00_cutoff()
150146

151-
@classmethod
152-
def get_second_cut_off(cls):
153-
meeting = cls.get_current_meeting()
154-
return meeting.get_01_cutoff()
147+
def get_second_cut_off(self):
148+
return self.get_01_cutoff()
155149

156-
@classmethod
157-
def get_ietf_monday(cls):
158-
date = cls.objects.all().filter(type="ietf").order_by('-date')[0].date
159-
return date + datetime.timedelta(days=-date.weekday(), weeks=1)
150+
def get_ietf_monday(self):
151+
for offset in range(self.days):
152+
date = self.date+datetime.timedelta(days=offset)
153+
if date.weekday() == 0: # Monday is 0
154+
return date
160155

161156
def get_materials_path(self):
162157
return os.path.join(settings.AGENDA_PATH,self.number)

ietf/secr/drafts/reports.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def report_id_activity(start,end):
4444
approved = events.filter(type='iesg_approved').count()
4545

4646
# get 4 weeks
47-
monday = Meeting.get_ietf_monday()
47+
monday = Meeting.get_current_meeting().get_ietf_monday()
4848
cutoff = monday + datetime.timedelta(days=3)
4949
ff1_date = cutoff - datetime.timedelta(days=28)
5050
#ff2_date = cutoff - datetime.timedelta(days=21)
@@ -100,4 +100,4 @@ def report_progress_report(start_date,end_date):
100100

101101
report = render_to_string('drafts/report_progress_report.txt', context)
102102

103-
return report
103+
return report

ietf/secr/meetings/tests.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ def test_add_meeting(self):
7070
url = reverse('ietf.secr.meetings.views.add')
7171
post_data = dict(number=number,city='Toronto',date='2014-07-20',country='CA',
7272
time_zone='America/New_York',venue_name='Hilton',
73+
days=6,
7374
venue_addr='100 First Ave',
7475
idsubmit_cutoff_day_offset_00=13,
7576
idsubmit_cutoff_day_offset_01=20,
@@ -106,6 +107,7 @@ def test_edit_meeting(self):
106107
)
107108
url = reverse('ietf.secr.meetings.views.edit_meeting',kwargs={'meeting_id':1})
108109
post_data = dict(number='1',date='2014-07-20',city='Toronto',
110+
days=7,
109111
idsubmit_cutoff_day_offset_00=13,
110112
idsubmit_cutoff_day_offset_01=20,
111113
idsubmit_cutoff_time_utc =datetime.timedelta(hours=23, minutes=59, seconds=59),

0 commit comments

Comments
 (0)