Author: batiste.bieler
Date: Mon Feb  2 10:01:30 2009
New Revision: 325

Added:
    trunk/example/documents/
    trunk/example/documents/__init__.py
    trunk/example/documents/admin.py
    trunk/example/documents/models.py
    trunk/example/documents/views.py
Modified:
    trunk/example/settings.py
    trunk/pages/admin/__init__.py
    trunk/pages/admin/utils.py
    trunk/pages/settings.py
    trunk/pages/tests.py

Log:
Add basic way to link a model to the Page admin with the  
PAGE_CONNECTED_MODELS setting

Added: trunk/example/documents/__init__.py
==============================================================================

Added: trunk/example/documents/admin.py
==============================================================================
--- (empty file)
+++ trunk/example/documents/admin.py    Mon Feb  2 10:01:30 2009
@@ -0,0 +1,9 @@
+# Admin bindings
+from django.contrib import admin
+from documents.models import Document
+
+class DocumentAdmin(admin.ModelAdmin):
+
+    list_display   = ('title', 'page',)
+
+admin.site.register(Document, DocumentAdmin)

Added: trunk/example/documents/models.py
==============================================================================
--- (empty file)
+++ trunk/example/documents/models.py   Mon Feb  2 10:01:30 2009
@@ -0,0 +1,17 @@
+from django.db import models
+from django.forms import ModelForm
+from pages.models import Page
+from django.utils.translation import ugettext_lazy as _
+
+class Document(models.Model):
+    "A dummy model used to illsutrate the use of linked models in  
django-page-cms"
+
+    title = models.CharField(_('title'), max_length=100, blank=False)
+    text = models.TextField(_('text'), blank=True)
+
+    # the foreign key _must_ be called page
+    page = models.ForeignKey(Page)
+
+class DocumentForm(ModelForm):
+    class Meta:
+        model = Document

Added: trunk/example/documents/views.py
==============================================================================
--- (empty file)
+++ trunk/example/documents/views.py    Mon Feb  2 10:01:30 2009
@@ -0,0 +1 @@
+# Create your views here.

Modified: trunk/example/settings.py
==============================================================================
--- trunk/example/settings.py   (original)
+++ trunk/example/settings.py   Mon Feb  2 10:01:30 2009
@@ -90,10 +90,15 @@
      'django.contrib.sessions',
      'django.contrib.admin',
      'django.contrib.sites',
+    'documents',
      'tagging',
      'pages',
      'mptt',
  )
