From 1a6f72071e725128382183a3112a4dd38b95c8af Mon Sep 17 00:00:00 2001
From: Adam Roach <adam@nostrum.com>
Date: Sat, 23 Jul 2011 15:37:09 +0000
Subject: [PATCH] Added csv output format for meeting agenda information, to
 assist external applications (e.g., Android app, iPhone app) in harvesting
 and displaying meeting agenda info.  - Legacy-Id: 3240

---
 ietf/meeting/urls.py              |  2 ++
 ietf/meeting/views.py             | 11 +++++++++++
 ietf/settings.py                  |  2 +-
 ietf/templates/meeting/agenda.csv |  5 +++++
 4 files changed, 19 insertions(+), 1 deletion(-)
 create mode 100644 ietf/templates/meeting/agenda.csv

diff --git a/ietf/meeting/urls.py b/ietf/meeting/urls.py
index b2bbadf86..1d61e3bff 100644
--- a/ietf/meeting/urls.py
+++ b/ietf/meeting/urls.py
@@ -10,11 +10,13 @@ urlpatterns = patterns('',
     (r'^agenda.txt$', views.text_agenda),
     (r'^agenda/agenda.ics$', views.ical_agenda),
     (r'^agenda.ics$', views.ical_agenda),
+    (r'^agenda.csv$', views.csv_agenda),
     (r'^agenda/week-view.html$', views.week_view),
     (r'^week-view.html$', views.week_view),
     (r'^(?P<num>\d+)/agenda(?:.html)?/?$', views.html_agenda),
     (r'^(?P<num>\d+)/agenda.txt$', views.text_agenda),
     (r'^(?P<num>\d+)/agenda.ics$', views.ical_agenda),
+    (r'^(?P<num>\d+)/agenda.csv$', views.csv_agenda),
     (r'^(?P<num>\d+)/week-view.html$', views.week_view),
     (r'^(?P<num>\d+)/agenda/(?P<session>[A-Za-z0-9-]+)-drafts.pdf$', views.session_draft_pdf),
     (r'^(?P<num>\d+)/agenda/(?P<session>[A-Za-z0-9-]+)-drafts.tgz$', views.session_draft_tarfile),
diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py
index 6067ad746..b66e3a483 100644
--- a/ietf/meeting/views.py
+++ b/ietf/meeting/views.py
@@ -349,3 +349,14 @@ def ical_agenda(request, num=None):
         {"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")
+
+def csv_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')
+
+    return HttpResponse(render_to_string("meeting/agenda.csv",
+        {"timeslots":timeslots, "update":update, "meeting":meeting, "venue":venue, "ads":ads,
+         "plenaryw_agenda":plenaryw_agenda, "plenaryt_agenda":plenaryt_agenda, },
+        RequestContext(request)), mimetype="text/csv")
diff --git a/ietf/settings.py b/ietf/settings.py
index 1db68e555..fec29f3a3 100644
--- a/ietf/settings.py
+++ b/ietf/settings.py
@@ -155,7 +155,7 @@ IDTRACKER_BASE_URL = "http://datatracker.ietf.org"
 # Valid values:
 # 'production', 'test', 'development'
 # Override this in settings_local.py if it's not true
-SERVER_MODE = 'production'
+SERVER_MODE = 'development'
 
 # The name of the method to use to invoke the test suite
 TEST_RUNNER = 'ietf.utils.test_runner.run_tests'
diff --git a/ietf/templates/meeting/agenda.csv b/ietf/templates/meeting/agenda.csv
new file mode 100644
index 000000000..03058617b
--- /dev/null
+++ b/ietf/templates/meeting/agenda.csv
@@ -0,0 +1,5 @@
+{% load humanize %}{% autoescape off %}{% load ietf_filters %}"Date","Start","End","Session","Room","Area","Acronym","Type","Description","Session ID","Agenda","Slides"
+{% for slot in timeslots %}{% ifchanged %}{% if slot.reg_info %}"{{ slot.meeting_date|date:"Y-m-d" }}","{{ slot.registration.time_desc|slice:":4" }}","{{ slot.registration.time_desc|slice:"5:9" }}","Registration","{{ venue.reg_area_name }}","","","","{{ slot.registration.name }}","r{{slot.day_id}}","",""
+{% endif %}{% endifchanged %}{% if slot.session_name %}{% if slot.break_info %}"{{ slot.meeting_date|date:"Y-m-d" }}","{{ slot.break_info.time_desc|slice:":4" }}","{{ slot.break_info.time_desc|slice:"5:9" }}","Break","{{ venue.break_area_name }}","","","","{{ slot.break_info.name }}","b{{slot.time_id}}","",""
+{% endif %}{% endif %}{% for session in slot.sessions_by_area %}"{{ slot.meeting_date|date:"Y-m-d" }}","{{ slot.time_desc|slice:":4" }}","{{ slot.time_desc|slice:"5:9" }}","{{ slot.session_name }}","{{ session.info.room_id.room_name }}","{{ session.info.area|upper }}","{{ session.info.acronym }}","{{ session.info.group_type_str }}","{{ session.info.acronym_name }}","{{session.info.session_id}}-{{session.info.ordinality}}","{% if session.info.agenda_file %}http://datatracker.ietf.org/meeting/{{ session.info.agenda_file }}{% endif %}","{% if session.info.slides %}{% for slide in session.info.slides %}http://www.ietf.org/proceedings/{{ slide.file_loc }}{% if not forloop.last %}|{% endif %}{% endfor %}{% endif %}"
+{% endfor %}{% endfor %}{% endautoescape %}