assets: always redirect user to most appropriate page (#21609)

This commit is contained in:
Frédéric Péters 2018-11-15 15:14:24 +01:00
parent 4ea3c2c920
commit ce07e03a5d
2 changed files with 79 additions and 15 deletions

View File

@ -120,13 +120,22 @@ class Assets(ListView):
context['query'] = self.request.GET.get('q') or ''
return context
def get_anchored_url(self, key=None, name=None):
url = reverse('combo-manager-assets')
for i, asset in enumerate(self.get_queryset()):
if key and key != getattr(asset, 'key', None):
continue
if name and name > getattr(asset, 'name', None):
continue
return url + '?page=%s' % ((i // self.paginate_by) + 1)
return url
assets = Assets.as_view()
class AssetUpload(FormView):
form_class = AssetUploadForm
template_name = 'combo/manager_asset_upload.html'
success_url = reverse_lazy('combo-manager-assets')
def form_valid(self, form):
# use native ckeditor view so it's available from ckeditor file/image
@ -136,6 +145,9 @@ class AssetUpload(FormView):
ckeditor_upload_view.post(self.request)
return super(AssetUpload, self).form_valid(form)
def get_success_url(self):
return Assets(request=self.request).get_anchored_url(name=self.request.FILES['upload'].name)
asset_upload = AssetUpload.as_view()
@ -171,6 +183,10 @@ class AssetOverwrite(FormView):
backend.create_thumbnail(saved_path)
return super(AssetOverwrite, self).form_valid(form)
def get_success_url(self):
img_orig = self.request.GET['img']
return Assets(request=self.request).get_anchored_url(name=os.path.basename(img_orig))
asset_overwrite = AssetOverwrite.as_view()
@ -187,7 +203,9 @@ class AssetDelete(TemplateView):
if not img_orig.startswith(base_path):
raise PermissionDenied()
default_storage.delete(img_orig)
return redirect(reverse('combo-manager-assets'))
return redirect(
Assets(request=self.request).get_anchored_url(
name=os.path.basename(img_orig)))
asset_delete = AssetDelete.as_view()
@ -199,13 +217,16 @@ class SlotAssetUpload(FormView):
def form_valid(self, form):
try:
asset = Asset.objects.get(key=self.kwargs['key'])
self.asset = Asset.objects.get(key=self.kwargs['key'])
except Asset.DoesNotExist:
asset = Asset(key=self.kwargs['key'])
asset.asset = self.request.FILES['upload']
asset.save()
self.asset = Asset(key=self.kwargs['key'])
self.asset.asset = self.request.FILES['upload']
self.asset.save()
return super(SlotAssetUpload, self).form_valid(form)
def get_success_url(self):
return Assets(request=self.request).get_anchored_url(key=self.kwargs['key'])
slot_asset_upload = SlotAssetUpload.as_view()
@ -214,7 +235,7 @@ class SlotAssetDelete(TemplateView):
def post(self, request, *args, **kwargs):
Asset.objects.filter(key=kwargs['key']).delete()
return redirect(reverse('combo-manager-assets'))
return redirect(Assets(request=self.request).get_anchored_url(key=kwargs['key']))
slot_asset_delete = SlotAssetDelete.as_view()

View File

@ -38,6 +38,13 @@ def admin_user():
user = User.objects.create_superuser('admin', email=None, password='admin')
return user
@pytest.fixture
def clean_media():
for path in ('uploads', 'assets'):
if os.path.exists(default_storage.path(path)):
shutil.rmtree(default_storage.path(path))
return None
def login(app, username='admin', password='admin'):
login_page = app.get('/login/')
login_form = login_page.forms[0]
@ -711,7 +718,43 @@ def test_asset_management(app, admin_user):
resp = resp.form.submit().follow()
assert 'have any asset yet.' in resp.text
def test_asset_management_search(app, admin_user):
def test_asset_management_anchor(app, admin_user):
app = login(app)
resp = app.get('/manage/assets/')
assert 'have any asset yet.' in resp.text
for i in range(25):
filepath = os.path.join(settings.CKEDITOR_UPLOAD_PATH, 'cc.png')
pix = b'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQAAAAA3bvkkAAAACklEQVQI12NoAAAAggCB3UNq9AAAAABJRU5ErkJggg=='
default_storage.save(filepath, BytesIO(base64.decodestring(pix)))
# test upload
resp = app.get('/manage/assets/')
resp = resp.click('Upload')
resp.form['upload'] = Upload('test.png',
base64.decodestring(b'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQAAAAA3bvkkAAAACklEQVQI12NoAAAAggCB3UNq9AAAAABJRU5ErkJggg=='),
'image/png')
resp = resp.form.submit()
assert resp.location.endswith('?page=3')
resp = resp.follow()
# overwrite
resp = resp.click(href=re.compile('overwrite.*test.png'))
resp.form['upload'] = Upload('aa.png',
base64.decodestring(b'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVQI12NgAgAABAADRWoApgAA\nAABJRU5ErkJggg=='),
'image/png')
resp = resp.form.submit()
assert resp.location.endswith('?page=3')
resp = resp.follow()
# delete
resp = resp.click(href=re.compile('delete.*test.png'))
resp = resp.form.submit()
assert resp.location.endswith('?page=3')
resp = resp.follow()
assert 'test.png' not in resp.text
def test_asset_management_search(app, admin_user, clean_media):
app = login(app)
filepath = os.path.join(settings.CKEDITOR_UPLOAD_PATH, 'test.png')
@ -732,12 +775,8 @@ def test_asset_management_search(app, admin_user):
resp = resp.form.submit()
assert resp.text.count('<tr class="asset') == 2
def test_asset_slots_management(app, admin_user):
def test_asset_slots_management(app, admin_user, clean_media):
app = login(app)
for path in ('uploads', 'assets'):
if os.path.exists(default_storage.path(path)):
shutil.rmtree(default_storage.path(path))
assert Asset.objects.count() == 0
with override_settings(COMBO_ASSET_SLOTS={'collectivity:banner': {'label': 'Banner'}}):
@ -749,7 +788,9 @@ def test_asset_slots_management(app, admin_user):
resp.form['upload'] = Upload('test.png',
base64.decodestring(b'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVQI12NgAgAABAADRWoApgAA\nAABJRU5ErkJggg=='),
'image/png')
resp = resp.form.submit().follow()
resp = resp.form.submit()
assert resp.location.endswith('?page=1')
resp = resp.follow()
assert 'test.png' in resp.text
assert '>Delete<' in resp.text
assert Asset.objects.filter(key='collectivity:banner').count() == 1
@ -768,7 +809,9 @@ def test_asset_slots_management(app, admin_user):
assert Asset.objects.filter(key='collectivity:banner').count() == 1
resp = resp.click('Delete')
resp = resp.form.submit().follow()
resp = resp.form.submit()
assert resp.location.endswith('?page=1')
resp = resp.follow()
assert '>Banner<' in resp.text
assert '>Delete<' not in resp.text
assert Asset.objects.filter(key='collectivity:banner').count() == 0