[cig-commits] r7833 - in cs/pythia/trunk/opal: components controllers views

leif at geodynamics.org leif at geodynamics.org
Thu Aug 16 02:40:19 PDT 2007


Author: leif
Date: 2007-08-16 02:40:16 -0700 (Thu, 16 Aug 2007)
New Revision: 7833

Modified:
   cs/pythia/trunk/opal/components/WebComponent.py
   cs/pythia/trunk/opal/controllers/Controller.py
   cs/pythia/trunk/opal/controllers/DeletionController.py
   cs/pythia/trunk/opal/controllers/FormController.py
   cs/pythia/trunk/opal/controllers/NoController.py
   cs/pythia/trunk/opal/views/DetailView.py
   cs/pythia/trunk/opal/views/ListView.py
   cs/pythia/trunk/opal/views/PaginatedListView.py
   cs/pythia/trunk/opal/views/View.py
   cs/pythia/trunk/opal/views/__init__.py
Log:
Refactored Views and Controllers to allow subviews.  This was
necessary because Cheetah template inheritance is more rigid.


Modified: cs/pythia/trunk/opal/components/WebComponent.py
===================================================================
--- cs/pythia/trunk/opal/components/WebComponent.py	2007-08-16 01:42:52 UTC (rev 7832)
+++ cs/pythia/trunk/opal/components/WebComponent.py	2007-08-16 09:40:16 UTC (rev 7833)
@@ -78,7 +78,8 @@
 
     def genericObjectList(self, request, queryset, **kwds):
         view = views.ListView(queryset = queryset, **kwds)
-        return view.response(request)
+        controller = view.controller
+        return controller.response(request)
 
 
     def genericObjectDetail(self, request, queryset, query, **kwds):
@@ -92,7 +93,8 @@
         # 'model' instead of a 'queryset'.
         model = queryset.model
         view = views.DetailView(model, query, **kwds)
-        return view.response(request)
+        controller = view.controller
+        return controller.response(request)
 
 
     # generic views -- CRUD
@@ -103,7 +105,7 @@
             follow = follow,
             )
         view = views.DetailView(model, None, controller = controller, **kwds)
-        return view.response(request)
+        return controller.response(request)
 
 
     def genericUpdateObject(self, request, model, query, post_save_redirect=None, follow=None, **kwds):
@@ -112,7 +114,7 @@
             follow = follow,
             )
         view = views.DetailView(model, query, controller = controller, **kwds)
-        return view.response(request)
+        return controller.response(request)
 
 
     def genericDeleteObject(self, request, model, query, post_delete_redirect, **kwds):
@@ -120,7 +122,7 @@
             post_redirect = post_delete_redirect,
             )
         view = views.DetailView(model, query, controller = controller, **kwds)
-        return view.response(request)
+        return controller.response(request)
 
 
     # errors
@@ -161,7 +163,7 @@
     from opal.http import Http404
 
 
-    def __init__(self, **attrs):
+    def __xinit__(self, **attrs):
         super(WebComponent, self).__init__()
         self.slug = attrs.get('slug')
         self.context = attrs.get('context', {})

Modified: cs/pythia/trunk/opal/controllers/Controller.py
===================================================================
--- cs/pythia/trunk/opal/controllers/Controller.py	2007-08-16 01:42:52 UTC (rev 7832)
+++ cs/pythia/trunk/opal/controllers/Controller.py	2007-08-16 09:40:16 UTC (rev 7833)
@@ -11,9 +11,12 @@
 #
 
 
-class Controller(object):
+Responder = object
 
 
+class Controller(Responder):
+
+
     def __init__(self):
         self._view = None
         self.model = None
@@ -33,13 +36,14 @@
     templateNameTag = property(_getTemplateNameTag)
 
 
-    def globalContext(self):
+    def contextDictionary(self, request):
         return dict()
 
 
     def response(self, request):
-        __pychecker__ = 'unusednames=request'
-        raise NotImplementedError("class %r must override 'response'" % self.__class__.__name__)
+        response = self.view.response(request)
+        self.decorateResponse(response, request)
+        return response
 
 
     def decorateResponse(self, response, request):

Modified: cs/pythia/trunk/opal/controllers/DeletionController.py
===================================================================
--- cs/pythia/trunk/opal/controllers/DeletionController.py	2007-08-16 01:42:52 UTC (rev 7832)
+++ cs/pythia/trunk/opal/controllers/DeletionController.py	2007-08-16 09:40:16 UTC (rev 7833)
@@ -46,7 +46,7 @@
                 request.user.message_set.create(message="The %s was deleted." % self.model._meta.verbose_name)
             return HttpResponseRedirect(self.post_redirect)
 
