Skip to content

Commit 103d597

Browse files
committed
Fix the agena problem where breaks would not have the right name. Also refactor and simplify the agenda code and templates.
- Legacy-Id: 1346
1 parent a7677a8 commit 103d597

5 files changed

Lines changed: 165 additions & 196 deletions

File tree

ietf/meeting/urls.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
from ietf.meeting import views
55

66
urlpatterns = patterns('',
7-
(r'^(?P<meeting_num>\d+)/agenda.(?P<html_or_txt>\S+)$', views.show_html_agenda),
87
(r'^(?P<meeting_num>\d+)/materials.html$', views.show_html_materials),
8+
(r'^agenda/$', views.html_agenda),
9+
(r'^(?P<num>\d+)/agenda.html$', views.html_agenda),
10+
(r'^(?P<num>\d+)/agenda.txt$', views.text_agenda),
911
(r'^$', views.current_materials),
1012
)
1113

ietf/meeting/views.py

Lines changed: 42 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
from django.shortcuts import render_to_response as render, get_object_or_404
66
from ietf.proceedings.models import Meeting, MeetingTime, WgMeetingSession, NonSession, MeetingVenue, IESGHistory, Proceeding, Switches
77
from django.views.generic.list_detail import object_list
8-
from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect, Http404
8+
from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect, Http404, HttpResponse
99
from django.core.urlresolvers import reverse
10-
from django.db.models import Q
10+
from django.db.models import Q
11+
from django.template import RequestContext
12+
from django.template.loader import render_to_string
1113
import datetime
1214

1315
def show_html_materials(request, meeting_num=None):
@@ -39,45 +41,47 @@ def current_materials(request):
3941
meeting = Meeting.objects.order_by('-meeting_num')[0]
4042
return HttpResponseRedirect( reverse(show_html_materials, args=[meeting.meeting_num]) )
4143

