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