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