Skip to content

Commit 57afa06

Browse files
committed
Moved the materials start, cutoff, and revision dates into the Meeting object
Add a bit to meeting to note whether proceedings are final. Update proceedings view to reflect the status of that bit. Add a function that finalizes a meetings proceedings. Straighten out a migration numbering collision introduced in an earlier merge. Commit ready for merge. - Legacy-Id: 11764
2 parents f617e26 + 162845d commit 57afa06

16 files changed

Lines changed: 187 additions & 21 deletions

ietf/doc/tests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -928,7 +928,7 @@ def setUp(self):
928928
self.other_group.role_set.create(name_id='chair',person=self.other_chair,email=self.other_chair.email())
929929

930930
today = datetime.date.today()
931-
cut_days = settings.MEETING_MATERIALS_SUBMISSION_CORRECTION_DAYS
931+
cut_days = settings.MEETING_MATERIALS_DEFAULT_SUBMISSION_CORRECTION_DAYS
932932
self.past_cutoff = SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today-datetime.timedelta(days=1+cut_days))
933933
self.past = SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today-datetime.timedelta(days=cut_days/2))
934934
self.inprog = SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today-datetime.timedelta(days=1))
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
from django.db import models, migrations
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('meeting', '0029_add_time_to_room_and_floorplan'),
11+
]
12+
13+
operations = [
14+
migrations.AddField(
15+
model_name='meeting',
16+
name='submission_correction_day_offset',
17+
field=models.IntegerField(default=50, help_text=b'The number of days after the meeting start date in which updates to existing meeting materials will be accepted.', blank=True),
18+
preserve_default=True,
19+
),
20+
migrations.AddField(
21+
model_name='meeting',
22+
name='submission_cutoff_day_offset',
23+
field=models.IntegerField(default=26, help_text=b'The number of days after the meeting start date in which new meeting materials will be accepted.', blank=True),
24+
preserve_default=True,
25+
),
26+
migrations.AddField(
27+
model_name='meeting',
28+
name='submission_start_day_offset',
29+
field=models.IntegerField(default=90, help_text=b'The number of days before the meeting start date after which meeting materials will be accepted.', blank=True),
30+
preserve_default=True,
31+
),
32+
]
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
from django.db import models, migrations
5+
6+
7+
def reverse(apps, schema_editor):
8+
pass
9+
10+
class Migration(migrations.Migration):
11+
12+
dependencies = [
13+
('meeting', '0030_add_material_day_offsets'),
14+
]
15+
16+
operations = [
17+
migrations.AddField(
18+
model_name='meeting',
19+
name='proceedings_final',
20+
field=models.BooleanField(default=False, help_text='Are the proceedings for this meeting complete?'),
21+
preserve_default=True,
22+
),
23+
]

ietf/meeting/migrations/0029_reconstruct_bluesheet_docs_95through96.py renamed to ietf/meeting/migrations/0032_reconstruct_bluesheet_docs_95through96.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def reverse(apps, schema_editor):
5959
class Migration(migrations.Migration):
6060

6161
dependencies = [
62-
('meeting', '0028_add_audio_stream_data'),
62+
('meeting', '0031_add_proceedings_final'),
6363
('doc', '0012_auto_20160207_0537'),
6464
('group','0008_auto_20160505_0523'),
6565
]