-        return self.view.render(request)
+        return super(DeletionController, self).response(request)
 
 
 # end of file

Modified: cs/pythia/trunk/opal/controllers/FormController.py
===================================================================
--- cs/pythia/trunk/opal/controllers/FormController.py	2007-08-16 01:42:52 UTC (rev 7832)
+++ cs/pythia/trunk/opal/controllers/FormController.py	2007-08-16 09:40:16 UTC (rev 7833)
@@ -31,7 +31,7 @@
         self.errors = {}
 
 
-    def globalContext(self):
+    def contextDictionary(self, request):
         context = dict()
         form = self.newFormWrapper()
         context['form'] = form
@@ -77,7 +77,7 @@
         
         if request.method != "POST" or self.errors:
             # Let the view respond to this request.
-            return self.view.render(request)
+            return super(FormController, self).response(request)
 
         # POST with no errors -- this means we can save the data!
         obj = self.manipulator.save(self.data)

Modified: cs/pythia/trunk/opal/controllers/NoController.py
===================================================================
--- cs/pythia/trunk/opal/controllers/NoController.py	2007-08-16 01:42:52 UTC (rev 7832)
+++ cs/pythia/trunk/opal/controllers/NoController.py	2007-08-16 09:40:16 UTC (rev 7833)
@@ -15,10 +15,7 @@
 
 
 class NoController(Controller):
+    pass
 
 
-    def response(self, request):
-        return self.view.render(request)
-
-
 # end of file

Modified: cs/pythia/trunk/opal/views/DetailView.py
===================================================================
--- cs/pythia/trunk/opal/views/DetailView.py	2007-08-16 01:42:52 UTC (rev 7832)
+++ cs/pythia/trunk/opal/views/DetailView.py	2007-08-16 09:40:16 UTC (rev 7833)
@@ -13,8 +13,7 @@
 
 from View import View
 from opal.core.exceptions import ObjectDoesNotExist
-from opal.http import Http404, HttpResponse
-from opal.template import RequestContext
+from opal.http import Http404
 
 
 class DetailView(View):
@@ -34,34 +33,21 @@
     def __init__(self, model, query=None, template_name_field=None, **kwds):
         View.__init__(self, model, **kwds)
         self.query = query
-        self.obj = None
+        self._obj = None
         self.template_name_field = template_name_field
         return
 
 
-    def response(self, request):
-        if self.query:
-            self.obj = self.getObject()
-        # Give the controller a chance to respond to this request.
-        return self.controller.response(request)
+    def _getObj(self):
+        if self._obj is None and self.query:
+            try:
+                self._obj = self.query.get(self.model._default_manager.all())
+            except ObjectDoesNotExist:
+                raise Http404("No %s found matching the query '%s'" % (self.model._meta.verbose_name, self.query))
+        return self._obj
+    obj = property(_getObj)
 
 
-    def render(self, request):
-        t = self.loadTemplate()
-        c = self.createContext(request)
-        response = HttpResponse(t.render(c), mimetype=self.mimetype)
-        self.controller.decorateResponse(response, request)
-        return response
-
-
-    def getObject(self):
-        try:
-            obj = self.query.get(self.model._default_manager.all())
-        except ObjectDoesNotExist:
-            raise Http404("No %s found matching the query '%s'" % (self.model._meta.verbose_name, self.query))
-        return obj
-
-
     def loadTemplate(self):
         if self.obj and self.template_name_field:
             template_name_list = [getattr(self.obj, self.template_name_field), self.template_name]
@@ -71,17 +57,11 @@
         return t
 
 
-    def createContext(self, request):
-        c = RequestContext(request, self.globalContext(), self.context_processors)
-        c = self.addExtraContext(c)
-        return c
-
-
-    def globalContext(self):
-        context = super(DetailView, self).globalContext()
+    def contextDictionary(self, request):
+        dct = super(DetailView, self).contextDictionary(request)
         if self.obj:
-            context[self.template_object_name] = self.obj
-        return context
+            dct[self.template_object_name] = self.obj
+        return dct
 
 
 # end of file

Modified: cs/pythia/trunk/opal/views/ListView.py
===================================================================
--- cs/pythia/trunk/opal/views/ListView.py	2007-08-16 01:42:52 UTC (rev 7832)
+++ cs/pythia/trunk/opal/views/ListView.py	2007-08-16 09:40:16 UTC (rev 7833)
@@ -12,8 +12,7 @@
 
 
 from View import View
-from opal.http import Http404, HttpResponse
-from opal.template import RequestContext
+from opal.http import Http404
 
 
 class ListView(View):
@@ -55,21 +54,15 @@
         return
 
 