42-
def show_html_agenda(request, meeting_num=None, html_or_txt=None):
43-
queryset_list=MeetingTime.objects.filter(meeting=meeting_num,day_id__gt='0').order_by("day_id","time_desc")
44-
queryset_list_pre_session=MeetingTime.objects.filter(meeting=meeting_num,day_id__lte='0').order_by("day_id","time_desc")
45-
meeting_info=get_object_or_404(Meeting, meeting_num=meeting_num)
46-
nonsession_info=NonSession.objects.filter(meeting=meeting_num,day_id__gte='0').order_by("day_id")
47-
meetingvenue_info=get_object_or_404(MeetingVenue, meeting_num=meeting_num)
48-
last_update_info=get_object_or_404(Switches,id=1)
44+
def get_plenary_agenda(meeting_num, id):
4945
try:
50-
plenaryt_agenda_file = "/a/www/ietf/proceedings/%s" % WgMeetingSession.objects.get(meeting=meeting_num,group_acronym_id=-2).agenda_file()
46+
plenary_agenda_file = "/a/www/ietf/proceedings/%s" % WgMeetingSession.objects.get(meeting=meeting_num,group_acronym_id=id).agenda_file()
5147
try:
52-
f = open(plenaryt_agenda_file)
53-
plenaryt_agenda = f.read()
48+
f = open(plenary_agenda_file)
49+
plenary_agenda = f.read()
5450
f.close()
51+
return plenary_agenda
5552
except IOError:
56-
plenaryt_agenda = "THE AGENDA HAS NOT BEEN UPLOADED YET"
53+
return "THE AGENDA HAS NOT BEEN UPLOADED YET"
5754
except WgMeetingSession.DoesNotExist:
58-
plenaryt_agenda = "The Technical Plenary has not been scheduled"
59-
if html_or_txt == "html":
60-
template_file="meeting/agenda.html"
61-
elif html_or_txt == "txt":
62-
template_file="meeting/agenda.txt"
63-
else:
64-
raise Http404
65-
try:
66-
plenaryw_agenda_file = "/a/www/ietf/proceedings/%s" % WgMeetingSession.objects.get(meeting=meeting_num,group_acronym_id=-1).agenda_file()
67-
try:
68-
f = open(plenaryw_agenda_file)
69-
plenaryw_agenda = f.read()
70-
f.close()
71-
except IOError:
72-
plenaryw_agenda = "THE AGENDA HAS NOT BEEN UPLOADED YET"
73-
except WgMeetingSession.DoesNotExist:
74-
plenaryw_agenda = "THE IETF Operations and Administration Plenary has not been secheduled"
75-
# Due to a bug in Django@0.96 we can't use foreign key lookup in
76-
# order_by(), see http://code.djangoproject.com/ticket/2076. Changeset
77-
# [133] is broken because it requires a patched Django to run. Work
78-
# around this instead. Later: FIXME (revert to the straightforward code
79-
# when this bug has been fixed in the Django release we're running.)
80-
queryset_list_ads = list(IESGHistory.objects.filter(meeting=meeting_num))
81-
queryset_list_ads.sort(key=(lambda item: item.area.area_acronym.acronym))
82-
return object_list(request,queryset=queryset_list, template_name=template_file,allow_empty=True, extra_context={'queryset_list_pre_session':queryset_list_pre_session, 'meeting_info':meeting_info, 'meeting_num':meeting_num, 'nonsession_info':nonsession_info, 'meetingvenue_info':meetingvenue_info, 'plenaryw_agenda':plenaryw_agenda, 'plenaryt_agenda':plenaryt_agenda, 'qs_ads':queryset_list_ads,'last_update_info':last_update_info})
55+
return "The Plenary has not been scheduled"
56+
57+
def html_agenda(request, num=None):
58+
if not num:
59+
num = list(Meeting.objects.all())[-1].meeting_num
60+
timeslots = MeetingTime.objects.filter(meeting=num).order_by("day_id", "time_desc")
61+
update = get_object_or_404(Switches,id=1)
62+
meeting=get_object_or_404(Meeting, meeting_num=num)
63+
venue = get_object_or_404(MeetingVenue, meeting_num=num)
64+
ads = list(IESGHistory.objects.filter(meeting=num))
65+
if not ads:
66+
ads = list(IESGHistory.objects.filter(meeting=str(int(num)-1)))
67+
ads.sort(key=(lambda item: item.area.area_acronym.acronym))
68+
plenaryw_agenda = get_plenary_agenda(num, -1)
69+
plenaryt_agenda = get_plenary_agenda(num, -2)
70+
return render("meeting/agenda.html",
71+
{"timeslots":timeslots, "update":update, "meeting":meeting, "venue":venue, "ads":ads,
72+
"ops_plenary_agenda":plenaryw_agenda, "tech_plenary_agenda":plenaryt_agenda, },
73+
RequestContext(request))
8374

75+
def text_agenda(request, num):
76+
timeslots = MeetingTime.objects.filter(meeting=num).order_by("day_id", "time_desc")
77+
update = get_object_or_404(Switches,id=1)
78+
meeting=get_object_or_404(Meeting, meeting_num=num)
79+
venue = get_object_or_404(MeetingVenue, meeting_num=num)
80+
ads = list(IESGHistory.objects.filter(meeting=num))
81+
if not ads:
82+
ads = list(IESGHistory.objects.filter(meeting=str(int(num)-1)))
83+
ads.sort(key=(lambda item: item.area.area_acronym.acronym))
84+
return HttpResponse(render_to_string("meeting/agenda.txt",
85+
{"timeslots":timeslots, "update":update, "meeting":meeting, "venue":venue, "ads":ads},
86+
RequestContext(request)), mimetype="text/plain")
87+

