Author: batiste.bieler
Date: Mon Mar  9 16:24:50 2009
New Revision: 398

Modified:
    trunk/pages/admin/__init__.py
    trunk/pages/admin/forms.py
    trunk/pages/managers.py
    trunk/pages/models.py
    trunk/pages/settings.py
    trunk/pages/templatetags/pages_tags.py
    trunk/pages/tests.py
    trunk/pages/urls.py
    trunk/pages/utils.py
    trunk/pages/views.py

Log:
Start the work to have slug dup

Modified: trunk/pages/admin/__init__.py
==============================================================================
--- trunk/pages/admin/__init__.py       (original)
+++ trunk/pages/admin/__init__.py       Mon Mar  9 16:24:50 2009
@@ -228,16 +228,18 @@
              form.base_fields['template'].initial = force_unicode(template)

          # handle most of the logic of connected models
+
          if obj:
              for mod in get_connected_models():
                  model = mod['model']
                  attributes = {'page': obj.id}
                  validate_field = True
-
+
                  if request.POST:
                      for field_name, real_field_name, field in  
mod['fields']:
                          if field_name in request.POST and  
request.POST[field_name]:
                              attributes[real_field_name] =  
request.POST[field_name]
+
                      if len(attributes) > 1:
                          connected_form = mod['form'](attributes)
                          if connected_form.is_valid():
@@ -245,9 +247,10 @@
                      else:
                          validate_field = False

-                if validate_field:
-                    for field_name, real_field_name, field in  
mod['fields']:
-                        form.base_fields[field_name] = field
+                for field_name, real_field_name, field in mod['fields']:
+                    form.base_fields[field_name] = field
+                    if not validate_field:
+                        form.base_fields[field_name].required = False

          for placeholder in get_placeholders(request, template):
              widget = self.get_widget(request, placeholder.widget)()

Modified: trunk/pages/admin/forms.py
==============================================================================
--- trunk/pages/admin/forms.py  (original)
+++ trunk/pages/admin/forms.py  Mon Mar  9 16:24:50 2009
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
  from django import forms
  from django.template.defaultfilters import slugify
  from django.utils.translation import ugettext_lazy as _
@@ -43,4 +44,7 @@
                      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()]:
