Esempio n. 1
0
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})
Esempio n. 2
0
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.
Esempio n. 3
0
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)
Esempio n. 5
0
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)
Esempio n. 6
0
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)
Esempio n. 7
0
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)
Esempio n. 8
0
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)
Esempio n. 9
0
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)
Esempio n. 10
0
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 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)
Esempio n. 12
0
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 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)
Esempio n. 14
0
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)   
Esempio n. 15
0
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
        }
    })
Esempio n. 16
0
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)
Esempio n. 17
0
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
        }
    })
Esempio n. 18
0
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
        }
    })
Esempio n. 19
0
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
        }
    })
Esempio n. 20
0
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 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')
Esempio n. 23
0
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)
Esempio n. 26
0
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)
Esempio n. 27
0
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)
Esempio n. 28
0
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)
Esempio n. 29
0
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)
Esempio n. 31
0
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)
Esempio n. 32
0
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)
Esempio n. 33
0
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)
Esempio n. 34
0
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 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)
Esempio n. 36
0
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)
Esempio n. 37
0
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)
Esempio n. 38
0
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)
Esempio n. 39
0
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)
Esempio n. 41
0
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)
Esempio n. 42
0
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)
Esempio n. 43
0
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)
Esempio n. 44
0
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 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)
Esempio n. 47
0
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)
Esempio n. 48
0
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)
Esempio n. 49
0
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 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)
Esempio n. 51
0
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)
Esempio n. 52
0
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)
Esempio n. 53
0
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))
Esempio n. 54
0
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)
Esempio n. 55
0
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)