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

Reply via email to