[z3-checkins] r5846 - z3/Five/branch/dc-experiments
dreamcatcher at codespeak.net
dreamcatcher at codespeak.net
Mon Aug 2 20:07:52 MEST 2004
Author: dreamcatcher
Date: Mon Aug 2 20:07:51 2004
New Revision: 5846
Added:
z3/Five/branch/dc-experiments/viewable.py (contents, props changed)
Log:
Forgot to add this file *wink*
Added: z3/Five/branch/dc-experiments/viewable.py
==============================================================================
--- (empty file)
+++ z3/Five/branch/dc-experiments/viewable.py Mon Aug 2 20:07:51 2004
@@ -0,0 +1,72 @@
+##############################################################################
+#
+# Copyright (c) 2004 Five Contributors. All rights reserved.
+#
+# This software is distributed under the terms of the Zope Public
+# License (ZPL) v2.1. See COPYING.txt for more information.
+#
+##############################################################################
+"""Machinery for making things viewable
+
+$Id: traversable.py 5763 2004-07-28 20:15:11Z dreamcatcher $
+"""
+from zExceptions import NotFound
+from zope.exceptions import NotFoundError
+from zope.component import getView, getDefaultViewName, ComponentLookupError
+from zope.interface import implements
+from zope.publisher.interfaces.browser import IBrowserRequest
+from traversable import FakeRequest
+
+_marker = object
+
+class Viewable:
+ """A mixin to make an object viewable.
+ """
+ __five_viewable__ = True
+
+ def __fallback_default__(self, request):
+ """Try to dispatch to existing index_html or __call__"""
+ if getattr(self, 'index_html', None):
+ return self, ('index_html',)
+ if getattr(self, 'fallback_call__', None):
+ return self, ('fallback_call__',)
+ # XXX Should never get this far. But if it does?
+
+ def fallback_call__(self, *args, **kw):
+ """By default, return self"""
+ return self
+
+ # we have a default view, tell zpublisher to go there
+ def __browser_default__(self, request):
+ name = None
+ try:
+ name = getDefaultViewName(self, request)
+ except ComponentLookupError:
+ pass
+ if name:
+ if name == '__call__':
+ return self, ('fallback_call__',)
+ view = self.unrestrictedTraverse([name])
+ if view is not None:
+ return self, (name,)
+ return self.__fallback_default__(request)
+ __browser_default__.__five_method__ = True
+
+ # this is technically not needed because ZPublisher finds our
+ # attribute through __browser_default__; but we also want to be
+ # able to call pages from python modules, PythonScripts or ZPT
+ def __call__(self, *args, **kw):
+ """ """
+ request = kw.get('REQUEST')
+ if not IBrowserRequest.providedBy(request):
+ request = getattr(self, 'REQUEST', None)
+ if not IBrowserRequest.providedBy(request):
+ request = FakeRequest()
+ obj, name = self.__browser_default__(request)
+ if name:
+ name = name[0]
+ meth = obj.unrestrictedTraverse([name])
+ if meth is not None:
+ return meth(*args, **kw)
+ return self.fallback_call__(*args, **kw)
+ __call__.__five_method__ = True
More information about the z3-checkins
mailing list