[docs]classPageTemplateView(PageViewBase):""" Extend the PageViewBase class to add logic about templates for HTML rendering. Additionnally to the base view, the context will have the following variables : page_template_name Template name used to compile the page HTML Attributes: template_name (string): Page template file path relaive to templates directoy. Used as Python template string with optional non positional argument ``{{ language_code }}`` available for internationalized pages. """template_name=None_required_page_attributes=["title","template_name","destination"]
[docs]defget_template_name(self):""" Get template file path. Returns: string: Template file path relative to templates directory. """returnself.template_name.format(language_code=self.get_lang().code)
[docs]def_recurse_template_search(self,env,template_name):""" Load involved template sources from given template file path then find their template references. Arguments: env (jinja2.Jinja2Environment): Jinja environment. template_name (string): Template file path. Returns: list: List of involved templates sources files. """template_source=env.loader.get_source(env,template_name)[0]parsed_content=env.parse(template_source)deps=[]foriteminJinja2Meta.find_referenced_templates(parsed_content):deps.append(item)deps+=self._recurse_template_search(env,item)returndeps
[docs]defget_context(self):""" Augment method from base view to insert variables related to templates. Returns: dict: Template context of variables. """super().get_context()self.context.update({"page_template_name":self.get_template_name(),})self.logger.debug(" - Initial context: {}".format(self.context))returnself.context
[docs]defintrospect(self,env):""" Take the Jinja2 environment as required argument to find every templates dependancies from page. Arguments: env (jinja2.Jinja2Environment): Jinja environment. Returns: list: List of involved templates sources files. """ifself._used_templatesisNone:self.env=envfound=self._recurse_template_search(env,self.get_template_name())self._used_templates=[self.get_template_name()]+foundself.logger.debug(" - Used templates: {}".format(self._used_templates))returnself._used_templates
[docs]defrender(self,env):""" Take the Jinja2 environment as required argument. Arguments: env (jinja2.Jinja2Environment): Jinja environment. Returns: string: HTML builded from page template with its context. """super().render(env)context=self.get_context()template=self.env.get_template(self.get_template_name())returntemplate.render(lang=self.get_lang(),**context)