[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