Skip to content

Commit 162845d

Browse files
committed
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
- Legacy-Id: 11763
1 parent fbf7d9e commit 162845d

9 files changed

Lines changed: 99 additions & 10 deletions

File tree

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/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ class Meeting(models.Model):
8888
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.")
8989
agenda = models.ForeignKey('Schedule',null=True,blank=True, related_name='+')
9090
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?")
9192

9293
def __unicode__(self):
9394
if self.type_id == "ietf":

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: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,3 +1146,22 @@ def test_floor_plan_page(self):
11461146
r = self.client.get(url)
11471147
self.assertEqual(r.status_code, 200)
11481148

1149+
class FinalizeProceedingsTests(TestCase):
1150+
def test_finalize_proceedings(self):
1151+
make_meeting_test_data()
1152+
meeting = Meeting.objects.filter(type_id='ietf').order_by('id').last()
1153+
meeting.session_set.filter(group__acronym='mars').first().sessionpresentation_set.create(document=Document.objects.filter(type='draft').first(),rev=None)
1154+
1155+
url = urlreverse('ietf.meeting.views.finalize_proceedings',kwargs={'num':meeting.number})
1156+
login_testing_unauthorized(self,"secretary",url)
1157+
r = self.client.get(url)
1158+
self.assertEqual(r.status_code, 200)
1159+
1160+
self.assertEqual(meeting.proceedings_final,False)
1161+
self.assertEqual(meeting.session_set.filter(group__acronym="mars").first().sessionpresentation_set.filter(document__type="draft").first().rev,None)
1162+
r = self.client.post(url,{'finalize':1})
1163+
self.assertEqual(r.status_code, 302)
1164+
meeting = Meeting.objects.get(pk=meeting.pk)
1165+
self.assertEqual(meeting.proceedings_final,True)
1166+
self.assertEqual(meeting.session_set.filter(group__acronym="mars").first().sessionpresentation_set.filter(document__type="draft").first().rev,'00')
1167+

ietf/meeting/urls.py

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

7273
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
@@ -48,6 +48,7 @@
4848
from ietf.meeting.helpers import send_interim_cancellation_notice
4949
from ietf.meeting.helpers import send_interim_approval_request
5050
from ietf.meeting.helpers import send_interim_announcement_request
51+
from ietf.meeting.utils import finalize
5152
from ietf.utils.mail import send_mail_message
5253
from ietf.utils.pipe import pipe
5354
from ietf.utils.pdf import pdf_pages
@@ -1465,10 +1466,26 @@ def proceedings(request, num=None):
14651466

14661467
cache_version = Document.objects.filter(session__meeting__number=meeting.number).aggregate(Max('time'))["time__max"]
14671468
return render(request, "meeting/proceedings.html", {
1468-
'meeting_num': meeting.number,
1469+
'meeting': meeting,
14691470
'plenaries': plenaries, 'ietf': ietf, 'training': training, 'irtf': irtf, 'iab': iab,
14701471
'cut_off_date': cut_off_date,
14711472
'cor_cut_off_date': cor_cut_off_date,
14721473
'submission_started': now > begin_date,
14731474
'cache_version': cache_version,
14741475
})
1476+
1477+
1478+
@role_required('Secretariat')
1479+
def finalize_proceedings(request, num=None):
1480+
1481+
meeting = get_meeting(num)
1482+
1483+
if meeting.number <= 64 or not meeting.agenda.assignments.exists() or meeting.proceedings_final:
1484+
raise Http404
1485+
1486+
if request.method=='POST':
1487+
finalize(meeting)
1488+
return HttpResponseRedirect(reverse('ietf.meeting.views.proceedings',kwargs={'num':meeting.number}))
1489+
1490+
return render(request, "meeting/finalize.html", {'meeting':meeting,})
1491+

