make moveMedia async

This commit is contained in:
j 2016-09-08 00:29:31 +02:00
parent bea661abcf
commit 3ac08aa806
4 changed files with 73 additions and 50 deletions

View file

@ -4,8 +4,8 @@ from __future__ import division, print_function, absolute_import
from glob import glob from glob import glob
from six import string_types
from celery.task import task from celery.task import task
from django.conf import settings from django.conf import settings
from django.db.models import Q from django.db.models import Q
@ -201,3 +201,47 @@ def update_stream(id):
@task(queue="encoding") @task(queue="encoding")
def download_media(item_id, url): def download_media(item_id, url):
return external.download(item_id, url) return external.download(item_id, url)
@task(queue='default')
def move_media(data, user):
user = models.User.objects.get(username=user)
from changelog.models import add_changelog
from item.models import get_item, Item
import item.tasks
if Item.objects.filter(public_id=data['item']).count() == 1:
i = Item.objects.get(public_id=data['item'])
else:
data['public_id'] = data.pop('item').strip()
if len(data['public_id']) != 7:
del data['public_id']
if 'director' in data and isinstance(data['director'], string_types):
if data['director'] == '':
data['director'] = []
else:
data['director'] = data['director'].split(', ')
i = get_item(data, user=user)
else:
i = get_item({'imdbId': data['public_id']}, user=user)
changed = [i.public_id]
for f in models.File.objects.filter(oshash__in=data['ids']):
if f.item.id != i.public_id and f.editable(user):
if f.item.public_id not in changed:
changed.append(f.item.public_id)
f.item = i
f.save()
for public_id in changed:
c = Item.objects.get(public_id=public_id)
if c.files.count() == 0 and settings.CONFIG['itemRequiresVideo']:
c.delete()
else:
c.rendered = False
c.save()
Task.start(c, user)
item.tasks.update_timeline.delay(public_id)
add_changelog({
'user': user,
'action': 'moveMedia'
}, data, i.public_id)
return {
'item': i.public_id
}

View file

@ -378,9 +378,12 @@ def getTaskStatus(request, data):
res = default_backend.get_result(task_id) res = default_backend.get_result(task_id)
response['data'] = { response['data'] = {
'id': task_id, 'id': task_id,
'status': status, 'status': status
'result': res
} }
if isinstance(res, dict):
response['data'].update(res)
else:
response['data']['result'] = res
if status in default_backend.EXCEPTION_STATES: if status in default_backend.EXCEPTION_STATES:
traceback = default_backend.get_traceback(task_id) traceback = default_backend.get_traceback(task_id)
response['data'].update({ response['data'].update({
@ -405,39 +408,9 @@ def moveMedia(request, data):
notes: This will *not* (yet) shift the corresponding annotations. notes: This will *not* (yet) shift the corresponding annotations.
see: addMedia, editMedia, findMedia, removeMedia see: addMedia, editMedia, findMedia, removeMedia
''' '''
if Item.objects.filter(public_id=data['item']).count() == 1: response = json_response()
i = Item.objects.get(public_id=data['item']) t = tasks.move_media.delay(data, request.user.username)
else: response['data']['taskId'] = t.task_id
data['public_id'] = data.pop('item').strip()
if len(data['public_id']) != 7:
del data['public_id']
if 'director' in data and isinstance(data['director'], string_types):
if data['director'] == '':
data['director'] = []
else:
data['director'] = data['director'].split(', ')
i = get_item(data, user=request.user)
else:
i = get_item({'imdbId': data['public_id']}, user=request.user)
changed = [i.public_id]
for f in models.File.objects.filter(oshash__in=data['ids']):
if f.item.id != i.public_id and f.editable(request.user):
if f.item.public_id not in changed:
changed.append(f.item.public_id)
f.item = i
f.save()
for public_id in changed:
c = Item.objects.get(public_id=public_id)
if c.files.count() == 0 and settings.CONFIG['itemRequiresVideo']:
c.delete()
else:
c.rendered = False
c.save()
Task.start(c, request.user)
item.tasks.update_timeline.delay(public_id)
response = json_response(text='updated')
response['data']['item'] = i.public_id
add_changelog(request, data, i.public_id)
return render_to_json_response(response) return render_to_json_response(response)
actions.register(moveMedia, cache=False) actions.register(moveMedia, cache=False)

View file

@ -28,8 +28,12 @@ class Changelog(models.Model):
return self.value return self.value
def add_changelog(request, data, id=None): def add_changelog(request, data, id=None):
user = request.user if isinstance(request, dict):
action = request.POST['action'] user = request['user']
action = request['action']
else:
user = request.user
action = request.POST['action']
c = Log(user=user, action=action, data=data) c = Log(user=user, action=action, data=data)
if id and isinstance(id, list): if id and isinstance(id, list):
id = ', '.join(id) id = ', '.join(id)

View file

@ -550,19 +550,21 @@ pandora.ui.mediaView = function(options) {
{disabled: true, title: Ox._('Moving Files...')} {disabled: true, title: Ox._('Moving Files...')}
); );
pandora.api.moveMedia(data, function(result) { pandora.api.moveMedia(data, function(result) {
if (isActive()) { pandora.wait(result.data.taskId, function(result) {
Ox.Request.clearCache(); // fixme: remove if (isActive()) {
if (self.$switch.value()) { Ox.Request.clearCache(); // fixme: remove
pandora.UI.set({item: result.data.item}); if (self.$switch.value()) {
pandora.updateItemContext(); pandora.UI.set({item: result.data.item});
} else { pandora.updateItemContext();
self.$filesList.reloadList(); } else {
self.$instancesList.reloadList(); self.$filesList.reloadList();
self.$moveButton.options( self.$instancesList.reloadList();
{disabled: false, title: Ox._('Move Files')} self.$moveButton.options(
); {disabled: false, title: Ox._('Move Files')}
);
}
} }
} });
}); });
} }