Provides a custom json view of meetings optimized for the iphone app. Commit ready for merge.
- Legacy-Id: 11756
This commit is contained in:
parent
c3718c8e6c
commit
c68ae7669e
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
]
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Reference in a new issue