Skip to content

Commit 36c7f5b

Browse files
committed
Fix serving static files from third-party services. #384 #385
1 parent 4dc34e3 commit 36c7f5b

File tree

3 files changed

+51
-57
lines changed

3 files changed

+51
-57
lines changed

admin_interface/templates/admin/base_site.html

+31-33
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
{% block extrastyle %}
1010
{% get_admin_interface_theme as theme %}
11-
{% get_admin_interface_nocache as version_md5_cache %}
1211
{% get_current_language as current_lang %}
1312
<style>
1413
:root .admin-interface {
@@ -79,39 +78,39 @@
7978
{% endif %}
8079
}
8180
</style>
82-
<link rel="stylesheet" href="{% static 'admin_interface/css/admin-interface.css' %}?v={{ version_md5_cache }}">
83-
<link rel="stylesheet" href="{% static 'admin_interface/css/changelist.css' %}?v={{ version_md5_cache }}">
84-
<link rel="stylesheet" href="{% static 'admin_interface/css/change-form.css' %}?v={{ version_md5_cache }}">
85-
<link rel="stylesheet" href="{% static 'admin_interface/css/fieldsets.css' %}?v={{ version_md5_cache }}">
86-
<link rel="stylesheet" href="{% static 'admin_interface/css/file-upload.css' %}?v={{ version_md5_cache }}">
87-
<link rel="stylesheet" href="{% static 'admin_interface/css/header.css' %}?v={{ version_md5_cache }}">
88-
<link rel="stylesheet" href="{% static 'admin_interface/css/inlines.css' %}?v={{ version_md5_cache }}">
89-
<link rel="stylesheet" href="{% static 'admin_interface/css/jquery.ui.tabs.css' %}?v={{ version_md5_cache }}">
90-
<link rel="stylesheet" href="{% static 'admin_interface/css/language-chooser.css' %}?v={{ version_md5_cache }}">
91-
<link rel="stylesheet" href="{% static 'admin_interface/css/list-filter.css' %}?v={{ version_md5_cache }}">
92-
<link rel="stylesheet" href="{% static 'admin_interface/css/list-filter-dropdown.css' %}?v={{ version_md5_cache }}">
93-
<link rel="stylesheet" href="{% static 'admin_interface/css/login.css' %}?v={{ version_md5_cache }}">
94-
<link rel="stylesheet" href="{% static 'admin_interface/css/modules.css' %}?v={{ version_md5_cache }}">
95-
<link rel="stylesheet" href="{% static 'admin_interface/css/nav-sidebar.css' %}?v={{ version_md5_cache }}">
96-
<link rel="stylesheet" href="{% static 'admin_interface/css/paginator.css' %}?v={{ version_md5_cache }}">
97-
<link rel="stylesheet" href="{% static 'admin_interface/css/object-tools.css' %}?v={{ version_md5_cache }}">
81+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/admin-interface.css' %}">
82+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/changelist.css' %}">
83+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/change-form.css' %}">
84+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/fieldsets.css' %}">
85+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/file-upload.css' %}">
86+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/header.css' %}">
87+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/inlines.css' %}">
88+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/jquery.ui.tabs.css' %}">
89+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/language-chooser.css' %}">
90+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/list-filter.css' %}">
91+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/list-filter-dropdown.css' %}">
92+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/login.css' %}">
93+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/modules.css' %}">
94+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/nav-sidebar.css' %}">
95+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/paginator.css' %}">
96+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/object-tools.css' %}">
9897
{% if not theme.recent_actions_visible %}
99-
<link rel="stylesheet" href="{% static 'admin_interface/css/recent-actions.css' %}?v={{ version_md5_cache }}">
98+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/recent-actions.css' %}">
10099
{% endif %}
101-
<link rel="stylesheet" href="{% static 'admin_interface/css/rtl.css' %}?v={{ version_md5_cache }}">
102-
<link rel="stylesheet" href="{% static 'admin_interface/css/sticky-form-controls.css' %}?v={{ version_md5_cache }}">
103-
<link rel="stylesheet" href="{% static 'admin_interface/css/tabbed-changeform.css' %}?v={{ version_md5_cache }}">
104-
<link rel="stylesheet" href="{% static 'admin_interface/css/widgets.css' %}?v={{ version_md5_cache }}">
100+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/rtl.css' %}">
101+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/sticky-form-controls.css' %}">
102+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/tabbed-changeform.css' %}">
103+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/widgets.css' %}">
105104

106105
<!-- third-party packages compatibility / style optimizations -->
107-
<link rel="stylesheet" href="{% static 'admin_interface/css/third-party/ckeditor.css' %}?v={{ version_md5_cache }}">
108-
<link rel="stylesheet" href="{% static 'admin_interface/css/third-party/import-export.css' %}?v={{ version_md5_cache }}">
109-
<link rel="stylesheet" href="{% static 'admin_interface/css/third-party/json-widget.css' %}?v={{ version_md5_cache }}">
110-
<link rel="stylesheet" href="{% static 'admin_interface/css/third-party/modeltranslation.css' %}?v={{ version_md5_cache }}">
111-
<link rel="stylesheet" href="{% static 'admin_interface/css/third-party/rangefilter.css' %}?v={{ version_md5_cache }}">
112-
<link rel="stylesheet" href="{% static 'admin_interface/css/third-party/sorl-thumbnail.css' %}?v={{ version_md5_cache }}">
113-
<link rel="stylesheet" href="{% static 'admin_interface/css/third-party/streamfield.css' %}?v={{ version_md5_cache }}">
114-
<link rel="stylesheet" href="{% static 'admin_interface/css/third-party/tinymce.css' %}?v={{ version_md5_cache }}">
106+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/third-party/ckeditor.css' %}">
107+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/third-party/import-export.css' %}">
108+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/third-party/json-widget.css' %}">
109+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/third-party/modeltranslation.css' %}">
110+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/third-party/rangefilter.css' %}">
111+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/third-party/sorl-thumbnail.css' %}">
112+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/third-party/streamfield.css' %}">
113+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin_interface/css/third-party/tinymce.css' %}">
115114
<!-- end third-party packages compatibility / style optimizations -->
116115

