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