Skip to content

Commit c68ae76

Browse files
committed
Provides a custom json view of meetings optimized for the iphone app. Commit ready for merge.
- Legacy-Id: 11756
1 parent c3718c8 commit c68ae76

7 files changed

Lines changed: 145 additions & 2 deletions

File tree

ietf/meeting/ajax.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def agenda_permission_api(request, num, owner, name):
7272
## ROOM API
7373
#############################################################################
7474
from django.forms.models import modelform_factory
75-
AddRoomForm = modelform_factory(Room, exclude=('meeting',))
75+
AddRoomForm = modelform_factory(Room, exclude=('meeting','time'))
7676

7777
# no authorization required
7878
def timeslot_roomlist(request, mtg):
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
from django.db import models, migrations
5+
import datetime
6+
7+
def forward(apps,schema_editor):
8+
Room = apps.get_model('meeting','Room')
9+
FloorPlan = apps.get_model('meeting','FloorPlan')
10+
for room in Room.objects.all():
11+
room.time = room.meeting.date+datetime.timedelta(days=5)
12+
room.save()
13+
for plan in FloorPlan.objects.all():
14+
plan.time = plan.meeting.date+datetime.timedelta(days=5)
15+
plan.save()
16+
17+
class Migration(migrations.Migration):
18+
19+
dependencies = [
20+
('meeting', '0028_add_audio_stream_data'),
21+
]
22+
23+
operations = [
24+
migrations.AddField(
25+
model_name='floorplan',
26+
name='time',
27+
field=models.DateTimeField(default=datetime.datetime.now),
28+
preserve_default=True,
29+
),
30+
migrations.AddField(
31+
model_name='room',
32+
name='time',
33+
field=models.DateTimeField(default=datetime.datetime.now),
34+
preserve_default=True,
35+
),
36+
migrations.RunPython(forward,None)
37+
]

ietf/meeting/models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ def json_dict(self, host_scheme):
296296

297297
class Room(models.Model):
298298
meeting = models.ForeignKey(Meeting)
299+
time = models.DateTimeField(default=datetime.datetime.now)
299300
name = models.CharField(max_length=255)
300301
functional_name = models.CharField(max_length=255, blank = True)
301302
capacity = models.IntegerField(null=True, blank=True)
@@ -384,6 +385,7 @@ def floorplan_path(instance, filename):
384385

385386
class FloorPlan(models.Model):
386387
name = models.CharField(max_length=255)
388+
time = models.DateTimeField(default=datetime.datetime.now)
387389
meeting = models.ForeignKey(Meeting)
388390
order = models.SmallIntegerField()
389391
image = models.ImageField(storage=NoLocationMigrationFileSystemStorage(), upload_to=floorplan_path, blank=True, default=None)

ietf/meeting/resources.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ class Meta:
9494
filtering = {
9595
"id": ALL,
9696
"name": ALL,
97+
"time": ALL,
9798
"order": ALL,
9899
"image": ALL,
99100
"meeting": ALL_WITH_RELATIONS,
@@ -114,6 +115,7 @@ class Meta:
114115
filtering = {
115116
"id": ALL,
116117
"name": ALL,
118+
"time": ALL,
117119
"functional_name": ALL,
118120
"capacity": ALL,
119121
"meeting": ALL_WITH_RELATIONS,

ietf/meeting/tests_views.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import shutil
44
import datetime
55
import urlparse
6+
import random
67

78
import debug # pyflakes:ignore
89

@@ -1146,3 +1147,24 @@ def test_floor_plan_page(self):
11461147
r = self.client.get(url)
11471148
self.assertEqual(r.status_code, 200)
11481149

1150+
class IphoneAppJsonTests(TestCase):
1151+
def setUp(self):
1152+
pass
1153+
1154+
def tearDown(self):
1155+
pass
1156+
1157+
def test_iphone_app_json(self):
1158+
make_meeting_test_data()
1159+
meeting = Meeting.objects.filter(type_id='ietf').order_by('id').last()
1160+
floorplan = FloorPlanFactory.create(meeting=meeting)
1161+
for room in meeting.room_set.all():
1162+
room.floorplan = floorplan
1163+
room.x1 = random.randint(0,100)
1164+
room.y1 = random.randint(0,100)
1165+
room.x2 = random.randint(0,100)
1166+
room.y2 = random.randint(0,100)
1167+
room.save()
1168+
url = urlreverse('ietf.meeting.views.json_agenda',kwargs={'num':meeting.number})
1169+
r = self.client.get(url)
1170+
self.assertEqual(r.status_code,200)

ietf/meeting/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
url(r'^requests$', views.meeting_requests),
6060
url(r'^agenda/agenda.ics$', views.ical_agenda),
6161
url(r'^agenda.ics$', views.ical_agenda),
62+
url(r'^agenda.json$', views.json_agenda),
6263
url(r'^agenda/week-view(?:.html)?/?$', views.week_view),
6364
url(r'^agenda/room-view(?:.html)?/?$', views.room_view),
6465
url(r'^floor-plan/?$', views.floor_plan),

ietf/meeting/views.py

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import json
1212
import pytz
1313
from pyquery import PyQuery
14+
from wsgiref.handlers import format_date_time
15+
from time import mktime
1416

1517
import debug # pyflakes:ignore
1618

@@ -28,7 +30,7 @@
2830
from django.views.decorators.csrf import ensure_csrf_cookie
2931

3032
from ietf.doc.fields import SearchableDocumentsField
31-
from ietf.doc.models import Document, State, DocEvent
33+
from ietf.doc.models import Document, State, DocEvent, NewRevisionDocEvent
3234
from ietf.group.models import Group
3335
from ietf.group.utils import can_manage_materials
3436
from ietf.ietfauth.utils import role_required, has_role
@@ -892,6 +894,83 @@ def ical_agenda(request, num=None, name=None, ext=None):
892894
"updated": updated
893895
}, content_type="text/calendar")
894896

