def addDocument(request): ''' add document(s) to item takes { item: string id: string or ids: [string] } returns { } ''' response = json_response() data = json.loads(request.POST['data']) if 'ids' in data: ids = data['ids'] else: ids = [data['id']] item = Item.objects.get(itemId=data['item']) if item.editable(request.user): for id in ids: document = models.Document.get(id) document.add(item) else: response = json_response(status=403, file='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 addListItems(request): ''' takes { list: listId, items: [itemId], query: ... } returns { } ''' data = json.loads(request.POST['data']) list = get_list_or_404_json(data['list']) if 'items' in data: if list.editable(request.user): with transaction.commit_on_success(): for item in Item.objects.filter(itemId__in=data['items']): list.add(item) response = json_response(status=200, text='items added') else: response = json_response(status=403, text='not allowed') elif 'query' in data: response = json_response(status=501, text='not implemented') else: response = json_response(status=501, text='not implemented') return render_to_json_response(response)
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 tv(request): ''' takes { list: string } returns { item: string, position: float, title: string, ... } ''' data = json.loads(request.POST['data']) if 'list' in data and data['list']: list = get_list_or_404_json(data['list']) if list.accessible(request.user): channel, created = models.Channel.objects.get_or_create(list=list) response = json_response(status=200, text='created') response['data'] = channel.json(request.user) else: response = json_response(status=404, text='list not found') else: channel, created = models.Channel.objects.get_or_create(list=None) response = json_response(status=200, text='ok') response['data'] = channel.json(request.user) return render_to_json_response(response)
def tv(request): ''' takes { list: string } returns { item: string, position: float, title: string, ... } ''' data = json.loads(request.POST['data']) if 'list' in data and data['list']: list = get_list_or_404_json(data['list']) if list.accessible(request.user): channel, created = models.Channel.objects.get_or_create(list=list) response = json_response(status=200, text='created') response['data'] = channel.json(request.user) else: response = json_response(status=404, text='list not found') else: channel, created = models.Channel.objects.get_or_create(list=None) response = json_response(status=200, text='ok') response['data'] = channel.json(request.user) return render_to_json_response(response)
def editList(request): ''' takes { id: listId, key: value, } keys: name, status, query, position, posterFrames if you change status you have to provide position of list posterFrames: array with objects that have item/position returns { id: string, ... } ''' data = json.loads(request.POST['data']) list = get_list_or_404_json(data['id']) if list.editable(request.user): response = json_response() list.edit(data, request.user) response['data'] = list.json(user=request.user) else: response = json_response(status=403, text='not allowed') return render_to_json_response(response)
def editDocument(request): ''' takes { id: string name: string description: string item(optional): edit descriptoin per item } returns { id: ... } ''' response = json_response() data = json.loads(request.POST['data']) item = 'item' in data and Item.objects.get(itemId=data['item']) or None if data['id']: document = models.Document.get(data['id']) if document.editable(request.user): document.edit(data, request.user, item=item) document.save() response['data'] = document.json(user=request.user, item=item) else: response = json_response(status=403, text='permission denied') else: response = json_response(status=500, text='invalid request') return render_to_json_response(response)
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 addDocument(request): ''' add document(s) to item takes { item: string id: string or ids: [string] } returns { } ''' response = json_response() data = json.loads(request.POST['data']) if 'ids' in data: ids = data['ids'] else: ids = [data['id']] item = Item.objects.get(itemId=data['item']) if item.editable(request.user): for id in ids: document = models.Document.get(id) document.add(item) 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 add(request): ''' takes { title: string, //(optional) } returns { id: name: ... } ''' if not request.user.get_profile().capability('canAddItems'): response = json_response(status=403, text='permissino denied') else: data = json.loads(request.POST['data']) data['title'] = data.get('title', 'Untitled') i = models.Item() i.data['title'] = data['title'] i.user = request.user p = i.save() if p: p.wait() else: i.make_poster(True) response = json_response(status=200, text='created') response['data'] = i.get_json() return render_to_json_response(response)
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 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 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 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 requestToken(request): ''' takes { username: string, email: string } returns { errors: { username: '******' email: 'Unknown Email' } username: user } ''' data = json.loads(request.POST['data']) user = None if 'username' in data: try: user = User.objects.get(username__iexact=data['username']) except User.DoesNotExist: user = None elif 'email' in data: try: user = User.objects.get(email__iexact=data['email']) except User.DoesNotExist: user = None if user: while True: code = ox.toAZ( random.randint(ox.fromAZ('AAAAAAAAAAAAAAAA'), ox.fromAZ('AAAAAAAAAAAAAAAAA'))) if models.UserProfile.objects.filter(reset_code=code).count() == 0: break user_profile = user.get_profile() user_profile.reset_code = code user_profile.save() template = loader.get_template('password_reset_email.txt') context = RequestContext( request, { 'code': code, 'sitename': settings.SITENAME, 'footer': settings.CONFIG['site']['email']['footer'], 'url': request.build_absolute_uri('/'), }) message = template.render(context) subject = '%s - Reset Password' % settings.SITENAME user.email_user(subject, message) response = json_response({'username': user.username}, text='password reset email sent') else: response = json_response({'errors': {}}) if 'username' in data: response['data']['errors']['username'] = '******' elif 'email' in data: response['data']['errors']['email'] = 'Unknown Email' else: response = json_response(status=400, text='invalid data') return render_to_json_response(response)
def add(request): ''' takes { title: string, //(optional) } returns { id: name: ... } ''' if not request.user.get_profile().capability('canAddItems'): response = json_response(status=403, text='permissino denied') else: data = json.loads(request.POST['data']) data['title'] = data.get('title', 'Untitled') i = models.Item() i.data['title'] = data['title'] i.user = request.user p = i.save() if p: p.wait() else: i.make_poster(True) response = json_response(status=200, text='created') response['data'] = i.get_json() return render_to_json_response(response)
def editDocument(request): ''' takes { id: string name: string description: string item(optional): edit descriptoin per item } returns { id: ... } ''' response = json_response() data = json.loads(request.POST['data']) item = 'item' in data and Item.objects.get(itemId=data['item']) or None if data['id']: document = models.Document.get(data['id']) if document.editable(request.user): document.edit(data, request.user, item=item) document.save() response['data'] = document.json(user=request.user, item=item) else: response = json_response(status=403, text='permission denied') else: response = json_response(status=500, text='invalid request') return render_to_json_response(response)
def upload(request): text = get_text_or_404_json(request.POST['id']) if text.editable(request.user): #post next chunk if 'chunk' in request.FILES: form = ChunkForm(request.POST, request.FILES) if form.is_valid() and text.editable(request.user): c = form.cleaned_data['chunk'] chunk_id = form.cleaned_data['chunkId'] response = { 'result': 1, 'resultUrl': request.build_absolute_uri(text.get_absolute_url()) } if not text.save_chunk(c, chunk_id, form.cleaned_data['done']): response['result'] = -1 if form.cleaned_data['done']: response['done'] = 1 return render_to_json_response(response) #init upload else: text.uploading = True if text.file: text.file.delete() text.save() return render_to_json_response({ 'uploadUrl': request.build_absolute_uri('/api/upload/text'), 'url': request.build_absolute_uri(text.get_absolute_url()), 'result': 1 }) else: response = json_response(status=404, text='permission denied') response = json_response(status=400, text='this request requires POST') return render_to_json_response(response)
def editClip(request): ''' takes { id: string, in: float, out: float } returns { } ''' response = json_response() data = json.loads(request.POST['data']) clip = get_object_or_404_json(models.Clip, pk=ox.fromAZ(data['id'])) valid = True if clip.edit.editable(request.user): for key in ('in', 'out'): if key in data: if clip.annotation: clip.start = clip.annotation.start clip.end = clip.annotation.end clip.item = clip.annotation.item clip.annotation = None setattr(clip, {'in': 'start', 'out': 'end'}.get(key), float(data[key])) if not clip.annotation: duration = clip.item.sort.duration if clip.start >= clip.end or clip.start >= duration or clip.end > duration: response = json_response(status=500, text='invalid in/out') valid = False if valid: clip.save() response['data'] = clip.json(user=request.user) else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def signin(request): ''' takes { username: string, password: string } returns { errors: { username: '******', password: '******' } user: { ... } } ''' data = json.loads(request.POST['data']) if 'assertion' in data: response = persona.signin(request) elif 'username' in data and 'password' in data: data['username'] = data['username'].strip() if settings.AUTH_CHECK_USERNAME: qs = User.objects.filter(username__iexact=data['username']) if qs.count() == 0: response = json_response({ 'errors': { 'username': '******' } }) username = None else: username = qs[0].username else: username = data['username'] if username: user = authenticate(username=username, password=data['password']) if user is not None: if user.is_active: request.session['ui'] = '{}' login(request, user) user_json = models.init_user(user, request) response = json_response({ 'user': user_json }) else: response = json_response({ 'errors': { 'username': '******' } }) else: response = json_response({ 'errors': { 'password': '******' } }) else: response = json_response(status=400, text='invalid data') return render_to_json_response(response)
def signin(request): data = json.loads(request.POST['data']) response = json_response({'errors': {'email': 'Failed to verify email'}}) verification_data = verify(request, data['assertion']) if verification_data: email = verification_data['email'] username = data.get('username') qs = User.objects.filter(email__iexact=email) if qs.count() == 0: if not username: response = json_response({ 'errors': { 'username': '******' } }) return response user = User() user.email = email user.username = username user.save() else: user = qs[0] if user.is_active: request.session['ui'] = '{}' #fixme. use custom backend instead? user.backend = 'django.contrib.auth.backends.ModelBackend' auth.login(request, user) user_json = models.init_user(user, request) response = json_response({'user': user_json}) else: response = json_response({'errors': {'email': 'User Disabled'}}) return response
def editPreferences(request): ''' takes { key: value } keys: email, password returns {} ''' data = json.loads(request.POST['data']) errors = {} change = False response = json_response() if 'email' in data: if User.objects.filter( email=data['email']).exclude(username=request.user.username).count()>0: errors['email'] = 'Email address already in use' else: change = True request.user.email = ox.escape_html(data['email']) if 'newsletter' in data: profile = request.user.get_profile() profile.newsletter = data['newsletter'] profile.save() if 'password' in data: change = True request.user.set_password(data['password']) if change: request.user.save() if errors: response = json_response({ 'errors': errors}) return render_to_json_response(response)
def addClips(request): ''' takes { edit: string, index: int, clips: [] item: string, in: float, out: float, annotation: string } add clips with item/in/out or annotation to edit with id clips are added at index or end if index is not provided (annoation id is in the form item/annotation) returns { } ''' response = json_response() data = json.loads(request.POST['data']) edit = get_edit_or_404_json(data['edit']) clips = [] if edit.editable(request.user): index = data.get('index', edit.clips.count()) for c in data['clips']: clip = edit.add_clip(c, index) index += 1 if not clip: response = json_response(status=500, text='invalid in/out') return render_to_json_response(response) else: clips.append(clip.json(request.user)) response['data']['clips'] = clips else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def editPreferences(request): ''' takes { key: value } keys: email, password returns {} ''' data = json.loads(request.POST['data']) errors = {} change = False response = json_response() if 'email' in data: if User.objects.filter(email=data['email']).exclude( username=request.user.username).count() > 0: errors['email'] = 'Email address already in use' else: change = True request.user.email = ox.escape_html(data['email']) if 'newsletter' in data: profile = request.user.get_profile() profile.newsletter = data['newsletter'] profile.save() if 'password' in data: change = True request.user.set_password(data['password']) if change: request.user.save() if errors: response = json_response({'errors': errors}) return render_to_json_response(response)
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 lookup(request): ''' takes { title: string, director: [string], year: string, id: string } returns { title: string, director: [string], year: string, id: string } ''' data = json.loads(request.POST['data']) if 'id' in data: i = models.Item.objects.get(itemId=data['id']) r = {'id': i.itemId} for key in ('title', 'director', 'year'): r[key] = i.get(key) response = json_response(r) else: response = json_response(status=404, text='not found') return render_to_json_response(response)
def lookup(request): ''' takes { title: string, director: [string], year: string, id: string } returns { title: string, director: [string], year: string, id: string } ''' data = json.loads(request.POST['data']) if 'id' in data: i = models.Item.objects.get(itemId=data['id']) r = {'id': i.itemId} for key in ('title', 'director', 'year'): r[key] = i.get(key) response = json_response(r) else: response = json_response(status=404, text='not found') return render_to_json_response(response)
def addMedia(request): ''' takes { id: oshash filename: string, item: string info: {} } returns { item: id, } ''' response = json_response({}) data = json.loads(request.POST['data']) oshash = data.pop('id') if not request.user.get_profile().capability('canAddItems'): response = json_response(status=403, text='permissino denied') elif models.File.objects.filter(oshash=oshash).count() > 0: f = models.File.objects.get(oshash=oshash) if f.available: response['status']['text'] = 'file exists' response['data']['item'] = f.item.itemId response['data']['itemUrl'] = request.build_absolute_uri('/%s' % f.item.itemId) else: if 'item' in data: i = Item.objects.get(itemId=data['item']) else: title = ox.parse_movie_path(os.path.splitext( data['filename'])[0])['title'] i = Item() i.data = { 'title': title, 'director': data.get('director', []), } i.user = request.user i.save() i.make_poster(True) f = models.File(oshash=oshash, item=i) f.path = data.get('filename', 'Untitled') extension = f.path.split('.') if len(extension) > 1: extension = extension[-1] else: #wafaa #extension = 'webm' extension = 'png' f.selected = True if 'info' in data and data['info']: f.info = data['info'] f.info['extension'] = extension f.parse_info() f.save() response['data']['item'] = i.itemId response['data']['itemUrl'] = request.build_absolute_uri('/%s' % i.itemId) return render_to_json_response(response)
def direct_upload(request): if 'id' in request.GET: file = models.File.objects.get(oshash=request.GET['id']) else: oshash = request.POST['id'] response = json_response(status=400, text='this request requires POST') if 'chunk' in request.FILES: form = ChunkForm(request.POST, request.FILES) if form.is_valid() and file.editable(request.user): c = form.cleaned_data['chunk'] chunk_id = form.cleaned_data['chunkId'] response = { 'result': 1, 'resultUrl': request.build_absolute_uri(file.item.get_absolute_url()) } if not file.save_chunk(c, chunk_id, form.cleaned_data['done']): response['result'] = -1 if form.cleaned_data['done']: file.uploading = False file.queued = True file.save() #try/execpt so it does not fail if rabitmq is down try: t = file.extract_stream() response['resultUrl'] = t.task_id except: pass response['done'] = 1 return render_to_json_response(response) #init upload else: file, created = models.File.objects.get_or_create(oshash=oshash) if file.editable(request.user): #remove previous uploads if not created: file.streams.all().delete() file.delete_frames() if file.item.rendered and file.selected: Item.objects.filter(id=file.item.id).update(rendered=False) file.uploading = True file.save() upload_url = request.build_absolute_uri( '/api/upload/direct/?id=%s' % file.oshash) return render_to_json_response({ 'uploadUrl': upload_url, 'url': request.build_absolute_uri(file.item.get_absolute_url()), 'result': 1 }) else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def signin(request): ''' takes { username: string, password: string } returns { errors: { username: '******', password: '******' } user: { ... } } ''' data = json.loads(request.POST['data']) if 'assertion' in data: response = persona.signin(request) elif 'username' in data and 'password' in data: data['username'] = data['username'].strip() if settings.AUTH_CHECK_USERNAME: qs = User.objects.filter(username__iexact=data['username']) if qs.count() == 0: response = json_response( {'errors': { 'username': '******' }}) username = None else: username = qs[0].username else: username = data['username'] if username: user = authenticate(username=username, password=data['password']) if user is not None: if user.is_active: request.session['ui'] = '{}' login(request, user) user_json = models.init_user(user, request) response = json_response({'user': user_json}) else: response = json_response( {'errors': { 'username': '******' }}) else: response = json_response( {'errors': { 'password': '******' }}) else: response = json_response(status=400, text='invalid data') return render_to_json_response(response)
def firefogg_upload(request): profile = request.GET['profile'] oshash = request.GET['id'] config = settings.CONFIG['video'] video_profile = "%sp.%s" % (max(config['resolutions']), config['formats'][0]) #handle video upload if request.method == 'POST': #post next chunk if 'chunk' in request.FILES and oshash: f = get_object_or_404(models.File, oshash=oshash) form = ChunkForm(request.POST, request.FILES) if form.is_valid() and profile == video_profile and f.editable(request.user): c = form.cleaned_data['chunk'] chunk_id = form.cleaned_data['chunkId'] response = { 'result': 1, 'resultUrl': request.build_absolute_uri('/%s'%f.item.itemId) } if not f.save_chunk_stream(c, chunk_id, form.cleaned_data['done']): response['result'] = -1 elif form.cleaned_data['done']: f.uploading = False f.queued = True f.save() #FIXME: this fails badly if rabbitmq goes down try: t = tasks.process_stream.delay(f.id) response['resultUrl'] = t.task_id except: pass response['result'] = 1 response['done'] = 1 return render_to_json_response(response) #init upload elif oshash and profile == video_profile: #404 if oshash is not know, files must be registered via update api first f = get_object_or_404(models.File, oshash=oshash) if f.editable(request.user): f.streams.all().delete() f.delete_frames() f.uploading = True f.save() if f.item.rendered and f.selected: Item.objects.filter(id=f.item.id).update(rendered=False) response = { 'uploadUrl': request.build_absolute_uri('/api/upload/?id=%s&profile=%s' % (f.oshash, profile)), 'url': request.build_absolute_uri('/%s' % f.item.itemId), 'result': 1 } return render_to_json_response(response) else: response = json_response(status=404, text='permission denied') response = json_response(status=400, text='this request requires POST') return render_to_json_response(response)
def removeVolume(request): data = json.loads(request.POST['data']) user = request.user try: volume = models.Volume.objects.get(user=user, name=data['volume']) volume.files.delete() volume.delete() response = json_response() except models.Volume.DoesNotExist: response = json_response(status=404, text='volume not found') return render_to_json_response(response)
def removeVolume(request): data = json.loads(request.POST['data']) user = request.user try: volume = models.Volume.objects.get(user=user, name=data['volume']) volume.files.delete() volume.delete() response = json_response() except models.Volume.DoesNotExist: response = json_response(status=404, text='volume not found') 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 addMedia(request): ''' takes { id: oshash filename: string, item: string info: {} } returns { item: id, } ''' response = json_response({}) data = json.loads(request.POST['data']) oshash = data.pop('id') if not request.user.get_profile().capability('canAddItems'): response = json_response(status=403, text='permissino denied') elif models.File.objects.filter(oshash=oshash).count() > 0: f = models.File.objects.get(oshash=oshash) if f.available: response['status']['text'] = 'file exists' response['data']['item'] = f.item.itemId response['data']['itemUrl'] = request.build_absolute_uri('/%s' % f.item.itemId) else: if 'item' in data: i = Item.objects.get(itemId=data['item']) else: title = ox.parse_movie_path(os.path.splitext(data['filename'])[0])['title'] i = Item() i.data = { 'title': title, 'director': data.get('director', []), } i.user = request.user i.save() i.make_poster(True) f = models.File(oshash=oshash, item=i) f.path = data.get('filename', 'Untitled') extension = f.path.split('.') if len(extension) > 1: extension = extension[-1] else: extension = 'webm' f.selected = True if 'info' in data and data['info']: f.info = data['info'] f.info['extension'] = extension f.parse_info() f.save() response['data']['item'] = i.itemId response['data']['itemUrl'] = request.build_absolute_uri('/%s' % i.itemId) 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 removeMedia(request): data = json.loads(request.POST['data']) response = json_response() if request.user.get_profile().get_level() == 'admin': qs = models.File.objects.filter(oshash__in=data['ids'], instances__id=None) for f in qs: if f.item.sort.numberoffiles: f.item.sort.numberoffiles -= 1 f.item.sort.save() qs.delete() else: response = json_response(status=403, text='permissino denied') 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 direct_upload(request): if 'id' in request.GET: file = models.File.objects.get(oshash=request.GET['id']) else: oshash = request.POST['id'] response = json_response(status=400, text='this request requires POST') if 'chunk' in request.FILES: form = ChunkForm(request.POST, request.FILES) if form.is_valid() and file.editable(request.user): c = form.cleaned_data['chunk'] chunk_id = form.cleaned_data['chunkId'] response = { 'result': 1, 'resultUrl': request.build_absolute_uri(file.item.get_absolute_url()) } if not file.save_chunk(c, chunk_id, form.cleaned_data['done']): response['result'] = -1 if form.cleaned_data['done']: file.uploading = False file.queued = True file.save() #try/execpt so it does not fail if rabitmq is down try: t = tasks.extract_stream.delay(file.id) response['resultUrl'] = t.task_id except: pass response['done'] = 1 return render_to_json_response(response) #init upload else: file, created = models.File.objects.get_or_create(oshash=oshash) if file.editable(request.user): #remove previous uploads if not created: file.streams.all().delete() file.delete_frames() if file.item.rendered and file.selected: Item.objects.filter(id=file.item.id).update(rendered=False) file.uploading = True file.save() upload_url = request.build_absolute_uri('/api/upload/direct/?id=%s' % file.oshash) return render_to_json_response({ 'uploadUrl': upload_url, 'url': request.build_absolute_uri(file.item.get_absolute_url()), 'result': 1 }) else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def resetPassword(request): ''' takes { username: string, password: string, code: string } returns { errors: { code: 'Incorrect Code' } user { } } ''' data = json.loads(request.POST['data']) if 'code' in data and 'password' in data: if not data['password']: response = json_response({ 'errors': { 'password': '******' } }) else: qs = models.UserProfile.objects.filter(reset_code=data['code']) if qs.count() == 1: user = qs[0].user user.set_password(data['password']) user.save() user_profile = user.get_profile() user_profile.reset_code = None user_profile.save() user = authenticate(username=user.username, password=data['password']) login(request, user) user_json = models.init_user(user, request) response = json_response({ 'user': user_json }, text='password reset') else: response = json_response({ 'errors': { 'code': 'Incorrect code' } }) else: response = json_response(status=400, text='invalid data') return render_to_json_response(response)
def removeMedia(request): data = json.loads(request.POST['data']) response = json_response() if request.user.get_profile().get_level() == 'admin': qs = models.File.objects.filter(oshash__in=data['ids'], instances__id=None) for f in qs: if f.item.sort.numberoffiles: f.item.sort.numberoffiles -= 1 f.item.sort.save() qs.delete() else: response = json_response(status=403, text='permissino denied') return render_to_json_response(response)
def sortTexts(request): ''' takes { section: 'personal', ids: [1,2,4,3] } known sections: 'personal', 'public', 'featured' featured can only be edited by admins returns {} ''' data = json.loads(request.POST['data']) position = 0 section = data['section'] section = { 'favorite': 'public' }.get(section,section) #ids = list(set(data['ids'])) ids = data['ids'] if section == 'featured' and not request.user.get_profile().capability('canEditFeaturedTexts'): response = json_response(status=403, text='not allowed') else: user = request.user if section == 'featured': for i in ids: l = get_text_or_404_json(i) qs = models.Position.objects.filter(section=section, text=l) if qs.count() > 0: pos = qs[0] else: pos = models.Position(text=l, user=user, section=section) if pos.position != position: pos.position = position pos.save() position += 1 models.Position.objects.filter(section=section, text=l).exclude(id=pos.id).delete() else: for i in ids: l = get_text_or_404_json(i) pos, created = models.Position.objects.get_or_create(text=l, user=request.user, section=section) if pos.position != position: pos.position = position pos.save() position += 1 response = json_response() return render_to_json_response(response)
def sortEdits(request): ''' takes { section: 'personal', ids: [1,2,4,3] } known sections: 'personal', 'public', 'featured' featured can only be edited by admins returns {} ''' data = json.loads(request.POST['data']) position = 0 section = data['section'] section = { 'favorite': 'public' }.get(section,section) #ids = list(set(data['ids'])) ids = data['ids'] if section == 'featured' and not request.user.get_profile().capability('canEditFeaturedEdits'): response = json_response(status=403, text='not allowed') else: user = request.user if section == 'featured': for i in ids: l = get_edit_or_404_json(i) qs = models.Position.objects.filter(section=section, edit=l) if qs.count() > 0: pos = qs[0] else: pos = models.Position(edit=l, user=user, section=section) if pos.position != position: pos.position = position pos.save() position += 1 models.Position.objects.filter(section=section, edit=l).exclude(id=pos.id).delete() else: for i in ids: l = get_edit_or_404_json(i) pos, created = models.Position.objects.get_or_create(edit=l, user=request.user, section=section) if pos.position != position: pos.position = position pos.save() position += 1 response = json_response() return render_to_json_response(response)
def resetPassword(request): ''' takes { username: string, password: string, code: string } returns { errors: { code: 'Incorrect Code' } user { } } ''' data = json.loads(request.POST['data']) if 'code' in data and 'password' in data: if not data['password']: response = json_response( {'errors': { 'password': '******' }}) else: qs = models.UserProfile.objects.filter(reset_code=data['code']) if qs.count() == 1: user = qs[0].user user.set_password(data['password']) user.save() user_profile = user.get_profile() user_profile.reset_code = None user_profile.save() user = authenticate(username=user.username, password=data['password']) login(request, user) user_json = models.init_user(user, request) response = json_response({'user': user_json}, text='password reset') else: response = json_response( {'errors': { 'code': 'Incorrect code' }}) else: response = json_response(status=400, text='invalid data') return render_to_json_response(response)
def findId(request): ''' takes { 'id': string 'title': string 'director': [string] 'year': int } ''' data = json.loads(request.POST['data']) response = json_response({}) response['data']['items'] = [] if 'id' in data: qs = models.Item.objects.filter(itemId=data['id']) if qs.count() == 1: response['data']['items'] = [ i.get_json(['title', 'director', 'year', 'id']) for i in qs ] if not response['data']['items'] \ and settings.USE_IMDB \ and settings.DATA_SERVICE: r = models.external_data('getId', data) if r['status']['code'] == 200: response['data']['items'] = [r['data']] return render_to_json_response(response)
def getMetadata(request): ''' takes { id: string, keys: [string] } returns { key: value .. } ''' data = json.loads(request.POST['data']) response = json_response({}) if settings.DATA_SERVICE: ''' info = {} for c in data['query']['conditions']: info[c['key']] = c['value'] r = models.external_data('getId', info) ''' r = models.external_data('getData', {'id': data['id']}) if r['status']['code'] == 200: if 'keys' in data and data['keys']: for key in data['keys']: if key in r['data']: response['data'][key] = r['data'][key] else: response['data'] = r['data'] return render_to_json_response(response)
def getIds(request): ''' takes { title: string, director: [string], year: int } returns { items: [{ tite: string, director: [string], year: int, originalTitle: string }] } ''' data = json.loads(request.POST['data']) response = json_response({}) if settings.DATA_SERVICE: r = models.external_data('getIds', data) if r['status']['code'] == 200: response['data']['items'] = r['data']['items'] else: response['data']['items'] 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 log(request): ''' takes { url: string, line: string, text: string } returns { } ''' data = json.loads(request.POST['data']) if request.user.is_authenticated(): user = request.user else: user = None url = data.get('url', '').split('/static/')[-1] if 'text' in data: if len(url) > 1000: url = url[:997] + '...' l = models.Log( text=data['text'], line=int(data.get('line', 0)), url=url ) if user: l.user = user l.save() response = json_response() return render_to_json_response(response)
def getIds(request): ''' takes { title: string, director: [string], year: int } returns { items: [{ tite: string, director: [string], year: int, originalTitle: string }] } ''' data = json.loads(request.POST['data']) response = json_response({}) if settings.DATA_SERVICE: r = models.external_data('getIds', data) if r['status']['code'] == 200: response['data']['items'] = r['data']['items'] else: response['data']['items'] 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 getSequence(request): ''' takes { id mode position } returns { id mode in out } ''' data = json.loads(request.POST['data']) response = json_response() position = float('%0.03f' % data['position']) i = Item.objects.get(itemId=data['id']) qs = models.Sequence.objects.filter( sort_id=i.sort.pk, mode=models.Sequence.MODE[data['mode']], start__lte=position, end__gt=position ).order_by('start', 'end') for sequence in qs: response['data'] = sequence.json() break return render_to_json_response(response)
def getMediaInfo(request): ''' takes { id: oshash of stream file } returns { item: itemId, file: oshash of source file } ''' data = json.loads(request.POST['data']) f = None qs = models.Stream.objects.filter(oshash=data['id']) if qs.count() > 0: s = qs[0] f = s.file else: qs = models.File.objects.filter(oshash=data['id']) if qs.count() > 0: f = qs[0] response = json_response() if f: response['data'] = { 'file': f.oshash, 'item': f.item.itemId } 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 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)