コード例 #1
0
    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)
コード例 #2
0
    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
コード例 #3
0
ファイル: loaders.py プロジェクト: brunogola/django-themes
    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
コード例 #4
0
ファイル: loaders.py プロジェクト: fabiopiovam/django-themes
    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