[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