Skip to content

Commit 06a0e2b

Browse files
committed
Adds a graphical overview of each day by room for the secretariat to assist with scheduling additional meetings. Commit ready for merge.
- Legacy-Id: 9651
1 parent b9bf759 commit 06a0e2b

4 files changed

Lines changed: 664 additions & 2 deletions

File tree

ietf/meeting/tests_views.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,13 @@ def test_agenda_by_type(self):
149149
self.assertFalse(any([x in r.content for x in ['mars','Test Room']]))
150150
self.assertTrue(all([x in r.content for x in ['IESG Breakfast','Breakfast Room']]))
151151

152+
def test_agenda_room_view(self):
153+
meeting = make_meeting_test_data()
154+
url = urlreverse("ietf.meeting.views.room_view",kwargs=dict(num=meeting.number))
155+
login_testing_unauthorized(self,"secretary",url)
156+
r = self.client.get(url)
157+
self.assertTrue(all([x in r.content for x in ['mars','IESG Breakfast','Test Room','Breakfast Room']]))
158+
152159
def test_session_details(self):
153160
meeting = make_meeting_test_data()
154161
url = urlreverse("ietf.meeting.views.session_details", kwargs=dict(num=meeting.number, acronym="mars"))

ietf/meeting/urls.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
(r'^agenda/agenda.ics$', views.ical_agenda),
1919
(r'^agenda.ics$', views.ical_agenda),
2020
(r'^agenda/week-view.html$', views.week_view),
21+
(r'^agenda/room-view.html$', views.room_view),
2122
(r'^week-view.html$', views.week_view),
23+
(r'^room-view.html$', views.room_view),
2224
(r'^(?P<num>\d+)/agenda/(?P<owner>[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P<name>[A-Za-z0-9-:_]+)/edit$', views.edit_agenda),
2325
(r'^(?P<num>\d+)/agenda/(?P<owner>[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P<name>[A-Za-z0-9-:_]+)/details$', views.edit_agenda_properties),
2426
(r'^(?P<num>\d+)/agenda/(?P<owner>[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P<name>[A-Za-z0-9-:_]+).(?P<ext>.html)?/?$', views.agenda),
@@ -48,7 +50,9 @@
4850
(r'^(?P<num>\d+)/agendas$', ajax.agenda_infosurl),
4951
(r'^(?P<num>\d+)/agendas.json$', ajax.agenda_infosurl),
5052
(r'^(?P<num>\d+)/week-view.html$', views.week_view),
53+
(r'^(?P<num>\d+)/room-view.html$', views.room_view),
5154
(r'^(?P<num>\d+)/agenda/week-view.html$', views.week_view),
55+
(r'^(?P<num>\d+)/agenda/room-view.html$', views.room_view),
5256
(r'^(?P<num>\d+)/agenda/(?P<session>[A-Za-z0-9-]+)-drafts.pdf$', views.session_draft_pdf),
5357
(r'^(?P<num>\d+)/agenda/(?P<session>[A-Za-z0-9-]+)-drafts.tgz$', views.session_draft_tarfile),
5458
(r'^(?P<num>\d+)/agenda/(?P<session>[A-Za-z0-9-]+)/?$', views.session_agenda),

ietf/meeting/views.py

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,10 @@
1515
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden, Http404
1616
from django.contrib import messages
1717
from django.core.urlresolvers import reverse
18-
from django.db.models import Q
18+
from django.db.models import Q, Min, Max
1919
from django.template import RequestContext
2020
from django.template.loader import render_to_string
2121
from django.conf import settings
22-
from django.db.models import Max
2322
from django.forms.models import modelform_factory
2423
from django.views.decorators.csrf import ensure_csrf_cookie
2524
from django.forms import ModelForm
@@ -612,6 +611,59 @@ def week_view(request, num=None):
612611
return render_to_response(template,
613612
{"timeslots":timeslots,"render_types":["Session","Other","Break","Plenary"]}, context_instance=RequestContext(request))
614613

614+
@role_required('Secretariat')
615+
def room_view(request, num=None):
616+
meeting = get_meeting(num)
617+
618+
rooms = meeting.room_set.order_by('functional_name','name')
619+
if rooms.count() == 0:
620+
raise Http404
621+
622+
scheduledsessions = meeting.agenda.scheduledsession_set.all()
623+
unavailable = meeting.timeslot_set.filter(type__slug='unavail')
624+
if (unavailable.count() + scheduledsessions.count()) == 0 :
625+
raise Http404
626+
627+
earliest = None
628+
latest = None
629+
630+
if scheduledsessions:
631+
earliest = scheduledsessions.aggregate(Min('timeslot__time'))['timeslot__time__min']
632+
latest = scheduledsessions.aggregate(Max('timeslot__time'))['timeslot__time__max']
633+
634+
if unavailable:
635+
earliest_unavailable = unavailable.aggregate(Min('time'))['time__min']
636+
if not earliest or ( earliest_unavailable and earliest_unavailable < earliest ):
637+
earliest = earliest_unavailable
638+
latest_unavailable = unavailable.aggregate(Max('time'))['time__max']
639+
if not latest or ( latest_unavailable and latest_unavailable > latest ):
640+
latest = latest_unavailable
641+
642+
if not (earliest and latest):
643+
raise Http404
644+
645+
base_time = earliest
646+
base_day = datetime.datetime(base_time.year,base_time.month,base_time.day)
647+
648+
day = base_day
649+
days = []
650+
while day <= latest :
651+
days.append(day)
652+
day += datetime.timedelta(days=1)
653+
654+
unavailable = list(unavailable)
655+
for t in unavailable:
656+
t.delta_from_beginning = (t.time - base_time).total_seconds()
657+
t.day = (t.time-base_day).days
658+
659+
scheduledsessions = list(scheduledsessions)
660+
for ss in scheduledsessions:
661+
ss.delta_from_beginning = (ss.timeslot.time - base_time).total_seconds()
662+
ss.day = (ss.timeslot.time-base_day).days
663+
664+
template = "meeting/room-view.html"
665+
return render(request, template,{"meeting":meeting,"unavailable":unavailable,"scheduledsessions":scheduledsessions,"rooms":rooms,"days":days})
666+
615667
def ical_agenda(request, num=None, name=None, ext=None):
616668
meeting = get_meeting(num)
617669
schedule = get_schedule(meeting, name)

0 commit comments

Comments
 (0)