From 021339d4a7a6064b20c311616395a44df5fd791a Mon Sep 17 00:00:00 2001 From: David Guillot Date: Thu, 28 Apr 2022 23:50:52 +0200 Subject: [PATCH 1/3] refactor(templatetags): make _RENDERED comment a constant --- django_components/templatetags/component_tags.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/django_components/templatetags/component_tags.py b/django_components/templatetags/component_tags.py index 1db37157..19fce9c7 100644 --- a/django_components/templatetags/component_tags.py +++ b/django_components/templatetags/component_tags.py @@ -15,6 +15,9 @@ from django_components.middleware import ( register = template.Library() +RENDERED_COMMENT_TEMPLATE = "" + + def get_components_from_registry(registry): """Returns a list unique components from the registry.""" @@ -197,7 +200,9 @@ class ComponentNode(Node): rendered_component = self.component.render(context) if self.should_render_dependencies: return ( - f"" + RENDERED_COMMENT_TEMPLATE.format( + name=self.component._component_name + ) + rendered_component ) else: From f67cd37dea6c175f4c144822ff9d5b53bbfc08b6 Mon Sep 17 00:00:00 2001 From: David Guillot Date: Thu, 28 Apr 2022 19:45:11 +0200 Subject: [PATCH 2/3] feat(templatetags): fix #143, ability to preload components --- .../templatetags/component_tags.py | 53 ++++++++++++++-- tests/test_dependency_rendering.py | 60 +++++++++++++++++++ 2 files changed, 107 insertions(+), 6 deletions(-) diff --git a/django_components/templatetags/component_tags.py b/django_components/templatetags/component_tags.py index 19fce9c7..d7c6620c 100644 --- a/django_components/templatetags/component_tags.py +++ b/django_components/templatetags/component_tags.py @@ -30,13 +30,36 @@ def get_components_from_registry(registry): return components +def get_components_from_preload_str(preload_str): + """Returns a list of unique components from a comma-separated str""" + + components = [] + for component_name in preload_str.split(","): + component_name = component_name.strip() + if not component_name: + continue + component_class = registry.get(component_name) + components.append(component_class(component_name)) + + return components + + @register.simple_tag(name="component_dependencies") -def component_dependencies_tag(): +def component_dependencies_tag(preload=""): """Marks location where CSS link and JS script tags should be rendered.""" if is_dependency_middleware_active(): + preloaded_dependencies = [] + for component in get_components_from_preload_str(preload): + preloaded_dependencies.append( + RENDERED_COMMENT_TEMPLATE.format( + name=component._component_name + ) + ) return mark_safe( - CSS_DEPENDENCY_PLACEHOLDER + JS_DEPENDENCY_PLACEHOLDER + "\n".join(preloaded_dependencies) + + CSS_DEPENDENCY_PLACEHOLDER + + JS_DEPENDENCY_PLACEHOLDER ) else: rendered_dependencies = [] @@ -47,11 +70,20 @@ def component_dependencies_tag(): @register.simple_tag(name="component_css_dependencies") -def component_css_dependencies_tag(): +def component_css_dependencies_tag(preload=""): """Marks location where CSS link tags should be rendered.""" if is_dependency_middleware_active(): - return mark_safe(CSS_DEPENDENCY_PLACEHOLDER) + preloaded_dependencies = [] + for component in get_components_from_preload_str(preload): + preloaded_dependencies.append( + RENDERED_COMMENT_TEMPLATE.format( + name=component._component_name + ) + ) + return mark_safe( + "\n".join(preloaded_dependencies) + CSS_DEPENDENCY_PLACEHOLDER + ) else: rendered_dependencies = [] for component in get_components_from_registry(registry): @@ -61,11 +93,20 @@ def component_css_dependencies_tag(): @register.simple_tag(name="component_js_dependencies") -def component_js_dependencies_tag(): +def component_js_dependencies_tag(preload=""): """Marks location where JS script tags should be rendered.""" if is_dependency_middleware_active(): - return mark_safe(JS_DEPENDENCY_PLACEHOLDER) + preloaded_dependencies = [] + for component in get_components_from_preload_str(preload): + preloaded_dependencies.append( + RENDERED_COMMENT_TEMPLATE.format( + name=component._component_name + ) + ) + return mark_safe( + "\n".join(preloaded_dependencies) + JS_DEPENDENCY_PLACEHOLDER + ) else: rendered_dependencies = [] for component in get_components_from_registry(registry): diff --git a/tests/test_dependency_rendering.py b/tests/test_dependency_rendering.py index 667636a2..cba1b29e 100644 --- a/tests/test_dependency_rendering.py +++ b/tests/test_dependency_rendering.py @@ -86,6 +86,42 @@ class ComponentMediaRenderingTests(SimpleTestCase): count=0, ) + def test_preload_dependencies_render_when_no_components_used(self): + component.registry.register(name="test", component=SimpleComponent) + + template = Template( + "{% load component_tags %}{% component_dependencies preload='test' %}" + ) + rendered = create_and_process_template_response(template) + self.assertInHTML('