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 %}
+
+ +