Skip to content

Commit bf718d1

Browse files
committed
Merged [4265] from adam@nostrum.com:
Migrated HTML agenda to new data model. This has several improvements, as well, such as clearer marking of BOFs. - Legacy-Id: 4268 Note: SVN reference [4265] has been migrated to Git commit c113bd0
2 parents 484eb75 + c113bd0 commit bf718d1

4 files changed

Lines changed: 155 additions & 114 deletions

File tree

ietf/doc/models.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ class DocumentInfo(models.Model):
6060
note = models.TextField(blank=True)
6161
internal_comments = models.TextField(blank=True)
6262

63+
def file_extension(self):
64+
_,ext = os.path.splitext(self.external_url)
65+
return ext.lstrip(".").lower()
66+
6367
def get_file_path(self):
6468
if self.type_id == "draft":
6569
return settings.INTERNET_DRAFT_PATH

ietf/meeting/views.py

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
# New models
3535
from ietf.meeting.models import Meeting, Room, TimeSlot, Constraint, Session
36-
from ietf.group.models import Group
36+
from ietf.group.models import Group, GroupManager
3737

3838

3939
@decorator_from_middleware(GZipMiddleware)
@@ -197,6 +197,34 @@ def agenda_infoREDESIGN(num=None):
197197

198198
@decorator_from_middleware(GZipMiddleware)
199199
def html_agenda(request, num=None):
200+
if settings.SERVER_MODE != 'production' and '_testiphone' in request.REQUEST:
201+
user_agent = "iPhone"
202+
elif 'user_agent' in request.REQUEST:
203+
user_agent = request.REQUEST['user_agent']
204+
elif 'HTTP_USER_AGENT' in request.META:
205+
user_agent = request.META["HTTP_USER_AGENT"]
206+
else:
207+
user_agent = ""
208+
if "iPhone" in user_agent:
209+
return iphone_agenda(request, num)
210+
211+
meeting = get_meeting(num)
212+
timeslots = TimeSlot.objects.filter(Q(meeting = meeting.number)).order_by('time','name')
213+
modified = timeslots.aggregate(Max('modified'))['modified__max']
214+
215+
area_list = timeslots.filter(type = 'Session', session__group__parent__isnull = False).order_by('session__group__parent__acronym').distinct('session__group__parent__acronym').values_list('session__group__parent__acronym',flat=True)
216+
217+
wg_name_list = timeslots.filter(type = 'Session', session__group__isnull = False, session__group__parent__isnull = False).order_by('session__group__acronym').distinct('session__group').values_list('session__group__acronym',flat=True)
218+
219+
wg_list = Group.objects.filter(acronym__in = set(wg_name_list)).order_by('parent__acronym','acronym')
220+
221+
return HttpResponse(render_to_string("meeting/agenda.html",
222+
{"timeslots":timeslots, "modified": modified, "meeting":meeting,
223+
"area_list": area_list, "wg_list": wg_list ,
224+
"show_inline": set(["txt","htm","html"]) },
225+
RequestContext(request)), mimetype="text/html")
226+
227+
def deprecated_PLEASE_REMOVE_ME(request, num=None):
200228
timeslots, update, meeting, venue, ads, plenaryw_agenda, plenaryt_agenda = agenda_info(num)
201229

202230
groups_meeting = [];
@@ -209,26 +237,33 @@ def html_agenda(request, num=None):
209237
rgs = IRTF.objects.all().filter(acronym__in = groups_meeting).order_by('acronym')
210238
areas = Area.objects.filter(status=Area.ACTIVE).order_by('area_acronym__acronym')
211239

212-
if settings.SERVER_MODE != 'production' and '_testiphone' in request.REQUEST:
213-
user_agent = "iPhone"
214-
elif 'user_agent' in request.REQUEST:
215-
user_agent = request.REQUEST['user_agent']
216-
elif 'HTTP_USER_AGENT' in request.META:
217-
user_agent = request.META["HTTP_USER_AGENT"]
218-
else:
219-
user_agent = ""
220-
#print user_agent
221-
if "iPhone" in user_agent:
222-
template = "meeting/m_agenda.html"
223-
else:
224-
template = "meeting/agenda.html"
240+
template = "meeting/agenda.html"
225241
return render_to_response(template,
226242
{"timeslots":timeslots, "update":update, "meeting":meeting, "venue":venue, "ads":ads,
227243
"plenaryw_agenda":plenaryw_agenda, "plenaryt_agenda":plenaryt_agenda,
228244
"wg_list" : wgs, "rg_list" : rgs, "area_list" : areas},
229245
context_instance=RequestContext(request))
230246