ietf/proceedings/models.py

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ def __str__(self):
108108
return "IETF %d" % (self.meeting_num)
109109
def get_meeting_date (self,offset):
110110
return self.start_date + datetime.timedelta(days=offset)
111+
def num(self):
112+
return self.meeting_num
111113
class Meta:
112114
db_table = 'meetings'
113115
class Admin:
@@ -130,6 +132,8 @@ def __str__(self):
130132
return self.name
131133
class Meta:
132134
db_table = 'non_session_ref'
135+
class Admin:
136+
pass
133137

134138
class NonSession(models.Model):
135139
non_session_id = models.AutoField(primary_key=True)
@@ -225,37 +229,29 @@ def sessions(self):
225229
else:
226230
s.room_id = 0
227231
return sessions
232+
def sessions_by_area(self):
233+
return [ {"area":session.area()+session.acronym(), "info":session} for session in self.sessions() ]
228234
def meeting_date(self):
229235
return self.meeting.get_meeting_date(self.day_id)
236+
def registration(self):
237+
reg = NonSession.objects.get(meeting=self.meeting, day_id=self.day_id, non_session_ref=1)
238+
reg.name = reg.non_session_ref.name
239+
return reg
230240
def reg_info(self):
231-
reg_info = NonSession.objects.get(meeting=self.meeting, day_id=self.day_id, non_session_ref=1)
241+
reg_info = self.registration()
232242
if reg_info.time_desc:
233-
return "%s %s" % (reg_info.time_desc, reg_info.non_session_ref)
243+
return "%s %s" % (reg_info.time_desc, reg_info.name)
234244
else:
235245
return ""
236-
def morning_br_info(self):
237-
br_info = NonSession.objects.get(models.Q(day_id=self.day_id) | models.Q(day_id__isnull=True), meeting=self.meeting, non_session_ref=2)
238-
return "%s %s" % (br_info.time_desc, br_info.non_session_ref)
239-
def lunch_br_info(self):
240-
return NonSession.objects.get(meeting=self.meeting, non_session_ref=3).time_desc
241-
def an_br1_info(self):
242-
an_br1_info = NonSession.objects.exclude(time_desc="").get(meeting=self.meeting, day_id=self.day_id, non_session_ref=4)
243-
if an_br1_info:
244-
if self.day_id == 1 or self.day_id == 2:
245-
return "%s Afternoon Beverage Break I" % (an_br1_info.time_desc)
246-
else:
247-
return "%s %s" % (an_br1_info.time_desc, an_br1_info.non_session_ref)
248-
else:
249-
return ""
250-
def an_br2_info(self):
251-
an_br2_info = NonSession.objects.exclude(time_desc="").get(meeting=self.meeting, day_id=self.day_id, non_session_ref=5)
252-
if an_br2_info:
253-
return "%s %s" % (an_br2_info.time_desc, an_br2_info.non_session_ref)
254-
else:
255-
return ""
256-
def fbreak_info(self):
257-
fbreak_info = NonSession.objects.get(meeting=self.meeting, day_id=5, non_session_ref=6)
258-
return "%s %s" % (fbreak_info.time_desc, fbreak_info.non_session_ref)
246+
def break_info(self):
247+
breaks = NonSession.objects.filter(meeting=self.meeting).exclude(non_session_ref=1).filter(models.Q(day_id=self.day_id) | models.Q(day_id__isnull=True)).order_by('time_desc')
248+
for brk in breaks:
249+
if brk.time_desc[-4:] == self.time_desc[:4]:
250+
brk.name = brk.non_session_ref.name
251+
return brk
252+
return None
253+
def is_plenary(self):
254+
return self.session_name_id in [9, 10]
259255
class Meta:
260256
db_table = 'meeting_times'
261257
class Admin:

ietf/templates/meeting/agenda.html

Lines changed: 83 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,106 +1,100 @@
1-
{# Copyright The IETF Trust 2007, All Rights Reserved #}
21
{% extends "base.html" %}
2+
{# Copyright The IETF Trust 2007, All Rights Reserved #}
33
{% load humanize %}
4-
{% block title %} Meeting Agenda of the {{ meeting_num|ordinal }} IETF Meeting{% endblock %}
5-
{% block body_attributes %}background="http://www.ietf.org/meetings/peachbkg.gif"{% endblock %}
4+
{% block title %} Meeting Agenda of the {{ meeting.num|ordinal }} IETF Meeting{% endblock %}
65
{% block content %}
7-
8-
<center>
9-
<strong> Agenda of the {{ meeting_num|ordinal }} IETF Meeting </strong> <br/>
10-
<strong>{{ meeting_info.start_date|date:"F j" }}-{% ifnotequal meeting_info.start_date.month meeting_info.end_date.month %}{{ meeting_info.end_date|date:"F " }}{% endifnotequal %}{{ meeting_info.end_date|date:"j, Y" }} </strong><br />
11-
Updated {{ last_update_info.updated|date:"F j, Y P (T)" }}<br />
12-
(<a href="{% url ietf.meeting.views.show_html_agenda meeting_num,"txt" %}">Agenda in text/plain format</a>) <br />
13-
<br />
14-
<i>IETF agendas are subject to change, up to and during the meeting.</i><br />
6+
<p style="text-align: center">
7+
Agenda of the {{ meeting.num|ordinal }} IETF Meeting<br />
8+
{{ meeting.start_date|date:"F j" }}-{% ifnotequal meeting.start_date.month meeting.end_date.month %}{{ meeting.end_date|date:"F " }}{% endifnotequal %}{{ meeting.end_date|date:"j, Y" }}<br />
9+
Updated {{ update.updated|date:"Y-m-d H:i:s T" }}<br />
10+
(There's also a <a href="./agenda.txt">plaintext agenda</a> and a <a href="http://tools.ietf.org/agenda/{{meeting.num}}/">tools-style agenda</a> available)<br />
1511
<br />
16-
</center>
12+
IETF agendas are subject to change, up to and during the meeting.<br />
13+
</p>
1714

18-
19-
<!-- Update to include Saturday Session -->
20-
{% regroup queryset_list_pre_session by day_id as pre_days %}
21-
{% for pre_day in pre_days %}
22-
<b>{{ pre_day.list.0.meeting_date|date:"l"|upper }}, {{ pre_day.list.0.meeting_date|date:"F j, Y" }} </b><br>
23-
{% ifequal pre_day.list.0.day_id 0 %}
24-
{{ nonsession_info.0.time_desc }} {{ nonsession_info.0.non_session_ref }} - {{ meetingvenue_info.reg_area_name }}
25-
<br>
26-
{% endifequal %}
27-
{% for item in pre_day.list %}
28-
{% for session in item.sessions %}
29-
{{ item.time_desc }} {{ session.acronym_name }} - {{ session.sched_room_id1.room_name }}<br>
30-
{% endfor %}
31-
{% endfor %}
32-
<br>
33-
{% endfor %}
34-
<!-- End Update -->
35-
{% regroup object_list by day_id as days %}
36-
{% for day in days %}
37-
<b>{{ day.list.0.meeting_date|date:"l"|upper }}, {{ day.list.0.meeting_date|date:"F j, Y" }} </b><br>
38-
{% if day.list.0.reg_info %}{{ day.list.0.reg_info }} - {{ meetingvenue_info.reg_area_name }} <br>{% endif %}
39-
{% ifequal day.list.0.day_id "5" %}
40-
{{ day.list.0.fbreak_info }} - {{ meetingvenue_info.break_area_name }} <br>
15+
<table id="agenda">
16+
{% for slot in timeslots %}
17+
{% ifchanged %}
18+
<tr>
19+
<td colspan="4">
20+
<hr />
21+
<h4>{{ slot.meeting_date|date:"l"|upper }}, {{ slot.meeting_date|date:"F j, Y" }}</h4>
22+
</td>
23+
</tr>
24+
{% if slot.reg_info %}
25+
<tr>
26+
<td colspan="4">
27+
{{ slot.registration.time_desc }} {{ slot.registration.name }}
28+
{% if venue.reg_area_name %} - <a href="http://tools.ietf.org/agenda/{{meeting.num}}/venue/?room={{ venue.reg_area_name|slugify }}">{{ venue.reg_area_name }}</a>{% endif %}
29+
</td>
30+
</tr>
31+
{% endif %}
32+
{% endifchanged %}
33+
{% if slot.session_name %}
34+
{% if slot.break_info %}
35+
<tr>
36+
<td colspan="4">
37+
<br />
38+
{{ slot.break_info.time_desc }} {{ slot.break_info.name }}
39+
{% if venue.break_area_name %} - <a href="http://tools.ietf.org/agenda/{{meeting.num}}/venue/?room={{ venue.break_area_name|slugify }}">{{ venue.break_area_name }}</a>{% endif %}
40+
</td>
41+
</tr>
42+
{% endif %}
43+
<tr>
44+
<td colspan="4">
45+
<b>{{ slot.time_desc }} {{ slot.session_name }}</b>
46+
{% ifequal slot.sessions.0.acronym "plenaryw" %}
47+
<b>- {{ slot.sessions.0.room_id.room_name }}</b><br>
48+
<pre>{{ ops_plenary_agenda|escape }}</pre>
49+
{% endifequal %}
50+
{% ifequal slot.sessions.0.acronym "plenaryt" %}
51+
<b>- {{ slot.sessions.0.room_id.room_name }}</b><br>
52+
<pre>{{ tech_plenary_agenda|escape }}</pre>
53+
{% endifequal %}
54+
</td>
55+
</tr>
56+
{% if not slot.is_plenary %}
57+
{% for session in slot.sessions_by_area|dictsort:"area" %}
58+
<tr>
59+
<td><a href="http://tools.ietf.org/agenda/{{meeting.num}}/venue/?room={{session.info.room_id.room_name|slugify}}">{{ session.info.room_id.room_name}}</a></td>
60+
{% if session.info.area %}
61+
<td>{{ session.info.area|upper}}</td>
62+
<td>{% if session.info.isWG %}<a href="http://www.ietf.org/html.charters/{{ session.info.acronym|lower }}-charter.html">{{ session.info.acronym|lower }}</a>{% else %}{{ session.info.acronym|lower }}{% endif %}</td>
63+
<td>
64+
{% if session.info.agenda_file %}<a href="http://www3.ietf.org/proceedings/{{ session.info.agenda_file }}">{{ session.info.acronym_name|escape }} {{ session.info.group_type_str }}</a>{% else %}{{ session.info.acronym_name|escape }} {{ session.info.group_type_str }}{% endif %}
65+
{% if session.info.special_agenda_note %}<br/> - {{ session.info.special_agenda_note }}{% endif %}
66+
</td>
67+
{% endif %}
68+
</tr>
69+
{% endfor %}
70+
{% endif %}
4171
{% else %}
42-
{{ day.list.0.morning_br_info }} - {{ meetingvenue_info.break_area_name }} <br>
43-
{% endifequal %}
44-
<br>
45-
{% for item in day.list %}
46-
{% ifequal item.session_name_id 3 %}
47-
{{ day.list.0.lunch_br_info }} Break<br>
48-
{% endifequal %}
49-
{% ifequal item.session_name_id 4 %}
50-
{% if day.list.0.an_br1_info %}
51-
{{ day.list.0.an_br1_info }} - {{ meetingvenue_info.break_area_name }}<br>
52-
{% endif %}
53-
{% endifequal %}
54-
{% ifequal item.session_name_id 5 %}
55-
{% if day.list.0.an_br2_info %}
56-
{{ day.list.0.an_br2_info }} - {{ meetingvenue_info.break_area_name }}<br>
57-
{% endif %}
58-
{% endifequal %}
59-
{% ifequal item.session_name_id 8 %}
60-
{% if day.list.0.an_br2_info %}
61-
{{ day.list.0.an_br2_info }} - {{ meetingvenue_info.break_area_name }}<br>
62-
{% endif %}
63-
{% endifequal %}
64-
{% ifequal item.session_name_id 10 %}
65-
{% if day.list.0.an_br2_info %}
66-
{{ day.list.0.an_br2_info }} - {{ meetingvenue_info.break_area_name }}<br>
67-
{% endif %}
68-
{% endifequal %}
69-
<b>{{ item.time_desc }} {{ item.session_name }} </b>
70-
{% ifequal item.sessions.0.acronym "plenaryw" %}
71-
<b>- {{ item.sessions.0.room_id.room_name }}</b><br>
72-
<pre>{{ plenaryw_agenda|escape }}</pre>
73-
{% else %}
74-
{% ifequal item.sessions.0.acronym "plenaryt" %}
75-
<b>- {{ item.sessions.0.room_id.room_name }}</b><br>
76-
<pre>{{ plenaryt_agenda|escape }}</pre>
77-
{% else %}
78-
<table border="0" cellspacing="0" cellpadding="0" width="800">
79-
{% for session in item.sessions|dictsort:"area" %}
80-
<tr><td width="200">{{ session.room_id.room_name }}</td><td width="50">{{ session.area|upper }}</td><td width="100">{% if session.isWG %}<a href="http://www.ietf.org/html.charters/{{ session.acronym|lower }}-charter.html">{{ session.acronym|lower }}</a>{% else %}{{ session.acronym|lower }}{% endif %}</td><td>{% if session.agenda_file %}<a href="http://www3.ietf.org/proceedings/{{ session.agenda_file }}">{{ session.acronym_name }} {{ session.group_type_str }}</a>{% else %}{{ session.acronym_name }} {{ session.group_type_str }}{% endif %}{% if session.special_agenda_note %} <b>- {{ session.special_agenda_note }}</b>{% endif %}</td></tr>
81-
{% endfor %}
82-
</table>
83-
{% endifequal %}
84-
{% endifequal %}
85-
<br>
86-
{% endfor %}
87-
<br>
72+
{% for session in slot.sessions %}
73+
<tr>
74+
<td colspan="4">
75+
{{ slot.time_desc }} {{ session.acronym_name|escape }} - <a href="http://tools.ietf.org/agenda/{{meeting.num}}/venue/?room={{session.room_id.room_name|slugify}}">{{ session.room_id.room_name}}</a>
76+
</td>
77+
</tr>
78+
{% endfor %}
79+
{% endif %}
8880
{% endfor %}
89-
<hr>
90-
<center><b>AREA DIRECTORS</b></center><br>
91-
<table border="0" width="800">
92-
{% regroup qs_ads by area as ads %}
93-
{% for ad in ads %}
81+
<tr><td colspan="4"><hr /></td></tr>
82+
<tr><td colspan="4" style="text-align: center"><b>AREA DIRECTORS</b></td></tr>
83+
<tr><td colspan="4">
84+
<table>
85+
{% regroup ads by area as grouped %}{% for ad in grouped %}
9486
<tr valign="top">
95-
<td width="65">{{ ad.grouper|upper }}</td>
96-
<td width="140">{{ ad.list.0.area.area_acronym.name }}</td>
87+
<td>{{ ad.grouper|upper }}</td>
88+
<td>{{ ad.list.0.area.area_acronym.name }}</td>
9789
<td>
9890
{% for ad_person in ad.list %}
99-
{% ifequal forloop.counter 2 %} & {% endifequal %}
91+
{% ifequal forloop.counter 2 %} &amp; {% endifequal %}
10092
{{ ad_person.person }}/{{ ad_person.person.affiliation }}
10193
{% endfor %}
10294
</td>
10395
</tr>
10496
{% endfor %}
10597
</table>
98+
</td></tr>
99+
</table>
106100
{% endblock %}

0 commit comments

Comments
 (0)