Log message for revision 40666: - smarter upload - enforcing UTF-8 in the ZMI - enforcing unicode as internal representation - added some assertions to check for unicode
Changed: U Zope/branches/ajung-zpt-integration/lib/python/Products/ZPT/ZPT.py U Zope/branches/ajung-zpt-integration/lib/python/Products/ZPT/pt/ptEdit.zpt -=- Modified: Zope/branches/ajung-zpt-integration/lib/python/Products/ZPT/ZPT.py =================================================================== --- Zope/branches/ajung-zpt-integration/lib/python/Products/ZPT/ZPT.py 2005-12-09 16:56:40 UTC (rev 40665) +++ Zope/branches/ajung-zpt-integration/lib/python/Products/ZPT/ZPT.py 2005-12-09 17:06:16 UTC (rev 40666) @@ -20,6 +20,7 @@ import os, AccessControl, Acquisition from Globals import ImageFile, package_home, InitializeClass from OFS.SimpleItem import SimpleItem +from OFS.content_types import guess_content_type from DateTime.DateTime import DateTime from Shared.DC.Scripts.Script import Script from Shared.DC.Scripts.Signature import FuncCode @@ -63,6 +64,7 @@ __implements__ = (WriteLockInterface,) meta_type = 'ZPT' + management_page_charset = 'utf-8' func_defaults = None func_code = FuncCode((), 0) @@ -90,12 +92,12 @@ security.declareObjectProtected(view) security.declareProtected(view, '__call__') - def __init__(self, id, text=None, content_type=None): + def __init__(self, id, text=None, content_type=None, encoding='utf-8'): self.id = str(id) self.ZBindings_edit(self._default_bindings) if text is None: text = open(self._default_content_fn).read() - self.pt_edit(text, content_type) + self.pt_edit(text, content_type, encoding) def _setPropValue(self, id, value): PropertyManager._setPropValue(self, id, value) @@ -104,7 +106,11 @@ security.declareProtected(change_page_templates, 'pt_edit') - def pt_edit(self, text, content_type): + def pt_edit(self, text, content_type, encoding='utf-8'): + if not isinstance(text, unicode): + text = unicode(text, encoding, 'strict') + assert isinstance(text, unicode) + self.ZCacheable_invalidate() PageTemplate.pt_edit(self, text, content_type) security.declareProtected(change_page_templates, 'pt_editAction') @@ -143,16 +149,22 @@ if self.wl_isLocked(): raise ResourceLockedError("File is locked via WebDAV") + filename = None if not isinstance(file, str): if not file: raise ValueError('File not specified') + filename = file.filename file = file.read() - if charset: - try: - unicode(file, 'us-ascii') - file = str(file) - except UnicodeDecodeError: - file = unicode(file, charset) - self.write(file) + + ct, dummy = guess_content_type(filename, file) + if not ct in ('text/html', 'text/xml'): + raise ValueError('Unsupported mimetype: %s' % ct) + + if not isinstance(file, unicode): + if not charset: + raise ValueError('No encoding specified for non-unicode content') + file = unicode(file, charset) + + self.pt_edit(file, ct) message = 'Saved changes.' return self.pt_editForm(manage_tabs_message=message) @@ -205,10 +217,9 @@ } return c - security.declareProtected(change_page_templates, 'write') - def write(self, text): - self.ZCacheable_invalidate() - PageTemplate.write(self, text) +# security.declareProtected(change_page_templates, 'write') +# def write(self, text): +# PageTemplate.write(self, text) security.declareProtected(view_management_screens, 'manage_main', 'read', 'ZScriptHTML_tryForm') @@ -248,6 +259,7 @@ try: # XXX: check the parameters for pt_render()! (aj) result = self.pt_render(self.pt_getContext()) + assert isinstance(result, unicode) # result = self.pt_render(extra_context=bound_names) if keyset is not None: @@ -266,7 +278,8 @@ """ Handle HTTP PUT requests """ self.dav__init(REQUEST, RESPONSE) self.dav__simpleifhandler(REQUEST, RESPONSE, refresh=1) - self.write(REQUEST.get('BODY', '')) + ## XXX:this should be unicode or we must pass an encoding + self.pt_edit(REQUEST.get('BODY', '')) RESPONSE.setStatus(204) return RESPONSE @@ -281,7 +294,7 @@ self.REQUEST.RESPONSE.setHeader('Content-Type', self.content_type) return self.read() - security.declareProtected(view_manage_screens, 'html') + security.declareProtected(view_management_screens, 'html') def html(self): return self.content_type == 'text/html' Modified: Zope/branches/ajung-zpt-integration/lib/python/Products/ZPT/pt/ptEdit.zpt =================================================================== --- Zope/branches/ajung-zpt-integration/lib/python/Products/ZPT/pt/ptEdit.zpt 2005-12-09 16:56:40 UTC (rev 40665) +++ Zope/branches/ajung-zpt-integration/lib/python/Products/ZPT/pt/ptEdit.zpt 2005-12-09 17:06:16 UTC (rev 40666) @@ -123,15 +123,14 @@ <input type="file" name="file" size="25" value=""> </td> </tr> -<tr tal:condition="context/management_page_charset|nothing"> +<tr> <td align="left" valign="top"> <div class="form-label"> Encoding </div> </td> <td align="left" valign="top"> - <input name="charset" value="" - tal:attributes="value context/management_page_charset|default" /> + <input name="charset" value="utf-8"/> </td> </tr> <tr> _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins