From 1c9bf9b1ca0efcbc56a0ce5497f2a0988dd7483b Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Wed, 30 May 2007 13:47:09 +0000 Subject: [PATCH] meeting_agenda_html.cgi porting has been completed. * Add a new method, affiliation to idtracker/models.py, in class PersonOrOrgInfo * Agenda for the Plenaries should be stored in /home/master-site/proceedings directory to be displayed. * Bug found in listing ADs at the end of the agenda. An agenda always lists the current IESG instead of the IESG at each meeting. Bug is fixed in the ported tool. * meeting_agenda_text.cgi was obsolete, but ported anyway in case someone still has it bookmarked. - Legacy-Id: 182 --- ietf/idtracker/models.py | 9 +++++ ietf/meeting/urls.py | 2 +- ietf/meeting/views.py | 45 +++++++++++++++++----- ietf/proceedings/models.py | 40 +++++++++++++------- ietf/templates/meeting/agenda.html | 38 +++++++++++++++---- ietf/templates/meeting/agenda.txt | 61 ++++++++++++++++++++++++++++++ 6 files changed, 163 insertions(+), 32 deletions(-) create mode 100644 ietf/templates/meeting/agenda.txt diff --git a/ietf/idtracker/models.py b/ietf/idtracker/models.py index b0a953ab2..697f70b3c 100644 --- a/ietf/idtracker/models.py +++ b/ietf/idtracker/models.py @@ -216,6 +216,15 @@ class PersonOrOrgInfo(models.Model): except EmailAddress.DoesNotExist: email = '' return (name, email) + # Added by Sunny Lee to display person's affiliation - 5/26/2007 + def affiliation(self, priority=1, type='INET'): + try: + postal = self.postaladdress_set.get(address_priority=1) + except PostalAddress.DoesNotExist: + return "PersonOrOrgInfo with no name, no postal address!" + except AssertionError: + return "PersonOrOrgInfo with multiple priority-1 addresses!" + return "%s" % ( postal.affiliated_company or postal.department or "???" ) class Meta: db_table = 'person_or_org_info' ordering = ['last_name'] diff --git a/ietf/meeting/urls.py b/ietf/meeting/urls.py index d0e4279dd..dcf26f85f 100644 --- a/ietf/meeting/urls.py +++ b/ietf/meeting/urls.py @@ -5,7 +5,7 @@ urlpatterns = patterns('', (r'^$', views.showlist), (r'^(?P\d+)/$', views.show), - (r'^(?P\d+)/agenda.html$', views.show_html_agenda), + (r'^(?P\d+)/agenda.(?P\S+)$', views.show_html_agenda), (r'^(?P\d+)/materials.html$', views.show_html_materials), diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index 8e2d8d6a5..7f6323e00 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -4,8 +4,9 @@ from django.shortcuts import render_to_response as render import django.newforms as forms from django.utils.html import escape, linebreaks import ietf.utils -from ietf.proceedings.models import Meeting, MeetingTime, WgMeetingSession, SessionName, NonSession, MeetingVenue +from ietf.proceedings.models import Meeting, MeetingTime, WgMeetingSession, SessionName, NonSession, MeetingVenue, IESGHistory from django.views.generic.list_detail import object_list +from django.http import Http404 def default(request): """Default page, with links to sub-pages""" @@ -31,15 +32,37 @@ def meeting_list(request, template): def show_html_materials(request, meeting_num=None): return render("meeting/list.html",{}) -def show_html_agenda(request, meeting_num=None): - meeting_info=Meeting.objects.filter(meeting_num=meeting_num)[0] +def show_html_agenda(request, meeting_num=None, html_or_txt=None): + try: + queryset_list=MeetingTime.objects.filter(meeting=meeting_num).exclude(day_id=0).order_by("day_id","time_desc") + except MeetingTime.DoesNotExist: + raise Http404 + meeting_info=Meeting.objects.get(meeting_num=meeting_num) nonsession_info=NonSession.objects.filter(meeting=meeting_num,day_id__gte='0').order_by("day_id") - meetingvenue_info=MeetingVenue.objects.filter(meeting_num=meeting_num)[0] - queryset_list=MeetingTime.objects.filter(meeting=meeting_num).exclude(day_id=0).order_by("day_id","time_desc") - plenaryw_agenda = "17:00 Welcome\n17:05 NOC report (Wieslaw Blysz, Siemens Networks))\n Host presentation (Georg Haubs, CTO Innovations of Siemens Networks)\n17:20 IETF Chair and IAD short reports\n17:30 Jonathan B. Postel award\n17:40 NomCom Chair (Andrew Lange)\n17:45 Open Microphone\n19:30 (latest) end " #only for testing. In production, this text will be pulled from actualy agenda file - plenaryt_agenda = "-17h00 Welcome and introduction (Leslie Daigle)\n-17h05 IAB update (Leslie Daigle)\nTH17h15 IRTF Report (Aaron Falk)\nTH17h25 Technical Presentations\n Highlights from draft-iab-net-transparent\n (Bernard Aboba)\n Readout from Unwanted Traffic Workshop\n (Danny McPherson & Loa Andersson)\n Readout from the Routing & Addressing Workshop\n (Dave Meyer, Chris Morrow)\n Next steps from RAWS (Leslie Daigle)\nTH19h00 IAB open Mic\n-19h30 End. " #only for testing. In production, this text will be pulled from actualy agenda file - #queryset_list=WgMeetingSession.objects.filter(meeting_num=meeting_num, group_acronym_id > -3) - + try: + meetingvenue_info=MeetingVenue.objects.get(meeting_num=meeting_num) + except MeetingVenue.DoesNotExist: + raise Http404 + plenaryt_agenda_file = "/home/master-site/proceedings/%s" % WgMeetingSession.objects.get(meeting=meeting_num,group_acronym_id=-2).agenda_file() + try: + f = open(plenaryt_agenda_file) + plenaryt_agenda = f.read() + f.close() + except IOError: + plenaryt_agenda = "THE AGENDA HAS NOT BEEN UPLOADED YET" + if html_or_txt == "html": + template_file="meeting/agenda.html" + elif html_or_txt == "txt": + template_file="meeting/agenda.txt" + else: + raise Http404 + plenaryw_agenda_file = "/home/master-site/proceedings/%s" % WgMeetingSession.objects.get(meeting=meeting_num,group_acronym_id=-1).agenda_file() + try: + f = open(plenaryw_agenda_file) + plenaryw_agenda = f.read() + f.close() + except IOError: + plenaryw_agenda = "THE AGENDA HAS NOT BEEN UPLOADED YET" # Due to a bug in Django@0.96 we can't use foreign key lookup in # order_by(), see http://code.djangoproject.com/ticket/2076. Changeset # [133] is broken because it requires a patched Django to run. Work @@ -48,7 +71,9 @@ def show_html_agenda(request, meeting_num=None): ## queryset_list_sun=WgMeetingSession.objects.filter(meeting=meeting_num, sched_time_id1__day_id=0).order_by('sched_time_id1__time_desc') queryset_list_sun=list(WgMeetingSession.objects.filter(meeting=meeting_num, sched_time_id1__day_id=0)) queryset_list_sun.sort(key=(lambda item: item.sched_time_id1.time_desc)) - return object_list(request,queryset=queryset_list, template_name='meeting/agenda.html',allow_empty=True, extra_context={'qs_sun':queryset_list_sun, 'meeting_info':meeting_info, 'meeting_num':meeting_num, 'nonsession_info':nonsession_info, 'meetingvenue_info':meetingvenue_info, 'plenaryw_agenda':plenaryw_agenda, 'plenaryt_agenda':plenaryt_agenda}) + queryset_list_ads = list(IESGHistory.objects.filter(meeting=meeting_num)) + queryset_list_ads.sort(key=(lambda item: item.area.area_acronym.acronym)) + return object_list(request,queryset=queryset_list, template_name=template_file,allow_empty=True, extra_context={'qs_sun':queryset_list_sun, 'meeting_info':meeting_info, 'meeting_num':meeting_num, 'nonsession_info':nonsession_info, 'meetingvenue_info':meetingvenue_info, 'plenaryw_agenda':plenaryw_agenda, 'plenaryt_agenda':plenaryt_agenda, 'qs_ads':queryset_list_ads}) def show(request): return 0 diff --git a/ietf/proceedings/models.py b/ietf/proceedings/models.py index e17bcefdd..819136f68 100644 --- a/ietf/proceedings/models.py +++ b/ietf/proceedings/models.py @@ -1,5 +1,5 @@ from django.db import models -from ietf.idtracker.models import Acronym, PersonOrOrgInfo, IRTF, AreaGroup, IETFWG +from ietf.idtracker.models import Acronym, PersonOrOrgInfo, IRTF, AreaGroup, Area, IETFWG import datetime from ietf.utils import log @@ -147,7 +147,17 @@ class SessionName(models.Model): db_table = 'session_names' class Admin: pass - +class IESGHistory(models.Model): + meeting = models.ForeignKey(Meeting, db_column='meeting_num', primary_key=True, core=True) + area = models.ForeignKey(Area, db_column='area_acronym_id', primary_key=True, core=True) + person = models.ForeignKey(PersonOrOrgInfo, db_column='person_or_org_tag', raw_id_admin=True, core=True) + def __str__(self): + return "%s (%s)" % (self.person,self.area) + class Meta: + db_table = 'iesg_history' + class Admin: + pass + class MeetingTime(models.Model): time_id = models.AutoField(primary_key=True) time_desc = models.CharField(maxlength=100) @@ -163,7 +173,9 @@ class MeetingTime(models.Model): sessions = WgMeetingSession.objects.filter( models.Q(sched_time_id1=self.time_id) | models.Q(sched_time_id2=self.time_id) | - models.Q(sched_time_id3=self.time_id)) + models.Q(sched_time_id3=self.time_id) | + models.Q(combined_time_id1=self.time_id) | + models.Q(combined_time_id2=self.time_id)) for s in sessions: if s.sched_time_id1_id == self.time_id: s.room_id = s.sched_room_id1 @@ -171,22 +183,21 @@ class MeetingTime(models.Model): s.room_id = s.sched_room_id2 elif s.sched_time_id3_id == self.time_id: s.room_id = s.sched_room_id3 + elif s.combined_time_id1_id == self.time_id: + s.room_id = s.combined_room_id1 + elif s.combined_time_id2_id == self.time_id: + s.room_id = s.combined_room_id2 else: s.room_id = 0 return sessions - def combined_sessions(self): - """ - Get all sessions that have a combined_time at this - time. - """ - return WgMeetingSession.objects.filter( - models.Q(combined_time_id1=self.time_id) | - models.Q(combined_time_id2=self.time_id)) def meeting_date(self): return self.meeting.get_meeting_date(self.day_id) def reg_info(self): reg_info = NonSession.objects.get(meeting=self.meeting, day_id=self.day_id, non_session_ref=1) - return "%s %s" % (reg_info.time_desc, reg_info.non_session_ref) + if reg_info.time_desc: + return "%s %s" % (reg_info.time_desc, reg_info.non_session_ref) + else: + return "" def morning_br_info(self): br_info = NonSession.objects.get(models.Q(day_id=self.day_id) | models.Q(day_id__isnull=True), meeting=self.meeting, non_session_ref=2) return "%s %s" % (br_info.time_desc, br_info.non_session_ref) @@ -198,6 +209,9 @@ class MeetingTime(models.Model): def an_br2_info(self): an_br2_info = NonSession.objects.get(meeting=self.meeting, day_id=self.day_id, non_session_ref=5) return "%s %s" % (an_br2_info.time_desc, an_br2_info.non_session_ref) + def fbreak_info(self): + fbreak_info = NonSession.objects.get(meeting-self.meeting, day_id=5, non_session_ref=6) + return "%s %s" % (fbreak_info.time_desc, fbreak_info.non_session_ref) class Meta: db_table = 'meeting_times' class Admin: @@ -261,7 +275,7 @@ class WgMeetingSession(models.Model, ResolveAcronym): try: filename = WgAgenda.objects.get(meeting=self.meeting, group_acronym_id=self.group_acronym_id,irtf=irtfvar,interim=0).filename dir = Proceeding.objects.get(meeting_num=self.meeting).dir_name - retvar = "%s/%s" % (dir,filename) + retvar = "%s/agenda/%s" % (dir,filename) except WgAgenda.DoesNotExist: retvar = "" return retvar diff --git a/ietf/templates/meeting/agenda.html b/ietf/templates/meeting/agenda.html index 7eee91fc8..0ac2faca5 100644 --- a/ietf/templates/meeting/agenda.html +++ b/ietf/templates/meeting/agenda.html @@ -1,5 +1,6 @@ {% extends "base.html" %} -{% block title %} Meeting Agenda {% endblock %} +{% block title %} Meeting Agenda of IETF {{ meeting_num }} {% endblock %} +{% block body_attributes %}background="http://www.ietf.org/meetings/peachbkg.gif"{% endblock %} {% block content %}
@@ -8,7 +9,7 @@ Updated As of : {% now "F j, Y" %}
- Text Format of the Agenda
+ Text Format of the Agenda

*** Click on an acronym of the group to get a charter page ***
*** Click on a name of the group to get a meeting agenda ***
@@ -22,19 +23,23 @@ Updated As of : {% now "F j, Y" %}

{% regroup object_list by day_id as days %} {% for day in days %} - Day: {{ day.list.1.meeting_date|date:"l, F j, Y" }}
- {{ day.list.1.reg_info }} - {{ meetingvenue_info.reg_area_name }}
- {{ day.list.1.morning_br_info }} - {{ meetingvenue_info.break_area_name }}
+ {{ day.list.0.meeting_date|date:"l, F j, Y" }}
+ {% if day.list.0.reg_info %}{{ day.list.0.reg_info }} - {{ meetingvenue_info.reg_area_name }}
{% endif %} + {% ifequal day.list.0.day_id "5" %} + {{ day.list.0.fbreak_info }} - {{ meetingvenue_info.break_area_name }}
+ {% else %} + {{ day.list.0.morning_br_info }} - {{ meetingvenue_info.break_area_name }}
+ {% endifequal %}
{% for item in day.list %} {% ifequal item.session_name_id 3 %} - {{ day.list.1.lunch_br_info }} Break
+ {{ day.list.0.lunch_br_info }} Break
{% endifequal %} {% ifequal item.session_name_id 4 %} - {{ day.list.1.an_br1_info }}
+ {{ day.list.0.an_br1_info }}
{% endifequal %} {% ifequal item.session_name_id 5 %} - {{ day.list.1.an_br2_info }}
+ {{ day.list.0.an_br2_info }}
{% endifequal %} {{ item.time_desc }} {{ item.session_name }} {% ifequal item.sessions.0.acronym "plenaryw" %} @@ -56,4 +61,21 @@ Updated As of : {% now "F j, Y" %}
{% endfor %}
{% endfor %} +


