From 97b48252b1a80798709ef1cfdf6231c67295248a Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Sat, 26 Mar 2011 14:33:51 +0000 Subject: [PATCH] Merged [2946] from adam@nostrum.com: Added ical-format agenda (http://trac.tools.ietf.org/tools/ietfdb/ticket/601) - Legacy-Id: 2954 Note: SVN reference [2946] has been migrated to Git commit fe3189ba04734ac21d8c18fba99b289abc0bd358 --- ietf/meeting/urls.py | 2 ++ ietf/meeting/views.py | 17 +++++++++++ ietf/proceedings/models.py | 6 ++++ ietf/templates/meeting/agenda.html | 15 ++++++++- ietf/templates/meeting/agenda.ics | 44 +++++++++++++++++++++++++++ ietf/templates/meeting/week-view.html | 3 +- 6 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 ietf/templates/meeting/agenda.ics diff --git a/ietf/meeting/urls.py b/ietf/meeting/urls.py index 0316b23fe..34437476e 100644 --- a/ietf/meeting/urls.py +++ b/ietf/meeting/urls.py @@ -8,10 +8,12 @@ urlpatterns = patterns('', (r'^agenda/$', views.html_agenda), (r'^agenda(?:.html)?$', views.html_agenda), (r'^agenda.txt$', views.text_agenda), + (r'^agenda.ics$', views.ical_agenda), (r'^agenda/week-view.html$', views.week_view), (r'^week-view.html$', views.week_view), (r'^(?P\d+)/agenda(?:.html)?/?$', views.html_agenda), (r'^(?P\d+)/agenda.txt$', views.text_agenda), + (r'^(?P\d+)/agenda.ics$', views.ical_agenda), (r'^(?P\d+)/week-view.html$', views.week_view), (r'^(?P\d+)/agenda/(?P[A-Za-z0-9-]+)-drafts.pdf$', views.session_draft_pdf), (r'^(?P\d+)/agenda/(?P[A-Za-z0-9-]+)-drafts.tgz$', views.session_draft_tarfile), diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index 43c90280e..936ce50a1 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -321,3 +321,20 @@ def week_view(request, num=None): "rg_list" : rgs, "area_list" : areas}, context_instance=RequestContext(request)) +def ical_agenda(request, num=None): + timeslots, update, meeting, venue, ads, plenaryw_agenda, plenaryt_agenda = agenda_info(num) + wgs = IETFWG.objects.filter(status=IETFWG.ACTIVE).order_by('group_acronym__acronym') + rgs = IRTF.objects.all().order_by('acronym') + areas = Area.objects.filter(status=Area.ACTIVE).order_by('area_acronym__acronym') + filter = (request.META['QUERY_STRING']).lower().split(','); + include = set(filter) + + for slot in timeslots: + for session in slot.sessions(): + if session.area() == '' or session.area().find('plenary') > 0 or (session.area().lower() in include): + filter.append(session.acronym()) + + return HttpResponse(render_to_string("meeting/agenda.ics", + {"filter":set(filter), "timeslots":timeslots, "update":update, "meeting":meeting, "venue":venue, "ads":ads, + "plenaryw_agenda":plenaryw_agenda, "plenaryt_agenda":plenaryt_agenda, }, + RequestContext(request)), mimetype="text/calendar") diff --git a/ietf/proceedings/models.py b/ietf/proceedings/models.py index bea0c2c27..384246b2e 100644 --- a/ietf/proceedings/models.py +++ b/ietf/proceedings/models.py @@ -255,16 +255,22 @@ class MeetingTime(models.Model): for s in sessions: if s.sched_time_id1_id == self.time_id: s.room_id = s.sched_room_id1 + s.ordinality = 1 elif s.sched_time_id2_id == self.time_id: s.room_id = s.sched_room_id2 + s.ordinality = 2 elif s.sched_time_id3_id == self.time_id: s.room_id = s.sched_room_id3 + s.ordinality = 3 elif s.combined_time_id1_id == self.time_id: s.room_id = s.combined_room_id1 + s.ordinality = 4 elif s.combined_time_id2_id == self.time_id: s.room_id = s.combined_room_id2 + s.ordinality = 5 else: s.room_id = 0 + s.ordinality = 0 return sessions def sessions_by_area(self): return [ {"area":session.area()+session.acronym(), "info":session} for session in self.sessions() ] diff --git a/ietf/templates/meeting/agenda.html b/ietf/templates/meeting/agenda.html index 5b2142165..a6ee237c7 100644 --- a/ietf/templates/meeting/agenda.html +++ b/ietf/templates/meeting/agenda.html @@ -19,7 +19,13 @@ table#wg-selector { border:1px solid black; border-collapse:collapse; } #wg-selector-triangle-down { vertical-align: text-top; } #weekview.hidden { display: none; } -#weekview { border: none; margin: 10px 0 0 0;} +#weekview { border: none; margin: 0 0 0 0;} +#ical-link.hidden { display: none; } +#ical-link { margin: 10px 0 0 0; padding: 10px; text-align: center; background-color: #2647a0; color: #FFFFFF } +#ical-link A:link { color: #FFFFFF; } +#ical-link A:visited { color: #FFFFFF; } +#ical-link A:active { color: #FF00FF; } +#ical-link A:hover { color: #FF0000; } img.hidden { display: none; } @@ -61,6 +67,8 @@ img.hidden { display: none; } if (frag == lastfrag) { return; } var weekview = document.getElementById('weekview'); + var ical_link = document.getElementById('ical-link'); + var ical_href = document.getElementById('ical-href'); lastfrag = frag; @@ -70,10 +78,13 @@ img.hidden { display: none; } { weekview.setAttribute("src","week-view.html#"+frag); weekview.className = ''; + ical_href.setAttribute("href","agenda.ics?"+frag); + ical_link.className = ''; } else { weekview.className = 'hidden'; + ical_link.className = 'hidden'; } var selectors = document.getElementsByTagName('div'); @@ -244,6 +255,8 @@ You can customize the agenda below to show only selected working group sessions. + + diff --git a/ietf/templates/meeting/agenda.ics b/ietf/templates/meeting/agenda.ics new file mode 100644 index 000000000..6a492eeca --- /dev/null +++ b/ietf/templates/meeting/agenda.ics @@ -0,0 +1,44 @@ +{% load humanize %}{% autoescape off %}{% load ietf_filters %}BEGIN:VCALENDAR +VERSION:2.0 +METHOD:PUBLISH +BEGIN:VTIMEZONE +TZID:{% now "T" %} +BEGIN:STANDARD +TZOFFSETFROM:{% now "O" %} +TZOFFSETTO:{% now "O" %} +TZNAME:{% now "T" %} +DTSTART:19700101T000000 +END:STANDARD +END:VTIMEZONE +{% if meeting.time_zone %}BEGIN:VTIMEZONE +TZID:{{meeting.city}} +BEGIN:STANDARD +TZOFFSETFROM:{{meeting.time_zone|stringformat:"+02.2d"}}00 +TZOFFSETTO:{{meeting.time_zone|stringformat:"+02.2d"}}00 +TZNAME:{{meeting.city}} +DTSTART:19700101T000000 +END:STANDARD +END:VTIMEZONE +{% endif %}{% for slot in timeslots %}{% ifchanged %}{% if slot.session_name and slot.break_info %}BEGIN:VEVENT +UID:ietf-{{meeting.num}}-break-{{slot.time_id}} +SUMMARY:{{slot.break_info.name}} +{% if venue.break_area_name and slot.break_info.show_break_location %}LOCATION:{{venue.break_area_name}} +{% endif %}STATUS:TENTATIVE +CLASS:PUBLIC +DTSTART{% if meeting.time_zone %};TZID="{{meeting.city}}"{%endif%}:{{ slot.meeting_date|date:"Ymd" }}T{{slot.break_info.time_desc|slice:":4"}}00 +DTEND{% if meeting.time_zone %};TZID="{{meeting.city}}"{%endif%}:{{ slot.meeting_date|date:"Ymd" }}T{{slot.break_info.time_desc|slice:"5:9"}}00 +DTSTAMP;TZID="{% now "T" %}":{% now "Ymd" %}T{% now "Gis" %} +END:VEVENT +{% endif %}{% endifchanged %}{% for session in slot.sessions %}{%for f in filter%}{%ifequal f session.acronym%}BEGIN:VEVENT +UID:ietf-{{meeting.num}}-{{session.acronym}}-{{session.ordinality}} +SUMMARY:{% if session.area %}{% ifnotequal session.area "1plenary" %}{{session.acronym|upper}} - {% endifnotequal %}{% endif %}{{session.acronym_name}} +LOCATION:{{session.room_id.room_name}} +STATUS:TENTATIVE +CLASS:PUBLIC +DTSTART{% if meeting.time_zone %};TZID="{{meeting.city}}"{%endif%}:{{ slot.meeting_date|date:"Ymd" }}T{{slot.time_desc|slice:":4"}}00 +DTEND{% if meeting.time_zone %};TZID="{{meeting.city}}"{%endif%}:{{ slot.meeting_date|date:"Ymd" }}T{{slot.time_desc|slice:"5:9"}}00 +DTSTAMP;TZID="{% now "T" %}":{% now "Ymd" %}T{% now "Gis" %} +{% if session.description %}DESCRIPTION: + {{ session.description|escapejs }} +{% endif %}END:VEVENT +{%endifequal%}{%endfor%}{% endfor %}{% endfor %}END:VCALENDAR{% endautoescape %} diff --git a/ietf/templates/meeting/week-view.html b/ietf/templates/meeting/week-view.html index f619a5cda..e60d3f7d1 100644 --- a/ietf/templates/meeting/week-view.html +++ b/ietf/templates/meeting/week-view.html @@ -128,9 +128,10 @@ function draw_calendar() e.style.border="solid"; e.style.borderWidth=border; - e.style.background="#000"; + e.style.background="#2647a0"; e.style.color="#fff"; e.style.borderColor="#000 #fff"; + e.style.borderColor="#2647a0 #2647a0 #000 #2647a0"; e.style.display="block"; e.style.overflow="hidden";