diff --git a/combo/apps/assets/views.py b/combo/apps/assets/views.py index 2f53c4bf..7d39214d 100644 --- a/combo/apps/assets/views.py +++ b/combo/apps/assets/views.py @@ -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() diff --git a/tests/test_manager.py b/tests/test_manager.py index 5d5d9761..1785dca4 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -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('