def add_relation(request): feature1 = request.GET.get("feature1", None) feature2 = request.GET.get("feature2", None) relation = request.GET.get("relation", None) if feature1 == None or feature2 == None or relation == None: return render_to_json_response({"error": "bad request"}) if not request.user.is_staff: return render_to_json_response( {"error": "insufficient permissions error. try logging in again? are you staff / admin?"} ) feature1 = get_object_or_404_json(Feature, pk=feature1) feature2 = get_object_or_404_json(Feature, pk=feature2) verb = rel_obj = None try: rel_obj = Relationship.objects.get(feature1=feature1, feature2=feature2) verb = "deleted" except ObjectDoesNotExist: rel_obj = Relationship(feature1=feature1, feature2=feature2, relationship_type=relation) verb = "created" if relation == "": if verb == "deleted": rel_obj.delete() if relation == "conflates": feature2.is_primary = True feature2.save() else: return render_to_json_response({"error": "relation is already deleted"}) else: rel_obj.save() if relation == "conflates": feature2.is_primary = False feature2.save() return render_to_json_response({"success": "relation %s successfully." % verb})
def stop(request, slug): srid = int(request.GET.get("srid", 4326)) if request.POST and request.POST.has_key('geojson'): if not request.user.is_staff: return render_to_json_response({'errors': 'No permission'}) if not slug: stop = Stop() #FIXME: should this return an error instead? else: stop = get_object_or_404_json(Stop, slug=slug) geojson = json.loads(request.POST['geojson']) return render_to_json_response(stop.from_geojson(geojson, srid)) else: stop = get_object_or_404_json(Stop, slug=slug) return render_to_json_response(stop.get_geojson(srid=srid)) #FIXME: please don't repeat this code, its retarded.
def get_list_or_404_json(id): id = id.split(':') username = id[0] listname = ":".join(id[1:]) return get_object_or_404_json(models.List, user__username=username, name=listname)
def get_text_or_404_json(id): id = id.split(':') username = id[0] name = ":".join(id[1:]) return get_object_or_404_json(models.Text, user__username=username, name=name)
def editNews(request): ''' takes { id: string, title: string, text: string, date: string } returns { id: string ... } ''' response = json_response({}) data = json.loads(request.POST['data']) n = get_object_or_404_json(models.News, id=ox.fromAZ(data['id'])) if n.editable(request.user): for key in ('title', 'text', 'date'): if key in data: setattr(n, key, data[key]) n.save() response['data'] = n.json() else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def setPoster(request): ''' takes { id: string, source: string // url } returns { poster: { url: string, width: int, height: int } } ''' data = json.loads(request.POST['data']) item = get_object_or_404_json(models.Item, itemId=data['id']) response = json_response() if item.editable(request.user): valid_sources = [p['source'] for p in item.get_posters()] if data['source'] in valid_sources: item.poster_source = data['source'] if item.poster: item.poster.delete() item.save() tasks.update_poster(item.itemId) response = json_response() response['data']['posterAspect'] = item.poster_width/item.poster_height else: response = json_response(status=403, text='invalid poster url') else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def getNews(request): ''' takes { id: string } returns { id: string, ... } if not id is passed, return all news items takes {} returns { items: [object] } ''' data = json.loads(request.POST['data']) response = json_response() if 'id' in data: news = get_object_or_404_json(models.News, id=ox.fromAZ(data['id'])) response['data'] = news.json() else: qs = models.News.objects.all().order_by('-date') response['data']['items'] = [p.json() for p in qs] return render_to_json_response(response)
def addAnnotations(request): ''' takes { item: itemId, layer: layerId, annotations: [{ in: float, out: float, value: string }, ...] } returns { taskId: string } ''' data = json.loads(request.POST['data']) for key in ('item', 'layer', 'annotations'): if key not in data: return render_to_json_response(json_response(status=400, text='invalid data')) item = get_object_or_404_json(Item, itemId=data['item']) layer_id = data['layer'] layer = filter(lambda l: l['id'] == layer_id, settings.CONFIG['layers'])[0] if item.editable(request.user) \ and layer['canAddAnnotations'].get(request.user.get_profile().get_level()): response = json_response() data['user'] = request.user.username t = add_annotations.delay(data) response['data']['taskId'] = t.task_id else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def editAnnotation(request): ''' takes { id:, in: float, out: float, value: string, } returns { id: ... } ''' response = json_response({}) data = json.loads(request.POST['data']) a = get_object_or_404_json(models.Annotation, public_id=data['id']) if a.editable(request.user): a.log() for key in ('value', 'in', 'out'): if key in data: setattr(a, { 'in': 'start', 'out': 'end' }.get(key,key), data[key]) a.save() #update sort/find tables async update_item.delay(a.id) response['data'] = a.json() response['data']['editable'] = True else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def search_related_json(request, id): # id = request.GET.get("id", "0") id = str(id) feature = get_object_or_404_json(Feature, pk=id) similar_features = feature.similar_features() d = [] for s in similar_features: time_frame = relates_to = related_by = "" if s.time_frame is not None: time_frame = s.time_frame.description if s.relationship_type is not None: if s.feature2_id == s.id: relates_to = s.relationship_type elif s.feature1_id == s.id: related_by = s.relationship_type d.append( { "id": s.id, "feature_type": s.feature_type.name, # FeatureType.objects.get(pk=s.feature_type_id).name, "preferred_name": s.preferred_name, "similarity": s.similarity, "distance": s.distance, "time_frame": time_frame, "is_primary": s.is_primary, "relates_to": relates_to, "related_by": related_by, } ) return render_to_json_response(d)
def remove(request): ''' remove item with id, return status is 200/removed on sucess or 403/permission deinied. takes { id: string } returns { } ''' response = json_response({}) data = json.loads(request.POST['data']) item = get_object_or_404_json(models.Item, itemId=data['id']) user = request.user if user.get_profile().capability('canRemoveItems') == True or \ user.is_staff or \ item.user == user or \ item.groups.filter(id__in=user.groups.all()).count() > 0: item.log() #FIXME: is this cascading enough or do we end up with orphan files etc. item.delete() response = json_response(status=200, text='removed') else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def time_frame_json(request): id = request.GET.get("id", "0") time_frame = get_object_or_404_json(AuthorityRecord, pk=id) features = [f.get_geojson() for f in time_frame.feature_set.all()] d = { 'type': 'FeatureCollection', 'features': features } return render_to_json_response(d)
def area(request, slug): srid = int(request.GET.get("srid", 4326)) area = get_object_or_404_json(Area, slug=slug) stops = [stop.get_geojson(srid=srid) for stop in Stop.objects.filter(area=area)] return render_to_json_response({ 'area': area.get_dict(), 'stops': { 'type': 'FeatureCollection', 'features': stops } })
def editMedia(request): ''' change file / item link takes { files: [ {id:, key1: value1, key2: value2} ... ] } possible keys: part, partTitle, language, ignore, extension, version, episodes returns { } ''' data = json.loads(request.POST['data']) ignore = [] dont_ignore = [] response = json_response(status=200, text='updated') response['data']['files'] = [] for info in data['files']: f = get_object_or_404_json(models.File, oshash=info['id']) if f.editable(request.user): if 'ignore' in info: if info['ignore']: ignore.append(info['id']) else: dont_ignore.append(info['id']) update = False for key in f.PATH_INFO: if key in info: f.info[key] = info[key] update = True if update: f.save() response['data']['files'].append(f.json()) else: response['data']['files'].append({ 'id': info['id'], 'error': 'permission denied' }) if ignore: models.Instance.objects.filter(file__oshash__in=ignore).update( ignore=True) if dont_ignore: models.Instance.objects.filter(file__oshash__in=dont_ignore).update( ignore=False) if ignore or dont_ignore: files = models.File.objects.filter(oshash__in=ignore + dont_ignore) #FIXME: is this to slow to run sync? for i in Item.objects.filter(files__in=files).distinct(): i.update_selected() i.update_wanted() return render_to_json_response(response)
def route(request, code): srid = int(request.GET.get("srid", 4326)) route = get_object_or_404_json(Route, code=code) stops = [r.stop.get_geojson(srid=srid) for r in RouteDetail.objects.filter(route=route)] return render_to_json_response({ 'route': route.get_dict(), 'stops': { 'type': 'FeatureCollection', 'features': stops } })
def removeUser(request): ''' takes { username: username } returns {} ''' response = json_response() data = json.load(request.POST['data']) user = get_object_or_404_json(User, username=data['username']) user.delete() return render_to_json_response(response)
def oembed(request): format = request.GET.get('format', 'json') #maxwidth = int(request.GET.get('maxwidth', 640)) maxwidth = int(request.GET.get('maxwidth', 2000)) #wafaa #maxheight = int(request.GET.get('maxheight', 480)) maxheight = int(request.GET.get('maxheight', 1080)) url = request.GET['url'] parts = urlparse(url).path.split('/') itemId = parts[1] item = get_object_or_404_json(models.Item, itemId=itemId) embed_url = request.build_absolute_uri('/%s' % itemId) if url.startswith(embed_url): embed_url = url if not '#embed' in embed_url: embed_url = '%s#embed' % embed_url oembed = {} oembed['version'] = '1.0' oembed['type'] = 'video' oembed['provider_name'] = settings.SITENAME oembed['provider_url'] = request.build_absolute_uri('/') oembed['title'] = item.get('title') #oembed['author_name'] = item.get('director') #oembed['author_url'] = ?? height = max(settings.CONFIG['video']['resolutions']) height = min(height, maxheight) width = int(round(height * item.stream_aspect)) if width > maxwidth: width = maxwidth height = min(maxheight, int(width / item.stream_aspect)) oembed[ 'html'] = '<iframe width="%s" height="%s" src="%s" frameborder="0" allowfullscreen></iframe>' % ( width, height, embed_url) oembed['width'] = width oembed['height'] = height thumbheight = 96 thumbwidth = int(thumbheight * item.stream_aspect) thumbwidth -= thumbwidth % 2 oembed['thumbnail_height'] = thumbheight oembed['thumbnail_width'] = thumbwidth oembed['thumbnail_url'] = request.build_absolute_uri( '/%s/%sp.jpg' % (item.itemId, thumbheight)) if format == 'xml': oxml = ET.Element('oembed') for key in oembed: e = ET.SubElement(oxml, key) e.text = unicode(oembed[key]) return HttpResponse( '<?xml version="1.0" encoding="utf-8" standalone="yes"?>\n' + ET.tostring(oxml), 'application/xml') return HttpResponse(json.dumps(oembed, indent=2), 'application/json')
def editEvent(request): ''' takes { id: string, name: string, start: string, end: string } returns { id: string, ... } ''' data = json.loads(request.POST['data']) event = get_object_or_404_json(models.Event, pk=ox.fromAZ(data['id'])) if event.editable(request.user): conflict = False conflict_names = [] names = [data.get('name', event.name)] + data.get( 'alternativeNames', []) for name in names: if models.Event.objects.filter( defined=True, name_find__icontains=u'|%s|' % name).exclude(id=event.id).count() != 0: conflict = True conflict_names.append(name) if not conflict: models.Event.objects.filter(defined=False, name__in=names).delete() for key in ('name', 'start', 'startTime', 'end', 'endTime', 'duration', 'durationTime', 'type', 'alternativeNames'): if key in data: value = data[key] if isinstance(value, basestring): value = ox.escape_html(value) if key == 'alternativeNames': value = tuple([ox.escape_html(v) for v in value]) setattr(event, key, value) if 'name' in data: event.set_name_sort(ox.escape_html(data['name'])) if 'nameSort' in data: event.set_name_sort(ox.escape_html(data['nameSort'])) event.save() if 'name' in data or 'alternativeNames' in data: event.update_matches() response = json_response(status=200, text='updated') response['data'] = event.json() else: response = json_response(status=409, text='Event name conflict') response['data']['names'] = conflict_names else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def setUI(request): ''' takes { key.subkey: value } you can set nested keys api.setUI({"lists|my|ListView": "icons"}) returns { } ''' data = json.loads(request.POST['data']) if request.user.is_authenticated(): profile = request.user.get_profile() ui = profile.ui else: ui = json.loads(request.session.get('ui', '{}')) for key in data: keys = map(lambda p: p.replace('\0', '\\.'), key.replace('\\.', '\0').split('.')) value = data[key] p = ui while len(keys) > 1: key = keys.pop(0) if isinstance(p, list): p = p[getPositionById(p, key)] else: if key not in p: p[key] = {} p = p[key] if value == None and keys[0] in p: del p[keys[0]] else: p[keys[0]] = value if request.user.is_authenticated(): profile.save() else: request.session['ui'] = json.dumps(ui) if data.get('item'): item = get_object_or_404_json(Item, itemId=data['item']) if request.user.is_authenticated(): access, created = Access.objects.get_or_create(item=item, user=request.user) else: access, created = Access.objects.get_or_create(item=item, user=None) if not created: access.save() response = json_response() return render_to_json_response(response)
def editUser(request): ''' takes { key: value } required key: id optional keys: username, email, level, notes returns { } ''' response = json_response() data = json.loads(request.POST['data']) user = get_object_or_404_json(User, pk=ox.fromAZ(data['id'])) profile = user.get_profile() if 'disabled' in data: user.is_active = not data['disabled'] if 'email' in data: if 'email' in data: data['email'] = ox.escape_html(data['email']) if User.objects.filter(email__iexact=data['email']).exclude( id=user.id).count() > 0: response = json_response(status=403, text='email already in use') return render_to_json_response(response) user.email = data['email'] if 'level' in data: profile.set_level(data['level']) if 'notes' in data: profile.notes = data['notes'] if 'newsletter' in data: profile.newsletter = data['newsletter'] if 'groups' in data: groups = data['groups'] if isinstance(groups, list): groups = filter(lambda g: g.strip(), groups) groups = [ox.escape_html(g) for g in groups] user.groups.exclude(name__in=groups).delete() current_groups = [g.name for g in user.groups.all()] for g in filter(lambda g: g not in current_groups, groups): group, created = Group.objects.get_or_create(name=g) user.groups.add(group) if 'username' in data: if User.objects.filter(username__iexact=data['username']).exclude( id=user.id).count() > 0: response = json_response(status=403, text='username already in use') return render_to_json_response(response) user.username = data['username'] user.save() profile.save() response['data'] = user.data.get().json() return render_to_json_response(response)
def editUser(request): ''' takes { key: value } required key: id optional keys: username, email, level, notes returns { } ''' response = json_response() data = json.loads(request.POST['data']) user = get_object_or_404_json(User, pk=ox.fromAZ(data['id'])) profile = user.get_profile() if 'disabled' in data: user.is_active = not data['disabled'] if 'email' in data: if 'email' in data: data['email'] = ox.escape_html(data['email']) if User.objects.filter(email__iexact=data['email']).exclude(id=user.id).count()>0: response = json_response(status=403, text='email already in use') return render_to_json_response(response) user.email = data['email'] if 'level' in data: profile.set_level(data['level']) if 'notes' in data: profile.notes = data['notes'] if 'newsletter' in data: profile.newsletter = data['newsletter'] if 'groups' in data: groups = data['groups'] if isinstance(groups, list): groups = filter(lambda g: g.strip(), groups) groups = [ox.escape_html(g) for g in groups] user.groups.exclude(name__in=groups).delete() current_groups = [g.name for g in user.groups.all()] for g in filter(lambda g: g not in current_groups, groups): group, created = Group.objects.get_or_create(name=g) user.groups.add(group) if 'username' in data: if User.objects.filter( username__iexact=data['username']).exclude(id=user.id).count()>0: response = json_response(status=403, text='username already in use') return render_to_json_response(response) user.username = data['username'] user.save() profile.save() response['data'] = user.data.get().json() return render_to_json_response(response)
def editEvent(request): ''' takes { id: string, name: string, start: string, end: string } returns { id: string, ... } ''' data = json.loads(request.POST['data']) event = get_object_or_404_json(models.Event, pk=ox.fromAZ(data['id'])) if event.editable(request.user): conflict = False conflict_names = [] names = [data.get('name', event.name)] + data.get('alternativeNames', []) for name in names: if models.Event.objects.filter(defined=True, name_find__icontains=u'|%s|'%name).exclude(id=event.id).count() != 0: conflict = True conflict_names.append(name) if not conflict: models.Event.objects.filter(defined=False, name__in=names).delete() for key in ('name', 'start', 'startTime', 'end', 'endTime', 'duration', 'durationTime', 'type', 'alternativeNames'): if key in data: value = data[key] if isinstance(value, basestring): value = ox.escape_html(value) if key == 'alternativeNames': value = tuple([ox.escape_html(v) for v in value]) setattr(event, key, value) if 'name' in data: event.set_name_sort(ox.escape_html(data['name'])) if 'nameSort' in data: event.set_name_sort(ox.escape_html(data['nameSort'])) event.save() if 'name' in data or 'alternativeNames' in data: event.update_matches() response = json_response(status=200, text='updated') response['data'] = event.json() else: response = json_response(status=409, text='Event name conflict') response['data']['names'] = conflict_names else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def editMedia(request): ''' change file / item link takes { files: [ {id:, key1: value1, key2: value2} ... ] } possible keys: part, partTitle, language, ignore, extension, version, episodes returns { } ''' data = json.loads(request.POST['data']) ignore = [] dont_ignore = [] response = json_response(status=200, text='updated') response['data']['files'] = [] for info in data['files']: f = get_object_or_404_json(models.File, oshash=info['id']) if f.editable(request.user): if 'ignore' in info: if info['ignore']: ignore.append(info['id']) else: dont_ignore.append(info['id']) update = False for key in f.PATH_INFO: if key in info: f.info[key] = info[key] update = True if update: f.save() response['data']['files'].append(f.json()) else: response['data']['files'].append({'id': info['id'], 'error': 'permission denied'}) if ignore: models.Instance.objects.filter(file__oshash__in=ignore).update(ignore=True) if dont_ignore: models.Instance.objects.filter(file__oshash__in=dont_ignore).update(ignore=False) if ignore or dont_ignore: files = models.File.objects.filter(oshash__in=ignore+dont_ignore) #FIXME: is this to slow to run sync? for i in Item.objects.filter(files__in=files).distinct(): i.update_selected() i.update_wanted() return render_to_json_response(response)
def setUI(request): ''' takes { key.subkey: value } you can set nested keys api.setUI({"lists|my|ListView": "icons"}) returns { } ''' data = json.loads(request.POST['data']) if request.user.is_authenticated(): profile = request.user.get_profile() ui = profile.ui else: ui = json.loads(request.session.get('ui', '{}')) for key in data: keys = map(lambda p: p.replace('\0', '\\.'), key.replace('\\.', '\0').split('.')) value = data[key] p = ui while len(keys)>1: key = keys.pop(0) if isinstance(p, list): p = p[getPositionById(p, key)] else: if key not in p: p[key] = {} p = p[key] if value == None and keys[0] in p: del p[keys[0]] else: p[keys[0]] = value if request.user.is_authenticated(): profile.save() else: request.session['ui'] = json.dumps(ui) if data.get('item'): item = get_object_or_404_json(Item, itemId=data['item']) if request.user.is_authenticated(): access, created = Access.objects.get_or_create(item=item, user=request.user) else: access, created = Access.objects.get_or_create(item=item, user=None) if not created: access.save() response = json_response() return render_to_json_response(response)
def removeNews(request): ''' takes { ids: [] } returns {} ''' data = json.loads(request.POST['data']) response = json_response({}) news = get_object_or_404_json(models.News, id=ox.fromAZ(data['id'])) if news.editable(request.user): news.delete() response = json_response(status=200, text='news removed') else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def updateExternalData(request): ''' takes { id: string, } returns { } ''' data = json.loads(request.POST['data']) item = get_object_or_404_json(models.Item, itemId=data['id']) response = json_response() if item.editable(request.user): item.update_external() else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def removeEvent(request): ''' remove Event with given id takes { id: event id } returns {} ''' data = json.loads(request.POST['data']) event = get_object_or_404_json(models.Event, pk=ox.fromAZ(data['id'])) if event.editable(request.user): event.delete() response = json_response(status=200, text='removed') else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def removePlace(request): ''' takes { id: string, } returns {} ''' data = json.loads(request.POST['data']) if isinstance(data, dict): data = data['id'] place = get_object_or_404_json(models.Place, pk=ox.fromAZ(data)) if place.editable(request.user): place.delete() response = json_response(status=200, text='deleted') else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def removeAnnotation(request): ''' takes { id: annotationId } returns { } ''' response = json_response({}) data = json.loads(request.POST['data']) a = get_object_or_404_json(models.Annotation, public_id=data['id']) if a.editable(request.user): a.log() a.delete() else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def oembed(request): format = request.GET.get('format', 'json') maxwidth = int(request.GET.get('maxwidth', 640)) maxheight = int(request.GET.get('maxheight', 480)) url = request.GET['url'] parts = urlparse(url).path.split('/') itemId = parts[1] #fixme: embed should reflect actuall url item = get_object_or_404_json(models.Item, itemId=itemId) embed_url = request.build_absolute_uri('/%s/embed' % item.itemId) embed_url = '%s#?embed=true' % url oembed = {} oembed['version'] = '1.0' oembed['type'] = 'video' oembed['provider_name'] = settings.SITENAME oembed['provider_url'] = request.build_absolute_uri('/') oembed['title'] = item.get('title') #oembed['author_name'] = item.get('director') #oembed['author_url'] = ?? height = max(settings.CONFIG['video']['resolutions']) height = min(height, maxheight) width = int(round(height * item.stream_aspect)) if width > maxwidth: width = maxwidth height = min(maxheight, int(width / item.stream_aspect)) oembed['html'] = '<iframe width="%s" height="%s" src="%s" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>' % (width, height, embed_url) oembed['width'] = width oembed['height'] = height thumbheight = 96 thumbwidth = int(thumbheight * item.stream_aspect) thumbwidth -= thumbwidth % 2 oembed['thumbnail_height'] = thumbheight oembed['thumbnail_width'] = thumbwidth oembed['thumbnail_url'] = request.build_absolute_uri('/%s/%sp.jpg' % (item.itemId, thumbheight)) if format == 'xml': oxml = ET.Element('oembed') for key in oembed: e = ET.SubElement(oxml, key) e.text = unicode(oembed[key]) return HttpResponse( '<?xml version="1.0" encoding="utf-8" standalone="yes"?>\n' + ET.tostring(oxml), 'application/xml' ) return HttpResponse(json.dumps(oembed, indent=2), 'application/json')
def setPosterFrame(request): ''' takes { id: string, position: float } returns { } ''' data = json.loads(request.POST['data']) item = get_object_or_404_json(models.Item, itemId=data['id']) if item.editable(request.user): item.poster_frame = data['position'] item.save() tasks.update_poster(item.itemId) response = json_response() else: response = json_response(status=403, text='permissino denied') return render_to_json_response(response)
def upload(request): ''' takes { id: string frame: [] //multipart frames file: [] //multipart file } returns { info: object, rename: object } ''' response = json_response({}) f = get_object_or_404_json(models.File, oshash=request.POST['id']) if 'frame' in request.FILES: if f.editable(request.user): f.frames.all().delete() for frame in request.FILES.getlist('frame'): name = frame.name #float required? position = float(os.path.splitext(name)[0]) fr, created = models.Frame.objects.get_or_create( file=f, position=position) if fr.frame: fr.frame.delete() fr.frame.save(name, frame) os.chmod(fr.frame.path, 0644) f.item.select_frame() f.item.save() item.tasks.update_poster.delay(f.item.itemId) if 'file' in request.FILES: if not f.available: if f.data: f.data.delete() f.data.save('data.raw', request.FILES['file']) f.save() os.chmod(f.data.path, 0644) item.tasks.load_subtitles.delay(f.item.itemId) response = json_response(text='file saved') else: response = json_response(status=403, text='permissino denied') return render_to_json_response(response)
def upload(request): ''' takes { id: string frame: [] //multipart frames file: [] //multipart file } returns { info: object, rename: object } ''' response = json_response({}) f = get_object_or_404_json(models.File, oshash=request.POST['id']) if 'frame' in request.FILES: if f.editable(request.user): f.frames.all().delete() for frame in request.FILES.getlist('frame'): name = frame.name #float required? position = float(os.path.splitext(name)[0]) fr, created = models.Frame.objects.get_or_create(file=f, position=position) if fr.frame: fr.frame.delete() fr.frame.save(name, frame) os.chmod(fr.frame.path, 0644) f.item.select_frame() f.item.save() item.tasks.update_poster.delay(f.item.itemId) if 'file' in request.FILES: if not f.available: if f.data: f.data.delete() f.data.save('data.raw', request.FILES['file']) f.save() os.chmod(f.data.path, 0644) item.tasks.load_subtitles.delay(f.item.itemId) response = json_response(text='file saved') else: response = json_response(status=403, text='permissino denied') return render_to_json_response(response)
def edit(request): ''' edit item with id, you can pass one or many key/value pairs, returns all key/values for edited item. takes { id: string, key: value, ... } returns { key: value .. } ''' update_clips = False data = json.loads(request.POST['data']) item = get_object_or_404_json(models.Item, itemId=data['id']) if item.editable(request.user): item.log() response = json_response(status=200, text='ok') if 'rightslevel' in data: item.level = int(data['rightslevel']) del data['rightslevel'] if 'user' in data: if request.user.get_profile().get_level() in ('admin', 'staff') and \ models.User.objects.filter(username=data['user']).exists(): new_user = models.User.objects.get(username=data['user']) if new_user != item.user: item.user = new_user update_clips = True del data['user'] r = item.edit(data) if r: r.wait() if update_clips: tasks.update_clips.delay(item.itemId) response['data'] = item.get_json() else: response = json_response(status=403, text='permissino denied') return render_to_json_response(response)
def editTitle(request): ''' takes { id: string sorttitle: string } can contain any of the allowed keys for title returns { id: string } ''' data = json.loads(request.POST['data']) title = get_object_or_404_json(models.Title, pk=ox.fromAZ(data['id'])) response = json_response() if 'sorttitle' in data: title.sorttitle = data['sorttitle'] title.sorttitle = unicodedata.normalize('NFKD', title.sorttitle) title.edited = True title.save() response['data'] = title.json() return render_to_json_response(response)
def editName(request): ''' takes { id: id, sortname: string } returns { id: string, name: string ... } ''' data = json.loads(request.POST['data']) person = get_object_or_404_json(models.Person, pk=ox.fromAZ(data['id'])) response = json_response() if 'sortname' in data: person.sortname = data['sortname'] person.edited = True person.save() tasks.update_file_paths.delay(person.id) response['data'] = person.json() return render_to_json_response(response)
def get(request): ''' takes { id: string, keys: [string] } returns { key: value } ''' response = json_response({}) data = json.loads(request.POST['data']) data['keys'] = data.get('keys', []) item = get_object_or_404_json(models.Item, itemId=data['id']) if item.access(request.user): info = item.get_json(data['keys']) if not data['keys'] or 'stream' in data['keys']: info['stream'] = item.get_stream() if data['keys'] and 'layers' in data['keys']: info['layers'] = item.get_layers(request.user) if data['keys'] and 'documents' in data['keys']: info['documents'] = item.get_documents(request.user) if data['keys'] and 'files' in data['keys']: info['files'] = item.get_files(request.user) if not data['keys'] or 'groups' in data['keys'] \ and item.editable(request.user): info['groups'] = [g.name for g in item.groups.all()] for k in settings.CONFIG['itemKeys']: if 'capability' in k \ and not (item.editable(request.user) or has_capability(request.user, k['capability'])) \ and k['id'] in info \ and k['id'] not in ('parts', 'durations', 'duration'): del info[k['id']] info['editable'] = item.editable(request.user) response['data'] = info else: #response = json_response(status=403, text='permission denied') response = json_response(status=404, text='not found') return render_to_json_response(response)
def addAnnotation(request): ''' takes { item: itemId, layer: layerId, in: float, out: float, value: string } returns { id: string, //id of new annotation ... } ''' data = json.loads(request.POST['data']) for key in ('item', 'layer', 'in', 'out', 'value'): if key not in data: return render_to_json_response( json_response(status=400, text='invalid data')) item = get_object_or_404_json(Item, itemId=data['item']) layer_id = data['layer'] layer = filter(lambda l: l['id'] == layer_id, settings.CONFIG['layers'])[0] if layer['canAddAnnotations'].get(request.user.get_profile().get_level()): annotation = models.Annotation(item=item, layer=layer_id, user=request.user, start=float(data['in']), end=float(data['out']), value=data['value']) annotation.save() update_item.delay(annotation.id) response = json_response(annotation.json()) response['data']['editable'] = True else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def addAnnotation(request): ''' takes { item: itemId, layer: layerId, in: float, out: float, value: string } returns { id: string, //id of new annotation ... } ''' data = json.loads(request.POST['data']) for key in ('item', 'layer', 'in', 'out', 'value'): if key not in data: return render_to_json_response(json_response(status=400, text='invalid data')) item = get_object_or_404_json(Item, itemId=data['item']) layer_id = data['layer'] layer = filter(lambda l: l['id'] == layer_id, settings.CONFIG['layers'])[0] if layer['canAddAnnotations'].get(request.user.get_profile().get_level()): annotation = models.Annotation( item=item, layer=layer_id, user=request.user, start=float(data['in']), end=float(data['out']), value=data['value']) annotation.save() update_item.delay(annotation.id) response = json_response(annotation.json()) response['data']['editable'] = True else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def feature_json(request, id): id = str(id) srid = int(request.GET.get("srid",4326)) feature = get_object_or_404_json(Feature, pk=id) return render_to_json_response(feature.get_geojson(srid))
def get_document_or_404_json(id): username, name, extension = models.Document.parse_id(id) return get_object_or_404_json(models.Document, user__username=username, name=name, extension=extension)
def editPlace(request): ''' takes { id: string, name: string north: int } returns { names: [] } ''' data = json.loads(request.POST['data']) place = get_object_or_404_json(models.Place, pk=ox.fromAZ(data['id'])) names = data.get('name', []) if isinstance(names, basestring): names = [names] names = [ox.escape_html(n) for n in names] alternative_names = [ox.escape_html(n) for n in data.get('alternativeNames', [])] alternative_names = filter(lambda n: n.strip(), alternative_names) if place.editable(request.user): conflict = False conflict_names = [] conflict_geoname = '' if alternative_names: data['alternativeNames'] = alternative_names for name in names + alternative_names: name = ox.decode_html(name) if models.Place.objects.filter(defined=True, name_find__icontains=u'|%s|'%name).exclude(id=place.id).count() != 0: conflict = True conflict_names.append(name) ''' if 'geoname' in data: if models.Place.objects.filter(defined=True, geoname=data['geoname']).exclude(id=place.id).count() != 0: conflict = True conflict_geoname = data['geoname'] ''' if not conflict: models.Place.objects.filter(defined=False, name__in=names+alternative_names).delete() for key in data: if key != 'id': value = data[key] if isinstance(value, basestring): value = ox.escape_html(value) if isinstance(value, list): value = tuple(value) setattr(place, key, value) place.save() if 'name' in data or 'alternativeNames' in data: place.update_matches() response = json_response(place.json()) else: response = json_response(status=409, text='%s exists'%(conflict_names and 'Name' or 'Geoname')) response['data']['names'] = conflict_names if conflict_geoname: response['data']['geoname'] = conflict_geoname else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)