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