Author: homebrew79
Date: Tue Dec 9 13:51:00 2008
New Revision: 274
Modified:
branches/directory-style-urls/example/settings.py
branches/directory-style-urls/example/urls.py
branches/directory-style-urls/pages/admin/__init__.py
branches/directory-style-urls/pages/admin/forms.py
branches/directory-style-urls/pages/admin/utils.py
branches/directory-style-urls/pages/managers.py
branches/directory-style-urls/pages/media/pages/css/pages.css
branches/directory-style-urls/pages/media/pages/javascript/change_list.js
branches/directory-style-urls/pages/models.py
branches/directory-style-urls/pages/settings.py
branches/directory-style-urls/pages/templates/admin/pages/page/change_list_table.html
branches/directory-style-urls/pages/urls.py
branches/directory-style-urls/pages/utils.py
branches/directory-style-urls/pages/views.py
Log:
Lots of changes here. Adds support for directory style URLs where the slug
only has to be unique for the parent page. Adds a new setting
PAGE_USE_ID_IN_URL to get pages by ID. If PAGE_UNIQUE_SLUG_REQUIRED is
True it will require a unique slug for the entire site otherwise it assumes
Directory style URLs
Modified: branches/directory-style-urls/example/settings.py
==============================================================================
--- branches/directory-style-urls/example/settings.py (original)
+++ branches/directory-style-urls/example/settings.py Tue Dec 9 13:51:00
2008
@@ -109,6 +109,9 @@
('cool.html', 'cool one'),
)
+PAGE_UNIQUE_SLUG_REQUIRED = False
+PAGE_BASE_URL = ''
+
try:
from local_settings import *
except ImportError:
Modified: branches/directory-style-urls/example/urls.py
==============================================================================
--- branches/directory-style-urls/example/urls.py (original)
+++ branches/directory-style-urls/example/urls.py Tue Dec 9 13:51:00 2008
@@ -4,14 +4,15 @@
admin.autodiscover()
+
urlpatterns = patterns('',
- (r'^pages/', include('pages.urls')),
(r'^admin/(.*)', admin.site.root),
+ (r'', include('pages.urls')),
)
if settings.DEBUG:
- urlpatterns += patterns('',
+ urlpatterns = patterns('',
# Trick for Django to support static files (security hole: only
for Dev environement! remove this on Prod!!!)
- url(r'^media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT}),
+ url(r'^media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
url(r'^admin_media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': settings.ADMIN_MEDIA_ROOT}),
- )
+ ) + urlpatterns
Modified: branches/directory-style-urls/pages/admin/__init__.py
==============================================================================
--- branches/directory-style-urls/pages/admin/__init__.py (original)
+++ branches/directory-style-urls/pages/admin/__init__.py Tue Dec 9
13:51:00 2008
@@ -10,14 +10,15 @@
from django.http import HttpResponseRedirect
from pages import settings
-from pages.models import Page, Content, tagging
+from pages.models import Page, Content, tagging, URL
from pages.views import details
from pages.utils import get_template_from_request,
has_page_add_permission, \
get_language_from_request
from pages.admin import widgets
from pages.admin.forms import PageForm
-from pages.admin.utils import get_placeholders
+from pages.admin.utils import get_placeholders, unique_slug_for_parent, \
+ create_url_for_page
from pages.admin.views import traduction, get_content, valid_targets_list,
\
change_status, modify_content
@@ -37,7 +38,7 @@
general_fields.insert(insert_point, 'publication_end_date')
if settings.PAGE_SHOW_START_DATE:
general_fields.insert(insert_point, 'publication_date')
-
+
normal_fields = ['language']
if settings.PAGE_TEMPLATES:
normal_fields.append('template')
@@ -52,6 +53,10 @@
'classes': ('sidebar', 'clear'),
'description': _('Note: This page reloads if you change the
selection'),
}),
+ ('', {
+ 'fields': ('target','position'),
+ 'classes': ('hidden',)
+ }),
)
class Media:
@@ -91,6 +96,11 @@
elif url.endswith('/change-status'):
return change_status(request, unquote(url[:-14]))
return super(PageAdmin, self).__call__(request, url)
+
+# def add_view(self, request):
+# target = request.GET.get('target', None)
+# self.form.fields['parent'] = int(target)
+# return admin.ModelAdmin.add_view(self, request)
def i18n_javascript(self, request):
"""
@@ -114,6 +124,7 @@
language = form.cleaned_data['language']
target = request.GET.get('target', None)
position = request.GET.get('position', None)
+
if target is not None and position is not None:
try:
target = self.model.objects.get(pk=target)
@@ -141,7 +152,13 @@
else:
Content.objects.set_or_create_content(obj, language,
placeholder.name,
form.cleaned_data[placeholder.name])
-
+
+ # Create the URLs for the page when the slug is created or changes
+ if 'slug' in form._get_changed_data():
+ create_url_for_page(obj)
+ for page in obj.get_descendants():
+ create_url_for_page(page)
+
def get_fieldsets(self, request, obj=None):
"""
Add fieldsets of placeholders to the list of already existing
@@ -297,17 +314,26 @@
target = request.POST.get('target', None)
position = request.POST.get('position', None)
+
if target is not None and position is not None:
- try:
- target = self.model.objects.get(pk=target)
- except self.model.DoesNotExist:
- context.update({'error': _('Page could not been moved.')})
+ if position in ('right', 'left'):
+ relationship = 'sibling'
+ elif position == 'first-child':
+ relationship = 'parent'
+ if unique_slug_for_parent(slug=page.slug(),
+ page_id=target, relationship=relationship):
+ try:
+ target = self.model.objects.get(pk=target)
+ except self.model.DoesNotExist:
+ context.update({'move_status': _('Page could not been
moved.')})
+ else:
+ page.move_to(target, position)
+ context.update({'move_status': _('Page Successfully
moved.')})
else:
- page.move_to(target, position)
- return self.list_pages(request,
-
template_name='admin/pages/page/change_list_table.html')
+ context.update({'move_status': _('Error Moving Page. Slug
is not unique for parent.')})
context.update(extra_context or {})
- return HttpResponseRedirect('../../')
+ return self.list_pages(request,
+ template_name='admin/pages/page/change_list_table.html',
extra_context=context)
admin.site.register(Page, PageAdmin)
class ContentAdmin(admin.ModelAdmin):
Modified: branches/directory-style-urls/pages/admin/forms.py
==============================================================================
--- branches/directory-style-urls/pages/admin/forms.py (original)
+++ branches/directory-style-urls/pages/admin/forms.py Tue Dec 9 13:51:00
2008
@@ -4,6 +4,7 @@
from pages import settings
from pages.models import Page, Content, tagging
+from pages.admin.utils import unique_slug_for_parent
class PageForm(forms.ModelForm):
title = forms.CharField(
@@ -27,6 +28,9 @@
choices=settings.PAGE_TEMPLATES,
help_text=_('The template used to render the content.')
)
+ target = forms.IntegerField(required=False)
+ position = forms.CharField(required=False)
+
if tagging:
from tagging.forms import TagField
from pages.admin.widgets import AutoCompleteTagInput
@@ -43,4 +47,18 @@
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'))
+ else:
+ target = self.data.get('target', None)
+ position = self.data.get('position', None)
+ if self.instance.id:
+ sibling_slugs = [sibling.slug() for sibling in
self.instance.get_siblings()]
+ if slug in sibling_slugs:
+ raise forms.ValidationError(ugettext_lazy('A sibling
page with this slug already exists'))
+ elif target is not None and position is not None:
+ if position in ('left', 'right'):
+ if not unique_slug_for_parent(slug=slug,
page_id=target, relationship='sibling'):
+ raise forms.ValidationError(ugettext_lazy('A
sibling page with this slug already exists'))
+ elif position == 'first-child':
+ if not unique_slug_for_parent(slug=slug,
page_id=target, relationship='parent'):
+ raise forms.ValidationError(ugettext_lazy('A
sibling page with this slug already exists'))
return slug
Modified: branches/directory-style-urls/pages/admin/utils.py
==============================================================================
--- branches/directory-style-urls/pages/admin/utils.py (original)
+++ branches/directory-style-urls/pages/admin/utils.py Tue Dec 9 13:51:00
2008
@@ -4,6 +4,19 @@
from django.templatetags.pages_tags import PlaceholderNode
from pages.views import details
+from pages.models import Page, URL
+from pages import settings
+
+def create_url_for_page(page):
+ """
+ Insert URL Records for a given page based on page.get_url()
+ """
+ for language in settings.PAGE_LANGUAGES:
+ url, new = URL.objects.get_or_create(
+ page=page, url=page.get_url(language[0])
+ )
+ if new:
+ url.save()
def get_placeholders(request, template_name):
"""
@@ -36,3 +49,19 @@
for node in nodelist:
if isinstance(node, ExtendsNode):
placeholders_recursif(node.get_parent(Context()).nodelist,
list)
+
+def unique_slug_for_parent(slug, page_id, relationship):
+ """
+ Checks uniqueness of a slug in relation to other pages.
+ """
+ if relationship == 'sibling':
+ target_page = Page.objects.get(pk=page_id)
+ sibling_slugs = [sibling.slug() for sibling in
target_page.get_siblings()]
+ sibling_slugs.append(target_page.slug())
+ if slug in sibling_slugs:
+ return False
+ elif relationship == 'parent':
+ siblings = Page.objects.get(pk=page_id).get_children()
+ if slug in [sibling.slug() for sibling in siblings]:
+ return False
+ return True
\ No newline at end of file
Modified: branches/directory-style-urls/pages/managers.py
==============================================================================
--- branches/directory-style-urls/pages/managers.py (original)
+++ branches/directory-style-urls/pages/managers.py Tue Dec 9 13:51:00 2008
@@ -138,6 +138,14 @@
else:
return content
+ def get_slugs_by_name(self, slug):
+ """
+ Returns all content objects that are slugs with the given slug arg.
+ """
+ return self.filter(type='slug', body=slug,
+ page__sites__pk=Site.objects.get_current().pk
+ ).select_related('page')
+
class PagePermissionManager(models.Manager):
def get_page_id_list(self, user):
Modified: branches/directory-style-urls/pages/media/pages/css/pages.css
==============================================================================
--- branches/directory-style-urls/pages/media/pages/css/pages.css
(original)
+++ branches/directory-style-urls/pages/media/pages/css/pages.css Tue Dec
9 13:51:00 2008
@@ -16,6 +16,10 @@
background:#fff;
}
+.hidden {
+ display: none;
+}
+
.placeholder-row textarea, .placeholder-row input {
float:left;
}
Modified:
branches/directory-style-urls/pages/media/pages/javascript/change_list.js
==============================================================================
---
branches/directory-style-urls/pages/media/pages/javascript/change_list.js
(original)
+++
branches/directory-style-urls/pages/media/pages/javascript/change_list.js
Tue Dec 9 13:51:00 2008
@@ -160,7 +160,9 @@
$('#changelist').html(html);
initTreeCollapsing();
$('#page-row-'+selected_page).addClass("selected");
- var msg = $('<span>Successfully moved</span>');
+ var msg_text = $('#move_status').html();
+ var msg = $('<span>' + msg_text +'</span>');
+ //var msg = $('<span>Successfully moved</span>');
$($('#page-row-'+selected_page+"
td")[0]).append(msg);
msg.fadeOut(5000);
}
Modified: branches/directory-style-urls/pages/models.py
==============================================================================
--- branches/directory-style-urls/pages/models.py (original)
+++ branches/directory-style-urls/pages/models.py Tue Dec 9 13:51:00 2008
@@ -9,6 +9,8 @@
from django.core.urlresolvers import reverse
from django.core.exceptions import ImproperlyConfigured
from django.contrib.sites.models import Site
+from django.db.models.signals import pre_save, post_save
+
import mptt
from pages import settings
@@ -104,10 +106,10 @@
"""
get the url of this page, adding parent's slug
"""
- if settings.PAGE_UNIQUE_SLUG_REQUIRED:
- url = u'%s/' % self.slug(language)
- else:
+ if settings.PAGE_USE_ID_IN_URL:
url = u'%s-%d/' % (self.slug(language), self.id)
+ else:
+ url = u'%s/' % self.slug(language)
for ancestor in self.get_ancestors(ascending=True):
url = ancestor.slug(language) + u'/' + url
return url
@@ -215,3 +217,17 @@
def __unicode__(self):
return "%s :: %s" % (self.page.slug(), self.body[0:15])
+
+class URL(models.Model):
+ """URLS available for pages"""
+ page = models.ForeignKey(Page)
+ url = models.CharField(max_length=500)
+ creation_date = models.DateTimeField(auto_now_add=True)
+
+ def __unicode__(self):
+ return self.url
+
+ class Meta():
+ unique_together = ('page', 'url')
+
+
Modified: branches/directory-style-urls/pages/settings.py
==============================================================================
--- branches/directory-style-urls/pages/settings.py (original)
+++ branches/directory-style-urls/pages/settings.py Tue Dec 9 13:51:00 2008
@@ -26,6 +26,9 @@
# Whether to only allow unique slugs.
PAGE_UNIQUE_SLUG_REQUIRED = getattr(settings, 'PAGE_UNIQUE_SLUG_REQUIRED',
True)
+# Append the Page ID to the URL.
+PAGE_USE_ID_IN_URL = getattr(settings, 'PAGE_USE_ID_IN_URL', False)
+
# Whether to enable revisions.
PAGE_CONTENT_REVISION = getattr(settings, 'PAGE_CONTENT_REVISION', True)
Modified:
branches/directory-style-urls/pages/templates/admin/pages/page/change_list_table.html
==============================================================================
---
branches/directory-style-urls/pages/templates/admin/pages/page/change_list_table.html
(original)
+++
branches/directory-style-urls/pages/templates/admin/pages/page/change_list_table.html
Tue Dec 9 13:51:00 2008
@@ -1,4 +1,5 @@
{% load i18n pages_tags %}
+<div id="move_status" style="display: none">{{ move_status }}</div>
<table cellspacing="0" id="page-list">
<thead>
<tr>
Modified: branches/directory-style-urls/pages/urls.py
==============================================================================
--- branches/directory-style-urls/pages/urls.py (original)
+++ branches/directory-style-urls/pages/urls.py Tue Dec 9 13:51:00 2008
@@ -7,11 +7,11 @@
url(r'^$', details, name='pages-root'),
)
-if settings.PAGE_UNIQUE_SLUG_REQUIRED:
+if settings.PAGE_USE_ID_IN_URL:
urlpatterns += patterns('',
- url(r'^.*?/?(?P<slug>[-\w]+)/$', details,
name='pages-details-by-slug'),
+ url(r'^.*?(?P<page_id>[0-9]+)/$', details,
name='pages-details-by-id'),
)
else:
urlpatterns += patterns('',
- url(r'^.*?(?P<page_id>[0-9]+)/$', details,
name='pages-details-by-id'),
+ url(r'^.*?/?(?P<slug>[-\w]+)/$', details,
name='pages-details-by-slug'),
)
Modified: branches/directory-style-urls/pages/utils.py
==============================================================================
--- branches/directory-style-urls/pages/utils.py (original)
+++ branches/directory-style-urls/pages/utils.py Tue Dec 9 13:51:00 2008
@@ -16,7 +16,7 @@
del(kwargs['only_context'])
response = func(request, *args, **kwargs)
if isinstance(response, HttpResponse) or isinstance(response,
HttpResponseRedirect):
- raise Except("cannot return context dictionary because a
HttpResponseRedirect as been found")
+ raise Exception("cannot return context dictionary because
a HttpResponseRedirect as been found")
(template_name, context) = response
return context
if "template_name" in kwargs:
Modified: branches/directory-style-urls/pages/views.py
==============================================================================
--- branches/directory-style-urls/pages/views.py (original)
+++ branches/directory-style-urls/pages/views.py Tue Dec 9 13:51:00 2008
@@ -1,12 +1,39 @@
from django.http import Http404
from django.shortcuts import get_object_or_404
from django.contrib.sites.models import SITE_CACHE
+from django.core.urlresolvers import reverse
from pages import settings
-from pages.models import Page, Content
+from pages.models import Page, Content, URL
from pages.utils import auto_render, get_template_from_request,
get_language_from_request
+import re
+
def details(request, page_id=None, slug=None,
+ template_name=settings.DEFAULT_PAGE_TEMPLATE):
+ lang = get_language_from_request(request)
+ site = request.site
+ pages = Page.objects.root(site).order_by("tree_id")
+ if pages:
+ if page_id:
+ current_page = get_object_or_404(Page.objects.published(site),
pk=page_id)
+ elif slug:
+ try:
+ relative_url = re.sub(reverse('pages-root'), '',
request.path, count=1)
+ current_page = URL.objects.filter(
+ url=relative_url
+ ).latest('creation_date').page
+ except URL.DoesNotExist:
+ raise Http404
+ else:
+ current_page = pages[0]
+ template_name = get_template_from_request(request, current_page)
+ else:
+ current_page = None
+ return template_name, locals()
+details = auto_render(details)
+
+def details_old(request, page_id=None, slug=None,
template_name=settings.DEFAULT_PAGE_TEMPLATE):
lang = get_language_from_request(request)
site = request.site
@@ -15,11 +42,13 @@
if page_id:
current_page = get_object_or_404(Page.objects.published(site),
pk=page_id)
elif slug:
- slug_content = Content.objects.get_page_slug(slug, site)
- if slug_content and \
- slug_content.page.calculated_status == Page.PUBLISHED:
- current_page = slug_content.page
- else:
+ content = Content.objects.get_slugs_by_name(slug)
+ current_page = None
+ for content_obj in content:
+ if content_obj.page.get_absolute_url() == request.path and\
+ content_obj.page.calculated_status ==
Page.PUBLISHED:
+ current_page = content_obj.page
+ if current_page is None:
raise Http404
else:
current_page = pages[0]
@@ -27,4 +56,4 @@
else:
current_page = None
return template_name, locals()
-details = auto_render(details)
+#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
-~----------~----~----~----~------~----~------~--~---