diff options
author | Leif Johansson <leifj@sunet.se> | 2013-04-15 15:29:16 +0200 |
---|---|---|
committer | Leif Johansson <leifj@sunet.se> | 2013-04-15 15:29:16 +0200 |
commit | 36e6ff9cbc9237f230a332c2ba3c4d951417b265 (patch) | |
tree | 28729006477af21ebb9c8e647ff2179f1d0b3ee3 | |
parent | 69dcc3b90e13a1826c632a5a2c1f552e6d9ab20c (diff) |
make permissions updates non-critical
-rw-r--r-- | meetingtools/apps/room/views.py | 460 |
1 files changed, 252 insertions, 208 deletions
diff --git a/meetingtools/apps/room/views.py b/meetingtools/apps/room/views.py index c809113..b7fdb96 100644 --- a/meetingtools/apps/room/views.py +++ b/meetingtools/apps/room/views.py @@ -7,7 +7,7 @@ from celery.utils import deprecated from meetingtools.apps.sco.models import get_sco, get_sco_shortcuts from meetingtools.apps.room.models import Room from meetingtools.multiresponse import respond_to, redirect_to, json_response -from meetingtools.apps.room.forms import DeleteRoomForm,\ +from meetingtools.apps.room.forms import DeleteRoomForm, \ CreateRoomForm, ModifyRoomForm, TagRoomForm from django.shortcuts import get_object_or_404 from meetingtools.ac import ac_api_client @@ -34,34 +34,41 @@ from celery.execute import send_task from meetingtools.apps.room.tasks import start_user_counts_poll -def _user_meeting_folder(request,acc): - if not session(request,'my_meetings_sco_id'): +def _user_meeting_folder(request, acc): + if not session(request, 'my_meetings_sco_id'): with ac_api_client(acc) as api: userid = request.user.username - folders = api.request('sco-search-by-field',{'filter-type': 'folder','field':'name','query':userid}).et.xpath('//sco[folder-name="User Meetings"]') - logging.debug("user meetings folder: "+pformat(folders)) + folders = api.request('sco-search-by-field', + {'filter-type': 'folder', 'field': 'name', 'query': userid}).et.xpath( + '//sco[folder-name="User Meetings"]') + logging.debug("user meetings folder: " + pformat(folders)) #folder = next((f for f in folders if f.findtext('.//folder-name') == 'User Meetings'), None) if folders and len(folders) > 0: - session(request,'my_meetings_sco_id',folders[0].get('sco-id')) - - return session(request,'my_meetings_sco_id') + session(request, 'my_meetings_sco_id', folders[0].get('sco-id')) -def _user_templates(request,acc,folder_sco): + return session(request, 'my_meetings_sco_id') + + +def _user_templates(request, acc, folder_sco): templates = [] with ac_api_client(acc) as api: if folder_sco: - my_templates = api.request('sco-contents',{'sco-id': folder_sco.sco_id,'filter-type': 'folder'}).et.xpath('.//sco[folder-name="My Templates"][0]') + my_templates = api.request('sco-contents', {'sco-id': folder_sco.sco_id, 'filter-type': 'folder'}).et.xpath( + './/sco[folder-name="My Templates"][0]') if my_templates and len(my_templates) > 0: my_templates_sco_id = my_templates[0].get('sco_id') - meetings = api.request('sco-contents',{'sco-id': my_templates_sco_id,'filter-type': 'meeting'}) + meetings = api.request('sco-contents', {'sco-id': my_templates_sco_id, 'filter-type': 'meeting'}) if meetings: - templates += [(get_sco(acc,r.get('sco-id')),r.findtext('name')) for r in meetings.et.findall('.//sco')] - - shared_templates_sco = get_sco_shortcuts(acc,'shared-meeting-templates') - shared_templates = api.request('sco-contents',{'sco-id': shared_templates_sco.sco_id,'filter-type': 'meeting'}) + templates += [(get_sco(acc, r.get('sco-id')), r.findtext('name')) for r in + meetings.et.findall('.//sco')] + + shared_templates_sco = get_sco_shortcuts(acc, 'shared-meeting-templates') + shared_templates = api.request('sco-contents', + {'sco-id': shared_templates_sco.sco_id, 'filter-type': 'meeting'}) if shared_templates: - templates += [(get_sco(acc,r.get('sco-id')).id,r.findtext('name')) for r in shared_templates.et.findall('.//sco')] - + templates += [(get_sco(acc, r.get('sco-id')).id, r.findtext('name')) for r in + shared_templates.et.findall('.//sco')] + return templates @@ -73,6 +80,7 @@ def _find_current_session(session_info): return r return None + def _nusers(session_info): cur = _find_current_session(session_info) if cur is not None: @@ -80,51 +88,56 @@ def _nusers(session_info): else: return 0 + @login_required -def view(request,id): - room = get_object_or_404(Room,pk=id) +def view(request, id): + room = get_object_or_404(Room, pk=id) return respond_to(request, - {'text/html':'apps/room/list.html'}, - {'user':request.user, - 'rooms':[room], + {'text/html': 'apps/room/list.html'}, + {'user': request.user, + 'rooms': [room], 'title': room.name, 'baseurl': base_url(request), 'active': True, - }) + }) -def _init_update_form(request,form,acc,folder_sco): +def _init_update_form(request, form, acc, folder_sco): if form.fields.has_key('urlpath'): url = base_url(request) form.fields['urlpath'].widget.prefix = url if form.fields.has_key('source_sco'): - form.fields['source_sco'].widget.choices = [('','-- select template --')]+[r for r in _user_templates(request,acc,folder_sco)] + form.fields['source_sco'].widget.choices = [('', '-- select template --')] + [r for r in + _user_templates(request, acc, + folder_sco)] def _update_room(request, room, data=dict(), acc=None): - params = {'type':'meeting'} + params = {'type': 'meeting'} if acc is None: acc = acc_for_user(request.user) - for attr,param in (('sco','sco-id'),('folder_sco','folder-id'),('source_sco','source-sco-id'),('urlpath','url-path'),('name','name'),('description','description')): + for attr, param in ( + ('sco', 'sco-id'), ('folder_sco', 'folder-id'), ('source_sco', 'source-sco-id'), ('urlpath', 'url-path'), +('name', 'name'), ('description', 'description')): v = None - if hasattr(room,attr): - v = getattr(room,attr) - logging.debug("%s,%s = %s" % (attr,param,repr(v))) + if hasattr(room, attr): + v = getattr(room, attr) + logging.debug("%s,%s = %s" % (attr, param, repr(v))) if data.has_key(attr) and data[attr]: v = data[attr] - + if v: - if isinstance(v,(str,unicode)): + if isinstance(v, (str, unicode)): params[param] = v - elif hasattr(v,'sco_id'): + elif hasattr(v, 'sco_id'): params[param] = v.sco_id # support ACObject instances - elif hasattr(v,'__getitem__'): + elif hasattr(v, '__getitem__'): params[param] = v[0] else: params[param] = repr(v) - + logging.debug(pformat(params)) with ac_api_client(acc) as api: r = api.request('sco-update', params, True) @@ -132,32 +145,32 @@ def _update_room(request, room, data=dict(), acc=None): if sco_elt: sco_id = sco_elt.get('sco-id') if sco_id: - data['sco'] = get_sco(acc,sco_id) + data['sco'] = get_sco(acc, sco_id) source_sco_id = r.et.find(".//sco").get('sco-source-id') if source_sco_id: - data['source_sco'] = get_sco(acc,source_sco_id) + data['source_sco'] = get_sco(acc, source_sco_id) room.sco = data['sco'] room.save() sco_id = room.sco.sco_id - assert(sco_id is not None and sco_id > 0) + assert (sco_id is not None and sco_id > 0) user_principal = api.find_user(room.creator.username) #api.request('permissions-reset',{'acl-id': sco_id},True) - api.request('permissions-update',{'acl-id': sco_id, - 'principal-id': user_principal.get('principal-id'), - 'permission-id':'host'},True) # owner is always host + api.request('permissions-update', {'acl-id': sco_id, + 'principal-id': user_principal.get('principal-id'), + 'permission-id': 'host'}, False) # owner is always host if data.has_key('access'): access = data['access'] if access == 'public': - allow(room,'anyone','view-hidden') + allow(room, 'anyone', 'view-hidden') elif access == 'private': - allow(room,'anyone','remove') - + allow(room, 'anyone', 'remove') + # XXX figure out how to keep the room permissions in sync with the AC permissions for ace in acl(room): principal_id = None @@ -171,28 +184,31 @@ def _update_room(request, room, data=dict(), acc=None): principal_id = principal.get('principal-id') else: principal_id = "public-access" - - if principal_id: - api.request('permissions-update',{'acl-id': room.sco_id, 'principal-id': principal_id, 'permission-id': ace.permission},True) - + + if principal_id: + api.request('permissions-update', + {'acl-id': room.sco_id, 'principal-id': principal_id, 'permission-id': ace.permission}, + False) + room.deleted_sco = None # if we just cleaned a room we zero out the deleted_sco_id field to indicate the room is now ready for use room.save() # a second save here to avoid races return room + @never_cache @login_required def create(request): acc = acc_for_user(request.user) - my_meetings_sco = get_sco(acc,_user_meeting_folder(request,acc)) + my_meetings_sco = get_sco(acc, _user_meeting_folder(request, acc)) template_sco_id = acc.default_template_sco_id if not template_sco_id: template_sco_id = settings.DEFAULT_TEMPLATE_SCO - room = Room(creator=request.user,folder_sco=my_meetings_sco,source_sco=get_sco(acc,template_sco_id)) + room = Room(creator=request.user, folder_sco=my_meetings_sco, source_sco=get_sco(acc, template_sco_id)) what = "Create" title = "Create a new room" - + if request.method == 'POST': - form = CreateRoomForm(request.POST,instance=room) + form = CreateRoomForm(request.POST, instance=room) _init_update_form(request, form, acc, my_meetings_sco) if form.is_valid(): _update_room(request, room, form.cleaned_data) @@ -201,26 +217,27 @@ def create(request): else: form = CreateRoomForm(instance=room) _init_update_form(request, form, acc, my_meetings_sco) - - return respond_to(request,{'text/html':'apps/room/create.html'}, - {'form':form, - 'formtitle': title, - 'cancelurl': '/rooms', - 'cancelname':'Cancel', - 'submitname':'%s Room' % what}) + + return respond_to(request, {'text/html': 'apps/room/create.html'}, + {'form': form, + 'formtitle': title, + 'cancelurl': '/rooms', + 'cancelname': 'Cancel', + 'submitname': '%s Room' % what}) + @never_cache @login_required def myroom(request): acc = acc_for_user(request.user) - my_meetings_sco = get_sco(acc,_user_meeting_folder(request,acc)) + my_meetings_sco = get_sco(acc, _user_meeting_folder(request, acc)) template_sco_id = acc.default_template_sco_id if not template_sco_id: template_sco_id = settings.DEFAULT_TEMPLATE_SCO - template_sco = get_sco(acc,template_sco_id) + template_sco = get_sco(acc, template_sco_id) room = None try: - room = Room.by_name(acc,name=request.user.username) + room = Room.by_name(acc, name=request.user.username) except MultipleObjectsReturned: raise ValueError("Oops - there seem to be multiple rooms with name '%s'" % request.user.username) except ObjectDoesNotExist: @@ -228,23 +245,24 @@ def myroom(request): folder_sco=my_meetings_sco, name=request.user.username, source_sco=template_sco) - _update_room(request,room,dict(access='public')) + _update_room(request, room, dict(access='public')) if not room: raise ValueError("Opps - can't find your room") - return _goto(request,room) + return _goto(request, room) + @never_cache @login_required -def update(request,id): - room = get_object_or_404(Room,pk=id) +def update(request, id): + room = get_object_or_404(Room, pk=id) acc = room.sco.acc what = "Update" title = "Modify %s" % room.name - + if request.method == 'POST': - form = ModifyRoomForm(request.POST,instance=room) + form = ModifyRoomForm(request.POST, instance=room) _init_update_form(request, form, acc, room.folder_sco) if form.is_valid(): _update_room(request, room, form.cleaned_data) @@ -253,38 +271,39 @@ def update(request,id): else: form = ModifyRoomForm(instance=room) _init_update_form(request, form, acc, room.folder_sco) - - return respond_to(request,{'text/html':'apps/room/update.html'}, - {'form':form, - 'formtitle': title, - 'cancelurl': '/rooms#%d' % room.id, - 'cancelname': 'Cancel', - 'submitname':'%s Room' % what}) + + return respond_to(request, {'text/html': 'apps/room/update.html'}, + {'form': form, + 'formtitle': title, + 'cancelurl': '/rooms#%d' % room.id, + 'cancelname': 'Cancel', + 'submitname': '%s Room' % what}) + @deprecated -def _import_room(request,acc,r): +def _import_room(request, acc, r): modified = False room = None - + if room and (abs(room.lastupdate() - time.time()) < settings.IMPORT_TTL): return room - + if r.has_key('urlpath'): r['urlpath'] = r['urlpath'].strip('/') - + try: room = Room.by_sco(r['sco']) - for key in ('sco','name','source_sco','urlpath','description','user_count','host_count'): - if r.has_key(key) and hasattr(room,key): - rv = getattr(room,key) + for key in ('sco', 'name', 'source_sco', 'urlpath', 'description', 'user_count', 'host_count'): + if r.has_key(key) and hasattr(room, key): + rv = getattr(room, key) if rv != r[key] and r[key] is not None and r[key]: - setattr(room,key,r[key]) + setattr(room, key, r[key]) modified = True - + if modified: logging.debug("+++ saving room ... %s" % pformat(room)) room.save() - + except ObjectDoesNotExist: if r['folder_sco']: try: @@ -295,118 +314,131 @@ def _import_room(request,acc,r): description=r['description'], creator=request.user, folder_sco=r['folder_sco']) - except Exception,e: + except Exception, e: room = None pass - + if not room: return None - + logging.debug("+++ looking at user counts") with ac_api_client(acc) as api: - userlist = api.request('meeting-usermanager-user-list',{'sco-id': room.sco.sco_id},False) + userlist = api.request('meeting-usermanager-user-list', {'sco-id': room.sco.sco_id}, False) if userlist.status_code() == 'ok': room.user_count = int(userlist.et.xpath("count(.//userdetails)")) room.host_count = int(userlist.et.xpath("count(.//userdetails/role[text() = 'host'])")) room.save() - + return room + @login_required -def list_rooms(request,username=None): +def list_rooms(request, username=None): user = request.user if username: try: user = User.objects.get(username=username) except ObjectDoesNotExist: user = None - + rooms = [] if user: - rooms = Room.objects.filter(creator=user).order_by('name').all().prefetch_related("creator","sco","folder_sco","source_sco","deleted_sco") - + rooms = Room.objects.filter(creator=user).order_by('name').all().prefetch_related("creator", "sco", + "folder_sco", "source_sco", + "deleted_sco") + return respond_to(request, - {'text/html':'apps/room/list.html'}, - {'title':'Your Rooms','edit':True,'active':len(rooms) == 1,'rooms':rooms}) + {'text/html': 'apps/room/list.html'}, + {'title': 'Your Rooms', 'edit': True, 'active': len(rooms) == 1, 'rooms': rooms}) + @login_required -def unlock(request,id): - room = get_object_or_404(Room,pk=id) +def unlock(request, id): + room = get_object_or_404(Room, pk=id) room.unlock() return redirect_to("/rooms#%d" % room.id) + @login_required -def delete(request,id): - room = get_object_or_404(Room,pk=id) +def delete(request, id): + room = get_object_or_404(Room, pk=id) if request.method == 'POST': form = DeleteRoomForm(request.POST) if form.is_valid(): with ac_api_client(room.sco.acc) as api: - api.request('sco-delete',{'sco-id':room.sco.sco_id},raise_error=False) - #clear_acl(room) - #room.sco.delete() - #if room.folder_sco is not None: + api.request('sco-delete', {'sco-id': room.sco.sco_id}, raise_error=False) + #clear_acl(room) + #room.sco.delete() + #if room.folder_sco is not None: #room.folder_sco.delete() - #if room.deleted_sco is not None: + #if room.deleted_sco is not None: #room.deleted_sco.delete() room.delete() return redirect_to("/rooms") else: form = DeleteRoomForm() - - return respond_to(request,{'text/html':'edit.html'}, - {'form':form, - 'formtitle': 'Delete %s' % room.name, - 'cancelurl': '/rooms', - 'cancelname':'Cancel', - 'submitname':'Delete Room'}) - -def _clean(request,room): + + return respond_to(request, {'text/html': 'edit.html'}, + {'form': form, + 'formtitle': 'Delete %s' % room.name, + 'cancelurl': '/rooms', + 'cancelname': 'Cancel', + 'submitname': 'Delete Room'}) + + +def _clean(request, room): with ac_api_client(room.sco.acc) as api: room.deleted_sco = room.sco room.save() - api.request('sco-delete',{'sco-id':room.sco.sco_id},raise_error=False) + api.request('sco-delete', {'sco-id': room.sco.sco_id}, raise_error=False) room.sco = None return _update_room(request, room) -def occupation(request,rid): - room = get_object_or_404(Room,pk=rid) + +def occupation(request, rid): + room = get_object_or_404(Room, pk=rid) with ac_api_client(room.sco.acc) as api: api.poll_user_counts(room) - d = {'nusers': room.user_count, 'nhosts': room.host_count} + d = {'nusers': room.user_count, 'nhosts': room.host_count} return respond_to(request, {'text/html': 'apps/room/fragments/occupation.txt', 'application/json': json_response(d, request)}, d) -def go_by_id(request,id): - room = get_object_or_404(Room,pk=id) - return goto(request,room) -def go_by_path(request,path): +def go_by_id(request, id): + room = get_object_or_404(Room, pk=id) + return goto(request, room) + + +def go_by_path(request, path): rooms = Room.objects.filter(urlpath=path) if len(rooms) == 1: - return goto(request,rooms[0]) + return goto(request, rooms[0]) if len(rooms) == 0: return HttpResponseNotFound() return respond_to(request, - {'text/html': 'apps/room/choose.html', - 'application/json': json_response([base_url(request,room.go_url()) for room in rooms])}, - {'rooms': rooms}) + {'text/html': 'apps/room/choose.html', + 'application/json': json_response([base_url(request, room.go_url()) for room in rooms])}, + {'rooms': rooms}) + @login_required -def promote_and_launch(request,rid): - room = get_object_or_404(Room,pk=rid) - return _goto(request,room,clean=False,promote=True) +def promote_and_launch(request, rid): + room = get_object_or_404(Room, pk=rid) + return _goto(request, room, clean=False, promote=True) + + +def launch(request, rid): + room = get_object_or_404(Room, pk=rid) + return _goto(request, room, clean=False) + + +def goto(request, room): + return _goto(request, room, clean=True) -def launch(request,rid): - room = get_object_or_404(Room,pk=rid) - return _goto(request,room,clean=False) - -def goto(request,room): - return _goto(request,room,clean=True) def _random_key(length=20): rg = random.SystemRandom() @@ -414,15 +446,14 @@ def _random_key(length=20): return str().join(rg.choice(alphabet) for _ in range(length)) - -def _goto(request,room,clean=True,promote=False): +def _goto(request, room, clean=True, promote=False): if room.is_locked(): return respond_to(request, {"text/html": "apps/room/retry.html"}, {'room': room, 'wait': 10}) - + now = time.time() lastvisit = room.lastvisit() room.lastvisited = datetime.now() - + with ac_api_client(room.sco.acc) as api: api.poll_user_counts(room) if clean: @@ -431,142 +462,155 @@ def _goto(request,room,clean=True,promote=False): if (room.user_count == 0) and (abs(lastvisit - now) > settings.GRACE): room.lock("Locked for cleaning") try: - room = _clean(request,room) + room = _clean(request, room) finally: room.unlock() - + if room.host_count == 0 and room.allow_host: return respond_to(request, {"text/html": "apps/room/launch.html"}, {'room': room}) else: room.save() - + key = None if request.user.is_authenticated() and room.sco.acc.cross_domain_sso: key = _random_key(20) user_principal = api.find_user(request.user.username) - principal_id = user_principal.get('principal-id') + principal_id = user_principal.get('principal-id') with ac_api_client(room.sco.acc) as api: - api.request("user-update-pwd",{"user-id": principal_id, 'password': key,'password-verify': key},True) + api.request("user-update-pwd", {"user-id": principal_id, 'password': key, 'password-verify': key}, True) if promote and room.self_cleaning: if user_principal: - api.request('permissions-update',{'acl-id': room.sco.sco_id,'principal-id': user_principal.get('principal-id'),'permission-id':'host'},True) - - r = api.request('sco-info',{'sco-id':room.sco.sco_id},True) + api.request('permissions-update', + {'acl-id': room.sco.sco_id, 'principal-id': user_principal.get('principal-id'), + 'permission-id': 'host'}, True) + + r = api.request('sco-info', {'sco-id': room.sco.sco_id}, True) urlpath = r.et.findtext('.//sco/url-path') - start_user_counts_poll(room,10) + start_user_counts_poll(room, 10) if key: try: user_client = ACPClient(room.sco.acc.api_url, request.user.username, key, cache=False) - return user_client.redirect_to(room.sco.acc.url+urlpath) - except Exception,e: + return user_client.redirect_to(room.sco.acc.url + urlpath) + except Exception, e: pass - return HttpResponseRedirect(room.sco.acc.url+urlpath) - + return HttpResponseRedirect(room.sco.acc.url + urlpath) + ## Tagging -def _room2dict(request,room): - return {'name':room.name, - 'description':room.description, - 'user_count':room.nusers(), - 'host_count':room.nhosts(), +def _room2dict(request, room): + return {'name': room.name, + 'description': room.description, + 'user_count': room.nusers(), + 'host_count': room.nhosts(), 'updated': rfc3339_date(room.lastupdated), 'self_cleaning': room.self_cleaning, - 'url': base_url(request,room.go_url())} + 'url': base_url(request, room.go_url())} # should not require login -def list_by_tag(request,tn): +def list_by_tag(request, tn): tags = tn.split('+') - rooms = TaggedItem.objects.get_by_model(Room, tags).order_by('name').all().prefetch_related("creator","sco","folder_sco","source_sco","deleted_sco") + rooms = TaggedItem.objects.get_by_model(Room, tags).order_by('name').all().prefetch_related("creator", "sco", + "folder_sco", + "source_sco", + "deleted_sco") title = 'Rooms tagged with %s' % " and ".join(tags) return respond_to(request, - {'text/html':'apps/room/list.html', - 'application/json': json_response([_room2dict(request,room) for room in rooms],request)}, - {'title':title, - 'description':title , - 'edit':False, - 'active':len(rooms) == 1, + {'text/html': 'apps/room/list.html', + 'application/json': json_response([_room2dict(request, room) for room in rooms], request)}, + {'title': title, + 'description': title, + 'edit': False, + 'active': len(rooms) == 1, 'baseurl': base_url(request), 'tagstring': tn, - 'rooms':rooms}) + 'rooms': rooms}) + - -def widget(request,tags=None): +def widget(request, tags=None): title = 'Meetingtools jQuery widget' - return respond_to(request,{'text/html':'apps/room/widget.html'},{'title': title,'tags':tags}) - -def _can_tag(request,tag): - if tag in ('selfcleaning','cleaning','public','private'): - return False,"'%s' is reserved" % tag - # XXX implement access model for tags here soon - return True,"" + return respond_to(request, {'text/html': 'apps/room/widget.html'}, {'title': title, 'tags': tags}) + + +def _can_tag(request, tag): + if tag in ('selfcleaning', 'cleaning', 'public', 'private'): + return False, "'%s' is reserved" % tag + # XXX implement access model for tags here soon + return True, "" + @never_cache @login_required -def untag(request,rid,tag): - room = get_object_or_404(Room,pk=rid) +def untag(request, rid, tag): + room = get_object_or_404(Room, pk=rid) new_tags = [] for t in Tag.objects.get_for_object(room): if t.name != tag: new_tags.append(t.name) - + Tag.objects.update_tags(room, ' '.join(new_tags)) - return redirect_to("/room/%d/tag" % room.id) - + return redirect_to("/room/%d/tag" % room.id) + + @never_cache -@login_required -def tag(request,rid): - room = get_object_or_404(Room,pk=rid) +@login_required +def tag(request, rid): + room = get_object_or_404(Room, pk=rid) if request.method == 'POST': form = TagRoomForm(request.POST) if form.is_valid(): - for tag in re.split('[,\s]+',form.cleaned_data['tag']): + for tag in re.split('[,\s]+', form.cleaned_data['tag']): tag = tag.strip() - ok,reason = _can_tag(request,tag) + ok, reason = _can_tag(request, tag) if ok: Tag.objects.add_tag(room, tag) else: form._errors['tag'] = form.error_class([u'%s ... please choose another tag!' % reason]) else: form = TagRoomForm() - + tags = Tag.objects.get_for_object(room) tn = "+".join([t.name for t in tags]) - return respond_to(request, - {'text/html': "apps/room/tag.html"}, + return respond_to(request, + {'text/html': "apps/room/tag.html"}, {'form': form, 'formtitle': 'Add Tag', 'cancelurl': '/rooms#%d' % room.id, - 'cancelname':'Done', + 'cancelname': 'Done', 'submitname': 'Add Tag', 'room': room, 'tagstring': tn, 'tags': tags}) -def room_recordings(request,room): + +def room_recordings(request, room): acc = room.sco.acc with ac_api_client(acc) as api: - r = api.request('sco-expanded-contents',{'sco-id': room.sco.sco_id,'filter-icon':'archive'},True) + r = api.request('sco-expanded-contents', {'sco-id': room.sco.sco_id, 'filter-icon': 'archive'}, True) return [{'published': False, 'name': sco_elt.findtext('name'), - 'sco': get_sco(acc,sco_elt.get('sco-id')), + 'sco': get_sco(acc, sco_elt.get('sco-id')), 'url': room.sco.acc.make_url(sco_elt.findtext('url-path')), 'dl': room.sco.acc.make_dl_url(sco_elt.findtext('url-path')), - 'description': sco_elt.findtext('description'), + 'description': sco_elt.findtext('description'), 'date_created': iso8601.parse_date(sco_elt.findtext('date-created')), - 'date_modified': iso8601.parse_date(sco_elt.findtext('date-modified'))} for sco_elt in r.et.findall(".//sco")] + [ - {'published': True, - 'ar': ar, - 'name': ar.name, - 'description': ar.description, - 'sco': ar.sco, - 'url': room.sco.acc.make_url(ar.urlpath), - 'dl': room.sco.acc.make_url(ar.urlpath), - 'date_created': ar.timecreated, - 'date_modified': ar.lastupdated} for ar in room.archives.all().prefetch_related("creator","sco","folder_sco","source_sco","deleted_sco") - ] + 'date_modified': iso8601.parse_date(sco_elt.findtext('date-modified'))} for sco_elt in + r.et.findall(".//sco")] + [ + {'published': True, + 'ar': ar, + 'name': ar.name, + 'description': ar.description, + 'sco': ar.sco, + 'url': room.sco.acc.make_url(ar.urlpath), + 'dl': room.sco.acc.make_url(ar.urlpath), + 'date_created': ar.timecreated, + 'date_modified': ar.lastupdated} for ar in + room.archives.all().prefetch_related("creator", "sco", "folder_sco", "source_sco", "deleted_sco") + ] + + @login_required -def recordings(request,rid): - room = get_object_or_404(Room,pk=rid) +def recordings(request, rid): + room = get_object_or_404(Room, pk=rid) return respond_to(request, {'text/html': 'apps/room/recordings.html'}, - {'recordings': room_recordings(request,room),'room':room})
\ No newline at end of file + {'recordings': room_recordings(request, room), 'room': room})
\ No newline at end of file |