ietf/meeting/models.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,23 @@ class Meeting(models.Model):
7272
idsubmit_cutoff_warning_days = timedelta.fields.TimedeltaField(blank=True,
7373
default=settings.IDSUBMIT_DEFAULT_CUTOFF_WARNING_DAYS,
7474
help_text = "How long before the 00 cutoff to start showing cutoff warnings. Use for example 21 days or 3 weeks.")
75-
#
75+
submission_start_day_offset = models.IntegerField(blank=True,
76+
default=settings.MEETING_MATERIALS_DEFAULT_SUBMISSION_START_DAYS,
77+
help_text = "The number of days before the meeting start date after which meeting materials will be accepted.")
78+
submission_cutoff_day_offset = models.IntegerField(blank=True,
79+
default=settings.MEETING_MATERIALS_DEFAULT_SUBMISSION_CUTOFF_DAYS,
80+
help_text = "The number of days after the meeting start date in which new meeting materials will be accepted.")
81+
submission_correction_day_offset = models.IntegerField(blank=True,
82+
default=settings.MEETING_MATERIALS_DEFAULT_SUBMISSION_CORRECTION_DAYS,
83+
help_text = "The number of days after the meeting start date in which updates to existing meeting materials will be accepted.")
7684
venue_name = models.CharField(blank=True, max_length=255)
7785
venue_addr = models.TextField(blank=True)
7886
break_area = models.CharField(blank=True, max_length=255)
7987
reg_area = models.CharField(blank=True, max_length=255)
8088
agenda_note = models.TextField(blank=True, help_text="Text in this field will be placed at the top of the html agenda page for the meeting. HTML can be used, but will not be validated.")
8189
agenda = models.ForeignKey('Schedule',null=True,blank=True, related_name='+')
8290
session_request_lock_message = models.CharField(blank=True,max_length=255) # locked if not empty
91+
proceedings_final = models.BooleanField(default=False, help_text=u"Are the proceedings for this meeting complete?")
8392

8493
def __unicode__(self):
8594
if self.type_id == "ietf":
@@ -149,11 +158,11 @@ def get_materials_path(self):
149158

150159
# the various dates are currently computed
151160
def get_submission_start_date(self):
152-
return self.date + datetime.timedelta(days=settings.MEETING_MATERIALS_SUBMISSION_START_DAYS)
161+
return self.date - datetime.timedelta(days=self.submission_start_day_offset)
153162
def get_submission_cut_off_date(self):
154-
return self.date + datetime.timedelta(days=settings.MEETING_MATERIALS_SUBMISSION_CUTOFF_DAYS)
163+
return self.date + datetime.timedelta(days=self.submission_cutoff_day_offset)
155164
def get_submission_correction_date(self):
156-
return self.date + datetime.timedelta(days=settings.MEETING_MATERIALS_SUBMISSION_CORRECTION_DAYS)
165+
return self.date + datetime.timedelta(days=self.submission_correction_day_offset)
157166

158167
def get_schedule_by_name(self, name):
159168
return self.schedule_set.filter(name=name).first()

ietf/meeting/resources.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ class Meta:
3232
"idsubmit_cutoff_day_offset_01": ALL,
3333
"idsubmit_cutoff_time_utc": ALL,
3434
"idsubmit_cutoff_warning_days": ALL,
35+
"submission_start_day_offset": ALL,
36+
"submmission_cutoff_day_offset": ALL,
37+
"submission_correction_day_offset": ALL,
3538
"venue_name": ALL,
3639
"venue_addr": ALL,
3740
"break_area": ALL,
@@ -40,6 +43,7 @@ class Meta:
4043
"session_request_lock_message": ALL,
4144
"type": ALL_WITH_RELATIONS,
4245
"agenda": ALL_WITH_RELATIONS,
46+
"proceedings_final": ALL,
4347
}
4448
api.meeting.register(MeetingResource())
4549

ietf/meeting/tests_views.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1146,7 +1146,7 @@ def test_floor_plan_page(self):
11461146
url = urlreverse('ietf.meeting.views.floor_plan', kwargs={'floor': xslugify(floorplan.name)} )
11471147
r = self.client.get(url)
11481148
self.assertEqual(r.status_code, 200)
1149-
1149+
11501150
class IphoneAppJsonTests(TestCase):
11511151
def setUp(self):
11521152
pass
@@ -1168,3 +1168,23 @@ def test_iphone_app_json(self):
11681168
url = urlreverse('ietf.meeting.views.json_agenda',kwargs={'num':meeting.number})
11691169
r = self.client.get(url)
11701170
self.assertEqual(r.status_code,200)
1171+
1172+
class FinalizeProceedingsTests(TestCase):
1173+
def test_finalize_proceedings(self):
1174+
make_meeting_test_data()
1175+
meeting = Meeting.objects.filter(type_id='ietf').order_by('id').last()
1176+
meeting.session_set.filter(group__acronym='mars').first().sessionpresentation_set.create(document=Document.objects.filter(type='draft').first(),rev=None)
1177+
1178+
url = urlreverse('ietf.meeting.views.finalize_proceedings',kwargs={'num':meeting.number})
1179+
login_testing_unauthorized(self,"secretary",url)
1180+
r = self.client.get(url)
1181+
self.assertEqual(r.status_code, 200)
1182+
1183+
self.assertEqual(meeting.proceedings_final,False)
1184+
self.assertEqual(meeting.session_set.filter(group__acronym="mars").first().sessionpresentation_set.filter(document__type="draft").first().rev,None)
1185+
r = self.client.post(url,{'finalize':1})
1186+
self.assertEqual(r.status_code, 302)
1187+
meeting = Meeting.objects.get(pk=meeting.pk)
1188+
self.assertEqual(meeting.proceedings_final,True)
1189+
self.assertEqual(meeting.session_set.filter(group__acronym="mars").first().sessionpresentation_set.filter(document__type="draft").first().rev,'00')
1190+

