|
@@ -1,8 +1,94 @@
|
|
|
from django.forms import CharField, Form, Media, MultiWidget, TextInput
|
|
|
+from django.forms.widgets import MediaAsset, Script
|
|
|
from django.template import Context, Template
|
|
|
-from django.templatetags.static import static
|
|
|
from django.test import SimpleTestCase, override_settings
|
|
|
-from django.utils.html import format_html, html_safe
|
|
|
+from django.utils.html import html_safe
|
|
|
+
|
|
|
+
|
|
|
+class CSS(MediaAsset):
|
|
|
+ element_template = '<link href="{path}"{attributes}>'
|
|
|
+
|
|
|
+ def __init__(self, href, **attributes):
|
|
|
+ super().__init__(href, **attributes)
|
|
|
+ self.attributes["rel"] = "stylesheet"
|
|
|
+
|
|
|
+
|
|
|
+@override_settings(STATIC_URL="http://media.example.com/static/")
|
|
|
+class MediaAssetTestCase(SimpleTestCase):
|
|
|
+ def test_init(self):
|
|
|
+ attributes = {"media": "all", "is": "magic-css"}
|
|
|
+ asset = MediaAsset("path/to/css", **attributes)
|
|
|
+ self.assertEqual(asset._path, "path/to/css")
|
|
|
+ self.assertEqual(asset.attributes, attributes)
|
|
|
+ self.assertIsNot(asset.attributes, attributes)
|
|
|
+
|
|
|
+ def test_eq(self):
|
|
|
+ self.assertEqual(MediaAsset("path/to/css"), MediaAsset("path/to/css"))
|
|
|
+ self.assertEqual(MediaAsset("path/to/css"), "path/to/css")
|
|
|
+ self.assertEqual(
|
|
|
+ MediaAsset("path/to/css", media="all"), MediaAsset("path/to/css")
|
|
|
+ )
|
|
|
+
|
|
|
+ self.assertNotEqual(MediaAsset("path/to/css"), MediaAsset("path/to/other.css"))
|
|
|
+ self.assertNotEqual(MediaAsset("path/to/css"), "path/to/other.css")
|
|
|
+ self.assertNotEqual(MediaAsset("path/to/css", media="all"), CSS("path/to/css"))
|
|
|
+
|
|
|
+ def test_hash(self):
|
|
|
+ self.assertEqual(hash(MediaAsset("path/to/css")), hash("path/to/css"))
|
|
|
+ self.assertEqual(
|
|
|
+ hash(MediaAsset("path/to/css")), hash(MediaAsset("path/to/css"))
|
|
|
+ )
|
|
|
+
|
|
|
+ def test_str(self):
|
|
|
+ self.assertEqual(
|
|
|
+ str(MediaAsset("path/to/css")),
|
|
|
+ "http://media.example.com/static/path/to/css",
|
|
|
+ )
|
|
|
+ self.assertEqual(
|
|
|
+ str(MediaAsset("http://media.other.com/path/to/css")),
|
|
|
+ "http://media.other.com/path/to/css",
|
|
|
+ )
|
|
|
+
|
|
|
+ def test_repr(self):
|
|
|
+ self.assertEqual(repr(MediaAsset("path/to/css")), "MediaAsset('path/to/css')")
|
|
|
+ self.assertEqual(
|
|
|
+ repr(MediaAsset("http://media.other.com/path/to/css")),
|
|
|
+ "MediaAsset('http://media.other.com/path/to/css')",
|
|
|
+ )
|
|
|
+
|
|
|
+ def test_path(self):
|
|
|
+ asset = MediaAsset("path/to/css")
|
|
|
+ self.assertEqual(asset.path, "http://media.example.com/static/path/to/css")
|
|
|
+
|
|
|
+ asset = MediaAsset("http://media.other.com/path/to/css")
|
|
|
+ self.assertEqual(asset.path, "http://media.other.com/path/to/css")
|
|
|
+
|
|
|
+ asset = MediaAsset("https://secure.other.com/path/to/css")
|
|
|
+ self.assertEqual(asset.path, "https://secure.other.com/path/to/css")
|
|
|
+
|
|
|
+ asset = MediaAsset("/absolute/path/to/css")
|
|
|
+ self.assertEqual(asset.path, "/absolute/path/to/css")
|
|
|
+
|
|
|
+ asset = MediaAsset("//absolute/path/to/css")
|
|
|
+ self.assertEqual(asset.path, "//absolute/path/to/css")
|
|
|
+
|
|
|
+
|
|
|
+@override_settings(STATIC_URL="http://media.example.com/static/")
|
|
|
+class ScriptTestCase(SimpleTestCase):
|
|
|
+ def test_init_with_src_kwarg(self):
|
|
|
+ self.assertEqual(
|
|
|
+ Script(src="path/to/js").path, "http://media.example.com/static/path/to/js"
|
|
|
+ )
|
|
|
+
|
|
|
+ def test_str(self):
|
|
|
+ self.assertHTMLEqual(
|
|
|
+ str(Script("path/to/js")),
|
|
|
+ '<script src="http://media.example.com/static/path/to/js"></script>',
|
|
|
+ )
|
|
|
+ self.assertHTMLEqual(
|
|
|
+ str(Script("path/to/js", **{"async": True, "deferred": False})),
|
|
|
+ '<script src="http://media.example.com/static/path/to/js" async></script>',
|
|
|
+ )
|
|
|
|
|
|
|
|
|
@override_settings(
|
|
@@ -714,63 +800,6 @@ class FormsMediaTestCase(SimpleTestCase):
|
|
|
self.assertEqual(merged._js_lists, [["a"]])
|
|
|
|
|
|
|
|
|
-@html_safe
|
|
|
-class Asset:
|
|
|
- def __init__(self, path):
|
|
|
- self.path = path
|
|
|
-
|
|
|
- def __eq__(self, other):
|
|
|
- return (self.__class__ == other.__class__ and self.path == other.path) or (
|
|
|
- other.__class__ == str and self.path == other
|
|
|
- )
|
|
|
-
|
|
|
- def __hash__(self):
|
|
|
- return hash(self.path)
|
|
|
-
|
|
|
- def __str__(self):
|
|
|
- return self.absolute_path(self.path)
|
|
|
-
|
|
|
- def absolute_path(self, path):
|
|
|
- """
|
|
|
- Given a relative or absolute path to a static asset, return an absolute
|
|
|
- path. An absolute path will be returned unchanged while a relative path
|
|
|
- will be passed to django.templatetags.static.static().
|
|
|
- """
|
|
|
- if path.startswith(("http://", "https://", "/")):
|
|
|
- return path
|
|
|
- return static(path)
|
|
|
-
|
|
|
- def __repr__(self):
|
|
|
- return f"{self.path!r}"
|
|
|
-
|
|
|
-
|
|
|
-class CSS(Asset):
|
|
|
- def __init__(self, path, medium):
|
|
|
- super().__init__(path)
|
|
|
- self.medium = medium
|
|
|
-
|
|
|
- def __str__(self):
|
|
|
- path = super().__str__()
|
|
|
- return format_html(
|
|
|
- '<link href="{}" media="{}" rel="stylesheet">',
|
|
|
- self.absolute_path(path),
|
|
|
- self.medium,
|
|
|
- )
|
|
|
-
|
|
|
-
|
|
|
-class JS(Asset):
|
|
|
- def __init__(self, path, integrity=None):
|
|
|
- super().__init__(path)
|
|
|
- self.integrity = integrity or ""
|
|
|
-
|
|
|
- def __str__(self, integrity=None):
|
|
|
- path = super().__str__()
|
|
|
- template = '<script src="{}"%s></script>' % (
|
|
|
- ' integrity="{}"' if self.integrity else "{}"
|
|
|
- )
|
|
|
- return format_html(template, self.absolute_path(path), self.integrity)
|
|
|
-
|
|
|
-
|
|
|
@override_settings(
|
|
|
STATIC_URL="http://media.example.com/static/",
|
|
|
)
|
|
@@ -779,17 +808,22 @@ class FormsMediaObjectTestCase(SimpleTestCase):
|
|
|
|
|
|
def test_construction(self):
|
|
|
m = Media(
|
|
|
- css={"all": (CSS("path/to/css1", "all"), CSS("/path/to/css2", "all"))},
|
|
|
+ css={
|
|
|
+ "all": (
|
|
|
+ CSS("path/to/css1", media="all"),
|
|
|
+ CSS("/path/to/css2", media="all"),
|
|
|
+ )
|
|
|
+ },
|
|
|
js=(
|
|
|
- JS("/path/to/js1"),
|
|
|
- JS("http://media.other.com/path/to/js2"),
|
|
|
- JS(
|
|
|
+ Script("/path/to/js1"),
|
|
|
+ Script("http://media.other.com/path/to/js2"),
|
|
|
+ Script(
|
|
|
"https://secure.other.com/path/to/js3",
|
|
|
integrity="9d947b87fdeb25030d56d01f7aa75800",
|
|
|
),
|
|
|
),
|
|
|
)
|
|
|
- self.assertEqual(
|
|
|
+ self.assertHTMLEqual(
|
|
|
str(m),
|
|
|
'<link href="http://media.example.com/static/path/to/css1" media="all" '
|
|
|
'rel="stylesheet">\n'
|
|
@@ -801,9 +835,9 @@ class FormsMediaObjectTestCase(SimpleTestCase):
|
|
|
)
|
|
|
self.assertEqual(
|
|
|
repr(m),
|
|
|
- "Media(css={'all': ['path/to/css1', '/path/to/css2']}, "
|
|
|
- "js=['/path/to/js1', 'http://media.other.com/path/to/js2', "
|
|
|
- "'https://secure.other.com/path/to/js3'])",
|
|
|
+ "Media(css={'all': [CSS('path/to/css1'), CSS('/path/to/css2')]}, "
|
|
|
+ "js=[Script('/path/to/js1'), Script('http://media.other.com/path/to/js2'), "
|
|
|
+ "Script('https://secure.other.com/path/to/js3')])",
|
|
|
)
|
|
|
|
|
|
def test_simplest_class(self):
|
|
@@ -823,22 +857,24 @@ class FormsMediaObjectTestCase(SimpleTestCase):
|
|
|
def test_combine_media(self):
|
|
|
class MyWidget1(TextInput):
|
|
|
class Media:
|
|
|
- css = {"all": (CSS("path/to/css1", "all"), "/path/to/css2")}
|
|
|
+ css = {"all": (CSS("path/to/css1", media="all"), "/path/to/css2")}
|
|
|
js = (
|
|
|
"/path/to/js1",
|
|
|
"http://media.other.com/path/to/js2",
|
|
|
"https://secure.other.com/path/to/js3",
|
|
|
- JS("/path/to/js4", integrity="9d947b87fdeb25030d56d01f7aa75800"),
|
|
|
+ Script(
|
|
|
+ "/path/to/js4", integrity="9d947b87fdeb25030d56d01f7aa75800"
|
|
|
+ ),
|
|
|
)
|
|
|
|
|
|
class MyWidget2(TextInput):
|
|
|
class Media:
|
|
|
- css = {"all": (CSS("/path/to/css2", "all"), "/path/to/css3")}
|
|
|
- js = (JS("/path/to/js1"), "/path/to/js4")
|
|
|
+ css = {"all": (CSS("/path/to/css2", media="all"), "/path/to/css3")}
|
|
|
+ js = (Script("/path/to/js1"), "/path/to/js4")
|
|
|
|
|
|
w1 = MyWidget1()
|
|
|
w2 = MyWidget2()
|
|
|
- self.assertEqual(
|
|
|
+ self.assertHTMLEqual(
|
|
|
str(w1.media + w2.media),
|
|
|
'<link href="http://media.example.com/static/path/to/css1" media="all" '
|
|
|
'rel="stylesheet">\n'
|
|
@@ -857,14 +893,14 @@ class FormsMediaObjectTestCase(SimpleTestCase):
|
|
|
media = Media(
|
|
|
css={
|
|
|
"all": (
|
|
|
- CSS("/path/to/css1", "all"),
|
|
|
- CSS("/path/to/css1", "all"),
|
|
|
+ CSS("/path/to/css1", media="all"),
|
|
|
+ CSS("/path/to/css1", media="all"),
|
|
|
"/path/to/css1",
|
|
|
)
|
|
|
},
|
|
|
- js=(JS("/path/to/js1"), JS("/path/to/js1"), "/path/to/js1"),
|
|
|
+ js=(Script("/path/to/js1"), Script("/path/to/js1"), "/path/to/js1"),
|
|
|
)
|
|
|
- self.assertEqual(
|
|
|
+ self.assertHTMLEqual(
|
|
|
str(media),
|
|
|
'<link href="/path/to/css1" media="all" rel="stylesheet">\n'
|
|
|
'<script src="/path/to/js1"></script>',
|