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