Author: batiste.bieler
Date: Sat Mar 14 08:35:10 2009
New Revision: 401

Modified:
    trunk/pages/admin/__init__.py
    trunk/pages/admin/forms.py
    trunk/pages/admin/utils.py
    trunk/pages/admin/views.py
    trunk/pages/managers.py
    trunk/pages/models.py
    trunk/pages/templatetags/pages_tags.py
    trunk/pages/tests.py
    trunk/pages/utils.py

Log:
Add a cache dictionnary for every placeholder content

Modified: trunk/pages/admin/__init__.py
==============================================================================
--- trunk/pages/admin/__init__.py       (original)
+++ trunk/pages/admin/__init__.py       Sat Mar 14 08:35:10 2009
@@ -17,8 +17,9 @@
      get_language_from_request

  from pages.admin import widgets
+from pages.utils import get_placeholders
  from pages.admin.forms import PageForm
-from pages.admin.utils import get_placeholders, get_connected_models
+from pages.admin.utils import get_connected_models
  from pages.admin.views import traduction, get_content, sub_menu, \
      change_status, modify_content

@@ -135,7 +136,7 @@
              Content.objects.set_or_create_content(obj, language,
                  mandatory_placeholder,  
form.cleaned_data[mandatory_placeholder])

-        for placeholder in get_placeholders(request, obj.get_template()):
+        for placeholder in get_placeholders(obj.get_template()):
              if placeholder.name in form.cleaned_data:
                  if change:
                      if placeholder.name not in self.mandatory_placeholders:
@@ -162,7 +163,7 @@

          placeholder_fieldsets = []
          template = get_template_from_request(request, obj)
-        for placeholder in get_placeholders(request, template):
+        for placeholder in get_placeholders(template):
              if placeholder.name not in self.mandatory_placeholders:
                  placeholder_fieldsets.append(placeholder.name)

@@ -252,7 +253,7 @@
                      if not validate_field:
                          form.base_fields[field_name].required = False

