assets: always redirect user to most appropriate page (#21609)
This commit is contained in:
parent
4ea3c2c920
commit
ce07e03a5d
|
@ -120,13 +120,22 @@ class Assets(ListView):
|
||||||
context['query'] = self.request.GET.get('q') or ''
|
context['query'] = self.request.GET.get('q') or ''
|
||||||
return context
|
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()
|
assets = Assets.as_view()
|
||||||
|
|
||||||
|
|
||||||
class AssetUpload(FormView):
|
class AssetUpload(FormView):
|
||||||
form_class = AssetUploadForm
|
form_class = AssetUploadForm
|
||||||
template_name = 'combo/manager_asset_upload.html'
|
template_name = 'combo/manager_asset_upload.html'
|
||||||
success_url = reverse_lazy('combo-manager-assets')
|
|
||||||
|
|
||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
# use native ckeditor view so it's available from ckeditor file/image
|
# 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)
|
ckeditor_upload_view.post(self.request)
|
||||||
return super(AssetUpload, self).form_valid(form)
|
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()
|
asset_upload = AssetUpload.as_view()
|
||||||
|
|
||||||
|
|
||||||
|
@ -171,6 +183,10 @@ class AssetOverwrite(FormView):
|
||||||
backend.create_thumbnail(saved_path)
|
backend.create_thumbnail(saved_path)
|
||||||
return super(AssetOverwrite, self).form_valid(form)
|
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()
|
asset_overwrite = AssetOverwrite.as_view()
|
||||||
|
|
||||||
|
|
||||||
|
@ -187,7 +203,9 @@ class AssetDelete(TemplateView):
|
||||||
if not img_orig.startswith(base_path):
|
if not img_orig.startswith(base_path):
|
||||||
raise PermissionDenied()
|
raise PermissionDenied()
|
||||||
default_storage.delete(img_orig)
|
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()
|
asset_delete = AssetDelete.as_view()
|
||||||
|
|
||||||
|
@ -199,13 +217,16 @@ class SlotAssetUpload(FormView):
|
||||||
|
|
||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
try:
|
try:
|
||||||
asset = Asset.objects.get(key=self.kwargs['key'])
|
self.asset = Asset.objects.get(key=self.kwargs['key'])
|
||||||
except Asset.DoesNotExist:
|
except Asset.DoesNotExist:
|
||||||
asset = Asset(key=self.kwargs['key'])
|
self.asset = Asset(key=self.kwargs['key'])
|
||||||
asset.asset = self.request.FILES['upload']
|
self.asset.asset = self.request.FILES['upload']
|
||||||
asset.save()
|
self.asset.save()
|
||||||
return super(SlotAssetUpload, self).form_valid(form)
|
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()
|
slot_asset_upload = SlotAssetUpload.as_view()
|
||||||
|
|
||||||
|
|
||||||
|
@ -214,7 +235,7 @@ class SlotAssetDelete(TemplateView):
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
Asset.objects.filter(key=kwargs['key']).delete()
|
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()
|
slot_asset_delete = SlotAssetDelete.as_view()
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,13 @@ def admin_user():
|
||||||
user = User.objects.create_superuser('admin', email=None, password='admin')
|
user = User.objects.create_superuser('admin', email=None, password='admin')
|
||||||
return user
|
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'):
|
def login(app, username='admin', password='admin'):
|
||||||
login_page = app.get('/login/')
|
login_page = app.get('/login/')
|
||||||
login_form = login_page.forms[0]
|
login_form = login_page.forms[0]
|
||||||
|
@ -711,7 +718,43 @@ def test_asset_management(app, admin_user):
|
||||||
resp = resp.form.submit().follow()
|
resp = resp.form.submit().follow()
|
||||||
assert 'have any asset yet.' in resp.text
|
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)
|
app = login(app)
|
||||||
|
|
||||||
filepath = os.path.join(settings.CKEDITOR_UPLOAD_PATH, 'test.png')
|
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()
|
resp = resp.form.submit()
|
||||||
assert resp.text.count('<tr class="asset') == 2
|
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)
|
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
|
assert Asset.objects.count() == 0
|
||||||
|
|
||||||
with override_settings(COMBO_ASSET_SLOTS={'collectivity:banner': {'label': 'Banner'}}):
|
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',
|
resp.form['upload'] = Upload('test.png',
|
||||||
base64.decodestring(b'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVQI12NgAgAABAADRWoApgAA\nAABJRU5ErkJggg=='),
|
base64.decodestring(b'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVQI12NgAgAABAADRWoApgAA\nAABJRU5ErkJggg=='),
|
||||||
'image/png')
|
'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 'test.png' in resp.text
|
||||||
assert '>Delete<' in resp.text
|
assert '>Delete<' in resp.text
|
||||||
assert Asset.objects.filter(key='collectivity:banner').count() == 1
|
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
|
assert Asset.objects.filter(key='collectivity:banner').count() == 1
|
||||||
|
|
||||||
resp = resp.click('Delete')
|
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 '>Banner<' in resp.text
|
||||||
assert '>Delete<' not in resp.text
|
assert '>Delete<' not in resp.text
|
||||||
assert Asset.objects.filter(key='collectivity:banner').count() == 0
|
assert Asset.objects.filter(key='collectivity:banner').count() == 0
|
||||||
|
|
Loading…
Reference in New Issue