+
+PAGE_CONNECTED_MODELS = [
+     
{'model':'documents.models.Document','form':'documents.models.DocumentForm'},
+]

  gettext_noop = lambda s: s
  LANGUAGES = (

Modified: trunk/pages/admin/__init__.py
==============================================================================
--- trunk/pages/admin/__init__.py       (original)
+++ trunk/pages/admin/__init__.py       Mon Feb  2 10:01:30 2009
@@ -17,18 +17,19 @@

  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, get_connected_models
  from pages.admin.views import traduction, get_content, valid_targets_list,  
\
      change_status, modify_content

  class PageAdmin(admin.ModelAdmin):
+
      form = PageForm
      exclude = ['author', 'parent']
      # these mandatory fields are not versioned
      mandatory_placeholders = ('title', 'slug')
      general_fields = ['title', 'slug', 'status', 'sites']
      insert_point = general_fields.index('status') + 1
-
+
      if settings.PAGE_TAGGING:
          general_fields.insert(insert_point, 'tags')

@@ -146,19 +147,30 @@
          """
          Add fieldsets of placeholders to the list of already existing
          fieldsets.
-        """
+         """
+        additional_fieldsets = []
+
          placeholder_fieldsets = []
          template = get_template_from_request(request, obj)
          for placeholder in get_placeholders(request, template):
              if placeholder.name not in self.mandatory_placeholders:
                  placeholder_fieldsets.append(placeholder.name)

-        if self.declared_fieldsets:
-            given_fieldsets = list(self.declared_fieldsets)
-        else:
-            form = self.get_form(request, obj)
-            given_fieldsets = [(_('content'), {'fields':  
form.base_fields.keys()})]
-        return given_fieldsets + [(_('content'), {'fields':  
placeholder_fieldsets})]
+        additional_fieldsets.append((_('Content'), {'fields':  
placeholder_fieldsets}))
+
+        connected_fieldsets = []
+        if obj:
+            for mod in get_connected_models():
+                for field_name, real_field_name, field in mod['fields']:
+                    connected_fieldsets.append(field_name)
+
+                additional_fieldsets.append((_('Create a new linked ' +
+                    mod['model_name']), {'fields': connected_fieldsets}))
+
+        given_fieldsets = list(self.declared_fieldsets)
+
+        return given_fieldsets + additional_fieldsets
+

      def save_form(self, request, form, change):
          """
@@ -204,6 +216,28 @@
              form.base_fields['template'].choices = template_choices
              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():
+                            connected_form.save()
+                    else:
+                        validate_field = False
+
+                if validate_field:
+                    for field_name, real_field_name, field in  
mod['fields']:
+                        form.base_fields[field_name] = field
+
          for placeholder in get_placeholders(request, template):
              widget = self.get_widget(request, placeholder.widget)()
              if placeholder.parsed:
@@ -221,6 +255,7 @@
              else:
                  form.base_fields[name].initial = initial
                  form.base_fields[name].help_text = help_text
+
          return form

      def change_view(self, request, object_id, extra_context=None):

Modified: trunk/pages/admin/utils.py
==============================================================================
--- trunk/pages/admin/utils.py  (original)
+++ trunk/pages/admin/utils.py  Mon Feb  2 10:01:30 2009
@@ -3,8 +3,10 @@
  from django.http import Http404
  # must be imported like this for isinstance
  from django.templatetags.pages_tags import PlaceholderNode
+from django.core.urlresolvers import get_mod_func

  from pages.views import details
+from pages import settings

  def get_placeholders(request, template_name):
      """
@@ -40,3 +42,27 @@
      for node in nodelist:
          if isinstance(node, ExtendsNode):
              placeholders_recursif(node.get_parent(Context()).nodelist,  
list)
+
+def get_connected_models():
+
+    if not settings.PAGE_CONNECTED_MODELS:
+        return []
+
+    models = []
+    for capp in settings.PAGE_CONNECTED_MODELS:
+        model = {}
+        mod_name, form_name = get_mod_func(capp['form'])
+        f = getattr(__import__(mod_name, {}, {}, ['']), form_name)
+        #print f.Meta
+        model['form'] = f
+        mod_name, model_name = get_mod_func(capp['model'])
+        model['model_name'] = model_name
+        m = getattr(__import__(mod_name, {}, {}, ['']), model_name)
+        model['model'] = m
+        model['fields'] = []
+        for k, v in f.base_fields.iteritems():
+            if k is not "page":
+                model['fields'].append((model_name.lower() + '_' + k, k,  
v))
+        models.append(model)
+
+    return models

Modified: trunk/pages/settings.py
==============================================================================
--- trunk/pages/settings.py     (original)
+++ trunk/pages/settings.py     Mon Feb  2 10:01:30 2009
@@ -61,3 +61,8 @@
  # Changing this from True to False could cause some weirdness.  If that is  
required,
  # you should update your database and null any pages with  
publication_end_date set.
  PAGE_SHOW_END_DATE = getattr(settings, 'PAGE_SHOW_END_DATE', False)
+
+# You can specify a model and form for this model into your settings to get
+# an automatic form to create and directly link a new instance of this  
model
+# with your page.
+PAGE_CONNECTED_MODELS = getattr(settings, 'PAGE_CONNECTED_MODELS', False)

Modified: trunk/pages/tests.py
==============================================================================
--- trunk/pages/tests.py        (original)
+++ trunk/pages/tests.py        Mon Feb  2 10:01:30 2009
@@ -7,10 +7,10 @@
  page_data = {'title':'test page', 'slug':'test-page-1', 'language':'en',
      'sites':[2], 'status':Page.PUBLISHED}

+
  class PagesTestCase(TestCase):
      fixtures = ['tests.json']

-
      def test_01_add_page(self):
          """
          Test that the add admin page could be displayed via the admin
@@ -84,4 +84,20 @@

          response = c.get('/pages/')
          assert(response.status_code == 200)
+
+    def test_02_edit_page(self):
+        """
+        Test that a page can edited via the admin
+        """
+        c = Client()
+        c.login(username= 'batiste', password='b')
+        response = c.post('/admin/pages/page/add/', page_data)
+        response = c.get('/admin/pages/page/1/')
+        assert(response.status_code == 200)
+        page_data['title'] = 'changed title'
+        response = c.post('/admin/pages/page/1/', page_data)
+        self.assertRedirects(response, '/admin/pages/page/')
+        page = Page.objects.get(id=1)
+        assert(page.title() == 'changed title')
+


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