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