Revision: 622
Author: batiste.bieler
Date: Fri Jul 31 01:06:52 2009
Log: Refactor the Alias model and code to make slugs the only canonical
reference.
http://code.google.com/p/django-page-cms/source/detail?r=622
Modified:
/trunk/pages/admin/__init__.py
/trunk/pages/managers.py
/trunk/pages/models.py
/trunk/pages/tests/pages_tests.py
/trunk/pages/urls.py
/trunk/pages/views.py
=======================================
--- /trunk/pages/admin/__init__.py Tue Jul 21 01:02:49 2009
+++ /trunk/pages/admin/__init__.py Fri Jul 31 01:06:52 2009
@@ -416,8 +416,8 @@
pass
class AliasAdmin(admin.ModelAdmin):
- list_display = ('page', 'url', 'is_canonical',)
- list_editable = ('url', 'is_canonical',)
+ list_display = ('page', 'url',)
+ list_editable = ('url', )
try:
admin.site.register(PageAlias, AliasAdmin)
=======================================
--- /trunk/pages/managers.py Mon Jul 27 13:01:49 2009
+++ /trunk/pages/managers.py Fri Jul 31 01:06:52 2009
@@ -216,7 +216,7 @@
class PageAliasManager(models.Manager):
"""PageAlias manager."""
- def get_for_url(self, request, path=None, lang=None):
+ def from_path(self, request, path=None, lang=None):
"""
Resolve a request to an alias. returns a ``PageAlias`` object or
None
if the url matches no page at all. The aliasing system supports
plain
@@ -228,7 +228,8 @@
url = normalize_url(path)
# §1: try with complete query string
- if request.META["QUERY_STRING"]!="":
+ if ("QUERY_STRING" in request.META and
+ request.META["QUERY_STRING"] != ""):
url = url + '?' + request.META["QUERY_STRING"]
try:
alias = PageAlias.objects.get(url=url)
@@ -242,15 +243,5 @@
return alias
except PageAlias.DoesNotExist:
pass
- # §3: the requested path is not an alias, but it may be the slug
of a page
- page = Page.objects.from_path(path, lang)
- if page:
- alias = PageAlias(page=page, url=path)
- # we have a page, let's see if there is a canonical alias for
it
- if PageAlias.objects.filter(page=page,
is_canonical=True).count()>0:
- alias.is_canonical = False
- else:
- alias.is_canonical = True
- return alias
- else:
- return None
+ # §3: not alias found, we give up
+ return None
=======================================
--- /trunk/pages/models.py Mon Jul 27 13:01:49 2009
+++ /trunk/pages/models.py Fri Jul 31 01:06:52 2009
@@ -158,25 +158,29 @@
cache.set(self.PAGE_LANGUAGES_KEY % (self.id), languages)
return languages
+ def is_first_root(self):
+ """Return true if the page is the first root page."""
+ if self.parent:
+ return False
+ return Page.objects.root()[0].id == self.id
+
def get_absolute_url(self, language=None):
"""Return the absolute page url. Add the language prefix if
- ``PAGE_USE_LANGUAGE_PREFIX`` is set to **True***."""
- try:
- alias = PageAlias.objects.get(page=self, is_canonical=True)
- return reverse('pages-root')[:-1] + alias.url
- except:
- url = reverse('pages-root')
- if settings.PAGE_USE_LANGUAGE_PREFIX:
- url += str(language) + '/'
- return url + self.get_url(language)
+ ``PAGE_USE_LANGUAGE_PREFIX`` setting is set to **True***."""
+ url = reverse('pages-root')
+ if settings.PAGE_USE_LANGUAGE_PREFIX:
+ url += str(language) + '/'
+ return url + self.get_url(language)
def get_url(self, language=None):
"""Return url of this page, adding all parent's slug."""
url = cache.get(self.PAGE_URL_KEY % (self.id, language))
if url:
return url
-
- url = u'%s/' % self.slug(language)
+ if self.is_first_root():
+ url = ''
+ else:
+ url = u'%s/' % self.slug(language)
for ancestor in self.get_ancestors(ascending=True):
url = ancestor.slug(language) + u'/' + url
@@ -344,25 +348,14 @@
"""URL alias for a page"""
page = models.ForeignKey(Page, null=True, blank=True,
verbose_name=_('page'))
url = models.CharField(max_length=255, unique=True)
- is_canonical = models.NullBooleanField(null=True, blank=True)
objects = PageAliasManager()
class Meta:
verbose_name_plural = _('Aliases')
def save(self, *args, **kwargs):
# normalize url
- self.url = normalize_url(self.url)
-
- # override to handle "is_canonical" properly
- if self.is_canonical:
- for alias in PageAlias.objects.filter(page=self.page):
- alias.is_canonical = False
- alias.save()
+ self.url = normalize_url(self.url)
super(PageAlias, self).save(*args, **kwargs)
def __unicode__(self):
- str = "%s => %s" % (self.url, self.page.get_url())
- if self.is_canonical:
- str = str + " (canonical)"
- return str
-
+ return "%s => %s" % (self.url, self.page.get_url())
=======================================
--- /trunk/pages/tests/pages_tests.py Mon Jul 27 13:01:49 2009
+++ /trunk/pages/tests/pages_tests.py Fri Jul 31 01:06:52 2009
@@ -645,40 +645,30 @@
page_data['title'] = 'downloads-page-title'
page_data['slug'] = 'downloads-page'
- response = c.post('/admin/pages/page/add/', page_data)
+ response = c.post('/admin/pages/page/add/', page_data)
self.assertRedirects(response, '/admin/pages/page/')
-
+
# create aliases for the pages
page = Page.objects.from_path('home-page', None)
self.assertTrue(page)
- p = PageAlias(page=page, url='/', is_canonical=True)
+ p = PageAlias(page=page, url='/index.php')
p.save()
- p = PageAlias(page=page, url='/index.php', is_canonical=False)
- p.save()
page = Page.objects.from_path('downloads-page', None)
self.assertTrue(page)
- p = PageAlias(page=page, url='index.php?page=downloads',
is_canonical=False)
+ p = PageAlias(page=page, url='index.php?page=downloads')
p.save()
# now check whether we can retrieve the pages.
- # is the homepage available from its canonical alias?
- response = c.get('/pages/')
- self.assertContains(response, "home-page-title", 2)
-
- # the other alias must cause a 301 redirect since it is not
canonical
+ # is the homepage available from is alias
response = c.get('/pages/index.php')
- self.assertRedirects(response, '/pages/', 301)
-
- # same must be true if we are calling the page by slug
- response = c.get('/pages/home-page')
- self.assertRedirects(response, '/pages/', 301)
-
+ self.assertRedirects(response, '/pages/home-page/', 301)
+
# for the download page, the slug is canonical
response = c.get('/pages/downloads-page/')
self.assertContains(response, "downloads-page-title", 2)
# calling via its alias must cause redirect
response = c.get('/pages/index.php?page=downloads')
- self.assertRedirects(response, '/pages/downloads-page/', 301)
-
+ self.assertRedirects(response, '/pages/downloads-page/', 301)
+
=======================================
--- /trunk/pages/urls.py Sun Jul 26 07:34:43 2009
+++ /trunk/pages/urls.py Fri Jul 31 01:06:52 2009
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
from django.conf.urls.defaults import *
-from pages.views import details, alias_wrapper
+from pages.views import details
from pages import settings
urlpatterns = patterns('',
@@ -10,11 +10,11 @@
if settings.PAGE_USE_LANGUAGE_PREFIX:
urlpatterns += patterns('',
- url(r'^(?P<lang>[-\w]+)/(?P<path>.*)$', alias_wrapper,
+ url(r'^(?P<lang>[-\w]+)/(?P<path>.*)$', details,
name='pages-details-by-path'),
)
else:
urlpatterns += patterns('',
- url(r'^(?P<path>.*)$', alias_wrapper,
+ url(r'^(?P<path>.*)$', details,
name='pages-details-by-path'),
)
=======================================
--- /trunk/pages/views.py Wed Jul 22 01:58:14 2009
+++ /trunk/pages/views.py Fri Jul 31 01:06:52 2009
@@ -36,13 +36,16 @@
if path:
current_page = Page.objects.from_path(path, lang)
- if not current_page:
- raise Http404
elif pages:
current_page = pages[0]
+ # if no pages has been found, we will try to find an Alias
if not current_page:
- raise Http404
+ alias = PageAlias.objects.from_path(request, path, lang)
+ if not alias:
+ raise Http404
+ url = alias.page.get_absolute_url(lang)
+ return HttpResponsePermanentRedirect(url)
if not (request.user.is_authenticated() and request.user.is_staff) and
\
current_page.calculated_status in (Page.DRAFT, Page.EXPIRED):
@@ -65,17 +68,5 @@
'lang': lang,
'request': request,
}
-
-details = auto_render(details)
-
-def alias_wrapper(request, path=None, lang=None, *args, **kwargs):
- """
- a wrapper for details() which resolves aliases and canonicalizes URLs
- """
- alias = PageAlias.objects.get_for_url(request, path, lang)
- if not alias:
- raise Http404
- if alias.is_canonical:
- return details(request, alias.page.get_url(), *args, **kwargs)
- else:
- return
HttpResponsePermanentRedirect(alias.page.get_absolute_url(lang))
+
+details = auto_render(details)
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---