+
AREA DIRECTORS

+ +{% regroup qs_ads by area as ads %} +{% for ad in ads %} + + + + + +{% endfor %} +
{{ ad.grouper|upper }}{{ ad.list.0.area.area_acronym.name }} + {% for ad_person in ad.list %} + {% ifequal forloop.counter 2 %} & {% endifequal %} + {{ ad_person.person }}/{{ ad_person.person.affiliation }} + {% endfor %} +
{% endblock %} diff --git a/ietf/templates/meeting/agenda.txt b/ietf/templates/meeting/agenda.txt new file mode 100644 index 000000000..341a7a7d3 --- /dev/null +++ b/ietf/templates/meeting/agenda.txt @@ -0,0 +1,61 @@ + + +Agenda of the IETF {{ meeting_num }} +

+

+{% filter center:72 %}Agenda of the IETF {{ meeting_num }} Meeting{% endfilter %}
+{% filter center:72 %}{{ meeting_info.start_date|date:"F j, Y" }} - {{ meeting_info.end_date|date:"F j, Y" }}{% endfilter %}
+
+Updated As of : {% now "F j, Y" %}
+
+{{ meeting_info.start_date|date:"l, F j, Y" }}
+{{ nonsession_info.0.time_desc }} {{ nonsession_info.0.non_session_ref }} - {{ meetingvenue_info.reg_area_name }}
+{% for item in qs_sun %}{{ item.sched_time_id1.time_desc }} {{ item.acronym_name }} - {{ item.sched_room_id1.room_name }}
+{% endfor %}
+{% regroup object_list by day_id as days %} +{% for day in days %} +
+{{ day.list.0.meeting_date|date:"l, F j, Y" }}
+{% if day.list.0.reg_info %}{{ day.list.0.reg_info }} - {{ meetingvenue_info.reg_area_name }}{% endif %}
+{% ifequal day.list.0.day_id "5" %}{{ day.list.0.fbreak_info }} - {{ meetingvenue_info.break_area_name }}{% else %}{{ day.list.0.morning_br_info }} - {{ meetingvenue_info.break_area_name }}{% endifequal %}
+
+{% for item in day.list %} +{% ifequal item.session_name_id 3 %} +
{{ day.list.0.lunch_br_info }} Break
+
+{% endifequal %} +{% ifequal item.session_name_id 4 %} +
{{ day.list.0.an_br1_info }}
+
+{% endifequal %} +{% ifequal item.session_name_id 5 %} +
{{ day.list.0.an_br2_info }}
+
+{% endifequal %} +
{{ item.time_desc }} {{ item.session_name }}
+{% ifequal item.sessions.0.acronym "plenaryw" %} +
{{ item.sessions.0.room_id.room_name }}
+{{ plenaryw_agenda|escape }}
+
+{% else %} +{% ifequal item.sessions.0.acronym "plenaryt" %} +
{{ item.sessions.0.room_id.room_name }}
+{{ plenaryt_agenda|escape }}
+
+{% else %} +
{% for session in item.sessions|dictsort:"area" %}
+{{ session.room_id.room_name|ljust:20 }} {{ session.area|upper|ljust:5 }} {{ session.acronym|lower|ljust:10 }} {{ session.acronym_name }}{% if session.special_agenda_note %} - {{ session.special_agenda_note|upper }}{% endif %}{% endfor %}
+ {% endifequal %} + {% endifequal %} + {% endfor %} +{% endfor %} +
====================================================================
+AREA DIRECTORS
+{% regroup qs_ads by area as ads %}{% for ad in ads %}
+{{ ad.grouper|upper|ljust:5 }}{{ ad.list.0.area.area_acronym.name|ljust:18 }}  {% for ad_person in ad.list %}{% ifequal forloop.counter 2 %} & {% endifequal %}{{ ad_person.person }}/{{ ad_person.person.affiliation }}{% endfor %}{% endfor %}
+
+ +