From 2804cd527fce114468aeb934a4e64f1fd2b17352 Mon Sep 17 00:00:00 2001 From: Jannis Leidel Date: Fri, 1 Jul 2011 15:44:23 +0200 Subject: [PATCH] Refactored loader to be class based only. --- dbtemplates/loader.py | 72 +++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 44 deletions(-) diff --git a/dbtemplates/loader.py b/dbtemplates/loader.py index ca2d817..9a73c09 100644 --- a/dbtemplates/loader.py +++ b/dbtemplates/loader.py @@ -1,14 +1,13 @@ -import warnings -from django import VERSION -from django.conf import settings from django.contrib.sites.models import Site from django.template import TemplateDoesNotExist +from dbtemplates.conf import settings from dbtemplates.models import Template -from dbtemplates.utils import cache, get_cache_key +from dbtemplates.utils.cache import cache, get_cache_key, set_and_return +from django.template.loader import BaseLoader -def load_template_source(template_name, template_dirs=None, annoy=True): +class Loader(BaseLoader): """ A custom template loader to load templates from the database. @@ -17,43 +16,28 @@ def load_template_source(template_name, template_dirs=None, annoy=True): it falls back to query the database field ``name`` with the template path and ``sites`` with the current site. """ - if VERSION[:2] >= (1, 2) and annoy: - # For backward compatibility - warnings.warn( - "`dbtemplates.loader.load_template_source` is deprecated; " - "use `dbtemplates.loader.Loader` instead.", DeprecationWarning) - site = Site.objects.get_current() - display_name = 'db:%s:%s:%s' % (settings.DATABASE_ENGINE, - template_name, site.domain) - cache_key = get_cache_key(template_name) - if cache: - try: - backend_template = cache.get(cache_key) - if backend_template: - return backend_template, template_name - except: - pass - try: - template = Template.on_site.filter(name__exact=template_name)[0] - # Save in cache backend explicitly if manually deleted or invalidated + is_usable = True + + def load_template_source(self, template_name, template_dirs=None): + site = Site.objects.get_current() + display_name = 'dbtemplates:%s:%s:%s' % (settings.DATABASE_ENGINE, + template_name, site.domain) + cache_key = get_cache_key(template_name) if cache: - cache.set(cache_key, template.content) - return (template.content, display_name) - except: - pass - raise TemplateDoesNotExist(template_name) -load_template_source.is_usable = True - - -if VERSION[:2] >= (1, 2): - # providing a class based loader for Django >= 1.2, yay! - from django.template.loader import BaseLoader - - class Loader(BaseLoader): - __doc__ = load_template_source.__doc__ - - is_usable = True - - def load_template_source(self, template_name, template_dirs=None): - return load_template_source( - template_name, template_dirs, annoy=False) + try: + backend_template = cache.get(cache_key) + if backend_template: + return backend_template, template_name + except: + pass + try: + template = Template.objects.get(name__exact=template_name) + return set_and_return(template.content, display_name) + except (Template.MultipleObjectsReturned, Template.DoesNotExist): + try: + template = Template.objects.get( + name__exact=template_name, sites__in=[site.id]) + return set_and_return(template.content, display_name) + except Template.DoesNotExist: + pass + raise TemplateDoesNotExist(template_name)