mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
73a7a2d27a
* WIP * Add config_template field to Device * Pre-fetch referenced templates * Correct up_to_date callable * Add config_template FK to Device * Update & merge migrations * Add config_template FK to Platform * Add tagging support for ConfigTemplate * Catch exceptions when rendering device templates in UI * Refactor ConfigTemplate.render() * Add support for returning plain text content * Add ConfigTemplate model documentation * Add feature documentation for config rendering
38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
from django.apps import apps
|
|
from jinja2 import BaseLoader, TemplateNotFound
|
|
from jinja2.meta import find_referenced_templates
|
|
|
|
__all__ = (
|
|
'ConfigTemplateLoader',
|
|
)
|
|
|
|
|
|
class ConfigTemplateLoader(BaseLoader):
|
|
"""
|
|
Custom Jinja2 loader to facilitate populating template content from DataFiles.
|
|
"""
|
|
def __init__(self, data_source):
|
|
self.data_source = data_source
|
|
self._template_cache = {}
|
|
|
|
def get_source(self, environment, template):
|
|
DataFile = apps.get_model('core', 'DataFile')
|
|
|
|
# Retrieve template content from cache
|
|
try:
|
|
template_source = self._template_cache[template]
|
|
except KeyError:
|
|
raise TemplateNotFound(template)
|
|
|
|
# Find and pre-fetch referenced templates
|
|
if referenced_templates := find_referenced_templates(environment.parse(template_source)):
|
|
self.cache_templates({
|
|
df.path: df.data_as_string for df in
|
|
DataFile.objects.filter(source=self.data_source, path__in=referenced_templates)
|
|
})
|
|
|
|
return template_source, template, lambda: True
|
|
|
|
def cache_templates(self, templates):
|
|
self._template_cache.update(templates)
|