Provides a custom json view of meetings optimized for the iphone app. Commit ready for merge.

- Legacy-Id: 11756
This commit is contained in:
Robert Sparks 2016-08-04 19:51:52 +00:00
parent c3718c8e6c
commit c68ae7669e
7 changed files with 145 additions and 2 deletions

View file

@ -72,7 +72,7 @@ def agenda_permission_api(request, num, owner, name):
## ROOM API
#############################################################################
from django.forms.models import modelform_factory
AddRoomForm = modelform_factory(Room, exclude=('meeting',))
AddRoomForm = modelform_factory(Room, exclude=('meeting','time'))
# no authorization required
def timeslot_roomlist(request, mtg):

View file

@ -0,0 +1,37 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import datetime
def forward(apps,schema_editor):
Room = apps.get_model('meeting','Room')
FloorPlan = apps.get_model('meeting','FloorPlan')
for room in Room.objects.all():
room.time = room.meeting.date+datetime.timedelta(days=5)
room.save()
for plan in FloorPlan.objects.all():
plan.time = plan.meeting.date+datetime.timedelta(days=5)
plan.save()
class Migration(migrations.Migration):
dependencies = [
('meeting', '0028_add_audio_stream_data'),
]
operations = [
migrations.AddField(
model_name='floorplan',
name='time',
field=models.DateTimeField(default=datetime.datetime.now),
preserve_default=True,
),
migrations.AddField(
model_name='room',
name='time',
field=models.DateTimeField(default=datetime.datetime.now),
preserve_default=True,
),
migrations.RunPython(forward,None)
]

View file

@ -296,6 +296,7 @@ class ResourceAssociation(models.Model):
class Room(models.Model):
meeting = models.ForeignKey(Meeting)
time = models.DateTimeField(default=datetime.datetime.now)
name = models.CharField(max_length=255)
functional_name = models.CharField(max_length=255, blank = True)
capacity = models.IntegerField(null=True, blank=True)
@ -384,6 +385,7 @@ def floorplan_path(instance, filename):
class FloorPlan(models.Model):
name = models.CharField(max_length=255)
time = models.DateTimeField(default=datetime.datetime.now)
meeting = models.ForeignKey(Meeting)
order = models.SmallIntegerField()
image = models.ImageField(storage=NoLocationMigrationFileSystemStorage(), upload_to=floorplan_path, blank=True, default=None)

View file

@ -94,6 +94,7 @@ class FloorPlanResource(ModelResource):
filtering = {
"id": ALL,
"name": ALL,
"time": ALL,
"order": ALL,
"image": ALL,
"meeting": ALL_WITH_RELATIONS,
@ -114,6 +115,7 @@ class RoomResource(ModelResource):
filtering = {
"id": ALL,
"name": ALL,
"time": ALL,
"functional_name": ALL,
"capacity": ALL,
"meeting": ALL_WITH_RELATIONS,

View file

@ -3,6 +3,7 @@ import os
import shutil
import datetime
import urlparse
import random
import debug # pyflakes:ignore
@ -1146,3 +1147,24 @@ class FloorPlanTests(TestCase):
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
class IphoneAppJsonTests(TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_iphone_app_json(self):
make_meeting_test_data()
meeting = Meeting.objects.filter(type_id='ietf').order_by('id').last()
floorplan = FloorPlanFactory.create(meeting=meeting)
for room in meeting.room_set.all():
room.floorplan = floorplan
room.x1 = random.randint(0,100)
room.y1 = random.randint(0,100)
room.x2 = random.randint(0,100)
room.y2 = random.randint(0,100)
room.save()
url = urlreverse('ietf.meeting.views.json_agenda',kwargs={'num':meeting.number})
r = self.client.get(url)
self.assertEqual(r.status_code,200)

View file

@ -59,6 +59,7 @@ type_ietf_only_patterns_id_optional = [
url(r'^requests$', views.meeting_requests),
url(r'^agenda/agenda.ics$', views.ical_agenda),
url(r'^agenda.ics$', views.ical_agenda),
url(r'^agenda.json$', views.json_agenda),
url(r'^agenda/week-view(?:.html)?/?$', views.week_view),
url(r'^agenda/room-view(?:.html)?/?$', views.room_view),
url(r'^floor-plan/?$', views.floor_plan),

View file

@ -11,6 +11,8 @@ import csv
import json
import pytz
from pyquery import PyQuery
from wsgiref.handlers import format_date_time
from time import mktime
import debug # pyflakes:ignore
@ -28,7 +30,7 @@ from django.utils.functional import curry
from django.views.decorators.csrf import ensure_csrf_cookie
from ietf.doc.fields import SearchableDocumentsField
from ietf.doc.models import Document, State, DocEvent
from ietf.doc.models import Document, State, DocEvent, NewRevisionDocEvent
from ietf.group.models import Group
from ietf.group.utils import can_manage_materials
from ietf.ietfauth.utils import role_required, has_role
@ -892,6 +894,83 @@ def ical_agenda(request, num=None, name=None, ext=None):
"updated": updated
}, content_type="text/calendar")
def json_agenda(request, num=None ):
meeting = get_meeting(num)
sessions = []
room_names = set()
parent_acronyms = set()
for asgn in meeting.agenda.assignments.exclude(session__type__in=['lead','offagenda','break','reg']):
sessdict = dict()
sessdict['objtype'] = 'session'
if asgn.session.group.type_id in ['wg','rg']:
sessdict['group'] = asgn.session.group.acronym
sessdict['parent'] = asgn.session.group.parent.acronym
parent_acronyms.add(asgn.session.group.parent.acronym)
if asgn.session.name:
sessdict['name'] = asgn.session.name
elif asgn.session.short:
sessdict['name'] = asgn.session.short
else:
sessdict['name'] = asgn.session.group.name
sessdict['start'] = str(asgn.timeslot.time)
sessdict['duration'] = str(asgn.timeslot.duration)
sessdict['location'] = asgn.room_name
room_names.add(asgn.room_name)
if asgn.session.agenda():
sessdict['agenda'] = '/api/v1/doc/document/%s'%asgn.session.agenda().name
if asgn.session.slides():
sessdict['slides'] = []
for slides in asgn.session.slides():
sessdict['slides'].append('/api/v1/doc/document/%s'%slides.name)
modified = asgn.session.modified
for doc in asgn.session.materials.all():
rev_docevent = doc.latest_event(NewRevisionDocEvent,'new_revision')
modified = max(modified, (rev_docevent and rev_docevent.time) or modified)
sessdict['modified'] = modified
sessions.append(sessdict)
rooms = []
for room in meeting.room_set.filter(name__in=room_names):
roomdict = dict()
roomdict['objtype'] = 'location'
roomdict['name'] = room.name
if room.floorplan:
roomdict['level_name'] = room.floorplan.name
roomdict['level_sort'] = room.floorplan.order
if room.x1 is not None:
roomdict['x'] = room.x1+(room.x2/2.0)
roomdict['y'] = room.y1+(room.y2/2.0)
roomdict['modified'] = room.time
if room.floorplan and room.floorplan.image:
roomdict['map'] = room.floorplan.image.url
roomdict['modified'] = max(room.time,room.floorplan.time)
rooms.append(roomdict)
parents = []
for parent in Group.objects.filter(acronym__in=parent_acronyms):
parentdict = dict()
parentdict['objtype'] = 'parent'
parentdict['name'] = parent.acronym
parentdict['description'] = parent.name
parentdict['modified'] = parent.time
parents.append(parentdict)
meetinfo = []
meetinfo.extend(sessions)
meetinfo.extend(rooms)
meetinfo.extend(parents)
meetinfo.sort(key=lambda x: x['modified'],reverse=True)
last_modified = meetinfo[0]['modified']
for obj in meetinfo:
obj['modified'] = obj['modified'].strftime('%Y-%m-%dT%H:%M:%S')
data = {"%s"%num: meetinfo}
response = HttpResponse(json.dumps(data, indent=2), content_type='application/json;charset=%s'%settings.DEFAULT_CHARSET)
response['Last-Modified'] = format_date_time(mktime(last_modified.timetuple()))
return response
def meeting_requests(request, num=None):
meeting = get_meeting(num)
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")