From 2689ce19b14c7d8eb02fe8b125a0ef5ba977d97d 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 | 11 +++++++++++ tests/test_manager.py | 3 +++ 3 files changed, 15 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..01ace89 100644 --- a/combo/apps/assets/views.py +++ b/combo/apps/assets/views.py @@ -20,7 +20,9 @@ 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 import static from django.views.generic import TemplateView, ListView, FormView import ckeditor @@ -202,3 +204,12 @@ class SlotAssetDelete(TemplateView): return redirect(reverse('combo-manager-assets')) slot_asset_delete = SlotAssetDelete.as_view() + + +def serve_asset(request, *args, **kwargs): + try: + asset = Asset.objects.get(key=kwargs['key']) + path = asset.asset.path + except (Asset.DoesNotExist, AttributeError): + raise Http404() + return static.serve(request, path, document_root='/') diff --git a/tests/test_manager.py b/tests/test_manager.py index 2433461..9d98765 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')['content-type'] == 'image/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