mirror of
https://github.com/django-components/django-components.git
synced 2025-08-30 18:57:20 +00:00
refactor: fix use of URLs in Component.Media (#1064)
This commit is contained in:
parent
25e99854c0
commit
2472c2ad33
4 changed files with 51 additions and 2 deletions
|
@ -1,5 +1,11 @@
|
|||
# Release notes
|
||||
|
||||
## v0.133
|
||||
|
||||
#### Fix
|
||||
|
||||
- HOTFIX: Fix the use of URLs in `Component.Media.js` and `Component.Media.css`
|
||||
|
||||
## v0.132
|
||||
|
||||
#### Feat
|
||||
|
|
|
@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|||
|
||||
[project]
|
||||
name = "django_components"
|
||||
version = "0.132"
|
||||
version = "0.133"
|
||||
requires-python = ">=3.8, <4.0"
|
||||
description = "A way to create simple reusable template components in Django."
|
||||
keywords = ["django", "components", "css", "js", "html"]
|
||||
|
|
|
@ -865,9 +865,14 @@ def resolve_media_file(
|
|||
|
||||
filepath_abs_or_glob = os.path.join(media_root_dir, filepath)
|
||||
|
||||
# If the path is a URL, don't resolve it
|
||||
# (e.g. https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.0.2/chart.min.js)
|
||||
# This is defined based on Django's `Media.absolute_path()` method.
|
||||
is_url_path = filepath.startswith(("http://", "https", "/"))
|
||||
|
||||
# The path may be a glob. So before we check if the file exists,
|
||||
# we need to resolve the glob.
|
||||
if allow_glob and is_glob(filepath_abs_or_glob):
|
||||
if allow_glob and is_glob(filepath_abs_or_glob) and not is_url_path:
|
||||
matched_abs_filepaths = glob.glob(filepath_abs_or_glob)
|
||||
else:
|
||||
matched_abs_filepaths = [filepath_abs_or_glob]
|
||||
|
|
|
@ -414,6 +414,44 @@ class TestComponentMedia:
|
|||
assertInHTML('<script src="glob/glob_1.js"></script>', rendered)
|
||||
assertInHTML('<script src="glob/glob_2.js"></script>', rendered)
|
||||
|
||||
def test_glob_pattern_does_not_break_urls(self):
|
||||
class MyComponent(Component):
|
||||
template = """
|
||||
{% load component_tags %}
|
||||
{% component_js_dependencies %}
|
||||
{% component_css_dependencies %}
|
||||
"""
|
||||
|
||||
class Media:
|
||||
css = [
|
||||
"https://cdnjs.cloudflare.com/example/style.min.css",
|
||||
"http://cdnjs.cloudflare.com/example/style.min.css",
|
||||
# :// is not a valid URL - will be resolved as static path
|
||||
"://cdnjs.cloudflare.com/example/style.min.css",
|
||||
"/path/to/style.css",
|
||||
]
|
||||
js = [
|
||||
"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.0.2/chart.min.js",
|
||||
"http://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.0.2/chart.min.js",
|
||||
# :// is not a valid URL - will be resolved as static path
|
||||
"://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.0.2/chart.min.js",
|
||||
"/path/to/script.js",
|
||||
]
|
||||
|
||||
rendered = MyComponent.render()
|
||||
|
||||
assertInHTML('<link href="https://cdnjs.cloudflare.com/example/style.min.css" media="all" rel="stylesheet">', rendered)
|
||||
assertInHTML('<link href="http://cdnjs.cloudflare.com/example/style.min.css" media="all" rel="stylesheet">', rendered)
|
||||
# `://` is escaped because the path was resolved with Django's `static()`
|
||||
assertInHTML('<link href="%3A//cdnjs.cloudflare.com/example/style.min.css" media="all" rel="stylesheet">', rendered)
|
||||
assertInHTML('<link href="/path/to/style.css" media="all" rel="stylesheet">', rendered)
|
||||
|
||||
assertInHTML('<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.0.2/chart.min.js"></script>', rendered)
|
||||
assertInHTML('<script src="http://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.0.2/chart.min.js"></script>', rendered)
|
||||
# `://` is escaped because the path was resolved with Django's `static()`
|
||||
assertInHTML('<script src="%3A//cdnjs.cloudflare.com/ajax/libs/Chart.js/3.0.2/chart.min.js"></script>', rendered)
|
||||
assertInHTML('<script src="/path/to/script.js"></script>', rendered)
|
||||
|
||||
|
||||
@djc_test
|
||||
class TestMediaPathAsObject:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue