From c113bd0588612f1dadb4a8f4b2b620177efd728d Mon Sep 17 00:00:00 2001 From: Adam Roach Date: Thu, 5 Apr 2012 19:30:36 +0000 Subject: [PATCH] Migrated HTML agenda to new data model. This has several improvements, as well, such as clearer marking of BOFs. - Legacy-Id: 4265 --- ietf/doc/models.py | 4 + ietf/meeting/views.py | 63 ++++++-- ietf/templates/meeting/agenda.html | 199 +++++++++++++------------- ietf/templates/meeting/week-view.html | 3 +- 4 files changed, 155 insertions(+), 114 deletions(-) diff --git a/ietf/doc/models.py b/ietf/doc/models.py index 52afb5dbab..774c20485c 100644 --- a/ietf/doc/models.py +++ b/ietf/doc/models.py @@ -60,6 +60,10 @@ class DocumentInfo(models.Model): note = models.TextField(blank=True) internal_comments = models.TextField(blank=True) + def file_extension(self): + _,ext = os.path.splitext(self.external_url) + return ext.lstrip(".").lower() + def get_file_path(self): if self.type_id == "draft": return settings.INTERNET_DRAFT_PATH diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index 12687d4024..abbb3b9bd0 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -33,7 +33,7 @@ # New models from ietf.meeting.models import Meeting, Room, TimeSlot, Constraint, Session -from ietf.group.models import Group +from ietf.group.models import Group, GroupManager @decorator_from_middleware(GZipMiddleware) @@ -197,6 +197,34 @@ def agenda_infoREDESIGN(num=None): @decorator_from_middleware(GZipMiddleware) def html_agenda(request, num=None): + if settings.SERVER_MODE != 'production' and '_testiphone' in request.REQUEST: + user_agent = "iPhone" + elif 'user_agent' in request.REQUEST: + user_agent = request.REQUEST['user_agent'] + elif 'HTTP_USER_AGENT' in request.META: + user_agent = request.META["HTTP_USER_AGENT"] + else: + user_agent = "" + if "iPhone" in user_agent: + return iphone_agenda(request, num) + + meeting = get_meeting(num) + timeslots = TimeSlot.objects.filter(Q(meeting = meeting.number)).order_by('time','name') + modified = timeslots.aggregate(Max('modified'))['modified__max'] + + 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) + + 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) + + wg_list = Group.objects.filter(acronym__in = set(wg_name_list)).order_by('parent__acronym','acronym') + + return HttpResponse(render_to_string("meeting/agenda.html", + {"timeslots":timeslots, "modified": modified, "meeting":meeting, + "area_list": area_list, "wg_list": wg_list , + "show_inline": set(["txt","htm","html"]) }, + RequestContext(request)), mimetype="text/html") + +def deprecated_PLEASE_REMOVE_ME(request, num=None): timeslots, update, meeting, venue, ads, plenaryw_agenda, plenaryt_agenda = agenda_info(num) groups_meeting = []; @@ -209,26 +237,33 @@ def html_agenda(request, num=None): rgs = IRTF.objects.all().filter(acronym__in = groups_meeting).order_by('acronym') areas = Area.objects.filter(status=Area.ACTIVE).order_by('area_acronym__acronym') - if settings.SERVER_MODE != 'production' and '_testiphone' in request.REQUEST: - user_agent = "iPhone" - elif 'user_agent' in request.REQUEST: - user_agent = request.REQUEST['user_agent'] - elif 'HTTP_USER_AGENT' in request.META: - user_agent = request.META["HTTP_USER_AGENT"] - else: - user_agent = "" - #print user_agent - if "iPhone" in user_agent: - template = "meeting/m_agenda.html" - else: - template = "meeting/agenda.html" + template = "meeting/agenda.html" return render_to_response(template, {"timeslots":timeslots, "update":update, "meeting":meeting, "venue":venue, "ads":ads, "plenaryw_agenda":plenaryw_agenda, "plenaryt_agenda":plenaryt_agenda, "wg_list" : wgs, "rg_list" : rgs, "area_list" : areas}, context_instance=RequestContext(request)) +def iphone_agenda(request, num): + timeslots, update, meeting, venue, ads, plenaryw_agenda, plenaryt_agenda = agenda_info(num) + + groups_meeting = []; + for slot in timeslots: + for session in slot.sessions(): + groups_meeting.append(session.acronym()) + groups_meeting = set(groups_meeting); + + wgs = IETFWG.objects.filter(status=IETFWG.ACTIVE).filter(group_acronym__acronym__in = groups_meeting).order_by('group_acronym__acronym') + rgs = IRTF.objects.all().filter(acronym__in = groups_meeting).order_by('acronym') + areas = Area.objects.filter(status=Area.ACTIVE).order_by('area_acronym__acronym') + template = "meeting/m_agenda.html" + return render_to_response(template, + {"timeslots":timeslots, "update":update, "meeting":meeting, "venue":venue, "ads":ads, + "plenaryw_agenda":plenaryw_agenda, "plenaryt_agenda":plenaryt_agenda, + "wg_list" : wgs, "rg_list" : rgs, "area_list" : areas}, + context_instance=RequestContext(request)) + def text_agenda(request, num=None): timeslots, update, meeting, venue, ads, plenaryw_agenda, plenaryt_agenda = agenda_info(num) plenaryw_agenda = " "+plenaryw_agenda.strip().replace("\n", "\n ") diff --git a/ietf/templates/meeting/agenda.html b/ietf/templates/meeting/agenda.html index 7366b7aa4e..69db18585e 100644 --- a/ietf/templates/meeting/agenda.html +++ b/ietf/templates/meeting/agenda.html @@ -10,8 +10,8 @@ table#wg-selector { border:1px solid black; border-collapse:collapse; } #wg-selector td,#wg-selector th { border:1px solid black; padding: 2px} -#wg-selector div.selected { background-color: #D0D0FF; cursor: pointer; } -#wg-selector div.unselected { background-color: #FFFFFF; cursor: pointer; } +#wg-selector div.selected { background-color: #c0c0FF; cursor: pointer; } +#wg-selector div.unselected { cursor: pointer; } #wg-selector td.inactive div { background-color: #EEEEEE; color: #808080; cursor:default;} #wg-selector.hidden { display: none; } #wg-selector-toggle-text { text-decoration: underline; cursor: pointer; } @@ -27,6 +27,21 @@ #ical-link A:active { color: #FF00FF; } #ical-link A:hover { color: #FF0000; } +tr.time-title { font-weight: bold; color:#800000;} +tr.grouprow > td { padding: 4px; } +td.materials { align:right; } +span.note { font-style: italic; color:#ff0000; } + +#APP-groups, #selector-APP { color:#008; background-color:#eef } +#GEN-groups, #selector-GEN { color:#080; background-color:#efe } +#INT-groups, #selector-INT { color:#088; background-color:#eff } +#OPS-groups, #selector-OPS { color:#800; background-color:#fee } +#RAI-groups, #selector-RAI { color:#808; background-color:#fef } +#RTG-groups, #selector-RTG { color:#880; background-color:#ffe } +#SEC-groups, #selector-SEC { color:#488; background-color:#dff } +#TSV-groups, #selector-TSV { color:#484; background-color:#dfd } +#IRTF-groups, #selector-IRTF { color:#448; background-color:#ddf } + img.hidden { display: none; } .ietf-agenda-palette { border-collapse:collapse; border:2px solid black; background:white; overflow:hidden; } @@ -135,7 +150,6 @@ { iframe.setAttribute("src",iframe.getAttribute("xsrc")); } - r(iframe); } } else @@ -148,15 +162,28 @@ } - /* Resizes an IFRAME to fit its contents */ - function r(obj) + /* Resizes an IFRAME to fit its contents and attempts to convert to a div */ + function r(iframe) { try { - docHeight = obj.contentWindow.document.body.scrollHeight; - obj.height = docHeight; + iframe.height = 1; + docHeight = iframe.contentWindow.document.body.scrollHeight; + iframe.height = docHeight; + } + catch (e) { return; } + + if (iframe.contentWindow.document.body.innerHTML) + { + var div = document.createElement("div"); + div.style.border = "solid"; + div.style.borderWidth = "1px"; + div.style.margin = "0"; + div.style.padding = "10px"; + div.style.overflow = "auto"; + div.innerHTML=iframe.contentWindow.document.body.innerHTML; + iframe.parentNode.replaceChild(div,iframe); } - catch (e) {} } function toggle(selection) @@ -211,15 +238,14 @@ {% block content %}