ietf/templates/meeting/group_proceedings.html

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@
2525
{% if session.agenda %}
2626
<a href="https://www.ietf.org/proceedings/{{meeting_num}}/agenda/{{ session.agenda }}">Agenda</a><br>
2727
{% else %}
28-
{% if show_agenda == "True" %}
28+
{% if show_agenda == "True" and not meeting.proceedings_final %}
2929
<span class="label label-warning">No agenda</span><br>
3030
{% endif %}
3131
{% endif %}
3232
{% if session.minutes %}
3333
<a href="https://www.ietf.org/proceedings/{{ meeting_num }}/minutes/{{ session.minutes }}">Minutes</a><br>
3434
{% else %}
35-
{% if show_agenda == "True" %}
35+
{% if show_agenda == "True" and not meeting.proceedings_final %}
3636
<span class="label label-warning">No minutes</span><br>
3737
{% endif %}
3838
{% endif %}
@@ -64,7 +64,9 @@
6464
<a href="https://www.ietf.org/proceedings/{{meeting_num}}/slides/{{ slide.external_url }}">{{ slide.title|clean_whitespace }}</a>
6565
<br>
6666
{% empty %}
67-
<span class="label label-warning">No slides</span>
67+
{% if not meeting.proceedings_final %}
68+
<span class="label label-warning">No slides</span>
69+
{% endif %}
6870
{% endfor %}
6971
{% endwith %}
7072
</td>
@@ -73,7 +75,9 @@
7375
{% for draft in drafts %}
7476
<a href="{% url "doc_view" name=draft.canonical_name %}">{{ draft.canonical_name }}</a><br>
7577
{% empty %}
76-
<span class="label label-warning">No drafts</span>
78+
{% if not meeting.proceedings_final %}
79+
<span class="label label-warning">No drafts</span>
80+
{% endif %}
7781
{% endfor %}
7882
{% endwith %}
7983
</td>

ietf/templates/meeting/proceedings.html

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,27 +10,31 @@
1010

1111
{% block bodyAttrs %}data-spy="scroll" data-target="#affix"{% endblock %}
1212

13-
{% block title %}IETF {{ meeting_num }} Proceedings {% endblock %}
13+
{% block title %}IETF {{ meeting.number }} {% if not meeting.proceedings_final %}Draft{% endif %} Proceedings {% endblock %}
1414

1515
{% block content %}
1616
{% origin %}
1717
<div class="row">
1818
<div class="col-md-10">
1919

20-
<h1>IETF {{ meeting_num }} Proceedings</h1>
20+
<h1>IETF {{ meeting.number }} {% if not meeting.proceedings_final %}Draft{% endif %} Proceedings
21+
{% if user|has_role:"Secretariat" and not meeting.proceedings_final %}
22+
<a class="btn btn-default" href="{% url 'ietf.meeting.views.finalize_proceedings' num=meeting.number %}">Finalize Proceedings</a>
23+
{% endif %}
24+
</h1>
2125

2226
<p class="alert alert-info">
2327
<b>This page is under construction</b>
2428
</p>
25-
{% if meeting_num|add:0 <= 96 %}
29+
{% if meeting.number|add:0 <= 96 %}
2630
<p class="alert alert-info">
27-
<b>These are not the official proceedings for IETF{{meeting_num}}. This page shows what would be generated by the new automatic proceedings generator for that meeting. The official proceedings are located at <a href="https://www.ietf.org/proceedings/{{meeting_num}}">https://www.ietf.org/proceedings/{{meeting_num}}</a></b>
31+
<b>These are not the official proceedings for IETF{{meeting.number}}. This page shows what would be generated by the new automatic proceedings generator for that meeting. The official proceedings are located at <a href="https://www.ietf.org/proceedings/{{meeting.number}}">https://www.ietf.org/proceedings/{{meeting.number}}</a></b>
2832
</p>
2933
{% endif %}
3034

3135
{# cache for 15 minutes, as long as there's no proceedings activity. takes 4-8 seconds to generate. #}
3236
{% load cache %}
33-
{% cache 900 ietf_meeting_materials meeting_num cache_version %}
37+
{% cache 900 ietf_meeting_materials meeting.number cache_version %}
3438

3539
{% with "True" as show_agenda %}
3640
<!-- Plenaries -->

0 commit comments

Comments
 (0)