def __init__(self, template_string, origin=None, name='<Unknown Template>'): self.theme_name, self.template_name = name.split(':') self.registered_template = get_registered_template(self.template_name, {}) force_themes_tags = False # Treat the values for tags 'extends', 'include' and 'theme_static_file'. for full, tag, value in EXP_TAGS.findall(template_string): if ':' not in value: new_value = full.replace('"'+value+'"', '"%s:%s"'%(self.theme_name, value)) template_string = template_string.replace(full, new_value) if tag == 'theme_static_file': force_themes_tags = True # Forces {% load themes_tag %} if any of its tags are used but there is not loading if force_themes_tags and not EXP_THEME_TAG.findall(template_string): # The following 2 lines ensures the {% load %} comes after an {% extends %} tag f = EXP_EXTENDS.findall(template_string) pos = (template_string.index(f[0]) + len(f[0])) if f else 0 template_string = template_string[:pos] + '{% load themes_tags %}' + template_string[pos:] self.check_allowed_template(template_string) super(DjangoTemplate, self).__init__(template_string, origin, name)
def get_source(self, environment, template): if ":" in template: active_theme, template_name = template.split(":", 1) active_theme = Theme.query().get(name=active_theme) elif getattr(environment, "theme", None): template_name = template active_theme = environment.theme else: template_name = template active_theme = None if app_settings.CACHE_EXPIRATION: try: active_theme = Theme.query().get(pk=cache.get("themes:active", None)) except Theme.DoesNotExist: pass if not active_theme: try: theme = Theme.query().get(is_default=True) if app_settings.CACHE_EXPIRATION: cache.set("themes:active", theme["pk"], app_settings.CACHE_EXPIRATION) active_theme = theme except Theme.DoesNotExist: # raise JinjaTemplateNotFound('There\'s no active theme.') pass try: reg_template = get_registered_template(template) except KeyError: if app_settings.ALLOW_NOT_REGISTERED: reg_template = {} else: raise JinjaTemplateNotFound('Template "%s" is not registered.' % template) content = None uptodate = lambda: True full_name = None engine = None if active_theme: try: # Using cache to restore/store template content cache_key = "themes:%s|%s" % (active_theme["name"], template_name) content = cache.get(cache_key, None) if app_settings.CACHE_EXPIRATION else None if not content or not content.split(";", 1)[-1] or content.split(";", 1)[-1] == "None": tpl = ThemeTemplate.query().get(theme=active_theme, name=template_name) engine = tpl["engine"] content = tpl["content"] if app_settings.CACHE_EXPIRATION: cache.set(cache_key, "engine:%s;%s" % (engine, content or ""), app_settings.CACHE_EXPIRATION) full_name = "%s:%s" % (active_theme["name"], template_name) except ThemeTemplate.DoesNotExist: content = None if reg_template and not content: content = reg_template.get("content", None) if not content: if ( reg_template and reg_template.get("mirroring", None) and reg_template.get("mirroring", None) != template_name ): # Trying this firstly... try: return self.get_source(environment, reg_template["mirroring"]) except JinjaTemplateNotFound as e: pass # If get no success, tries by the hardest way, from file system... ret = environment.get_template(reg_template["mirroring"]) if ret: f = open(ret.filename) try: contents = f.read() finally: f.close() return contents.decode("utf-8"), ret.filename, ret.is_up_to_date raise JinjaTemplateNotFound('Template "%s" doesn\'t exist in active theme.' % template_name) if content.startswith("engine:"): engine, content = content.split(";", 1) engine = engine.split(":")[1] return content, full_name, uptodate
def load_template(self, template_name, template_dirs=None): if ":" in template_name: active_theme, template_name = template_name.split(":", 1) else: active_theme = cache.get("themes:active", None) if app_settings.CACHE_EXPIRATION else None if not active_theme: try: theme = Theme.objects.get(is_default=True) if app_settings.CACHE_EXPIRATION: cache.set("themes:active", theme.name, app_settings.CACHE_EXPIRATION) active_theme = theme.name except Theme.DoesNotExist: raise TemplateDoesNotExist("There's no active theme.") try: reg_template = get_registered_template(template_name) except KeyError: if app_settings.ALLOW_NOT_REGISTERED: reg_template = {} else: raise TemplateDoesNotExist('Template "%s" is not registered.' % template_name) content = None full_name = None engine = None try: # Using cache to restore/store template content cache_key = "themes:%s|%s" % (active_theme, template_name) content = cache.get(cache_key, None) if app_settings.CACHE_EXPIRATION else None if not content: tpl = ThemeTemplate.objects.get(theme__name=active_theme, name=template_name) engine = tpl.engine content = tpl.content if app_settings.CACHE_EXPIRATION: cache.set(cache_key, "engine:%s;%s" % (engine, content), app_settings.CACHE_EXPIRATION) full_name = "%s:%s" % (active_theme, template_name) except ThemeTemplate.DoesNotExist: content = None if not content: if reg_template and reg_template.get("mirroring", None): ret = get_template(reg_template["mirroring"]) content, origin = ret if isinstance(ret, (list, tuple)) else (ret, None) return content, origin else: raise TemplateDoesNotExist('Template "%s" doesn\'t exist in active theme.' % template_name) if content.startswith("engine:"): engine, content = content.split(";", 1) engine = engine.split(":")[1] origin = None try: template_class = get_engine_class(engine or app_settings.DEFAULT_ENGINE) template = template_class(content, origin, full_name) return template, None except TemplateDoesNotExist: return content, origin
def load_template(self, template_name, template_dirs=None): if ':' in template_name: active_theme, template_name = template_name.split(':', 1) else: active_theme = cache.get('themes:active', None) if app_settings.CACHE_EXPIRATION else None if not active_theme: try: theme = Theme.objects.get(is_default=True) if app_settings.CACHE_EXPIRATION: cache.set('themes:active', theme.name, app_settings.CACHE_EXPIRATION) active_theme = theme.name except Theme.DoesNotExist: raise TemplateDoesNotExist('There\'s no active theme.') try: reg_template = get_registered_template(template_name) except KeyError: if app_settings.ALLOW_NOT_REGISTERED: reg_template = {} else: raise TemplateDoesNotExist('Template "%s" is not registered.'%template_name) content = None full_name = None engine = None try: # Using cache to restore/store template content cache_key = 'themes:%s|%s'%(active_theme, template_name) content = cache.get(cache_key, None) if app_settings.CACHE_EXPIRATION else None if not content: tpl = ThemeTemplate.objects.get(theme__name=active_theme, name=template_name) engine = tpl.engine content = tpl.content if app_settings.CACHE_EXPIRATION: cache.set(cache_key, 'engine:%s;%s'%(engine,content), app_settings.CACHE_EXPIRATION) full_name = '%s:%s'%(active_theme, template_name) except ThemeTemplate.DoesNotExist: content = None if not content: if reg_template and reg_template.get('mirroring', None): ret = get_template(reg_template['mirroring']) content, origin = ret if isinstance(ret, (list,tuple)) else (ret, None) return content, origin else: raise TemplateDoesNotExist('Template "%s" doesn\'t exist in active theme.'%template_name) if content.startswith('engine:'): engine, content = content.split(';', 1) engine = engine.split(':')[1] origin = None try: template_class = get_engine_class(engine or app_settings.DEFAULT_ENGINE) template = template_class(content, origin, full_name) return template, None except TemplateDoesNotExist: return content, origin