ietf/meeting/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
url(r'^room-view(?:.html)?/?$', views.room_view),
6969
url(r'^materials(?:.html)?/?$', views.materials),
7070
url(r'^proceedings(?:.html)?/?$', views.proceedings),
71+
url(r'^proceedings(?:.html)?/finalize/?$', views.finalize_proceedings),
7172
]
7273

7374
urlpatterns = [

ietf/meeting/utils.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,19 @@ def time_sort_key(session):
7171
meeting_sorted = sorted(acronym_sorted,key=lambda x: x.meeting.number)
7272

7373
return meeting_sorted
74+
75+
def finalize(meeting):
76+
end_date = meeting.end_date()
77+
end_time = datetime.datetime.combine(end_date, datetime.datetime.min.time())+datetime.timedelta(days=1)
78+
for session in meeting.session_set.all():
79+
for sp in session.sessionpresentation_set.filter(document__type='draft',rev=None):
80+
rev_before_end = [e for e in sp.document.docevent_set.filter(newrevisiondocevent__isnull=False).order_by('-time') if e.time <= end_time ]
81+
if rev_before_end:
82+
sp.rev = rev_before_end[-1].newrevisiondocevent.rev
83+
else:
84+
sp.rev = '00'
85+
sp.save()
86+
meeting.proceedings_final = True
87+
meeting.save()
88+
return
89+

ietf/meeting/views.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
from ietf.meeting.helpers import send_interim_cancellation_notice
5151
from ietf.meeting.helpers import send_interim_approval_request
5252
from ietf.meeting.helpers import send_interim_announcement_request
53+
from ietf.meeting.utils import finalize
5354
from ietf.utils.mail import send_mail_message
5455
from ietf.utils.pipe import pipe
5556
from ietf.utils.pdf import pdf_pages
@@ -1546,10 +1547,26 @@ def proceedings(request, num=None):
15461547

15471548
cache_version = Document.objects.filter(session__meeting__number=meeting.number).aggregate(Max('time'))["time__max"]
15481549
return render(request, "meeting/proceedings.html", {
1549-
'meeting_num': meeting.number,
1550+
'meeting': meeting,
15501551
'plenaries': plenaries, 'ietf': ietf, 'training': training, 'irtf': irtf, 'iab': iab,
15511552
'cut_off_date': cut_off_date,
15521553
'cor_cut_off_date': cor_cut_off_date,
15531554
'submission_started': now > begin_date,
15541555
'cache_version': cache_version,
15551556
})
1557+
1558+
1559+
@role_required('Secretariat')
1560+
def finalize_proceedings(request, num=None):
1561+
1562+
meeting = get_meeting(num)
1563+
1564+
if meeting.number <= 64 or not meeting.agenda.assignments.exists() or meeting.proceedings_final:
1565+
raise Http404
1566+
1567+
if request.method=='POST':
1568+
finalize(meeting)
1569+
return HttpResponseRedirect(reverse('ietf.meeting.views.proceedings',kwargs={'num':meeting.number}))
1570+
1571+
return render(request, "meeting/finalize.html", {'meeting':meeting,})
1572+

0 commit comments

Comments
 (0)