117116
{% if current_lang == 'fa' %}
@@ -123,11 +122,10 @@
123122
{% block blockbots %}
124123
{{ block.super }}
125124
{% get_admin_interface_theme as theme %}
126-
{% get_admin_interface_nocache as version_md5_cache %}
127125
{# https://github.com/elky/django-flat-responsive#important-note #}
128126
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0">
129-
<link rel="stylesheet" href="{% static 'admin/css/responsive.css' %}?nocache={{ version_md5_cache }}">
130-
<link rel="stylesheet" href="{% static 'admin/css/responsive_rtl.css' %}?nocache={{ version_md5_cache }}">
127+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin/css/responsive.css' %}?nocache={{ version_md5_cache }}">
128+
<link rel="stylesheet" href="{% get_admin_interface_static 'admin/css/responsive_rtl.css' %}?nocache={{ version_md5_cache }}">
131129
{% include "admin_interface/favicon.html" %}
132130
{% include "admin_interface/foldable-apps.html" %}
133131
{% include "admin_interface/related-modal.html" %}

admin_interface/templatetags/admin_interface_tags.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from django import template
77
from django.conf import settings
88
from django.contrib.admin.utils import get_fields_from_path
9+
from django.templatetags.static import static
910
from django.urls import NoReverseMatch, reverse
1011
from django.utils import translation
1112
from slugify import slugify
@@ -81,20 +82,19 @@ def get_admin_interface_inline_template(template):
8182
return "/".join(template_path)
8283

8384

84-
@register.simple_tag()
85-
def get_admin_interface_version():
86-
return __version__
87-
88-
8985
def hash_string(text):
9086
hash_object = hashlib.sha224(text.encode())
9187
sha224_hash = hash_object.hexdigest()
9288
return sha224_hash
9389

9490

95-
@register.simple_tag()
96-
def get_admin_interface_nocache():
97-
return hash_string(__version__)
91+
@register.simple_tag(takes_context=False)
92+
def get_admin_interface_static(path):
93+
url = static(path)
94+
if not url.startswith(("https://", "http://", "//")):
95+
version_hash = hash_string(__version__)
96+
url = f"{url}?v={version_hash}"
97+
return url
9898

9999

100100
@register.simple_tag(takes_context=False)

tests/test_templatetags.py

+12-16
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
from datetime import date
22
from unittest.mock import Mock
33

4+
from django.conf import settings
45
from django.contrib.admin.views.main import ChangeList
56
from django.template import Context, Template
67
from django.test import TestCase, override_settings
78
from django.test.client import RequestFactory
89

9-
from admin_interface.metadata import __version__
1010
from admin_interface.models import Theme
1111
from admin_interface.templatetags import admin_interface_tags as templatetags
12-
from admin_interface.templatetags.admin_interface_tags import hash_string
1312

1413

1514
class AdminInterfaceTemplateTagsTestCase(TestCase):
@@ -104,27 +103,24 @@ def test_get_setting(self):
104103
title = templatetags.get_admin_interface_setting("title")
105104
self.assertEqual(title, "Django administration")
106105

107-
def test_get_version(self):
108-
version = templatetags.get_admin_interface_version()
109-
self.assertEqual(version, __version__)
106+
def test_get_static(self):
107+
path = "admin_interface/css/admin-interface.css"
110108
rendered = self.__render_template(
111109
"{% load admin_interface_tags %}"
112-
"{% get_admin_interface_version as version %}"
113-
"{{ version }}"
110+
f"{{% get_admin_interface_static '{path}' %}}"
114111
)
115-
self.assertEqual(rendered, __version__)
116-
117-
def test_get_version_nocache(self):
118-
hash_from_tag = templatetags.get_admin_interface_nocache()
119-
hash_manual = hash_string(__version__)
120-
self.assertEqual(hash_from_tag, hash_manual)
112+
self.assertTrue(rendered.startswith(f"{settings.STATIC_URL}{path}?v="))
121113

114+
@override_settings(
115+
STATIC_URL="https://bucket.s3.amazonaws.com/static/",
116+
)
117+
def test_get_static_with_s3_url(self):
118+
path = "admin_interface/css/admin-interface.css"
122119
rendered = self.__render_template(
123120
"{% load admin_interface_tags %}"
124-
"{% get_admin_interface_nocache as version_md5_hash %}"
125-
"{{ version_md5_hash }}"
121+
f"{{% get_admin_interface_static '{path}' %}}"
126122
)
127-
self.assertEqual(rendered, hash_manual)
123+
self.assertEqual(rendered, f"{settings.STATIC_URL}{path}")
128124

129125
def test_get_admin_interface_inline_template(self):
130126
headless_template = templatetags.get_admin_interface_inline_template(

0 commit comments

Comments
 (0)