247+
def iphone_agenda(request, num):
248+
timeslots, update, meeting, venue, ads, plenaryw_agenda, plenaryt_agenda = agenda_info(num)
249+
250+
groups_meeting = [];
251+
for slot in timeslots:
252+
for session in slot.sessions():
253+
groups_meeting.append(session.acronym())
254+
groups_meeting = set(groups_meeting);
255+
256+
wgs = IETFWG.objects.filter(status=IETFWG.ACTIVE).filter(group_acronym__acronym__in = groups_meeting).order_by('group_acronym__acronym')
257+
rgs = IRTF.objects.all().filter(acronym__in = groups_meeting).order_by('acronym')
258+
areas = Area.objects.filter(status=Area.ACTIVE).order_by('area_acronym__acronym')
259+
template = "meeting/m_agenda.html"
260+
return render_to_response(template,
261+
{"timeslots":timeslots, "update":update, "meeting":meeting, "venue":venue, "ads":ads,
262+
"plenaryw_agenda":plenaryw_agenda, "plenaryt_agenda":plenaryt_agenda,
263+
"wg_list" : wgs, "rg_list" : rgs, "area_list" : areas},
264+
context_instance=RequestContext(request))
231265

266+
232267
def text_agenda(request, num=None):
233268
timeslots, update, meeting, venue, ads, plenaryw_agenda, plenaryt_agenda = agenda_info(num)
234269
plenaryw_agenda = " "+plenaryw_agenda.strip().replace("\n", "\n ")

ietf/templates/meeting/agenda.html

Lines changed: 100 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010

1111
table#wg-selector { border:1px solid black; border-collapse:collapse; }
1212
#wg-selector td,#wg-selector th { border:1px solid black; padding: 2px}
13-
#wg-selector div.selected { background-color: #D0D0FF; cursor: pointer; }
14-
#wg-selector div.unselected { background-color: #FFFFFF; cursor: pointer; }
13+
#wg-selector div.selected { background-color: #c0c0FF; cursor: pointer; }
14+
#wg-selector div.unselected { cursor: pointer; }
1515
#wg-selector td.inactive div { background-color: #EEEEEE; color: #808080; cursor:default;}
1616
#wg-selector.hidden { display: none; }
1717
#wg-selector-toggle-text { text-decoration: underline; cursor: pointer; }
@@ -27,6 +27,21 @@
2727
#ical-link A:active { color: #FF00FF; }
2828
#ical-link A:hover { color: #FF0000; }
2929

30+
tr.time-title { font-weight: bold; color:#800000;}
31+
tr.grouprow > td { padding: 4px; }
32+
td.materials { align:right; }
33+
span.note { font-style: italic; color:#ff0000; }
34+
35+
#APP-groups, #selector-APP { color:#008; background-color:#eef }
36+
#GEN-groups, #selector-GEN { color:#080; background-color:#efe }
37+
#INT-groups, #selector-INT { color:#088; background-color:#eff }
38+
#OPS-groups, #selector-OPS { color:#800; background-color:#fee }
39+
#RAI-groups, #selector-RAI { color:#808; background-color:#fef }
40+
#RTG-groups, #selector-RTG { color:#880; background-color:#ffe }
41+
#SEC-groups, #selector-SEC { color:#488; background-color:#dff }
42+
#TSV-groups, #selector-TSV { color:#484; background-color:#dfd }
43+
#IRTF-groups, #selector-IRTF { color:#448; background-color:#ddf }
44+
3045
img.hidden { display: none; }
3146

3247
.ietf-agenda-palette { border-collapse:collapse; border:2px solid black; background:white; overflow:hidden; }
@@ -135,7 +150,6 @@
135150
{
136151
iframe.setAttribute("src",iframe.getAttribute("xsrc"));
137152
}
138-
r(iframe);
139153
}
140154
}
141155
else
@@ -148,15 +162,28 @@
148162

149163
}
150164

151-
/* Resizes an IFRAME to fit its contents */
152-
function r(obj)
165+
/* Resizes an IFRAME to fit its contents and attempts to convert to a div */
166+
function r(iframe)
153167
{
154168
try
155169
{
156-
docHeight = obj.contentWindow.document.body.scrollHeight;
157-
obj.height = docHeight;
170+
iframe.height = 1;
171+
docHeight = iframe.contentWindow.document.body.scrollHeight;
172+
iframe.height = docHeight;
173+
}
174+
catch (e) { return; }
175+
176+
if (iframe.contentWindow.document.body.innerHTML)
177+
{
178+
var div = document.createElement("div");
179+
div.style.border = "solid";
180+
div.style.borderWidth = "1px";
181+
div.style.margin = "0";
182+
div.style.padding = "10px";
183+
div.style.overflow = "auto";
184+
div.innerHTML=iframe.contentWindow.document.body.innerHTML;
185+
iframe.parentNode.replaceChild(div,iframe);
158186
}
159-
catch (e) {}
160187
}
161188

