diff --git a/ietf/meeting/migrations/0005_auto_20150318_1116.py b/ietf/meeting/migrations/0005_auto_20150318_1116.py index 1068f49df..2d28d53d5 100644 --- a/ietf/meeting/migrations/0005_auto_20150318_1116.py +++ b/ietf/meeting/migrations/0005_auto_20150318_1116.py @@ -67,7 +67,7 @@ def backfill_91_other_meetings(apps, schema_editor): ( 9, 17, 0, 120, 'offagenda', [secr], sea_pearl_12, 'Reception', "Companion's Reception"), # Should this appear on agenda? ( 9, 19, 0, 180, 'offagenda', [isocfell], rainbow_23, 'Dinner', 'ISOC Fellows Reception/Dinner'), ( 9, 19, 0, 180, 'offagenda', [secr], lehua_suite, 'Meeting', 'Huawei'), - ( 9, 21, 0, 180, 'lead', [secr], sea_pearl_12, 'Gathering', 'AMS/IESG/IABIAOC Gathering'), + ( 9, 21, 0, 180, 'lead', [secr], sea_pearl_12, 'Gathering', 'AMS/IESG/IAB/IAOC Gathering'), ( 10, 0, 0, 1440, 'offagenda', [secr], south_pacific_1, 'Terminal Room', 'Terminal Room Open to Attendees'), ( 10, 7, 0, 120, 'lead', [iesg,iab], south_pacific_2, 'Breakfast', 'IESG/IAB Breakfast'), ( 10, 7, 0, 120, 'lead', [nomcom], iolani_67, 'Breakfast', 'Nomcom Breakfast'), diff --git a/ietf/meeting/migrations/0006_auto_20150429_1224.py b/ietf/meeting/migrations/0006_auto_20150429_1224.py new file mode 100644 index 000000000..45e8f37b0 --- /dev/null +++ b/ietf/meeting/migrations/0006_auto_20150429_1224.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + +def extract_session_type_values(apps, schema_editor): + + Session = apps.get_model('meeting', 'Session') + + for s in Session.objects.all(): + t = s.scheduledsession_set.filter(schedule=models.F('schedule__meeting__agenda')).first() + if t and t.timeslot.type.slug != 'session': + s.type = t.timeslot.type + s.save() + +class Migration(migrations.Migration): + + dependencies = [ + ('name', '0004_auto_20150318_1140'), + ('meeting', '0005_auto_20150318_1116'), + ] + + operations = [ + migrations.AddField( + model_name='session', + name='type', + field=models.ForeignKey(default='session', to='name.TimeSlotTypeName'), + preserve_default=False, + ), + migrations.RunPython(extract_session_type_values), + ] diff --git a/ietf/meeting/migrations/0007_auto_20150429_1346.py b/ietf/meeting/migrations/0007_auto_20150429_1346.py new file mode 100644 index 000000000..a68a68f4e --- /dev/null +++ b/ietf/meeting/migrations/0007_auto_20150429_1346.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + +def extract_room_session_type_values(apps, schema_editor): + + Room = apps.get_model('meeting', 'Room') + + for r in Room.objects.all(): + for ts in r.timeslot_set.all(): + if ts.scheduledsession_set.filter(schedule=models.F('schedule__meeting__agenda')): + r.session_types.add(ts.type) + +class Migration(migrations.Migration): + + dependencies = [ + ('name', '0004_auto_20150318_1140'), + ('meeting', '0006_auto_20150429_1224'), + ] + + operations = [ + migrations.AddField( + model_name='room', + name='session_types', + field=models.ManyToManyField(to='name.TimeSlotTypeName', blank=True), + preserve_default=True, + ), + migrations.RunPython(extract_room_session_type_values), + ] diff --git a/ietf/meeting/urls.py b/ietf/meeting/urls.py index 429f8d723..351f3ab5b 100644 --- a/ietf/meeting/urls.py +++ b/ietf/meeting/urls.py @@ -34,6 +34,9 @@ urlpatterns = patterns('', (r'^(?P\d+)/agenda.ics$', views.ical_agenda), (r'^(?P\d+)/agenda(?P.csv)$', views.agenda), (r'^(?P\d+)/agenda/by-room$', views.agenda_by_room), + (r'^(?P\d+)/agenda/by-type$', views.agenda_by_type), + (r'^(?P\d+)/agenda/by-type/(?P[a-z]+)$', views.agenda_by_type), + (r'^(?P\d+)/agenda/by-type/(?P[a-z]+)/ics$', views.agenda_by_type_ics), (r'^(?P\d+)/agendas/edit$', views.edit_agendas), (r'^(?P\d+)/timeslots/edit$', views.edit_timeslots), (r'^(?P\d+)/rooms$', ajax.timeslot_roomsurl), diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index bf198ae36..ca02fdc85 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -388,7 +388,6 @@ def agenda(request, num=None, name=None, base=None, ext=None): #TODO - let the IAB in @role_required('Area Director','Secretariat') -@ensure_csrf_cookie def agenda_by_room(request,num=None): meeting = get_meeting(num) schedule = get_schedule(meeting) @@ -400,6 +399,25 @@ def agenda_by_room(request,num=None): ss_by_day[day].append(ss) return render(request,"meeting/agenda_by_room.html",{"meeting":meeting,"ss_by_day":ss_by_day}) +@role_required('Area Director','Secretariat') +def agenda_by_type(request,num=None,type=None): + meeting = get_meeting(num) + schedule = get_schedule(meeting) + scheduledsessions = schedule.scheduledsession_set.order_by('session__type__slug','timeslot__time') + if type: + scheduledsessions = scheduledsessions.filter(session__type__slug=type) + return render(request,"meeting/agenda_by_type.html",{"meeting":meeting,"scheduledsessions":scheduledsessions}) + +@role_required('Area Director','Secretariat') +def agenda_by_type_ics(request,num=None,type=None): + meeting = get_meeting(num) + schedule = get_schedule(meeting) + scheduledsessions = schedule.scheduledsession_set.order_by('session__type__slug','timeslot__time') + if type: + scheduledsessions = scheduledsessions.filter(session__type__slug=type) + updated = meeting_updated(meeting) + return render(request,"meeting/agenda.ics",{"schedule":schedule,"updated":updated,"assignments":scheduledsessions},content_type="text/calendar") + def read_agenda_file(num, doc): # XXXX FIXME: the path fragment in the code below should be moved to # settings.py. The *_PATH settings should be generalized to format() diff --git a/ietf/secr/meetings/views.py b/ietf/secr/meetings/views.py index e1b42e930..8b0ae1c98 100644 --- a/ietf/secr/meetings/views.py +++ b/ietf/secr/meetings/views.py @@ -53,10 +53,15 @@ def build_timeslots(meeting,room=None): or adding a room. ''' slots = meeting.timeslot_set.filter(type='session') + + # Don't do anything if the room is not capable of handling sessions + if not room.session_types.filter(slug='session'): + return + if room: rooms = [room] else: - rooms = meeting.room_set.all() + rooms = meeting.room_set.filter(session_types__slug='session') if not slots or room: # if we are just building timeslots for a new room, the room argument was passed, # then we need to use current meeting times as a template, not the last meeting times diff --git a/ietf/templates/meeting/agenda_by_type.html b/ietf/templates/meeting/agenda_by_type.html new file mode 100644 index 000000000..046154d02 --- /dev/null +++ b/ietf/templates/meeting/agenda_by_type.html @@ -0,0 +1,54 @@ +{% extends "base.html" %} +{% block morecss %} + +ul.typelist { list-style:none; padding-left:0; } +li.typelistentry { font-size:162%; font-weight:700; } +li.even { background-color:#EDF5FF; } +li.odd { background-color:white; } +ul.daylist {list-style:none; padding-left:0; margin-bottom:20px;} +li.daylistentry { margin-left:2em; font-weight: 400; } + +.sessiontable {margin-left:2em; font-size:62%;} +.sessiontable td {padding-right: 1em;} + +.typelabel { font-size:162%; font-weight:700; } +.daylabel { font-size:162%; font-weight:400; } +.even { background-color:#EDF5FF; } +.odd { background-color:white; } +{% comment %}li.sessionlistentry { font-size:62%; }{% endcomment %} + +.type-lead:after { content: " (DO NOT POST)"; color:red; } +.type-offagenda:after { content:" (not published on agenda)"; } + +{% endblock %} + +{% block title %}Agenda for {{meeting}} by Session Type{% endblock %} + +{% block content %} +

Agenda for {{meeting}} by Session Type

+{% regroup scheduledsessions by session.type.slug as type_list %} +
    +{% for type in type_list %} +
  • + {{type.grouper}} Download to Calendar +
      + {% regroup type.list by timeslot.time|date:"l Y-M-d" as daylist %} + {% for day in daylist %} +
    • + {{ day.grouper }} + + {% for ss in day.list %} + + + + + + {% endfor %} +
      {{ss.timeslot.time|date:"H:i"}}-{{ss.timeslot.end_time|date:"H:i"}}{{ss.timeslot.get_hidden_location}}{{ss.session.short_name}}
      +
    • + {% endfor %} +
    +
  • +{% endfor %} +
+{% endblock %}