-    def response(self, request):
-        c = self.requestContext(request)
-        c = self.addExtraContext(c)
-        t = self.loadTemplate()
-        return HttpResponse(t.render(c), mimetype=self.mimetype)
-
-
-    def requestContext(self, request):
-        c = RequestContext(request, {
-            '%s_list' % self.template_object_name: self.queryset,
-            'is_paginated': False
-        }, self.context_processors)
+    def contextDictionary(self, request):
         if not self.allow_empty and len(self.queryset) == 0:
             raise Http404()
-        return c
+        dct = super(ListView, self).contextDictionary(request)
+        dct.update({
+            '%s_list' % self.template_object_name: self.queryset,
+            'is_paginated': False
+        })
+        return dct
 
 
 # end of file

Modified: cs/pythia/trunk/opal/views/PaginatedListView.py
===================================================================
--- cs/pythia/trunk/opal/views/PaginatedListView.py	2007-08-16 01:42:52 UTC (rev 7832)
+++ cs/pythia/trunk/opal/views/PaginatedListView.py	2007-08-16 09:40:16 UTC (rev 7833)
@@ -14,7 +14,6 @@
 from ListView import ListView
 from opal.core.paginator import ObjectPaginator, InvalidPage
 from opal.http import Http404
-from opal.template import RequestContext
 
 
 class PaginatedListView(ListView):
@@ -53,7 +52,7 @@
         return
 
 
-    def requestContext(self, request):
+    def contextDictionary(self, request):
         queryset = self.queryset._clone()
         paginator = ObjectPaginator(queryset, self.paginate_by)
         page = self.page
@@ -67,7 +66,8 @@
                 object_list = []
             else:
                 raise Http404()
-        c = RequestContext(request, {
+        dct = super(ListView, self).contextDictionary(request)
+        dct.update({
             '%s_list' % self.template_object_name: object_list,
             'is_paginated': paginator.pages > 1,
             'results_per_page': self.paginate_by,
@@ -78,8 +78,8 @@
             'previous': page - 1,
             'pages': paginator.pages,
             'hits' : paginator.hits,
-        }, self.context_processors)
-        return c
+        })
+        return dct
 
 
 # end of file

Modified: cs/pythia/trunk/opal/views/View.py
===================================================================
--- cs/pythia/trunk/opal/views/View.py	2007-08-16 01:42:52 UTC (rev 7832)
+++ cs/pythia/trunk/opal/views/View.py	2007-08-16 09:40:16 UTC (rev 7833)
@@ -11,10 +11,14 @@
 #
 
 
+from opal.http import HttpResponse
+from opal.template import RequestContext
+
+
 class View(object):
 
 
-    def __init__(self, model, controller=None,
+    def __init__(self, model=None, controller=None, subviews=None,
                  template_name=None, template_loader=None,
                  extra_context=None, context_processors=None,
                  template_object_name='object',
@@ -26,6 +30,7 @@
         else:
             self.controller = controller
         self.controller.view = self
+        self.subviews = subviews
         if template_name:
             self.template_name = template_name
         else:
@@ -48,10 +53,16 @@
 
 
     def response(self, request):
-        __pychecker__ = 'unusednames=request'
-        raise NotImplementedError("class %r must override 'response'" % self.__class__.__name__)
+        return HttpResponse(self.render(request), mimetype=self.mimetype)
 
 
+    def render(self, request):
+        c = self.requestContext(request)
+        c = self.addExtraContext(c)
+        t = self.loadTemplate()
+        return t.render(c)
+
+
     def _getTemplateNameTag(self):
         return self.controller.templateNameTag
     templateNameTag = property(_getTemplateNameTag)
@@ -70,8 +81,22 @@
         return c
 
 
-    def globalContext(self):
-        return self.controller.globalContext()
+    def requestContext(self, request):
+        return RequestContext(
+            request,
+            self.contextDictionary(request),
+            self.context_processors,
+            )
 
 
+    def contextDictionary(self, request):
+        dct = self.controller.contextDictionary(request)
+        if self.subviews is not None:
+            subviews = {}
+            for name, view in self.subviews.iteritems():
+                subviews[name] = view.render(request)
+            dct['subviews'] = subviews
+        return dct
+
+
 # end of file

Modified: cs/pythia/trunk/opal/views/__init__.py
===================================================================
--- cs/pythia/trunk/opal/views/__init__.py	2007-08-16 01:42:52 UTC (rev 7832)
+++ cs/pythia/trunk/opal/views/__init__.py	2007-08-16 09:40:16 UTC (rev 7833)
@@ -11,10 +11,10 @@
 #
 
 
-from View import View
 from DetailView import DetailView
 from ListView import ListView
 from PaginatedListView import PaginatedListView
+from View import View
 
 
 # end of file



More information about the cig-commits mailing list