From 9ccd5aa35a596565876873c467d001daeb4a78bc Mon Sep 17 00:00:00 2001 From: Alexandre Boeglin <alex@nexedi.com> Date: Fri, 14 Dec 2007 14:28:39 +0000 Subject: [PATCH] Add a monkeypatch to MailTemplates: as iHotfix forces PageTemplates to be rendered as utf-8 encoded strings, it is incompatible with Products that expect them to render as unicode objects. - this patch is based on MailTemplates 1.1.0 - it will only try to encode() text if it's of type unicode git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@18331 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/ERP5Type/ZopePatch.py | 1 + product/ERP5Type/patches/MailTemplates.py | 81 +++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 product/ERP5Type/patches/MailTemplates.py diff --git a/product/ERP5Type/ZopePatch.py b/product/ERP5Type/ZopePatch.py index b5064e1a80..e8896e503d 100644 --- a/product/ERP5Type/ZopePatch.py +++ b/product/ERP5Type/ZopePatch.py @@ -54,6 +54,7 @@ from Products.ERP5Type.patches import PersistencePatch from Products.ERP5Type.patches import PersistentMapping from Products.ERP5Type.patches import DateTimePatch from Products.ERP5Type.patches import PythonScript +from Products.ERP5Type.patches import MailTemplates # for python2.3 compatibility import threading diff --git a/product/ERP5Type/patches/MailTemplates.py b/product/ERP5Type/patches/MailTemplates.py new file mode 100644 index 0000000000..0587f14bcf --- /dev/null +++ b/product/ERP5Type/patches/MailTemplates.py @@ -0,0 +1,81 @@ +#!/usr/bin/python +# Copyright (c) 2005 Simplistix Ltd +# +# This Software is released under the MIT License: +# http://www.opensource.org/licenses/mit-license.html +# See license.txt for more details. + +""" +this patch is based on MailTemplates 1.1.0 +it will only try to encode() text if it's of type unicode +""" + +try: + from Products.MailTemplates import BaseMailTemplate +except ImportError: + BaseMailTemplate = None + +if BaseMailTemplate is not None: + def _process_utf8(self,kw): + # sort out what encoding we're going to use + encoding = kw.get('encoding', + self.getProperty('encoding', + BaseMailTemplate.default_encoding)) + text = self.__class__.__bases__[1].__call__(self,**kw) + if not self.html() and isinstance(text, unicode): + text = text.encode(encoding,'replace') + # now turn the result into a MIMEText object + msg = BaseMailTemplate.MIMEText( + text.replace('\r',''), + self.content_type.split('/')[1], + encoding + ) + # sort out what headers and addresses we're going to use + headers = {} + values = {} + # headers from the headers property + for header in getattr(self,'headers',()): + name,value = header.split(':',1) + headers[name]=value + # headers from the headers parameter + headers_param = kw.get('headers',{}) + headers.update(headers_param) + # values and some specific headers + for key,header in (('mfrom','From'), + ('mto','To'), + ('mcc','Cc'), + ('mbcc','Bcc'), + ('subject','Subject')): + value = kw.get(key, + headers_param.get(header, + getattr(self, + key, + headers.get(header)))) + if value is not None: + values[key]=value + # turn some sequences in coma-seperated strings + if isinstance(value,tuple) or isinstance(value,list): + value = ', '.join(value) + # make sure we have no unicode headers + if isinstance(value,unicode): + value = value.encode(encoding) + headers[header]=value + # check required values have been supplied + errors = [] + for param in ('mfrom','mto','subject'): + if not values.get(param): + errors.append(param) + if errors: + raise TypeError( + 'The following parameters were required by not specified: '+( + ', '.join(errors) + )) + # add date header + headers['Date']=BaseMailTemplate.DateTime().rfc822() + # turn headers into an ordered list for predictable header order + keys = headers.keys() + keys.sort() + return msg,values,[(key,headers[key]) for key in keys] + + BaseMailTemplate.BaseMailTemplate._process = _process_utf8 + -- 2.30.9