897+
def json_agenda(request, num=None ):
898+
meeting = get_meeting(num)
899+
900+
sessions = []
901+
room_names = set()
902+
parent_acronyms = set()
903+
for asgn in meeting.agenda.assignments.exclude(session__type__in=['lead','offagenda','break','reg']):
904+
sessdict = dict()
905+
sessdict['objtype'] = 'session'
906+
if asgn.session.group.type_id in ['wg','rg']:
907+
sessdict['group'] = asgn.session.group.acronym
908+
sessdict['parent'] = asgn.session.group.parent.acronym
909+
parent_acronyms.add(asgn.session.group.parent.acronym)
910+
if asgn.session.name:
911+
sessdict['name'] = asgn.session.name
912+
elif asgn.session.short:
913+
sessdict['name'] = asgn.session.short
914+
else:
915+
sessdict['name'] = asgn.session.group.name
916+
sessdict['start'] = str(asgn.timeslot.time)
917+
sessdict['duration'] = str(asgn.timeslot.duration)
918+
sessdict['location'] = asgn.room_name
919+
room_names.add(asgn.room_name)
920+
if asgn.session.agenda():
921+
sessdict['agenda'] = '/api/v1/doc/document/%s'%asgn.session.agenda().name
922+
if asgn.session.slides():
923+
sessdict['slides'] = []
924+
for slides in asgn.session.slides():
925+
sessdict['slides'].append('/api/v1/doc/document/%s'%slides.name)
926+
modified = asgn.session.modified
927+
for doc in asgn.session.materials.all():
928+
rev_docevent = doc.latest_event(NewRevisionDocEvent,'new_revision')
929+
modified = max(modified, (rev_docevent and rev_docevent.time) or modified)
930+
sessdict['modified'] = modified
931+
sessions.append(sessdict)
932+
933+
rooms = []
934+
for room in meeting.room_set.filter(name__in=room_names):
935+
roomdict = dict()
936+
roomdict['objtype'] = 'location'
937+
roomdict['name'] = room.name
938+
if room.floorplan:
939+
roomdict['level_name'] = room.floorplan.name
940+
roomdict['level_sort'] = room.floorplan.order
941+
if room.x1 is not None:
942+
roomdict['x'] = room.x1+(room.x2/2.0)
943+
roomdict['y'] = room.y1+(room.y2/2.0)
944+
roomdict['modified'] = room.time
945+
if room.floorplan and room.floorplan.image:
946+
roomdict['map'] = room.floorplan.image.url
947+
roomdict['modified'] = max(room.time,room.floorplan.time)
948+
rooms.append(roomdict)
949+
950+
parents = []
951+
for parent in Group.objects.filter(acronym__in=parent_acronyms):
952+
parentdict = dict()
953+
parentdict['objtype'] = 'parent'
954+
parentdict['name'] = parent.acronym
955+
parentdict['description'] = parent.name
956+
parentdict['modified'] = parent.time
957+
parents.append(parentdict)
958+
959+
meetinfo = []
960+
meetinfo.extend(sessions)
961+
meetinfo.extend(rooms)
962+
meetinfo.extend(parents)
963+
meetinfo.sort(key=lambda x: x['modified'],reverse=True)
964+
last_modified = meetinfo[0]['modified']
965+
for obj in meetinfo:
966+
obj['modified'] = obj['modified'].strftime('%Y-%m-%dT%H:%M:%S')
967+
968+
data = {"%s"%num: meetinfo}
969+
970+
response = HttpResponse(json.dumps(data, indent=2), content_type='application/json;charset=%s'%settings.DEFAULT_CHARSET)
971+
response['Last-Modified'] = format_date_time(mktime(last_modified.timetuple()))
972+
return response
973+
895974
def meeting_requests(request, num=None):
896975
meeting = get_meeting(num)
897976
sessions = Session.objects.filter(meeting__number=meeting.number, type__slug='session', group__parent__isnull = False).exclude(requested_by=0).order_by("group__parent__acronym","status__slug","group__acronym")

0 commit comments

Comments
 (0)