diff --git a/view/browser/generic.pt b/view/browser/generic.pt
index b4c47e0..490a082 100644
--- a/view/browser/generic.pt
+++ b/view/browser/generic.pt
@@ -3,7 +3,8 @@
-
+
diff --git a/view/browser/view.py b/view/browser/view.py
index fcd96e0..89caf25 100644
--- a/view/browser/view.py
+++ b/view/browser/view.py
@@ -39,6 +39,9 @@ class BaseView(object):
resource_prefix = '/@@/'
view_mode = 'view'
+ def wrap(self):
+ return self
+
def __call__(self):
return self.index(self)
diff --git a/wiki/browser/view.py b/wiki/browser/view.py
index 4449acd..b0d9d6e 100644
--- a/wiki/browser/view.py
+++ b/wiki/browser/view.py
@@ -149,14 +149,14 @@ class WikiPageView(WikiBaseView):
title = form.get('title')
if title and title != self.context.title:
self.context.title = title
- text = form.get('text')
+ text = toUnicode(form.get('text'))
if text and text != self.context.text:
self.context.text = text
notify(ObjectModifiedEvent(self.context))
return True
def render(self):
- return self.context.render(self.request)
+ return toUnicode(self.context.render(self.request))
def edit(self):
self.view_mode = 'edit'
@@ -164,3 +164,13 @@ class WikiPageView(WikiBaseView):
def showEditButton(self):
return self.view_mode != 'edit'
+
+
+def toUnicode(text, encoding='UTF-8'):
+ if not isinstance(text, str):
+ return text
+ try:
+ return text.decode(encoding)
+ except UnicodeDecodeError:
+ return text.decode('ISO8859-15')
+
diff --git a/z2/browser/view.py b/z2/browser/view.py
index 61ce197..2f9e844 100644
--- a/z2/browser/view.py
+++ b/z2/browser/view.py
@@ -22,6 +22,7 @@ Base classes for views.
$Id$
"""
+from Acquisition import aq_chain
from Products.Five import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
@@ -34,7 +35,29 @@ zmi_page = ViewPageTemplateFile('main_zmi.pt')
class BaseView(BrowserView, BaseView):
+ # make Zope 2 restricted Python happy
+ __allow_access_to_unprotected_subobjects__ = 1
+ def wrap(self):
+ if len(aq_chain(self)) < 2:
+ return self.__of__(self.context)
+ return self
+
resource_prefix = '/++resource++'
+ template_name = 'view_macros'
+ content_renderer = 'content'
+
+ def defaultMacros(self):
+ template = getattr(self.context, self.template_name, None)
+ if template is None:
+ return super(BaseView, self).defaultMacros()
+ return template.macros
+
+ def contentMacro(self):
+ macroName = self.content_renderer
+ macro = self.defaultMacros().get(macroName)
+ if macro is None:
+ return super(BaseView, self).defaultMacros()[macroName]
+ return macro
# generic views for use with generic persistent objects with type-based adapters