IETF {{ meeting.num }} Meeting Agenda

{{ 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" }}
-Updated {{ update.updated|date:"Y-m-d H:i:s T" }}

+Updated {{ modified|date:"Y-m-d H:i:s T" }}

(There's also a plaintext agenda and a tools-style agenda available)

IETF agendas are subject to change, up to and during the meeting.

{# cache this part for 15 minutes -- it takes 3-6 seconds to generate #} -{% load cache %} -{% cache 900 ietf_meeting_agenda meeting.num %} +{% load cache %}{% cache 900 ietf_meeting_agenda meeting.num %} 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:
@@ -227,32 +253,21 @@

IETF {{ meeting.num }} Meeting Agenda

Select working group sessions
+ {% for area in area_list %} - + {% endfor %} - - - {% for area in area_list %} - - {% endfor %} - - - + {% for wg in wg_list %}{% ifchanged wg.parent.acronym %}{% if forloop.counter > 1 %} + {% endif %} + + @@ -263,78 +278,64 @@

IETF {{ meeting.num }} Meeting Agenda

{% for slot in timeslots %} {% ifchanged %} - -

{{ slot.meeting_date|date:"l"|upper }}, {{ slot.meeting_date|date:"F j, Y" }}

- + +

{{ slot.time|date:"l"|upper }}, {{ slot.time|date:"F j, Y" }}

+ - {% if slot.reg_info %} - - - {{ slot.registration.time_desc }} {{ slot.registration.name }} - {% if venue.reg_area_name %} - {{ venue.reg_area_name|escape }}{% 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|escape }}{% endif %} - - - {% endif %} - - - {{ slot.time_desc }} {{ slot.session_name }} - {% ifequal slot.sessions.0.acronym "plenaryw" %} - - {{ slot.sessions.0.room_id.room_name }}
-
{{ plenaryw_agenda|escape }}
- {% endifequal %} - {% ifequal slot.sessions.0.acronym "plenaryt" %} - - {{ slot.sessions.0.room_id.room_name }}
-
{{ plenaryt_agenda|escape }}
- {% endifequal %} - + {% ifchanged %} + + + {{slot.time|date:"Hi"}}-{{slot.end_time|date:"Hi"}} + + + {{slot.name}} + {% if slot.type.name != 'Session' %} - + {% if slot.show_location %}{{slot.get_location|escape}}{% endif %} + {% endif %} + - {% if not slot.is_plenary %} - {% for session in slot.sessions_by_area|dictsort:"area" %} - - {{ session.info.room_id.room_name}} - {% if session.info.area %} - {{ session.info.area|upper}} - {% if session.info.isWG %}{{ session.info.acronym|lower }}{% else %}{{ session.info.acronym|lower }}{% endif %} - -
- - {% if session.info.agenda_file %}{{ session.info.acronym_name|escape }} {{ session.info.group_type_str }}{% else %}{{ session.info.acronym_name|escape }} {{ session.info.group_type_str }}{% endif %} - {% if session.info.special_agenda_note %}
- {{ session.info.special_agenda_note }}{% endif %} -
drafts: tar|pdf
- - {% endif %} - - - - - {% if session.info.agenda_file %} - - {% else %} - No Agenda Submitted - {% endif %} - - - {% endfor %} - {% endif %} - {% else %} - {% for session in slot.sessions %} - - - {{ slot.time_desc }} {{ session.acronym_name|escape }} - {{ session.room_id.room_name}} - - - {% endfor %} + {% endifchanged %} + {% if slot.type.name = 'Session' %} {% if slot.session.group %} + + + {% if slot.show_location %}{{slot.get_location|escape}}{% endif %} + {{slot.session.group.parent.acronym|upper}} + + {% if slot.session.group.charter %}{{slot.session.group.acronym}} + {% else %}{{slot.session.group.acronym}}{% endif %} + + + {% if slot.session.agenda %}{{slot.session.group.name}} + {% else %}{{slot.session.group.name}}{% endif %} + {% if slot.session.group.state.name = "BOF" %} BOF {% endif %} + {% if slot.session.agenda_note %} +
{{slot.session.agenda_note}}{% endif %} + {% if slot.session.agenda %}drafts: tar|pdf{%endif%} + + + + + {% if slot.session.agenda %} + {% if slot.session.agenda.file_extension in show_inline%} + + {% else %} + Agenda submitted in {{slot.session.agenda.file_extension|upper}} format + {% endif %} + {% else %} + No Agenda Submitted + {% endif %} + + + + {% endif %} {% endif %} + {% if slot.type.name = 'Plenary' %} + + + + + + {% endif %} {% endfor %} diff --git a/ietf/templates/meeting/week-view.html b/ietf/templates/meeting/week-view.html index 13469bc9c4..ddb4384dc0 100644 --- a/ietf/templates/meeting/week-view.html +++ b/ietf/templates/meeting/week-view.html @@ -9,7 +9,7 @@ {% autoescape off %} {% for slot in timeslots %} {% if slot.type.name in render_types %} -items.push({day:{{slot.time|date:"w"}}, time:"{{slot.time|date:"Hi"}}-{{slot.end_time|date:"Hi"}}", duration:{{slot.duration.seconds}}, time_id:"{{slot.time|date:"mdHi"}}", type:"{{slot.type}}", {% if slot.session.name %}name:"{{slot.session.name}}",{% else %}{% if slot.type.name == "Break" %}name:"{{slot.name}}", area:"break", wg:"break",{% else %}name:"{{slot.session.group.name}}",wg:"{{slot.session.group.acronym}}",area:"{{slot.session.group.parent.acronym}}",{% endif %}{% endif %} {% if slot.show_location %}room:"{{slot.get_location}}",{% endif %} dayname:"{{ slot.time|date:"l"|upper }}, {{ slot.time|date:"F j, Y" }}"{% if slot.session.agenda %}, agenda:"http://www.ietf.org{{slot.session.agenda.get_absolute_url}}"{% endif %} });{% endif %}{% endfor %} +items.push({day:{{slot.time|date:"w"}}, time:"{{slot.time|date:"Hi"}}-{{slot.end_time|date:"Hi"}}", duration:{{slot.duration.seconds}}, time_id:"{{slot.time|date:"mdHi"}}", type:"{{slot.type}}", {% if slot.session.name %}name:"{{slot.session.name}}",{% else %}{% if slot.type.name == "Break" %}name:"{{slot.name}}", area:"break", wg:"break",{% else %}name:"{{slot.session.group.name}}{%if slot.session.group.state.name = "BOF"%} BOF{%endif%}",wg:"{{slot.session.group.acronym}}",area:"{{slot.session.group.parent.acronym}}",{% endif %}{% endif %} {% if slot.show_location %}room:"{{slot.get_location}}",{% endif %} dayname:"{{ slot.time|date:"l"|upper }}, {{ slot.time|date:"F j, Y" }}"{% if slot.session.agenda %}, agenda:"http://www.ietf.org{{slot.session.agenda.get_absolute_url}}"{% endif %} });{% endif %}{% endfor %} {% endautoescape %} /* Saturday events need to be moved to the day -1 */ @@ -423,6 +423,7 @@ frame.style.borderWidth = border; frame.style.padding = padding; frame.style.borderColor = e.style.borderColor; + e.appendChild(frame); }