+                raise forms.ValidationError(_('A sbiling with this slug  
already exists'))
          return slug

Modified: trunk/pages/managers.py
==============================================================================
--- trunk/pages/managers.py     (original)
+++ trunk/pages/managers.py     Mon Mar  9 16:24:50 2009
@@ -123,13 +123,14 @@
          to another language if wanted.
          """
          # used for the DISTINCT on the language. Should be nicer with a  
lot of revision
-        sql = '''SELECT DISTINCT(pages_content.language),  
pages_content.creation_date, pages_content.body
+        sql = '''SELECT pages_content.language, pages_content.body
              FROM pages_content WHERE (pages_content.type = %s
              AND pages_content.page_id = %s )
-            ORDER BY pages_content.creation_date ASC'''
+            GROUP BY pages_content.language
+            ORDER BY pages_content.creation_date DESC'''
          cursor = connection.cursor()
          cursor.execute(sql, (cnttype, page.id))
-        content_dict = dict([(c[0], c[2]) for c in cursor.fetchall()])
+        content_dict = dict([(c[0], c[1]) for c in cursor.fetchall()])
          if language in content_dict:
              return content_dict[language]
          # requested language not found. Try other languages one after
@@ -154,6 +155,18 @@
              return None
          else:
              return content
+
+    def get_page_ids_by_slug(self, slug):
+        """
+        Return all the page id according to a slug
+        """
+        sql = '''SELECT pages_content.page_id, pages_content.language
+            FROM pages_content WHERE (pages_content.type = %s AND  
pages_content.body =%s)
+            GROUP BY pages_content.language, pages_content.page_id
+            ORDER BY pages_content.creation_date DESC'''
+        cursor = connection.cursor()
+        cursor.execute(sql, ('slug', slug, ))
+        return [c[0] for c in cursor.fetchall()]

  class PagePermissionManager(models.Manager):


Modified: trunk/pages/models.py
==============================================================================
--- trunk/pages/models.py       (original)
+++ trunk/pages/models.py       Mon Mar  9 16:24:50 2009
@@ -143,10 +143,7 @@
          if url:
              return url

-        if settings.PAGE_UNIQUE_SLUG_REQUIRED:
-            url = u'%s/' % self.slug(language)
-        else:
-            url = u'%s-%d/' % (self.slug(language), self.id)
+        url = u'%s/' % self.slug(language)
          for ancestor in self.get_ancestors(ascending=True):
              url = ancestor.slug(language) + u'/' + url


Modified: trunk/pages/settings.py
==============================================================================
--- trunk/pages/settings.py     (original)
+++ trunk/pages/settings.py     Mon Mar  9 16:24:50 2009
@@ -27,7 +27,7 @@
      raise ImproperlyConfigured("django-tagging could not be found.\nPlease  
make sure you've installed it correctly or disable the tagging feature by  
setting PAGE_TAGGING to False.")

  # Whether to only allow unique slugs.
-PAGE_UNIQUE_SLUG_REQUIRED = getattr(settings, 'PAGE_UNIQUE_SLUG_REQUIRED',  
True)
+PAGE_UNIQUE_SLUG_REQUIRED = getattr(settings, 'PAGE_UNIQUE_SLUG_REQUIRED',  
False)

  # Whether to enable revisions.
  PAGE_CONTENT_REVISION = getattr(settings, 'PAGE_CONTENT_REVISION', True)

Modified: trunk/pages/templatetags/pages_tags.py
==============================================================================
--- trunk/pages/templatetags/pages_tags.py      (original)
+++ trunk/pages/templatetags/pages_tags.py      Mon Mar  9 16:24:50 2009
@@ -121,11 +121,7 @@
      request = context.get('request', False)
      # if the page is a SafeUnicode, try to use it like a slug
      if isinstance(page, SafeUnicode):
-        c = Content.objects.filter(type='slug', body=page)
-        if len(c):
-            page = c[0].page
-        else:
-            page = None
+        page = get_page_from_slug(slug, request)
      if not request or not page:
          return {'content':''}
      if lang is None:

Modified: trunk/pages/tests.py
==============================================================================
--- trunk/pages/tests.py        (original)
+++ trunk/pages/tests.py        Mon Mar  9 16:24:50 2009
@@ -47,7 +47,7 @@
          """
          Test a slug collision
          """
-        setattr(settings, "SITE_ID", 2)
+        setattr(settings, "PAGE_UNIQUE_SLUG_REQUIRED", True)

          c = Client()
          c.login(username= 'batiste', password='b')
@@ -92,9 +92,9 @@
          page_data['status'] = Page.PUBLISHED
          page_data['slug'] = 'test-page-2'
          response = c.post('/admin/pages/page/add/', page_data)
-        response = c.get('/admin/pages/page/')
+        self.assertRedirects(response, '/admin/pages/page/')

-        response = c.get('/pages/')
+        response = c.get('/pages/test-page-2/')
          self.assertEqual(response.status_code, 200)

      def test_05_edit_page(self):
@@ -258,6 +258,9 @@
          response = c.post('/admin/pages/page/1/', page_data)
           
self.assertEqual(Content.objects.get_content(page, 'en-us', 'body'), 'changed  
body 2')

+        response = c.get('/pages/')
+        self.assertContains(response, 'changed body 2', 1)
+
          setattr(settings, "PAGE_CONTENT_REVISION", False)

           
self.assertEqual(Content.objects.get_content(page, 'en-us', 'body'), 'changed  
body 2')
@@ -277,3 +280,39 @@
          self.assertEqual(response.status_code, 200)

          self.assertContains(response, 'name="right-column"', 1)
+
+    def test_10_directory_slug(self):
+        """
+        Test diretory slugs
+        """
+        setattr(settings, "PAGE_UNIQUE_SLUG_REQUIRED", False)
+        c = Client()
+        c.login(username= 'batiste', password='b')
+
+        page_data = self.get_new_page_data()
+        page_data['title'] = 'parent title'
+        response = c.post('/admin/pages/page/add/', page_data)
+        # the redirect tell that the page has been create correctly
+        self.assertRedirects(response, '/admin/pages/page/')
+
+        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
+        self.assertEqual(response.status_code, 200)
+
+        response = c.get('/pages/test-page-1/')
+
+        page1 =  
Content.objects.get_content_slug_by_slug(page_data['slug']).page
+        self.assertEqual(page1.id, 1)
+
+        page_data['title'] = 'children title'
+        # raise a bug with django 1.0.2
+        response =  
c.post('/admin/pages/page/add/?target=1&position=first-child', page_data)
+        self.assertRedirects(response, '/admin/pages/page/')
+
+        # finaly test that we can get every page according the path
+        response = c.get('/pages/test-page/')
+        self.assertContains(response, "parent title", status_code == 200)
+
+        response = c.get('/pages/test-page-1/test-page-1/')
+        self.assertContains(response, "children title", status_code == 200)

Modified: trunk/pages/urls.py
==============================================================================
--- trunk/pages/urls.py (original)
+++ trunk/pages/urls.py Mon Mar  9 16:24:50 2009
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
  from django.conf.urls.defaults import *
  from pages.views import details
  from pages import settings
@@ -7,11 +8,6 @@
      url(r'^$', details, name='pages-root'),
  )

-if settings.PAGE_UNIQUE_SLUG_REQUIRED:
-    urlpatterns += patterns('',
-        url(r'^.*?/?(?P<slug>[-\w]+)/$', details,  
name='pages-details-by-slug'),
-    )
-else:
-    urlpatterns += patterns('',
-        url(r'^.*?(?P<page_id>[0-9]+)/$', details,  
name='pages-details-by-id'),
-    )
+urlpatterns += patterns('',
+    url(r'^.*?/?(?P<slug>[-\w]+)/$', details,  
name='pages-details-by-slug'),
+)

Modified: trunk/pages/utils.py
==============================================================================
--- trunk/pages/utils.py        (original)
+++ trunk/pages/utils.py        Mon Mar  9 16:24:50 2009
@@ -4,8 +4,8 @@
  from django.db.models import signals
  from django.http import HttpResponse, HttpResponseRedirect
  from django.contrib.sites.models import Site, RequestSite, SITE_CACHE
-
  from pages import settings
+from pages.models import Content, Page

  def auto_render(func):
      """Decorator that put automaticaly the template path in the context  
dictionary
@@ -82,3 +82,18 @@
          if permission == "All":
              return True
      return False
+
+from django.core.urlresolvers import reverse
+def get_page_from_slug(slug, request):
+    lang = get_language_from_request(request)
+    relative_url = request.path.replace(reverse('pages-root'), '')
+    page_ids = Content.objects.get_page_ids_by_slug(slug)
+    pages_list = Page.objects.filter(id__in=page_ids)
+    current_page = None
+    if len(pages_list) == 1:
+        return pages_list[0]
+    if len(pages_list) > 1:
+        for page in pages_list:
+            if page.get_url(lang) == relative_url:
+                return page
+    return None

Modified: trunk/pages/views.py
==============================================================================
--- trunk/pages/views.py        (original)
+++ trunk/pages/views.py        Mon Mar  9 16:24:50 2009
@@ -2,38 +2,32 @@
  from django.http import Http404
  from django.shortcuts import get_object_or_404
  from django.contrib.sites.models import SITE_CACHE
-
  from pages import settings
  from pages.models import Page, Content
-from pages.utils import auto_render, get_language_from_request
+from pages.utils import auto_render, get_language_from_request,  
get_page_from_slug

-def details(request, page_id=None, slug=None):
+def details(request, slug=None):
      """
-    Example view that get the root pages for navigation,
-    and the current page if there is any root page.
+    Example view that get the root pages for navigation,
+    and the current page if there is any root page.
      All is rendered with the current page's template.
      """
      pages = Page.objects.navigation().order_by("tree_id")
-
+    current_page = False
+
      if pages:
-        if page_id:
-            current_page = get_object_or_404(
-                Page.objects.published(), pk=page_id)
-        elif slug:
-            slug_content = Content.objects.get_content_slug_by_slug(slug)
-            if slug_content and \
-                slug_content.page.calculated_status in (
-                    Page.PUBLISHED, Page.HIDDEN):
-                current_page = slug_content.page
-            else:
-                raise Http404
+        if slug:
+            current_page = get_page_from_slug(slug, request)
          else:
              current_page = pages[0]
-
-    else:
+
+    if not current_page:
+        raise Http404
+
+    if not current_page.calculated_status in (Page.PUBLISHED, Page.HIDDEN):
          raise Http404

      lang = get_language_from_request(request, current_page)
      template_name = current_page.get_template()
      return template_name, locals()
-details = auto_render(details)
+details = auto_render(details)
\ No newline at end of file

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