Refactored Component class

# Conflicts:
#	README.md
#	pyproject.toml
This commit is contained in:
Emil Stenström 2021-09-10 11:27:28 +02:00
parent 55f46d6069
commit 5b9188cc9c
8 changed files with 91 additions and 111 deletions

View file

@ -2,6 +2,7 @@ import warnings
from functools import lru_cache
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.forms.widgets import MediaDefiningClass
from django.template.base import Node, TokenType
from django.template.loader import get_template
@ -41,17 +42,21 @@ class SimplifiedInterfaceMediaDefiningClass(MediaDefiningClass):
class Component(metaclass=SimplifiedInterfaceMediaDefiningClass):
template_name = None
def __init__(self, component_name):
self._component_name = component_name
self.instance_template = None
self.slots = {}
def context(self):
return {}
def get_context(self, *args, **kwargs):
return kwargs
def template(self, context):
raise NotImplementedError("Missing template() method on component")
def get_template_name(self, context=None):
if not self.template_name:
raise ImproperlyConfigured(f'Template name is not set for Component {self.__class__.__name__}')
return self.template_name
def render_dependencies(self):
"""Helper function to access media.render()"""
@ -112,7 +117,21 @@ class Component(metaclass=SimplifiedInterfaceMediaDefiningClass):
return component_template
def render(self, context):
template_name = self.template(context)
if hasattr(self, 'context'):
warnings.warn(
f'{self.__class__.__name__}: `context` method is deprecated, use `get_context` instead',
DeprecationWarning
)
if hasattr(self, 'template'):
warnings.warn(
f'{self.__class__.__name__}: `template` method is deprecated, set `template_name` or override `get_template_name` instead',
DeprecationWarning
)
template_name = self.template(context)
else:
template_name = self.get_template_name(context)
instance_template = self.get_processed_template(template_name)
with context.update({ACTIVE_SLOT_CONTEXT_KEY: self.slots}):
return instance_template.render(context)

View file

@ -149,7 +149,7 @@ class ComponentNode(Node):
# context method to get values to insert into the context
resolved_context_args = [safe_resolve(arg, context) for arg in self.context_args]
resolved_context_kwargs = {key: safe_resolve(kwarg, context) for key, kwarg in self.context_kwargs.items()}
component_context = self.component.context(*resolved_context_args, **resolved_context_kwargs)
component_context = self.component.get_context(*resolved_context_args, **resolved_context_kwargs)
# Create a fresh context if requested
if self.isolated_context: