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

Reply via email to