-        for placeholder in get_placeholders(request, template):
+        for placeholder in get_placeholders(template):
              widget = self.get_widget(request, placeholder.widget)()
              if placeholder.parsed:
                  help_text = _('Note: This field is evaluated as template  
code.')
@@ -286,7 +287,7 @@
          else:
              template = get_template_from_request(request, obj)
              extra_context = {
-                'placeholders': get_placeholders(request, template),
+                'placeholders': get_placeholders(template),
                  'language': get_language_from_request(request),
                  'traduction_language': settings.PAGE_LANGUAGES,
                  'page': obj,

Modified: trunk/pages/admin/forms.py
==============================================================================
--- trunk/pages/admin/forms.py  (original)
+++ trunk/pages/admin/forms.py  Sat Mar 14 08:35:10 2009
@@ -52,9 +52,6 @@
                      raise forms.ValidationError(_('Another page with this  
slug already exists'))
              elif Content.objects.filter(body=slug, type="slug").count():
                  raise forms.ValidationError(_('Another page with this slug  
already exists'))
-        elif self.instance.id:
-            if slug in [sibling.slug() for sibling in  
self.instance.get_siblings().exclude(id=self.instance.id)]:
-                raise forms.ValidationError(_('A sibiling with this slug  
already exists'))

          if not settings.PAGE_UNIQUE_SLUG_REQUIRED:
              if target and position:
@@ -72,8 +69,8 @@
                              raise forms.ValidationError(_('A children with  
this slug already exists at the targeted position'))
              else:
                  if self.instance.id:
-                    if slug in [sibling.slug() for sibling in  
Page.objects.root().exclude(id=self.instance.id)]:
-                        raise forms.ValidationError(_('A sibiling with  
this slug already exists at the root level'))
+                    if slug in [sibling.slug() for sibling in  
self.instance.get_siblings().exclude(id=self.instance.id)]:
+                        raise forms.ValidationError(_('A sibiling with  
this slug already exists'))
                  else:
                      if slug in [sibling.slug() for sibling in  
Page.objects.root()]:
                          raise forms.ValidationError(_('A sibiling with  
this slug already exists at the root level'))

Modified: trunk/pages/admin/utils.py
==============================================================================
--- trunk/pages/admin/utils.py  (original)
+++ trunk/pages/admin/utils.py  Sat Mar 14 08:35:10 2009
@@ -1,53 +1,6 @@
  # -*- coding: utf-8 -*-
-from django.template import loader, Context, RequestContext,  
TemplateDoesNotExist
-from django.template.loader_tags import ExtendsNode
-from django.http import Http404
-# must be imported like this for isinstance
-from django.templatetags.pages_tags import PlaceholderNode
  from django.core.urlresolvers import get_mod_func
-
-from pages.views import details
  from pages import settings
-
-def get_placeholders(request, template_name):
-    """
-    Return a list of PlaceholderNode found in the given template
-    """
-    try:
-        temp = loader.get_template(template_name)
-    except TemplateDoesNotExist:
-        return []
-    try:
-        context = details(request, only_context=True)
-    except Http404:
-        context = {}
-    temp.render(RequestContext(request, context))
-    plist = []
-    placeholders_recursif(temp.nodelist, plist)
-    return plist
-
-def placeholders_recursif(nodelist, plist):
-    """
-    Recursively search into a template node list for PlaceholderNode node
-    """
-    for node in nodelist:
-        if isinstance(node, PlaceholderNode):
-            already_in_plist = False
-            for p in plist:
-                if p.name == node.name:
-                    already_in_plist = True
-            if not already_in_plist:
-                plist.append(node)
-            node.render(Context())
-        for key in ('nodelist', 'nodelist_true', 'nodelist_false'):
-            if hasattr(node, key):
-                try:
-                    placeholders_recursif(getattr(node, key), plist)
-                except:
-                    pass
-    for node in nodelist:
-        if isinstance(node, ExtendsNode):
-            placeholders_recursif(node.get_parent(Context()).nodelist,  
plist)

  def get_connected_models():


Modified: trunk/pages/admin/views.py
==============================================================================
--- trunk/pages/admin/views.py  (original)
+++ trunk/pages/admin/views.py  Sat Mar 14 08:35:10 2009
@@ -6,8 +6,7 @@
  from pages import settings
  from pages.models import Page, Content

-from pages.utils import auto_render
-from pages.admin.utils import get_placeholders
+from pages.utils import get_placeholders, auto_render

  def change_status(request, page_id):
      """

Modified: trunk/pages/managers.py
==============================================================================
--- trunk/pages/managers.py     (original)
+++ trunk/pages/managers.py     Sat Mar 14 08:35:10 2009
@@ -5,6 +5,7 @@
  from django.contrib.sites.managers import CurrentSiteManager
  from django.contrib.sites.models import Site
  from django.db.models import Q
+from django.core.cache import cache
  from pages import settings

  class PageManager(models.Manager):
@@ -117,20 +118,28 @@
              pass
          content = self.create(page=page, language=language, body=body,  
type=cnttype)

-    def get_content(self, page, language, type, language_fallback=False):
+    def get_content(self, page, language, ctype, language_fallback=False):
          """
          Gets the latest content for a particular page and language. Falls  
back
          to another language if wanted.
          """
+        PAGE_CONTENT_DICT_KEY = "page_content_dict_%d_%s"
          if not language:
              language = settings.PAGE_DEFAULT_LANGUAGE
-        content_dict = {}
-        for lang in settings.PAGE_LANGUAGES:
-            try:
-                content = self.filter(language=lang[0], type=type,  
page=page).latest()
-                content_dict[lang[0]] = content.body
-            except self.model.DoesNotExist:
-                content_dict[lang[0]] = ''
+
+        content_dict = cache.get(PAGE_CONTENT_DICT_KEY % (page.id, ctype))
+        #content_dict = None
+
+        if not content_dict:
+            content_dict = {}
+            for lang in settings.PAGE_LANGUAGES:
+                try:
+                    content = self.filter(language=lang[0], type=ctype,  
page=page).latest()
+                    content_dict[lang[0]] = content.body
+                except self.model.DoesNotExist:
+                    content_dict[lang[0]] = ''
+            cache.set(PAGE_CONTENT_DICT_KEY % (page.id, ctype),  
content_dict)
+
          if content_dict[language]:
              return content_dict[language]


Modified: trunk/pages/models.py
==============================================================================
--- trunk/pages/models.py       (original)
+++ trunk/pages/models.py       Sat Mar 14 08:35:10 2009
@@ -12,6 +12,7 @@

  import mptt
  from pages import settings
+from pages.utils import get_placeholders
  from pages.managers import PageManager, ContentManager,  
PagePermissionManager


@@ -30,12 +31,11 @@
          (HIDDEN, _('Hidden')),
      )

-    PAGE_SLUG_KEY = "page_%d_language_%s_slug"
      PAGE_LANGUAGES_KEY = "page_%d_languages"
      PAGE_URL_KEY = "page_%d_language_%s_url"
      PAGE_TEMPLATE_KEY = "page_%d_template"
      #PAGE_CHILDREN_KEY = "page_children_%d_%d"
-    PAGE_CONTENT_KEY = "page_content_%d_%s_%s"
+    PAGE_CONTENT_DICT_KEY = "page_content_dict_%d_%s"

      author = models.ForeignKey(User, verbose_name=_('author'))
      parent = models.ForeignKey('self', null=True, blank=True,
@@ -104,20 +104,22 @@

      def invalidate(self):
          """Invalidate a page and it's descendants"""
-        self.invalidate_if_parent_changed()
-        cache.delete(self.PAGE_LANGUAGES_KEY % (self.id))

-    def invalidate_if_parent_changed(self):
-        """Invalidate cache depending of a parent"""
-
+        cache.delete(self.PAGE_LANGUAGES_KEY % (self.id))
          cache.delete(self.PAGE_TEMPLATE_KEY % (self.id))

+        p_names = [p.name for p in get_placeholders(self.get_template())]
+        if 'slug' not in p_names:
+            p_names.append('slug')
+        if 'title' not in p_names:
+            p_names.append('title')
+        for name in p_names:
+            cache.delete(self.PAGE_CONTENT_DICT_KEY % (self.id, name))
+
          for lang in settings.PAGE_LANGUAGES:
              cache.delete(self.PAGE_URL_KEY % (self.id, lang[0]))
-            cache.delete(self.PAGE_SLUG_KEY % (self.id, lang[0]))
-            cache.delete(self.PAGE_CONTENT_KEY % (self.id,  
lang[0], 'title'))
-            cache.delete(self.PAGE_CONTENT_KEY % (self.id,  
lang[0], 'slug'))
-
+
+
      def get_languages(self):
          """
          get the list of all existing languages for this page
@@ -155,19 +157,10 @@
          """
          get the slug of the page depending on the given language
          """
-        slug = cache.get(self.PAGE_SLUG_KEY % (self.id, language))
-        if slug:
-            return slug
-
+
          slug = Content.objects.get_content(self, language, 'slug',
                                             language_fallback=fallback)

-        if not language:
-            language = settings.PAGE_DEFAULT_LANGUAGE
-
-        # Seems to trigger errors with the new slug dup
-        #cache.set(self.PAGE_URL_KEY % (self.id, language), slug)
-
          return slug

      def title(self, language=None, fallback=True):
@@ -176,6 +169,7 @@
          """
          if not language:
              language = settings.PAGE_DEFAULT_LANGUAGE
+
          return Content.objects.get_content(self, language, 'title',
                                             language_fallback=fallback)


Modified: trunk/pages/templatetags/pages_tags.py
==============================================================================
--- trunk/pages/templatetags/pages_tags.py      (original)
+++ trunk/pages/templatetags/pages_tags.py      Sat Mar 14 08:35:10 2009
@@ -1,6 +1,5 @@
  # -*- coding: utf-8 -*-
  from django import template
-from django.core.cache import cache
  from django.utils.safestring import SafeUnicode, mark_safe
  from django.utils.translation import ugettext_lazy as _
  from django.template import Template, TemplateSyntaxError
@@ -88,17 +87,7 @@

      if lang is None:
          lang = get_language_from_request(context['request'], page)
-    if hasattr(settings, 'PAGE_CONTENT_CACHE_DURATION'):
-        key = Page.PAGE_CONTENT_KEY % (page.id, lang, content_type)
-        c = cache.get(key)
-        if c is None:
-            c = Content.objects.get_content(page, lang, content_type, True)
-            # Storing None force SQL requests every time
-            if c is None:
-                c = " "
-            cache.set(key, c, settings.PAGE_CONTENT_CACHE_DURATION)
-    else:
-        c = Content.objects.get_content(page, lang, content_type, True)
+    c = Content.objects.get_content(page, lang, content_type, True)
      if c:
          return {'content':c}
      return {'content':''}

Modified: trunk/pages/tests.py
==============================================================================
--- trunk/pages/tests.py        (original)
+++ trunk/pages/tests.py        Sat Mar 14 08:35:10 2009
@@ -304,10 +304,11 @@
          self.assertRedirects(response, '/admin/pages/page/')

          page = Page.objects.all()[0]
+        page.invalidate()

          response = c.post('/admin/pages/page/add/', page_data)
          # we cannot create 2 root page with the same slug
-        # this assert test that the creation fail as attended
+        # this assert test that the creation fails as wanted
          self.assertEqual(response.status_code, 200)

          response = c.get('/pages/same-slug/')

Modified: trunk/pages/utils.py
==============================================================================
--- trunk/pages/utils.py        (original)
+++ trunk/pages/utils.py        Sat Mar 14 08:35:10 2009
@@ -1,11 +1,62 @@
  # -*- coding: utf-8 -*-
+from django.template import loader, Context, RequestContext,  
TemplateDoesNotExist
+from django.template.loader_tags import ExtendsNode
+from django.http import Http404
  from django.shortcuts import render_to_response
  from django.template import RequestContext
  from django.db.models import signals
  from django.http import HttpResponse, HttpResponseRedirect
+from django.core.handlers.wsgi import WSGIRequest
  from django.contrib.sites.models import Site, RequestSite, SITE_CACHE
  from pages import settings
-from pages.models import Content, Page
+
+def get_placeholders(template_name):
+    """
+    Return a list of PlaceholderNode found in the given template
+    """
+    try:
+        temp = loader.get_template(template_name)
+    except TemplateDoesNotExist:
+        return []
+
+    request = WSGIRequest({'REQUEST_METHOD': 'GET'})
+
+    try:
+        # to avoid circular import
+        from pages.views import details
+        context = details(request, only_context=True)
+    except Http404:
+        context = {}
+    temp.render(RequestContext(request, context))
+    plist = []
+    placeholders_recursif(temp.nodelist, plist)
+    return plist
+
+def placeholders_recursif(nodelist, plist):
+    """
+    Recursively search into a template node list for PlaceholderNode node
+    """
+    # to avoid circular import
+    # must be imported like this for isinstance
+    from django.templatetags.pages_tags import PlaceholderNode
+    for node in nodelist:
+        if isinstance(node, PlaceholderNode):
+            already_in_plist = False
+            for p in plist:
+                if p.name == node.name:
+                    already_in_plist = True
+            if not already_in_plist:
+                plist.append(node)
+            node.render(Context())
+        for key in ('nodelist', 'nodelist_true', 'nodelist_false'):
+            if hasattr(node, key):
+                try:
+                    placeholders_recursif(getattr(node, key), plist)
+                except:
+                    pass
+    for node in nodelist:
+        if isinstance(node, ExtendsNode):
+            placeholders_recursif(node.get_parent(Context()).nodelist,  
plist)

  def auto_render(func):
      """Decorator that put automaticaly the template path in the context  
dictionary
@@ -56,9 +107,12 @@
      language = request.GET.get('language', None)
      if language:
          return language
-
-    client_language =  
settings.PAGE_LANGUAGE_MAPPING(str(request.LANGUAGE_CODE))

+    if hasattr(request, 'LANGUAGE_CODE'):
+        client_language =  
settings.PAGE_LANGUAGE_MAPPING(str(request.LANGUAGE_CODE))
+    else:
+        client_language = settings.PAGE_DEFAULT_LANGUAGE
+
      # then try to get the right one for the page
      if current_page:
          # try to get the language that match the client language
@@ -83,8 +137,10 @@
              return True
      return False

-from django.core.urlresolvers import reverse
+# TODO: move this in the manager
  def get_page_from_slug(slug, request):
+    from pages.models import Content, Page
+    from django.core.urlresolvers import reverse
      lang = get_language_from_request(request)
      relative_url = request.path.replace(reverse('pages-root'), '')
      page_ids = Content.objects.get_page_ids_by_slug(slug)

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"pinax-updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/pinax-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to