Author: batiste.bieler
Date: Wed Jul 8 15:12:40 2009
New Revision: 598
Modified:
trunk/example/templates/pages/index.html
trunk/pages/admin/__init__.py
trunk/pages/http.py
trunk/pages/managers.py
trunk/pages/models.py
trunk/pages/templates/admin/pages/page/menu.html
trunk/pages/templatetags/pages_tags.py
trunk/pages/tests/pages_tests.py
trunk/pages/urls.py
trunk/pages/views.py
Log:
Big refactoring in order to enable the lang parameter at the basis of the
URL
Modified: trunk/example/templates/pages/index.html
==============================================================================
--- trunk/example/templates/pages/index.html (original)
+++ trunk/example/templates/pages/index.html Wed Jul 8 15:12:40 2009
@@ -6,7 +6,7 @@
{% show_content current_page "title" %}
{% endif %}
</title>
-<script type="text/javascript"
src="http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js" /></script>
+<!--<script type="text/javascript"
src="http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js"
/></script>-->
<style>
.placeholder-editable {
border:1px #bbb solid;
Modified: trunk/pages/admin/__init__.py
==============================================================================
--- trunk/pages/admin/__init__.py (original)
+++ trunk/pages/admin/__init__.py Wed Jul 8 15:12:40 2009
@@ -15,11 +15,10 @@
from pages import settings
from pages.models import Page, Content
-from pages.utils import has_page_add_permission
+from pages.utils import has_page_add_permission, get_placeholders
from pages.http import get_language_from_request, get_template_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_connected_models
from pages.admin.views import traduction, get_content, sub_menu,
change_status, modify_content
@@ -351,7 +350,9 @@
# HACK: overrides the changelist template and later resets it to
None
if template_name:
self.change_list_template = template_name
+ lang = get_language_from_request(request)
context = {
+ 'lang': lang,
'name': _("page"),
'pages': Page.objects.root().order_by("tree_id"),
'opts': self.model._meta
Modified: trunk/pages/http.py
==============================================================================
--- trunk/pages/http.py (original)
+++ trunk/pages/http.py Wed Jul 8 15:12:40 2009
@@ -4,7 +4,17 @@
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template import loader, Context, RequestContext
+from django.core.urlresolvers import reverse
from pages import settings
+
+def get_slug_and_relative_path(path):
+ if path[-1] == '/':
+ path = path[:-1]
+ slug = path.split("/")[-1]
+ root = reverse('pages-root')
+ if path.startswith(root):
+ path = path[len(root):]
+ return slug, path
def get_request_mock():
"""Build a request mock that can be used for testing."""
Modified: trunk/pages/managers.py
==============================================================================
--- trunk/pages/managers.py (original)
+++ trunk/pages/managers.py Wed Jul 8 15:12:40 2009
@@ -18,7 +18,6 @@
from django.contrib.sites.models import Site
from django.db.models import Q
from django.core.cache import cache
-from django.core.urlresolvers import reverse
from pages import settings
@@ -88,13 +87,11 @@
return self.on_site().filter(
publication_end_date__lte=datetime.now())
- def from_slug(self, slug, complete_path, lang, exclude_drafts=True):
+ def from_path(self, path, lang, exclude_drafts=True):
"""Get the page according to a slug."""
from pages.models import Content, Page
- relative_url = complete_path
- root = reverse('pages-root')
- if relative_url.startswith(root):
- relative_url = relative_url[len(root):]
+ from pages.http import get_slug_and_relative_path
+ slug, rpath = get_slug_and_relative_path(path)
page_ids = Content.objects.get_page_ids_by_slug(slug)
pages_list = self.filter(id__in=page_ids)
if exclude_drafts:
@@ -105,7 +102,7 @@
# more than one page matching the slug, let's use the full url
if len(pages_list) > 1:
for page in pages_list:
- if page.get_url(lang) == relative_url:
+ if page.get_url(lang) == path:
return page
return None
Modified: trunk/pages/models.py
==============================================================================
--- trunk/pages/models.py (original)
+++ trunk/pages/models.py Wed Jul 8 15:12:40 2009
@@ -157,7 +157,8 @@
return languages
def get_absolute_url(self, language=None):
- return reverse('pages-root') + self.get_url(language)
+ return reverse('pages-root') + str(language) + '/' \
+ + self.get_url(language)
def get_url(self, language=None):
"""
@@ -172,7 +173,7 @@
url = ancestor.slug(language) + u'/' + url
cache.set(self.PAGE_URL_KEY % (self.id, language), url)
-
+
return url
def slug(self, language=None, fallback=True):
@@ -247,7 +248,7 @@
if self.level:
for n in range(0, self.level):
level += ' '
- return mark_safe(level + self.__unicode__())
+ return mark_safe(level + self.slug())
def margin_level(self):
return self.level * 2
Modified: trunk/pages/templates/admin/pages/page/menu.html
==============================================================================
--- trunk/pages/templates/admin/pages/page/menu.html (original)
+++ trunk/pages/templates/admin/pages/page/menu.html Wed Jul 8 15:12:40
2009
@@ -13,9 +13,8 @@
{% endif %}
<a href="{{ url }}{{ page.id }}/" class="title
changelink">{% show_content page "slug" %}</a>
-
<div class="actions">
- <a class="viewlink" href="{{ page.get_absolute_url }}"
target="_blank" title="{% trans "view this page" %}"></a>
+ <a class="viewlink" href="{% show_absolute_url
page %}" target="_blank" title="{% trans "view this page" %}"></a>
<a class="movelink" id="move-link-{{ page.id }}"
href="#" title="{% trans "move this page" %}"></a>
<a class="addlink" id="add-link-{{ page.id }}"
href="#" title="{% trans "insert a new page here" %}"></a>
<a class="deletelink" href="{{ page.id }}/delete/"
title="{% trans "delete this page" %}"></a>
Modified: trunk/pages/templatetags/pages_tags.py
==============================================================================
--- trunk/pages/templatetags/pages_tags.py (original)
+++ trunk/pages/templatetags/pages_tags.py Wed Jul 8 15:12:40 2009
@@ -17,31 +17,25 @@
def get_content(context, page, content_type, lang, fallback=True):
"""Helper function used by placeholder nodes"""
- request = context.get('request', False)
- if not request or not page:
+ if not page:
return ''
- absolute_lang = None
- if lang:
- absolute_lang = lang
- elif 'lang' in context:
- absolute_lang = context['lang']
-
+ if not lang and 'lang' in context:
+ lang = context['lang']
+
# if the page is a SafeUnicode, try to use it like a slug
if isinstance(page, SafeUnicode) or isinstance(page, unicode):
- page = Page.objects.from_slug(page, context['request'].path,
- absolute_lang)
+ page = Page.objects.from_path(page, lang)
if not page:
return ''
# now that we are sure to have a page object, we can found the
content's
# language more accuratly
- if not absolute_lang:
- absolute_lang = get_language_from_request(context['request'], page)
+ """if not absolute_lang:
+ absolute_lang = get_language_from_request(context['lang'], page)"""
- c = Content.objects.get_content(page, absolute_lang, content_type,
-fallback)
+ c = Content.objects.get_content(page, lang, content_type, fallback)
return c
"""Filters"""
@@ -62,7 +56,8 @@
def pages_menu(context, page, url='/'):
"""Render a nested list of all children of the given page, including
this page"""
- request = context['request']
+ lang = context['lang']
+ path = context['path']
site_id = None
children = page.get_children_for_frontend()
if 'current_page' in context:
@@ -74,7 +69,8 @@
def pages_sub_menu(context, page, url='/'):
"""Get the root page of the given page and
render a nested list of all root's children pages"""
- request = context['request']
+ lang = context['lang']
+ path = context['path']
root = page.get_root()
children = root.get_children_for_frontend()
if 'current_page' in context:
@@ -90,19 +86,19 @@
if "tree_expanded" in request.COOKIES:
cookie_string = urllib.unquote(request.COOKIES['tree_expanded'])
if cookie_string:
- ids = [int(id) for id in
-urllib.unquote(request.COOKIES['tree_expanded']).split(',')]
+ ids = [int(id) for id in
+
urllib.unquote(request.COOKIES['tree_expanded']).split(',')]
if page.id in ids:
expanded = True
page_languages = settings.PAGE_LANGUAGES
has_permission = page.has_page_permission(request)
PAGES_MEDIA_URL = settings.PAGES_MEDIA_URL
+ lang = context.get('lang', None)
return locals()
pages_admin_menu = register.inclusion_tag('admin/pages/page/menu.html',
-
-takes_context=True)(pages_admin_menu)
+
takes_context=True)(pages_admin_menu)
def show_content(context, page, content_type, lang=None, fallback=True):
@@ -121,7 +117,7 @@
fallback -- use fallback content
"""
return {'content':get_content(context, page, content_type, lang,
-fallback)}
+ fallback)}
show_content = register.inclusion_tag('pages/content.html',
takes_context=True)(show_content)
@@ -138,17 +134,11 @@
page -- the page object or a slug string
lang -- the wanted language (defaults to None, uses request object
else)
"""
- request = context.get('request', False)
- if not request:
- return {'content':''}
- if lang is None:
- if 'lang' in context:
- lang = context['lang']
- else:
- lang = get_language_from_request(request, page)
+ lang = context.get('lang', None)
+ path = context.get('path', None)
# if the page is a SafeUnicode, try to use it like a slug
if isinstance(page, SafeUnicode) or isinstance(page, unicode):
- page = Page.objects.from_slug(page, request.path, lang)
+ page = Page.objects.from_path(page, lang)
if not page:
return {'content':''}
url = page.get_absolute_url(language=lang)
@@ -205,7 +195,7 @@
page -- the page object
type -- content_type used by a placeholder
name -- name of the context variable to store the content in
- lang -- the wanted language (default None, use the request object to
know)
+ lang -- the wanted language
"""
bits = token.split_contents()
if not 5 <= len(bits) <= 6:
@@ -300,14 +290,10 @@
self.found_in_block = None
def render(self, context):
- if not 'request' in context or not self.page in context:
+ if not self.page in context:
return ''
- if 'lang' in context:
- lang = context['lang']
- else:
- lang = get_language_from_request(context['request'],
context[self.page])
- request = context['request']
+ lang = context.get('lang', None)
content = Content.objects.get_content(context[self.page], lang,
self.name, True)
if not content:
Modified: trunk/pages/tests/pages_tests.py
==============================================================================
--- trunk/pages/tests/pages_tests.py (original)
+++ trunk/pages/tests/pages_tests.py Wed Jul 8 15:12:40 2009
@@ -94,7 +94,7 @@
response = c.post('/admin/pages/page/add/', page_data)
self.assertRedirects(response, '/admin/pages/page/')
- response = c.get('/pages/test-page-2/')
+ response = c.get('/pages/en-us/test-page-2/')
self.assertEqual(response.status_code, 200)
def test_05_edit_page(self):
@@ -305,7 +305,8 @@
# this assert test that the creation fails as wanted
self.assertEqual(response.status_code, 200)
- response = c.get('/pages/same-slug/')
+ response = c.get('/pages/en-us/same-slug/')
+ self.assertEqual(response.status_code, 200)
page1 =
Content.objects.get_content_slug_by_slug(page_data['slug']).page
self.assertEqual(page1.id, page.id)
@@ -317,10 +318,10 @@
self.assertRedirects(response, '/admin/pages/page/')
# finaly test that we can get every page according the path
- response = c.get('/pages/same-slug/')
+ response = c.get('/pages/en-us/same-slug/')
self.assertContains(response, "parent title", 2)
- response = c.get('/pages/same-slug/same-slug/')
+ response = c.get('/pages/en-us/same-slug/same-slug/')
self.assertContains(response, "children title", 2)
def test_11_show_content_tag(self):
@@ -335,7 +336,8 @@
class request:
REQUEST = {'language': 'en'}
GET = {}
- context = RequestContext(request, {'page': page})
+ context = RequestContext(request, {'page': page, 'lang':'en-us',
+ 'path':'/page-1/'})
template = Template('{% load pages_tags %}'
'{% show_content page "title" "en-us" %}')
self.assertEqual(template.render(context), page_data['title'])
@@ -568,11 +570,11 @@
# create a page for the example otherwise you will get a Http404
error
response = c.post('/admin/pages/page/add/', page_data)
- response = c.get('/pages/page1/')
+ response = c.get('/pages/en-us/page1/')
self.assertEqual(response.status_code, 200)
try:
- response = c.get('/pages/toto/page1/')
+ response = c.get('/pages/en-us/toto/page1/')
except TemplateDoesNotExist, e:
if e.args != ('404.html',):
raise
Modified: trunk/pages/urls.py
==============================================================================
--- trunk/pages/urls.py (original)
+++ trunk/pages/urls.py Wed Jul 8 15:12:40 2009
@@ -9,9 +9,6 @@
)
urlpatterns += patterns('',
- url(r'^.*?/?(?P<slug>[-\w]+)/ajax/$', details, {'ajax':True},
name='pages-details-by-slug'),
-)
-
-urlpatterns += patterns('',
- url(r'^.*?/?(?P<slug>[-\w]+)/$', details,
name='pages-details-by-slug'),
+ url(r'^(?P<lang>[-\w]+)/(?P<path>.*)$', details,
+ name='pages-details-by-slug'),
)
Modified: trunk/pages/views.py
==============================================================================
--- trunk/pages/views.py (original)
+++ trunk/pages/views.py Wed Jul 8 15:12:40 2009
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
"""Default example views"""
from django.http import Http404, HttpResponsePermanentRedirect
from django.shortcuts import get_object_or_404
@@ -6,9 +5,9 @@
from pages import settings
from pages.models import Page, Content
from pages.http import auto_render, get_language_from_request
+from pages.http import get_slug_and_relative_path
-
-def details(request, slug=None, lang=None):
+def details(request, path=None, lang=None):
"""This view get the root pages for navigation
and the current page to display if there is any.
@@ -28,13 +27,16 @@
pages = Page.objects.navigation().order_by("tree_id")
current_page = False
+
if lang is None:
lang = get_language_from_request(request, current_page)
- if slug:
- current_page = Page.objects.from_slug(slug, request.path, lang)
- if current_page and request.META['PATH_INFO'] != \
- current_page.get_absolute_url():
+ if lang not in [key for (key, value) in settings.PAGE_LANGUAGES]:
+ raise Http404
+
+ if path:
+ current_page = Page.objects.from_path(path, lang)
+ if not current_page:
raise Http404
elif pages:
current_page = pages[0]
@@ -55,8 +57,9 @@
if request.is_ajax():
new_template_name = "body_%s" % template_name
return new_template_name, locals()
-
+
return template_name, {
+ 'path': path,
'pages': pages,
'current_page': current_page,
'lang': lang,
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---