162189
function toggle(selection)
@@ -211,48 +238,36 @@
211238
{% block content %}
212239
<h1>IETF {{ meeting.num }} Meeting Agenda</h1>
213240
<p>{{ meeting.city }}, {{ 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 />
214-
Updated {{ update.updated|date:"Y-m-d H:i:s T" }}</p>
241+
Updated {{ modified|date:"Y-m-d H:i:s T" }}</p>
215242
<div class="noprint">
216243
(There's also a <a href="/meeting/{{meeting.num}}/agenda.txt">plaintext agenda</a> and a <a href="http://tools.ietf.org/agenda/{{meeting.num}}/">tools-style agenda</a> available)</div>
217244

218245
<p><strong>IETF agendas are subject to change, up to and during the meeting.</strong></p>
219246

220247
{# cache this part for 15 minutes -- it takes 3-6 seconds to generate #}
221-
{% load cache %}
222-
{% cache 900 ietf_meeting_agenda meeting.num %}
248+
{% load cache %}{% cache 900 ietf_meeting_agenda meeting.num %}
223249

224250
You can customize the agenda below to show only selected working group sessions. To be able to return to the customized view later, bookmark the resulting URL:
225251
<div class="noprint" onclick="toggle_wg_selector()">
226252
<img id="wg-selector-triangle-right" src="/images/triangle-right.png" />
227253
<img id="wg-selector-triangle-down" src="/images/triangle-down.png" class="hidden" />
228254
<span id="wg-selector-toggle-text">Select working group sessions</span>
229255
</div>
256+
230257
<table id="wg-selector" width="100%" class="hidden">
231258
<tr>
232259
{% for area in area_list %}
233-
<th><div id='selector-{{area.area_acronym|upper}}' class="unselected" onclick="toggle(this)">{{area.area_acronym|upper}}</div></th>
260+
<th><div id='selector-{{area|upper}}' class="unselected" onclick="toggle(this)">{{area|upper}}</div></th>
234261
{% endfor %}
235-
<th><div id='selector-IRTF' class="unselected" onclick="toggle(this)">IRTF</div></th>
236262
</tr>
237-
238263
<tr>
239-
{% for area in area_list %}
240-
<td valign="top" id="{{area.area_acronym|upper}}-groups">
241-
{% for wg in wg_list %}
242-
{% ifequal wg.area.area.area_acronym area.area_acronym %}
243-
<div id='selector-{{wg}}' class="unselected" onclick="toggle(this)">{{wg}}</div>
244-
{% endifequal %}
245-
{% endfor %}
246-
</td>
247-
{% endfor %}
248-
249-
<td valign="top" id="IRTF-groups">
250-
{% for rg in rg_list %}
251-
<div id='selector-{{rg|lower}}' class="unselected" onclick="toggle(this)">{{rg|lower}}</div>
252-
{% endfor %}
253-
</td>
254-
264+
{% for wg in wg_list %}{% ifchanged wg.parent.acronym %}{% if forloop.counter > 1 %}
265+
</td>{% endif %}
266+
<td valign="top" id="{{wg.parent.acronym|upper}}-groups">{% endifchanged %}
267+
<div id='selector-{{wg.acronym}}' class="unselected" onclick="toggle(this)">{% if wg.state.name = "BOF" %}<i>{{wg.acronym}}</i>{% else %}{{wg.acronym}}{% endif %}</div>{% endfor %}
268+
</td>
255269
</tr>
270+
<tr><td align="center" colspan="{{area_list.count}}"><i>Groups displayed in italics are BOFs</i></td></tr>
256271
</table>
257272

258273
<div id="ical-link" class="hidden"><span style="font-size:150%">Week View</span><br/><a id="ical-href" href="agenda.ics"><em>Download as an ical file</em></a></div>
@@ -263,78 +278,64 @@ <h1>IETF {{ meeting.num }} Meeting Agenda</h1>
263278
{% for slot in timeslots %}
264279
{% ifchanged %}
265280
<tr class="meeting-date">
266-
<td colspan="4">
267-
<h2 class="ietf-divider">{{ slot.meeting_date|date:"l"|upper }}, {{ slot.meeting_date|date:"F j, Y" }}</h2>
268-
</td>
281+
<td colspan="6">
282+
<h2 class="ietf-divider">{{ slot.time|date:"l"|upper }}, {{ slot.time|date:"F j, Y" }}</h2>
283+
</td>
269284
</tr>
270-
{% if slot.reg_info %}
271-
<tr>
272-
<td colspan="4">
273-
{{ slot.registration.time_desc }} {{ slot.registration.name }}
274-
{% 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|escape }}</a>{% endif %}
275-
</td>
276-
</tr>
277-
{% endif %}
278285
{% endifchanged %}
279-
{% if slot.session_name %}
280-
{% if slot.break_info %}
281-
<tr>
282-
<td colspan="4">
283-
<br />
284-
{{ slot.break_info.time_desc }} {{ slot.break_info.name }}
285-
{% if venue.break_area_name and slot.break_info.show_break_location %} - <a href="http://tools.ietf.org/agenda/{{meeting.num}}/venue/?room={{ venue.break_area_name|slugify }}">{{ venue.break_area_name|escape }}</a>{% endif %}
286-
</td>
287-
</tr>
288-
{% endif %}
289-
<tr>
290-
<td colspan="4">
291-
<b>{{ slot.time_desc }} {{ slot.session_name }}</b>
292-
{% ifequal slot.sessions.0.acronym "plenaryw" %}
293-
<b>- <a href="http://tools.ietf.org/agenda/{{meeting.num}}/venue/?room={{ slot.sessions.0.room_id.room_name|slugify }}">{{ slot.sessions.0.room_id.room_name }}</a></b><br/>
294-
<pre>{{ plenaryw_agenda|escape }}</pre>
295-
{% endifequal %}
296-
{% ifequal slot.sessions.0.acronym "plenaryt" %}
297-
<b>- <a href="http://tools.ietf.org/agenda/{{meeting.num}}/venue/?room={{ slot.sessions.0.room_id.room_name|slugify }}">{{ slot.sessions.0.room_id.room_name }}</a></b><br/>
298-
<pre>{{ plenaryt_agenda|escape }}</pre>
299-
{% endifequal %}
300-
</td>
286+
{% ifchanged %}
287+
<tr class="time-title">
288+
<td colspan="1">
289+
{{slot.time|date:"Hi"}}-{{slot.end_time|date:"Hi"}}
290+
</td>
291+
<td colspan="5">
292+
{{slot.name}}
293+
{% if slot.type.name != 'Session' %} -
294+
{% if slot.show_location %}<a href="http://tools.ietf.org/agenda/{{meeting.num}}/venue/?room={{ slot.get_location|slugify }}">{{slot.get_location|escape}}</a>{% endif %}
295+
{% endif %}
296+
</td>
301297
</tr>
302-
{% if not slot.is_plenary %}
303-
{% for session in slot.sessions_by_area|dictsort:"area" %}
304-
<tr id="{{meeting.num}}-{{slot.meeting_date|date:"D"|lower}}-{{slot.time_desc|slice:":4"}}-{{session.info.area|upper}}-{{session.info.acronym|lower}}" class="grouprow">
305-
<td><a href="http://tools.ietf.org/agenda/{{meeting.num}}/venue/?room={{session.info.room_id.room_name|slugify}}" title="room map">{{ session.info.room_id.room_name}}</a></td>
306-
{% if session.info.area %}
307-
<td>{{ session.info.area|upper}}</td>
308-
<td>{% if session.info.isWG %}<a href="/wg/{{ session.info.acronym|lower }}/">{{ session.info.acronym|lower }}</a>{% else %}{{ session.info.acronym|lower }}{% endif %}</td>
309-
<td>
310-
<table width="100%"><tr><td>
311-
<img src="/images/color-palette-4x4.gif" alt="" onclick="pickAgendaColor('{{meeting.num}}-{{slot.meeting_date|date:"D"|lower}}-{{slot.time_desc|slice:":4"}}-{{session.info.area|upper}}-{{session.info.acronym|lower}}',this);" title="color tag this line"/ class="noprint">
312-
{% if session.info.agenda_file %}<a href="http://www.ietf.org/proceedings/{{ session.info.agenda_file }}" title="session agenda">{{ session.info.acronym_name|escape }} {{ session.info.group_type_str }}</a>{% else %}{{ session.info.acronym_name|escape }} {{ session.info.group_type_str }}{% endif %}
313-
{% if session.info.special_agenda_note %}<br/> - {{ session.info.special_agenda_note }}{% endif %}
314-
</td><td align="right">drafts:&nbsp;<a href="/meeting/{{ meeting.num }}/agenda/{{session.info.acronym}}-drafts.tgz">tar</a>|<a href="/meeting/{{ meeting.num }}/agenda/{{session.info.acronym}}-drafts.pdf">pdf</a></td></tr></table>
315-
</td>
316-
{% endif %}
317-
</tr>
318-
<tr id="agenda-{{meeting.num}}-{{slot.meeting_date|date:"D"|lower}}-{{slot.time_desc|slice:":4"}}-{{session.info.area|upper}}-{{session.info.acronym|lower}}" class="groupagenda">
319-
<td></td>
320-
<td colspan="3">
321-
{% if session.info.agenda_file %}
322-
<iframe width="100%" height="400px" src="about:blank" xsrc="/meeting/{{ meeting.num }}/agenda/{{ session.info.acronym }}-agenda/" onload="r(this)"></iframe>
323-
{% else %}
324-
<b>No Agenda Submitted</b>
325-
{% endif %}
326-
</td>
327-
</tr>
328-
{% endfor %}
329-
{% endif %}
330-
{% else %}
331-
{% for session in slot.sessions %}
332-
<tr>
333-
<td colspan="4">
334-
{{ 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>
335-
</td>
336-
</tr>
337-
{% endfor %}
298+
{% endifchanged %}
299+
{% if slot.type.name = 'Session' %} {% if slot.session.group %}
300+
<tr id="{{meeting.num}}-{{slot.time|date:"D-Hi"|lower}}-{{slot.session.group.parent.acronym|upper}}-{{slot.session.group.acronym|lower}}" class="grouprow">
301+
<td>
302+
<td>{% if slot.show_location %}<a href="http://tools.ietf.org/agenda/{{meeting.num}}/venue/?room={{ slot.get_location|slugify }}">{{slot.get_location|escape}}</a>{% endif %}</td>
303+
<td>{{slot.session.group.parent.acronym|upper}}</td>
304+
<td>
305+
{% if slot.session.group.charter %}<a href="{{slot.session.group.charter.get_absolute_url}}">{{slot.session.group.acronym}}</a>
306+
{% else %}{{slot.session.group.acronym}}{% endif %}</td>
307+
<td>
308+
<img src="/images/color-palette-4x4.gif" alt="" onclick="pickAgendaColor('{{meeting.num}}-{{slot.time|date:"D-Hi"|lower}}-{{slot.session.group.parent.acronym|upper}}-{{slot.session.group.acronym|lower}}',this);" title="color tag this line"/ class="noprint">
309+
{% if slot.session.agenda %}<a href="/meeting/{{ meeting.num }}/agenda/{{ slot.session.group.acronym }}-agenda/">{{slot.session.group.name}}</a>
310+
{% else %}{{slot.session.group.name}}{% endif %}
311+
{% if slot.session.group.state.name = "BOF" %} BOF {% endif %}
312+
{% if slot.session.agenda_note %}
313+
<br/><span class="note">{{slot.session.agenda_note}}</span>{% endif %}</td>
314+
<td class="materials">{% if slot.session.agenda %}drafts:&nbsp;<a href="/meeting/{{meeting.num}}/agenda/{{slot.session.group.acronym}}-drafts.tgz">tar</a>|<a href="/meeting/{{ meeting.num }}/agenda/{{slot.session.group.acronym}}-drafts.pdf">pdf</a>{%endif%}</td>
315+
</tr>
316+
<tr id="{{meeting.num}}-{{slot.time|date:"D-Hi"|lower}}-{{slot.session.group.parent.acronym|upper}}-{{slot.session.group.acronym|lower}}" class="groupagenda">
317+
<td></td>
318+
<td colspan="5">
319+
{% if slot.session.agenda %}
320+
{% if slot.session.agenda.file_extension in show_inline%}
321+
<iframe width="100%" height="1px" src="about:blank" xsrc="/meeting/{{ meeting.num }}/agenda/{{ slot.session.group.acronym }}-agenda/" onload="r(this)"></iframe>
322+
{% else %}
323+
<b><i>Agenda submitted in {{slot.session.agenda.file_extension|upper}} format</i></b>
324+
{% endif %}
325+
{% else %}
326+
<b><i>No Agenda Submitted</i></b>
327+
{% endif %}
328+
</td>
329+
</tr>
330+
331+
{% endif %} {% endif %}
332+
{% if slot.type.name = 'Plenary' %}
333+
<tr>
334+
<td></td>
335+
<td colspan="5">
336+
<iframe width="100%" height="1px" src="/meeting/{{ meeting.num }}/agenda/{{ slot.session.group.acronym }}-agenda/" onload="r(this)"></iframe>
337+
</td>
338+
</tr>
338339
{% endif %}
339340
{% endfor %}
340341
</table>

0 commit comments

Comments
 (0)