0001-assets-always-redirect-user-to-most-appropriate-page.patch
combo/apps/assets/views.py | ||
---|---|---|
120 | 120 |
context['query'] = self.request.GET.get('q') or '' |
121 | 121 |
return context |
122 | 122 | |
123 |
def get_anchored_url(self, key=None, name=None): |
|
124 |
url = reverse('combo-manager-assets') |
|
125 |
for i, asset in enumerate(self.get_queryset()): |
|
126 |
if key and key != getattr(asset, 'key', None): |
|
127 |
continue |
|
128 |
if name and name > getattr(asset, 'name', None): |
|
129 |
continue |
|
130 |
return url + '?page=%s' % ((i // self.paginate_by) + 1) |
|
131 |
return url |
|
132 | ||
123 | 133 |
assets = Assets.as_view() |
124 | 134 | |
125 | 135 | |
126 | 136 |
class AssetUpload(FormView): |
127 | 137 |
form_class = AssetUploadForm |
128 | 138 |
template_name = 'combo/manager_asset_upload.html' |
129 |
success_url = reverse_lazy('combo-manager-assets') |
|
130 | 139 | |
131 | 140 |
def form_valid(self, form): |
132 | 141 |
# use native ckeditor view so it's available from ckeditor file/image |
... | ... | |
136 | 145 |
ckeditor_upload_view.post(self.request) |
137 | 146 |
return super(AssetUpload, self).form_valid(form) |
138 | 147 | |
148 |
def get_success_url(self): |
|
149 |
return Assets(request=self.request).get_anchored_url(name=self.request.FILES['upload'].name) |
|
150 | ||
139 | 151 |
asset_upload = AssetUpload.as_view() |
140 | 152 | |
141 | 153 | |
... | ... | |
171 | 183 |
backend.create_thumbnail(saved_path) |
172 | 184 |
return super(AssetOverwrite, self).form_valid(form) |
173 | 185 | |
186 |
def get_success_url(self): |
|
187 |
img_orig = self.request.GET['img'] |
|
188 |
return Assets(request=self.request).get_anchored_url(name=os.path.basename(img_orig)) |
|
189 | ||
174 | 190 |
asset_overwrite = AssetOverwrite.as_view() |
175 | 191 | |
176 | 192 | |
... | ... | |
187 | 203 |
if not img_orig.startswith(base_path): |
188 | 204 |
raise PermissionDenied() |
189 | 205 |
default_storage.delete(img_orig) |
190 |
return redirect(reverse('combo-manager-assets')) |
|
206 |
return redirect( |
|
207 |
Assets(request=self.request).get_anchored_url( |
|
208 |
name=os.path.basename(img_orig))) |
|
191 | 209 | |
192 | 210 |
asset_delete = AssetDelete.as_view() |
193 | 211 | |
... | ... | |
199 | 217 | |
200 | 218 |
def form_valid(self, form): |
201 | 219 |
try: |
202 |
asset = Asset.objects.get(key=self.kwargs['key']) |
|
220 |
self.asset = Asset.objects.get(key=self.kwargs['key'])
|
|
203 | 221 |
except Asset.DoesNotExist: |
204 |
asset = Asset(key=self.kwargs['key']) |
|
205 |
asset.asset = self.request.FILES['upload'] |
|
206 |
asset.save() |
|
222 |
self.asset = Asset(key=self.kwargs['key'])
|
|
223 |
self.asset.asset = self.request.FILES['upload']
|
|
224 |
self.asset.save()
|
|
207 | 225 |
return super(SlotAssetUpload, self).form_valid(form) |
208 | 226 | |
227 |
def get_success_url(self): |
|
228 |
return Assets(request=self.request).get_anchored_url(key=self.kwargs['key']) |
|
229 | ||
209 | 230 |
slot_asset_upload = SlotAssetUpload.as_view() |
210 | 231 | |
211 | 232 | |
... | ... | |
214 | 235 | |
215 | 236 |
def post(self, request, *args, **kwargs): |
216 | 237 |
Asset.objects.filter(key=kwargs['key']).delete() |
217 |
return redirect(reverse('combo-manager-assets'))
|
|
238 |
return redirect(Assets(request=self.request).get_anchored_url(key=kwargs['key']))
|
|
218 | 239 | |
219 | 240 |
slot_asset_delete = SlotAssetDelete.as_view() |
220 | 241 |
tests/test_manager.py | ||
---|---|---|
38 | 38 |
user = User.objects.create_superuser('admin', email=None, password='admin') |
39 | 39 |
return user |
40 | 40 | |
41 |
@pytest.fixture |
|
42 |
def clean_media(): |
|
43 |
for path in ('uploads', 'assets'): |
|
44 |
if os.path.exists(default_storage.path(path)): |
|
45 |
shutil.rmtree(default_storage.path(path)) |
|
46 |
return None |
|
47 | ||
41 | 48 |
def login(app, username='admin', password='admin'): |
42 | 49 |
login_page = app.get('/login/') |
43 | 50 |
login_form = login_page.forms[0] |
... | ... | |
711 | 718 |
resp = resp.form.submit().follow() |
712 | 719 |
assert 'have any asset yet.' in resp.text |
713 | 720 | |
714 |
def test_asset_management_search(app, admin_user): |
|
721 |
def test_asset_management_anchor(app, admin_user): |
|
722 |
app = login(app) |
|
723 |
resp = app.get('/manage/assets/') |
|
724 |
assert 'have any asset yet.' in resp.text |
|
725 | ||
726 |
for i in range(25): |
|
727 |
filepath = os.path.join(settings.CKEDITOR_UPLOAD_PATH, 'cc.png') |
|
728 |
pix = b'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQAAAAA3bvkkAAAACklEQVQI12NoAAAAggCB3UNq9AAAAABJRU5ErkJggg==' |
|
729 |
default_storage.save(filepath, BytesIO(base64.decodestring(pix))) |
|
730 | ||
731 |
# test upload |
|
732 |
resp = app.get('/manage/assets/') |
|
733 |
resp = resp.click('Upload') |
|
734 |
resp.form['upload'] = Upload('test.png', |
|
735 |
base64.decodestring(b'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQAAAAA3bvkkAAAACklEQVQI12NoAAAAggCB3UNq9AAAAABJRU5ErkJggg=='), |
|
736 |
'image/png') |
|
737 |
resp = resp.form.submit() |
|
738 |
assert resp.location.endswith('?page=3') |
|
739 |
resp = resp.follow() |
|
740 | ||
741 |
# overwrite |
|
742 |
resp = resp.click(href=re.compile('overwrite.*test.png')) |
|
743 |
resp.form['upload'] = Upload('aa.png', |
|
744 |
base64.decodestring(b'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVQI12NgAgAABAADRWoApgAA\nAABJRU5ErkJggg=='), |
|
745 |
'image/png') |
|
746 |
resp = resp.form.submit() |
|
747 |
assert resp.location.endswith('?page=3') |
|
748 |
resp = resp.follow() |
|
749 | ||
750 |
# delete |
|
751 |
resp = resp.click(href=re.compile('delete.*test.png')) |
|
752 |
resp = resp.form.submit() |
|
753 |
assert resp.location.endswith('?page=3') |
|
754 |
resp = resp.follow() |
|
755 |
assert 'test.png' not in resp.text |
|
756 | ||
757 |
def test_asset_management_search(app, admin_user, clean_media): |
|
715 | 758 |
app = login(app) |
716 | 759 | |
717 | 760 |
filepath = os.path.join(settings.CKEDITOR_UPLOAD_PATH, 'test.png') |
... | ... | |
732 | 775 |
resp = resp.form.submit() |
733 | 776 |
assert resp.text.count('<tr class="asset') == 2 |
734 | 777 | |
735 |
def test_asset_slots_management(app, admin_user): |
|
778 |
def test_asset_slots_management(app, admin_user, clean_media):
|
|
736 | 779 |
app = login(app) |
737 | ||
738 |
for path in ('uploads', 'assets'): |
|
739 |
if os.path.exists(default_storage.path(path)): |
|
740 |
shutil.rmtree(default_storage.path(path)) |
|
741 | 780 |
assert Asset.objects.count() == 0 |
742 | 781 | |
743 | 782 |
with override_settings(COMBO_ASSET_SLOTS={'collectivity:banner': {'label': 'Banner'}}): |
... | ... | |
749 | 788 |
resp.form['upload'] = Upload('test.png', |
750 | 789 |
base64.decodestring(b'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVQI12NgAgAABAADRWoApgAA\nAABJRU5ErkJggg=='), |
751 | 790 |
'image/png') |
752 |
resp = resp.form.submit().follow() |
|
791 |
resp = resp.form.submit() |
|
792 |
assert resp.location.endswith('?page=1') |
|
793 |
resp = resp.follow() |
|
753 | 794 |
assert 'test.png' in resp.text |
754 | 795 |
assert '>Delete<' in resp.text |
755 | 796 |
assert Asset.objects.filter(key='collectivity:banner').count() == 1 |
... | ... | |
768 | 809 |
assert Asset.objects.filter(key='collectivity:banner').count() == 1 |
769 | 810 | |
770 | 811 |
resp = resp.click('Delete') |
771 |
resp = resp.form.submit().follow() |
|
812 |
resp = resp.form.submit() |
|
813 |
assert resp.location.endswith('?page=1') |
|
814 |
resp = resp.follow() |
|
772 | 815 |
assert '>Banner<' in resp.text |
773 | 816 |
assert '>Delete<' not in resp.text |
774 | 817 |
assert Asset.objects.filter(key='collectivity:banner').count() == 0 |
775 |
- |