[cig-commits] r11817 - cs/portal/trunk/seismo/SeismoWebPortal
leif at geodynamics.org
leif at geodynamics.org
Tue Apr 15 11:07:08 PDT 2008
Author: leif
Date: 2008-04-15 11:07:08 -0700 (Tue, 15 Apr 2008)
New Revision: 11817
Modified:
cs/portal/trunk/seismo/SeismoWebPortal/create_update.py
Log:
Refactored the 'create_update' module to facilitate the placement of
multiple forms on the same page.
Modified: cs/portal/trunk/seismo/SeismoWebPortal/create_update.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/create_update.py 2008-04-15 15:10:03 UTC (rev 11816)
+++ cs/portal/trunk/seismo/SeismoWebPortal/create_update.py 2008-04-15 18:07:08 UTC (rev 11817)
@@ -5,6 +5,7 @@
from django.template import RequestContext
from django.http import Http404, HttpResponse, HttpResponseRedirect
from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured
+import config
import gui
def noop(*args, **kwds):
@@ -22,14 +23,49 @@
form
the form wrapper for the object
"""
- if extra_context is None: extra_context = {}
+
if login_required and not request.user.is_authenticated():
return redirect_to_login(request.path)
+
+ form = creationForm(request, model, request.POST, follow)
+
+ if request.POST and not form.error_dict:
+ # No errors -- this means we can save the data!
+ new_object = form.manipulator.save(form.data)
+ kludge = post_save_hook(new_object)
+ if kludge:
+ return kludge
+ if request.user.is_authenticated():
+ request.user.message_set.create(message="The %s was created successfully." % model._meta.verbose_name)
+
+ # Redirect to the new object: first by trying post_save_redirect,
+ # then by obj.get_absolute_url; fail if neither works.
+ if post_save_redirect:
+ return HttpResponseRedirect(post_save_redirect % new_object.__dict__)
+ elif hasattr(new_object, 'get_absolute_url'):
+ return HttpResponseRedirect(new_object.get_absolute_url())
+ else:
+ raise ImproperlyConfigured("No URL to redirect to from generic create view.")
+
+ if extra_context is None: extra_context = {}
+ help_visible = request.session.get('help_visible', False)
+ extra_context['help_visible'] = help_visible
+
+ window.content = gui.StaticContent(renderForm(form,
+ request,
+ template_name,
+ template_loader,
+ extra_context))
+ desktop.activeWindow.selectWindow(window)
+ return desktop
+
+def creationForm(request, model, post, follow=None):
+
manipulator = model.AddManipulator(follow=follow)
help_visible = request.session.get('help_visible', False)
- if request.POST:
+ if post:
new_data = request.POST.copy()
errors = {}
if new_data.has_key('show_help'):
@@ -49,31 +85,28 @@
errors = manipulator.get_validation_errors(new_data)
manipulator.do_html2python(new_data)
- if not errors:
- # No errors -- this means we can save the data!
- new_object = manipulator.save(new_data)
- kludge = post_save_hook(new_object)
- if kludge:
- return kludge
-
- if request.user.is_authenticated():
- request.user.message_set.create(message="The %s was created successfully." % model._meta.verbose_name)
-
- # Redirect to the new object: first by trying post_save_redirect,
- # then by obj.get_absolute_url; fail if neither works.
- if post_save_redirect:
- return HttpResponseRedirect(post_save_redirect % new_object.__dict__)
- elif hasattr(new_object, 'get_absolute_url'):
- return HttpResponseRedirect(new_object.get_absolute_url())
- else:
- raise ImproperlyConfigured("No URL to redirect to from generic create view.")
else:
# No POST, so we want a brand new form without any data or errors
errors = {}
new_data = manipulator.flatten_data()
- # Create the FormWrapper, template, context, response
- form = forms.FormWrapper(manipulator, new_data, errors)
+ # Create the FormWrapper
+ return forms.FormWrapper(manipulator, new_data, errors)
+
+def renderForm(form,
+ request,
+ template_name=None,
+ template_loader=loader,
+ extra_context=None,
+ template_object_name='object',
+ ):
+
+ if extra_context is None: extra_context = {}
+
+ model = form.manipulator.model
+ help_visible = request.session.get('help_visible', False)
+
+ # Create the template, context, response
if not template_name:
template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower())
t = template_loader.get_template(template_name)
@@ -81,20 +114,23 @@
'form': form,
'help_visible': help_visible,
'action': request.path,
+ 'root': config.root,
}
+ obj = getattr(form.manipulator, 'original_object', None)
+ if obj:
+ c[template_object_name] = obj
for key, value in extra_context.items():
if callable(value):
c[key] = value()
else:
c[key] = value
- window.content = gui.StaticContent(t.render(c))
- desktop.activeWindow.selectWindow(window)
- return desktop
+ return t.render(c)
+
def update_object(request, desktop, window, model, object_id=None, slug=None,
slug_field=None, template_name=None, template_loader=loader,
extra_context=None, post_save_redirect=None,
- login_required=False, follow=None, context_processors=None,
+ login_required=False, follow=None,
template_object_name='object',
post_save_hook=noop):
"""
@@ -107,7 +143,7 @@
object
the original object being edited
"""
- if extra_context is None: extra_context = {}
+
if login_required and not request.user.is_authenticated():
return redirect_to_login(request.path)
@@ -124,10 +160,45 @@
except ObjectDoesNotExist:
raise Http404, "No %s found for %s" % (model._meta.verbose_name, lookup_kwargs)
+ form = updatingForm(request, object, request.POST, follow)
+
+ if request.POST and not form.error_dict:
+ object = form.manipulator.save(form.data)
+ kludge = post_save_hook(object)
+ if kludge:
+ return kludge
+
+ if request.user.is_authenticated():
+ request.user.message_set.create(message="The %s was updated successfully." % model._meta.verbose_name)
+
+ # Do a post-after-redirect so that reload works, etc.
+ if post_save_redirect:
+ return HttpResponseRedirect(post_save_redirect % object.__dict__)
+ elif hasattr(object, 'get_absolute_url'):
+ return HttpResponseRedirect(object.get_absolute_url())
+ else:
+ raise ImproperlyConfigured("No URL to redirect to from generic create view.")
+
+ if extra_context is None: extra_context = {}
+ help_visible = request.session.get('help_visible', False)
+ extra_context['help_visible'] = help_visible
+
+ window.content = gui.StaticContent(renderForm(form,
+ request,
+ template_name,
+ template_loader,
+ extra_context,
+ template_object_name))
+ desktop.activeWindow.selectWindow(window)
+ return desktop
+
+def updatingForm(request, object, post, follow=None):
+
+ model = object.__class__
manipulator = model.ChangeManipulator(getattr(object, object._meta.pk.name), follow=follow)
help_visible = request.session.get('help_visible', False)
- if request.POST:
+ if post:
new_data = request.POST.copy()
errors = {}
if new_data.has_key('show_help'):
@@ -143,45 +214,12 @@
new_data.update(request.FILES)
errors = manipulator.get_validation_errors(new_data)
manipulator.do_html2python(new_data)
- if not errors:
- object = manipulator.save(new_data)
- kludge = post_save_hook(object)
- if kludge:
- return kludge
-
- if request.user.is_authenticated():
- request.user.message_set.create(message="The %s was updated successfully." % model._meta.verbose_name)
-
- # Do a post-after-redirect so that reload works, etc.
- if post_save_redirect:
- return HttpResponseRedirect(post_save_redirect % object.__dict__)
- elif hasattr(object, 'get_absolute_url'):
- return HttpResponseRedirect(object.get_absolute_url())
- else:
- raise ImproperlyConfigured("No URL to redirect to from generic create view.")
else:
errors = {}
# This makes sure the form acurate represents the fields of the place.
new_data = manipulator.flatten_data()
- form = forms.FormWrapper(manipulator, new_data, errors)
- if not template_name:
- template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower())
- t = template_loader.get_template(template_name)
- c = RequestContext(request, {
- 'form': form,
- 'help_visible': help_visible,
- 'action': request.path,
- template_object_name: object,
- }, context_processors)
- for key, value in extra_context.items():
- if callable(value):
- c[key] = value()
- else:
- c[key] = value
- window.content = gui.StaticContent(t.render(c))
- desktop.activeWindow.selectWindow(window)
- return desktop
+ return forms.FormWrapper(manipulator, new_data, errors)
def delete_object(request, desktop, model, post_delete_redirect,
More information about the cig-commits
mailing list