forked from wagtail/wagtail
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move sprite hashing out of module import time
This speeds up application startup. The hash is now a query param, injected in the template. As this param is only needed for cache invalidation, it's optional. A helper method is provided to generate the URL, along with a template tag. This also migrates to an `lru_cache` over a global variable for simplicity. Fixes wagtail#11680
- Loading branch information
1 parent
d00df53
commit 35a197d
Showing
8 changed files
with
65 additions
and
68 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
import hashlib | ||
import itertools | ||
import re | ||
from functools import lru_cache | ||
|
||
from django.conf import settings | ||
from django.template.loader import render_to_string | ||
from django.urls import reverse | ||
|
||
from wagtail import hooks | ||
|
||
icon_comment_pattern = re.compile(r"<!--.*?-->") | ||
|
||
|
||
@lru_cache(maxsize=None) | ||
def get_icons(): | ||
icon_hooks = hooks.get_hooks("register_icons") | ||
all_icons = sorted(itertools.chain.from_iterable(hook([]) for hook in icon_hooks)) | ||
combined_icon_markup = "" | ||
for icon in all_icons: | ||
symbol = ( | ||
render_to_string(icon) | ||
.replace('xmlns="http://www.w3.org/2000/svg"', "") | ||
.replace("svg", "symbol") | ||
) | ||
symbol = icon_comment_pattern.sub("", symbol) | ||
combined_icon_markup += symbol | ||
|
||
return render_to_string( | ||
"wagtailadmin/shared/icons.html", {"icons": combined_icon_markup} | ||
) | ||
|
||
|
||
@lru_cache(maxsize=None) | ||
def get_icon_sprite_hash(): | ||
# SECRET_KEY is used to prevent exposing the Wagtail version | ||
return hashlib.sha1( | ||
(get_icons() + settings.SECRET_KEY).encode("utf-8") | ||
).hexdigest()[:8] | ||
|
||
|
||
def get_icon_sprite_url(): | ||
return reverse("wagtailadmin_sprite") + f"?h={get_icon_sprite_hash()}" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,26 +1,17 @@ | ||
import re | ||
from django.test import SimpleTestCase | ||
|
||
from django.test import TestCase | ||
from django.urls import reverse | ||
from wagtail.admin.icons import get_icon_sprite_hash, get_icon_sprite_url | ||
|
||
from wagtail.admin.urls import get_sprite_hash, sprite_hash | ||
|
||
class TestIconSpriteView(SimpleTestCase): | ||
def test_content_type(self): | ||
response = self.client.get(get_icon_sprite_url()) | ||
self.assertEqual( | ||
response.headers["Content-Type"], "image/svg+xml; charset=utf-8" | ||
) | ||
self.assertEqual(response.wsgi_request.GET["h"], get_icon_sprite_hash()) | ||
|
||
class TestIconSprite(TestCase): | ||
def test_get_sprite_hash(self): | ||
result = get_sprite_hash() | ||
self.assertTrue(bool(re.match(r"^[a-z0-9]{8}$", result))) | ||
|
||
def test_hash_var(self): | ||
self.assertIsInstance(sprite_hash, str) | ||
self.assertEqual(len(sprite_hash), 8) | ||
|
||
def test_url(self): | ||
url = reverse("wagtailadmin_sprite") | ||
self.assertEqual(url[:14], "/admin/sprite-") | ||
|
||
def test_view(self): | ||
response = self.client.get(reverse("wagtailadmin_sprite")) | ||
self.assertIn( | ||
"Content-Type: text/html; charset=utf-8", str(response.serialize_headers()) | ||
) | ||
class TestIconSpriteHash(SimpleTestCase): | ||
def test_hash(self): | ||
self.assertEqual(len(get_icon_sprite_hash()), 8) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters