Rewrote html and text agenda templates to take schedule as data.

- Legacy-Id: 6495
This commit is contained in:
Henrik Levkowetz 2013-10-27 12:16:37 +00:00
parent da8c38f55d
commit 16ae35ae19
5 changed files with 130 additions and 85 deletions

View file

@ -3,6 +3,8 @@
import pytz, datetime
from urlparse import urljoin
import copy
import os
import debug
from django.db import models
@ -463,6 +465,11 @@ class Schedule(models.Model):
def base_url(self):
return "/meeting/%s/agenda/%s" % (self.meeting.number, self.name)
# temporary property to pacify the places where Schedule.scheduledsession_set is used
@property
def scheduledsession_set(self):
return self.assignments
# def url_edit(self):
# return "/meeting/%s/agenda/%s/edit" % (self.meeting.number, self.name)
#
@ -584,6 +591,15 @@ class Schedule(models.Model):
self.badness = badness
return badness
def area_list(self):
return ( self.assignments.filter(session__group__type__slug__in=['wg', 'rg', 'ag'],
session__group__parent__isnull=False)
.order_by('session__group__parent__acronym')
.values_list('session__group__parent__acronym', flat=True)
.distinct() )
def groups(self):
return Group.objects.filter(type__slug__in=['wg', 'rg', 'ag'], session__scheduledsession__schedule=self).distinct().order_by('parent__acronym', 'acronym')
class ScheduledSession(models.Model):
"""
@ -593,13 +609,16 @@ class ScheduledSession(models.Model):
"""
timeslot = models.ForeignKey('TimeSlot', null=False, blank=False, help_text=u"")
session = models.ForeignKey('Session', null=True, default=None, help_text=u"Scheduled session")
schedule = models.ForeignKey('Schedule', null=False, blank=False, help_text=u"Who made this agenda")
schedule = models.ForeignKey('Schedule', null=False, blank=False, related_name='assignments')
extendedfrom = models.ForeignKey('ScheduledSession', null=True, default=None, help_text=u"Timeslot this session is an extension of")
modified = models.DateTimeField(default=datetime.datetime.now)
notes = models.TextField(blank=True)
badness = models.IntegerField(default=0, blank=True, null=True)
pinned = models.BooleanField(default=False, help_text="Do not move session during automatic placement")
class Meta:
ordering = ["timeslot__time", "session__group__parent__name", "session__group__acronym", "session__name", ]
# use to distinguish this from FakeScheduledSession in placement.py
faked = "real"
@ -724,7 +743,6 @@ class ScheduledSession(models.Model):
ss["pinned"] = self.pinned
return ss
class Constraint(models.Model):
"""
Specifies a constraint on the scheduling.
@ -1142,3 +1160,20 @@ class Session(models.Model):
self.badness_log(1, "badgroup: %s badness = %u\n" % (self.group.acronym, badness))
return badness
def agenda_text(self):
doc = self.agenda()
if doc:
path = os.path.join(settings.AGENDA_PATH, self.meeting.number, "agenda", doc.external_url)
if os.path.exists(path):
with open(path) as f:
return f.read()
else:
"No agenda file found"
else:
return "The agenda has not been uploaded yet."
def type(self):
if self.group.type.slug in [ "wg" ]:
return "BOF" if self.group.state.slug in ["bof", "bof-conc"] else "WG"
else:
return ""

View file

@ -7,13 +7,13 @@ from ietf.meeting import ajax
urlpatterns = patterns('',
(r'^(?P<meeting_num>\d+)/materials.html$', views.materials),
(r'^agenda/$', views.agenda_html_request),
(r'^agenda/$', views.agenda),
(r'^agenda-utc(?:.html)?$', views.html_agenda_utc),
(r'^agenda(?:.html)?$', views.agenda_html_request),
(r'^agenda(?:.html)?$', views.agenda),
(r'^agenda/edit$', views.edit_agenda),
(r'^requests.html$', redirect_to, {"url": '/meeting/requests', "permanent": True}),
(r'^requests$', views.meeting_requests),
(r'^agenda.txt$', views.text_agenda),
(r'^agenda(?P<ext>.txt)$', views.agenda),
(r'^agenda/agenda.ics$', views.ical_agenda),
(r'^agenda.ics$', views.ical_agenda),
(r'^agenda.csv$', views.csv_agenda),
@ -22,12 +22,12 @@ urlpatterns = patterns('',
(r'^(?P<num>\d+)/schedule/edit$', views.edit_agenda),
(r'^(?P<num>\d+)/schedule/(?P<schedule_name>[A-Za-z0-9-:_]+)/edit$', views.edit_agenda),
(r'^(?P<num>\d+)/schedule/(?P<schedule_name>[A-Za-z0-9-:_]+)/details$', views.edit_agenda_properties),
(r'^(?P<num>\d+)/schedule/(?P<schedule_name>[A-Za-z0-9-:_]+)(?:.html)?/?$', views.agenda_html_request),
(r'^(?P<num>\d+)/agenda(?:.html)?/?$', views.agenda_html_request),
(r'^(?P<num>\d+)/schedule/(?P<name>[A-Za-z0-9-:_]+)(?P<ext>.html)?/?$', views.agenda),
(r'^(?P<num>\d+)/agenda(?P<ext>.html)?/?$', views.agenda),
(r'^(?P<num>\d+)/agenda-utc(?:.html)?/?$', views.html_agenda_utc),
(r'^(?P<num>\d+)/requests.html$', redirect_to, {"url": '/meeting/%(num)s/requests', "permanent": True}),
(r'^(?P<num>\d+)/requests$', views.meeting_requests),
(r'^(?P<num>\d+)/agenda.txt$', views.text_agenda),
(r'^(?P<num>\d+)/agenda(?P<ext>.txt)$', views.agenda),
(r'^(?P<num>\d+)/agenda.ics$', views.ical_agenda),
(r'^(?P<num>\d+)/agenda.csv$', views.csv_agenda),
(r'^(?P<num>\d+)/agendas/edit$', views.edit_agendas),

View file

@ -432,15 +432,13 @@ def iphone_agenda(request, num, name):
"wg_list" : wgs, "rg_list" : rgs, "area_list" : areas},
context_instance=RequestContext(request))
def text_agenda(request, num=None, name=None):
timeslots, update, meeting, venue, ads, plenaryw_agenda, plenaryt_agenda = agenda_info(num)
plenaryw_agenda = " "+plenaryw_agenda.strip().replace("\n", "\n ")
plenaryt_agenda = " "+plenaryt_agenda.strip().replace("\n", "\n ")
return HttpResponse(render_to_string("meeting/agenda.txt",
{"timeslots":timeslots, "update":update, "meeting":meeting, "venue":venue, "ads":ads,
"plenaryw_agenda":plenaryw_agenda, "plenaryt_agenda":plenaryt_agenda, },
RequestContext(request)), mimetype="text/plain")
def agenda(request, num=None, name=None, ext=".html"):
mimetype = {".html":"text/html", ".txt": "text/plain", ".ics":"text/calendar", ".csv":"text/csv"}
meeting = get_meeting(num)
schedule = get_schedule(meeting, name)
updated = Switches().from_object(meeting).updated()
return HttpResponse(render_to_string("meeting/agenda"+ext,
{"schedule":schedule, "updated": updated}, RequestContext(request)), mimetype=mimetype[ext])
def read_agenda_file(num, doc):
# XXXX FIXME: the path fragment in the code below should be moved to

View file

@ -2,7 +2,7 @@
{% load ietf_filters %}
{# Copyright The IETF Trust 2007, All Rights Reserved #}
{% load humanize %}
{% block title %}IETF {{ meeting.number }} Meeting Agenda{% endblock %}
{% block title %}IETF {{ schedule.meeting.number }} Meeting Agenda{% endblock %}
{% block morecss %}
table#agenda { border: 0; border-collapse:collapse; }
@ -81,17 +81,17 @@ img.hidden { display: none; }
{% endblock pagehead %}
{% block bodyAttrs %}onload='setGroupState();updateAgendaColors()'{% endblock %}
{% block content %}
<h1>IETF {{ meeting.number }} Meeting Agenda</h1>
<h1>IETF {{ schedule.meeting.number }} Meeting Agenda</h1>
<p>{{ meeting.city }}, {{ meeting.date|date:"F j" }} &#8211; {% ifnotequal meeting.date.month meeting.end_date.month %}{{ meeting.end_date|date:"F " }}{% endifnotequal %}{{ meeting.end_date|date:"j, Y" }}<br />
Updated {{ modified|date:"Y-m-d H:i:s T" }}</p>
<p>{{ schedule.meeting.city }}, {{ schedule.meeting.date|date:"F j" }} &#8211; {% ifnotequal schedule.meeting.date.month schedule.meeting.end_date.month %}{{ schedule.meeting.end_date|date:"F " }}{% endifnotequal %}{{ schedule.meeting.end_date|date:"j, Y" }}<br />
Updated {{ updated|date:"Y-m-d H:i:s T" }}</p>
<div class="noprint">
(There's also a <a href="/meeting/agenda-utc">agenda with UTC times</a>, a <a href="/meeting/{{meeting.number}}/agenda.txt">plaintext agenda</a> and a <a href="http://tools.ietf.org/agenda/{{meeting.number}}/">tools-style agenda</a> available)</div>
(There's also a <a href="/meeting/agenda-utc">agenda with UTC times</a>, a <a href="/meeting/{{schedule.meeting.number}}/agenda.txt">plaintext agenda</a> and a <a href="http://tools.ietf.org/agenda/{{schedule.meeting.number}}/">tools-style agenda</a> available)</div>
<p><strong>IETF agendas are subject to change, up to and during the meeting.</strong></p>
{# cache this part for 15 minutes -- it takes 3-6 seconds to generate #}
{% load cache %}{% cache 900 ietf_meeting_agenda meeting.number %}
{# cache this part for 5 minutes -- it takes 3-6 seconds to generate #}
{% load cache %}{% cache 300 ietf_meeting_agenda schedule.meeting.number %}
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.
<div class="noprint" onclick="toggle_wg_selector()">
@ -102,18 +102,18 @@ You can customize the agenda below to show only selected working group sessions.
<table id="wg-selector" width="100%" class="hidden">
<tr>
{% for area in area_list %}
{% for area in schedule.area_list %}
<th><div id='selector-{{area|upper}}' class="unselected" onclick="toggle(this)">{{area|upper}}</div></th>
{% endfor %}
</tr>
<tr>
{% for wg in wg_list %}{% ifchanged wg.parent.acronym %}{% if forloop.counter > 1 %}
{% for wg in schedule.groups %}{% ifchanged wg.parent.acronym %}{% if forloop.counter > 1 %}
</td>{% endif %}
<td valign="top" id="{{wg.parent.acronym|upper}}-groups">{% endifchanged %}
<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 %}
</td>
</tr>
<tr><td align="center" colspan="{{area_list|length}}">
<tr><td align="center" colspan="{{schedule.area_list|length}}">
Also show:
<input type="checkbox" class="include-checkbox" id="include-edu" onchange="toggle_special(this)"/>EDU &#8226;
<input type="checkbox" class="include-checkbox" id="include-ietf" onchange="toggle_special(this)"/>IETF &#8226;
@ -121,80 +121,92 @@ You can customize the agenda below to show only selected working group sessions.
<input type="checkbox" class="include-checkbox" id="include-iesg" onchange="toggle_special(this)"/>IESG &#8226;
<input type="checkbox" class="include-checkbox" id="include-iab" onchange="toggle_special(this)"/>IAB
<!-- </td></tr>
<tr><td align="center" colspan="{{area_list|length}}">
<tr><td align="center" colspan="{{schedule.area_list|length}}">
-->
<br/><i>Groups displayed in italics are BOFs</i></td></tr>
</table>
<div id="ical-link" class="hidden"><span style="font-size:150%">Week View</span><br/><a id="ical-href" href="{% url ietf.meeting.views.ical_agenda num=meeting.number %}"><em>Download as an .ics file</em></a></div>
<div id="ical-link" class="hidden"><span style="font-size:150%">Week View</span><br/><a id="ical-href" href="{% url ietf.meeting.views.ical_agenda num=schedule.meeting.number %}"><em>Download as an .ics file</em></a></div>
<iframe id="weekview" class="hidden" width="100%" height="600px" src="about:blank" scrolling="no"></iframe>
<table width="100%" id="ics-preconfig"><tr><td align="center">
Preconfigured .ics links:
{% for area in area_list %}
<a href="{% url ietf.meeting.views.ical_agenda num=meeting.number %}?{{area|upper}},-~Other,-~Plenary">{{area|upper}}</a> &#8226;
{% for area in schedule.area_list %}
<a href="{% url ietf.meeting.views.ical_agenda num=schedule.meeting.number %}?{{area|upper}},-~Other,-~Plenary">{{area|upper}}</a> &#8226;
{% endfor %}
<a href="{% url ietf.meeting.views.ical_agenda num=meeting.number %}">Non-Area Events</a>
<a href="{% url ietf.meeting.views.ical_agenda num=schedule.meeting.number %}">Non-Area Events</a>
</td></tr></table>
{% if meeting.agenda_note %}<h2 class="ietf-divider" style="background-color: #C00; margin-top: 2em; margin-bottom: 0;">{{ meeting.agenda_note|safe }}</h2>{% endif %}
{% if schedule.meeting.agenda_note %}<h2 class="ietf-divider" style="background-color: #C00; margin-top: 2em; margin-bottom: 0;">{{ schedule.meeting.agenda_note|safe }}</h2>{% endif %}
<table id="agenda" width="100%">
{% for slot in timeslots %}
{% for item in schedule.assignments.all %}
{% ifchanged %}
<tr class="meeting-date">
<td colspan="6">
<h2 class="ietf-divider">{{ slot.time|date:"l"|upper }}, {{ slot.time|date:"F j, Y" }}</h2>
<h2 class="ietf-divider">{{ item.timeslot.time|date:"l"|upper }}, {{ item.timeslot.time|date:"F j, Y" }}</h2>
</td>
</tr>
{% endifchanged %}
{% ifchanged %}
{% if item.timeslot.type.slug == 'session' %}
{% ifchanged %}
<tr class="time-title">
<td colspan="1" class="timecolumn">
{{slot.time|date:"Hi"}}-{{slot.end_time|date:"Hi"}}&nbsp;<span class="ietf-tiny">{{slot.tzname}}</span>
{{item.timeslot.time|date:"Hi"}}-{{item.timeslot.end_time|date:"Hi"}}&nbsp;<span class="ietf-tiny">{{item.timeslot.tzname}}</span>
</td>
<td colspan="5">
{% if slot.type.name == 'Session' %}{{ slot.time|date:"l"}}{% endif %}
{{slot.name}}
{% if slot.type.name != 'Session' %} -
{% if slot.show_location %}<a href="http://tools.ietf.org/agenda/{{meeting.number}}/venue/?room={{ slot.get_location|slugify }}">{{slot.get_location|escape}}</a>{% endif %}
{% endif %}
{{ item.timeslot.time|date:"l"}} {{item.timeslot.name}}
</td>
</tr>
{% endifchanged %}
{% if slot.type.name = 'Session' %} {% if slot.session.group %}
<tr id="{{meeting.number}}-{{slot.time|date:"D-Hi"|lower}}-{{slot.session.group.parent.acronym|upper}}-{{slot.session.group.acronym|lower}}" class="grouprow">
{% endifchanged %}
{% endif %}
{% if item.timeslot.type.slug == 'break' or item.timeslot.type.slug == 'reg' or item.timeslot.type.slug == 'other' or item.timeslot.type.slug == 'plenary' %}
{% ifchanged %}
<tr class="time-title">
<td colspan="1" class="timecolumn">
{{item.timeslot.time|date:"Hi"}}-{{item.timeslot.end_time|date:"Hi"}}&nbsp;<span class="ietf-tiny">{{item.timeslot.tzname}}</span>
</td>
<td colspan="5">
{{item.timeslot.name}}
-
{% if item.timeslot.show_location %}<a href="http://tools.ietf.org/agenda/{{schedule.meeting.number}}/venue/?room={{ item.timeslot.get_location|slugify }}">{{item.timeslot.get_location|escape}}</a>{% endif %}
</td>
</tr>
{% endifchanged %}
{% endif %}
{% if item.timeslot.type.slug = 'session' %} {% if item.session.group %}
<tr id="{{schedule.meeting.number}}-{{item.timeslot.time|date:"D-Hi"|lower}}-{{item.session.group.parent.acronym|upper}}-{{item.session.group.acronym|lower}}" class="grouprow">
<td>
<td>{% if slot.show_location %}<a href="http://tools.ietf.org/agenda/{{meeting.number}}/venue/?room={{ slot.get_location|slugify }}">{{slot.get_location|escape}}</a>{% endif %}</td>
<td>{{slot.session.group.parent.acronym|upper}}</td>
<td>{% if item.timeslot.show_location %}<a href="http://tools.ietf.org/agenda/{{schedule.meeting.number}}/venue/?room={{ item.timeslot.get_location|slugify }}">{{item.timeslot.get_location|escape}}</a>{% endif %}</td>
<td>{{item.session.group.parent.acronym|upper}}</td>
<td>
{% if slot.session.group.charter %}<a href="{{slot.session.group.charter.get_absolute_url}}">{{slot.session.group.acronym}}</a>
{% else %}{{slot.session.group.acronym}}{% endif %}</td>
{% if item.session.group.charter %}<a href="{{item.session.group.charter.get_absolute_url}}">{{item.session.group.acronym}}</a>
{% else %}{{item.session.group.acronym}}{% endif %}</td>
<td>
<img src="/images/color-palette-4x4.gif" alt="" onclick="pickAgendaColor('{{meeting.number}}-{{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">
{% if slot.session.agenda %}<a href="/meeting/{{ meeting.number }}/agenda/{{ slot.session.group.acronym }}/">{{slot.session.group.name}}</a>
{% else %}{{slot.session.group.name}}{% endif %}
{% if slot.session.group.state.name = "BOF" %} BOF {% endif %}
{% if slot.session.agenda_note %}
<br/><span class="note">{{slot.session.agenda_note}}</span>{% endif %}</td>
<td class="materials">{% if slot.session.agenda %}drafts:&nbsp;<a href="/meeting/{{meeting.number}}/agenda/{{slot.session.group.acronym}}-drafts.tgz">tar</a>|<a href="/meeting/{{ meeting.number }}/agenda/{{slot.session.group.acronym}}-drafts.pdf">pdf</a>{%endif%}</td>
<img src="/images/color-palette-4x4.gif" alt="" onclick="pickAgendaColor('{{schedule.meeting.number}}-{{item.timeslot.time|date:"D-Hi"|lower}}-{{item.session.group.parent.acronym|upper}}-{{item.session.group.acronym|lower}}',this);" title="color tag this line"/ class="noprint">
{% if item.session.agenda %}<a href="/meeting/{{ schedule.meeting.number }}/agenda/{{ item.session.group.acronym }}/">{{item.session.group.name}}</a>
{% else %}{{item.session.group.name}}{% endif %}
{% if item.session.group.state.name = "BOF" %} BOF {% endif %}
{% if item.session.agenda_note %}
<br/><span class="note">{{item.session.agenda_note}}</span>{% endif %}</td>
<td class="materials">{% if item.session.agenda %}drafts:&nbsp;<a href="/meeting/{{schedule.meeting.number}}/agenda/{{item.session.group.acronym}}-drafts.tgz">tar</a>|<a href="/meeting/{{ schedule.meeting.number }}/agenda/{{item.session.group.acronym}}-drafts.pdf">pdf</a>{%endif%}</td>
</tr>
<tr id="{{meeting.number}}-{{slot.time|date:"D-Hi"|lower}}-{{slot.session.group.parent.acronym|upper}}-{{slot.session.group.acronym|lower}}" class="groupagenda">
<tr id="{{schedule.meeting.number}}-{{item.timeslot.time|date:"D-Hi"|lower}}-{{item.session.group.parent.acronym|upper}}-{{item.session.group.acronym|lower}}" class="groupagenda">
<td></td>
<td colspan="5">
{% if slot.session.agenda %}
{% if slot.session.agenda.file_extension in show_inline%}
<iframe width="100%" height="1px" src="about:blank" xsrc="{{slot.session.agenda.href}}" onload="r(this)"></iframe>
{% if item.session.agenda %}
{% if item.session.agenda.file_extension == "txt" or item.session.agenda.file_extension == "html" or item.session.agenda.file_extension == "htm" %}
<iframe width="100%" height="1px" src="about:blank" xsrc="{{item.session.agenda.href}}" onload="r(this)"></iframe>
{% else %}
<b><i>Agenda submitted in {{slot.session.agenda.file_extension|upper}} format</i></b>
<b><i>Agenda submitted in {{item.session.agenda.file_extension|upper}} format</i></b>
{% endif %}
{% else %}
<b><i>No Agenda Submitted</i></b>
{% endif %}
{% if slot.session.slides %}
{% if item.session.slides %}
<h3>Slides:</h3>
<ol>{% for slide in slot.session.slides %}
<ol>{% for slide in item.session.slides %}
<li>
<img src="/images/{{slide.file_extension|upper}}_icon.png">
<a href="{{ slide.href }}">{{ slide.title|clean_whitespace }}</a>
@ -205,14 +217,14 @@ You can customize the agenda below to show only selected working group sessions.
</tr>
{% endif %} {% endif %}
{% if slot.type.name = 'Plenary' %}
{% if item.timeslot.type.slug = 'plenary' %}
<tr>
<td></td>
<td colspan="5">
<iframe width="100%" height="1px" src="{{slot.session.agenda.href}}" onload="r(this)"></iframe>
{% if slot.session.slides %}
<iframe width="100%" height="1px" src="{{item.session.agenda.href}}" onload="r(this)"></iframe>
{% if item.session.slides %}
<h3>Slides:</h3>
<ol>{% for slide in slot.session.slides %}
<ol>{% for slide in item.session.slides %}
<li>
<img src="/images/{{slide.file_extension|upper}}_icon.png">
<a href="{{ slide.href }}">{{ slide.title|clean_whitespace }}</a>

View file

@ -1,27 +1,27 @@
{% load humanize %}{% autoescape off %}
{% load ietf_filters %}
{% filter center:72 %}Agenda of the {{ meeting.num|ordinal }} IETF Meeting{% endfilter %}
{% if meeting.agenda_note %}
{% filter center:72 %}{{ meeting.agenda_note|striptags|wrap_text:72|safe }}{% endfilter %}
{% load humanize %}{% load ietf_filters %}{% autoescape off %}
{% filter center:72 %} Agenda of the {{ schedule.meeting.number|ordinal }} IETF Meeting {% endfilter %}
{% if schedule.meeting.agenda_note %}
{% filter center:72 %}{{ schedule.meeting.agenda_note|striptags|wrap_text:72|safe }}{% endfilter %}
{% endif %}
{% filter center:72 %}{{ 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" }}{% endfilter %}
{% filter center:72 %}Updated {{ update.updated|date:"Y-m-d H:i:s T" }}{% endfilter %}
{% filter center:72 %}{{ schedule.meeting.date|date:"F j" }}-{% ifnotequal schedule.meeting.date.month schedule.meeting.end_date.month %}{{ schedule.meeting.end_date|date:"F " }}{% endifnotequal %}{{ schedule.meeting.end_date|date:"j, Y" }}{% endfilter %}
{% filter center:72 %}Updated {{ updated|date:"Y-m-d H:i:s T" }}{% endfilter %}
{% filter center:72 %}IETF agendas are subject to change, up to and during the meeting.{% endfilter %}
{% for item in schedule.assignments.all.distinct %}{% ifchanged %}
{% for slot in timeslots %}{% ifchanged %}
{{ slot.meeting_date|date:"l"|upper }}, {{ slot.meeting_date|date:"F j, Y" }}{% if slot.reg_info %}
{{ slot.registration.time_desc }} {{ slot.registration.name }}{% if venue.reg_area_name %} - {{ venue.reg_area_name }}{% endif %}{% endif %}
{% endifchanged %}{% if slot.session_name %}{% if slot.break_info %}{{ slot.break_info.time_desc }} {{ slot.break_info.name }}{% if venue.break_area_name and slot.break_info.show_break_location %} - {{ venue.break_area_name }}{% endif %}
{% endif %}{{ slot.time_desc }} {{ slot.session_name }}{% if slot.is_plenary %} - {{ slot.sessions.0.room_id.room_name }}{% endif %}{% ifequal slot.sessions.0.acronym "plenaryw" %}
{{ item.timeslot.time|date:"l"|upper }}, {{ item.timeslot.time|date:"F j, Y" }}{% endifchanged %}{% if item.timeslot.type.slug == "reg" %}
{{ item.timeslot.time_desc }} {{ item.timeslot.name }}{% if schedule.meeting.reg_area %} - {{ schedule.meeting.reg_area }}{% endif %}{% endif %}{% if item.timeslot.type.slug == "plenary" %}
{{ item.timeslot.time_desc }} {{ item.session.name }} - {{ item.timeslot.location.name }}
{{ plenaryw_agenda }}{% endifequal %}{% ifequal slot.sessions.0.acronym "plenaryt" %}
{{ item.session.agenda_text.strip|indent:"3" }}
{% endif %}{% if item.timeslot.type.slug == "session" %}{% if item.session.group %}{% ifchanged %}
{{ item.timeslot.time_desc }} {{ item.timeslot.name }}
{% endifchanged %}{{ item.timeslot.location.name|ljust:14 }} {{ item.session.group.parent.acronym|upper|ljust:4 }} {{ item.session.group.acronym|ljust:10 }} {{ item.session.group.name }} {{ item.session.type }}{% if item.session.agenda_note %} - {{ item.session.agenda_note }}{% endif %}
{% endif %}{% endif %}{% if item.timeslot.type.slug == "break" %}
{{ item.timeslot.time_desc }} {{ item.timeslot.name }}{% if schedule.meeting.break_area and item.timeslot.show_location %} - {{ schedule.meeting.break_area }}{% endif %}{% endif %}{% if item.timeslot.type.slug == "other" %}
{{ item.timeslot.time_desc }} {{ item.timeslot.name }} - {{ item.timeslot.location.name }}{% endif %}{% endfor %}
{{ plenaryt_agenda }}{% endifequal %}{% if not slot.is_plenary %}{% for session in slot.sessions_by_area|dictsort:"area" %}
{{ session.info.room_id.room_name|ljust:14 }} {% if session.info.area %}{{ session.info.area|upper|ljust:4 }} {{ session.info.acronym|ljust:10 }} {% endif %}{{ session.info.acronym_name }} {{ session.info.group_type_str }}{% if session.info.special_agenda_note %} - {{ session.info.special_agenda_note }}{% endif %}{% endfor %}{% endif %}
{% else %}{% for session in slot.sessions %}{{ slot.time_desc }} {{ session.acronym_name }} - {{ session.room_id.room_name }}
{% endfor %}{% endif %}{% endfor %}
====================================================================
{% endautoescape %}