Author: batiste.bieler
Date: Mon Feb 16 04:24:52 2009
New Revision: 344

Modified:
    trunk/example/settings.py
    trunk/pages/admin/__init__.py
    trunk/pages/middleware.py
    trunk/pages/models.py
    trunk/pages/settings.py
    trunk/pages/templates/admin/pages/page/menu.html

Log:
Add cache on the page model to avoid SQL requests. Should be quicker

Modified: trunk/example/settings.py
==============================================================================
--- trunk/example/settings.py   (original)
+++ trunk/example/settings.py   Mon Feb 16 04:24:52 2009
@@ -110,6 +110,8 @@
      ('en', gettext_noop('English')),
  )

+SQL_DEBUGGING = True
+
  DEFAULT_PAGE_TEMPLATE = 'pages/index.html'

  PAGE_TEMPLATES = (

Modified: trunk/pages/admin/__init__.py
==============================================================================
--- trunk/pages/admin/__init__.py       (original)
+++ trunk/pages/admin/__init__.py       Mon Feb 16 04:24:52 2009
@@ -112,6 +112,7 @@
          Content object.
          """
          obj.save()
+        obj.invalidate()
          language = form.cleaned_data['language']
          target = request.GET.get('target', None)
          position = request.GET.get('position', None)

Modified: trunk/pages/middleware.py
==============================================================================
--- trunk/pages/middleware.py   (original)
+++ trunk/pages/middleware.py   Mon Feb 16 04:24:52 2009
@@ -14,13 +14,14 @@
          request.__class__.site = LazySite()
          return None

-    if settings.PAGE_SQL_DEBUGGING:
+    if settings.SQL_DEBUGGING:
          def process_response(self, request, response):
              from django import db
              import logging
              logging.basicConfig(filename="sql_log.txt",  
level=logging.DEBUG,)
              logging.debug(request.path + " : " +  
str(len(db.connection.queries)))
-            a = []
+            a = []
+            print "SQL requests : %d" % len(db.connection.queries)
              for q in db.connection.queries:
                  a.append(q['sql'])
              a.sort()

Modified: trunk/pages/models.py
==============================================================================
--- trunk/pages/models.py       (original)
+++ trunk/pages/models.py       Mon Feb 16 04:24:52 2009
@@ -14,6 +14,8 @@
  from pages import settings
  from pages.managers import PageManager, ContentManager,  
PagePermissionManager

+
+
  class Page(models.Model):
      """
      A simple hierarchical page model
@@ -28,11 +30,23 @@
          (PUBLISHED, _('Published')),
          (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"
+
      author = models.ForeignKey(User, verbose_name=_('author'))
-    parent = models.ForeignKey('self', null=True, blank=True,  
related_name='children', verbose_name=_('parent'))
-    creation_date = models.DateTimeField(_('creation date'),  
editable=False, default=datetime.now)
-    publication_date = models.DateTimeField(_('publication date'),  
null=True, blank=True, help_text=_('When the page should go live. Status  
must be "Published" for page to go live.'))
-    publication_end_date = models.DateTimeField(_('publication end date'),  
null=True, blank=True, help_text=_('When to expire the page. Leave empty to  
never expire.'))
+    parent = models.ForeignKey('self', null=True, blank=True,
+            related_name='children', verbose_name=_('parent'))
+    creation_date = models.DateTimeField(_('creation date'),  
editable=False,
+            default=datetime.now)
+    publication_date = models.DateTimeField(_('publication date'),
+            null=True, blank=True, help_text=_('''When the page should go  
live.
+                    Status must be "Published" for page to go live.'''))
+    publication_end_date = models.DateTimeField(_('publication end date'),
+            null=True, blank=True, help_text=_('''When to expire the page.  
Leave
+                    empty to never expire.'''))

      status = models.IntegerField(_('status'), choices=STATUSES,  
default=DRAFT)
      template = models.CharField(_('template'), max_length=100, null=True,  
blank=True)
@@ -79,16 +93,41 @@

          return self.status
      calculated_status = property(get_calculated_status)
+
+    def invalidate(self):
+        """Invalidate a page and it's descendants"""
+
+        self.invalidate_if_parent_changed()
+        cache.delete(self.PAGE_LANGUAGES_KEY % (self.id))
+
+        for desc in self.get_descendants():
+            desc.invalidate_if_parent_changed()
+
+    def invalidate_if_parent_changed(self):
+        """Invalidate cache depending of a parent"""

+        cache.delete(self.PAGE_TEMPLATE_KEY % (self.id))
+
+        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]))
+
      def get_languages(self):
          """
          get the list of all existing languages for this page
          """
+        languages = cache.get(self.PAGE_LANGUAGES_KEY % (self.id))
+        if languages:
+            return languages
+
          contents = Content.objects.filter(page=self, type="title")
          languages = []
          for c in contents:
              if c.language not in languages:
                  languages.append(c.language)
+
+        cache.set(self.PAGE_LANGUAGES_KEY % (self.id), languages)
+
          return languages

      def get_absolute_url(self, language=None):
@@ -98,8 +137,7 @@
          """
          get the url of this page, adding parent's slug
          """
-        PAGE_URL_KEY = "page_%d_language_%s_url"
-        url = cache.get(PAGE_URL_KEY % (self.id, language))
+        url = cache.get(self.PAGE_URL_KEY % (self.id, language))
          if url:
              return url

@@ -110,7 +148,7 @@
          for ancestor in self.get_ancestors(ascending=True):
              url = ancestor.slug(language) + u'/' + url

-        cache.set(PAGE_URL_KEY % (self.id, language), url)
+        cache.set(self.PAGE_URL_KEY % (self.id, language), url)

          return url

@@ -118,11 +156,20 @@
          """
          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
+
          if not language:
              language = settings.PAGE_DEFAULT_LANGUAGE
-        return Content.objects.get_content(self, language, 'slug',
+
+        slug = Content.objects.get_content(self, language, 'slug',
                                             language_fallback=fallback)

+        cache.set(self.PAGE_URL_KEY % (self.id, language), slug)
+
+        return slug
+
      def title(self, language=None, fallback=True):
          """
          get the title of the page depending on the given language
@@ -137,12 +184,25 @@
          get the template of this page if defined or if closer parent if
          defined or DEFAULT_PAGE_TEMPLATE otherwise
          """
+        template = cache.get(self.PAGE_TEMPLATE_KEY % (self.id))
+        if template:
+            return template
+
          if self.template:
-            return self.template
-        for p in self.get_ancestors(ascending=True):
-            if p.template:
-                return p.template
-        return settings.DEFAULT_PAGE_TEMPLATE
+            template = self.template
+
+        if not template:
+            for p in self.get_ancestors(ascending=True):
+                if p.template:
+                    template = p.template
+                    break
+
+        if not template:
+            template = settings.DEFAULT_PAGE_TEMPLATE
+
+        cache.set(self.PAGE_TEMPLATE_KEY % (self.id), template)
+
+        return template

      def traductions(self):
          langs = ""

Modified: trunk/pages/settings.py
==============================================================================
--- trunk/pages/settings.py     (original)
+++ trunk/pages/settings.py     Mon Feb 16 04:24:52 2009
@@ -69,4 +69,4 @@
  PAGE_CONNECTED_MODELS = getattr(settings, 'PAGE_CONNECTED_MODELS', False)

  # provide some informations about SQL requests into a log file
-PAGE_SQL_DEBUGGING = False
+SQL_DEBUGGING = getattr(settings, 'SQL_DEBUGGING', False)

Modified: trunk/pages/templates/admin/pages/page/menu.html
==============================================================================
--- trunk/pages/templates/admin/pages/page/menu.html    (original)
+++ trunk/pages/templates/admin/pages/page/menu.html    Mon Feb 16 04:24:52  
2009
@@ -40,9 +40,7 @@
  {% endifequal %}
  </td>
  <td>
-{% cache 300 page_template page.id %}
      {{ page.get_template }}
-{% endcache %}
  </td>
  <td>
  {% cache 10000 page_author page.author_id %}

--~--~---------~--~----~------------~-------~--~----~
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