From 281c047cfbcc1e4e530f327dd66783ee6b9f50f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Wed, 20 Jun 2018 20:29:56 +0200 Subject: [PATCH] general: give assets a stable URI (#24676) --- combo/apps/assets/urls.py | 1 + combo/apps/assets/views.py | 9 +++++++++ tests/test_manager.py | 3 +++ 3 files changed, 13 insertions(+) diff --git a/combo/apps/assets/urls.py b/combo/apps/assets/urls.py index 4d5c9d8..087716b 100644 --- a/combo/apps/assets/urls.py +++ b/combo/apps/assets/urls.py @@ -30,6 +30,7 @@ assets_manager_urls = [ ] urlpatterns = [ + url(r'^assets/(?P[\w_:-]+)$', views.serve_asset), url(r'^manage/assets/', decorated_includes(manager_required, include(assets_manager_urls))), ] diff --git a/combo/apps/assets/views.py b/combo/apps/assets/views.py index 5b5ea33..4e81f45 100644 --- a/combo/apps/assets/views.py +++ b/combo/apps/assets/views.py @@ -20,6 +20,7 @@ from django.conf import settings from django.core.exceptions import PermissionDenied from django.core.files.storage import default_storage from django.core.urlresolvers import reverse, reverse_lazy +from django.http import Http404 from django.shortcuts import redirect from django.views.generic import TemplateView, ListView, FormView @@ -202,3 +203,11 @@ class SlotAssetDelete(TemplateView): return redirect(reverse('combo-manager-assets')) slot_asset_delete = SlotAssetDelete.as_view() + + +def serve_asset(request, key): + try: + asset = Asset.objects.get(key=key) + return redirect(asset.asset.url) + except (Asset.DoesNotExist, AttributeError): + raise Http404() diff --git a/tests/test_manager.py b/tests/test_manager.py index 2433461..770ef87 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -676,6 +676,8 @@ def test_asset_slots_management(app, admin_user): assert '>Delete<' in resp.body assert Asset.objects.filter(key='collectivity:banner').count() == 1 + assert app.get('/assets/collectivity:banner', status=302)['location'].endswith('test.png') + # upload a new version of image resp = resp.click('Overwrite') resp.form['upload'] = Upload('test2.png', @@ -692,6 +694,7 @@ def test_asset_slots_management(app, admin_user): assert '>Delete<' not in resp.body assert Asset.objects.filter(key='collectivity:banner').count() == 0 + resp = app.get('/assets/collectivity:banner', status=404) def test_menu_json(app, admin_user): app.get('/manage/menu.json', status=302) -- 2.17.1