[Erp5-report] r34395 nicolas - /erp5/trunk/products/ERP5/Document/EmailDocument.py

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Apr 8 16:45:15 CEST 2010


Author: nicolas
Date: Thu Apr  8 16:45:13 2010
New Revision: 34395

URL: http://svn.erp5.org?rev=34395&view=rev
Log:
Use email library to get filename attchments (get_filename). In case of failures, fallback
to old implementation by intropsecting message headers.

Modified:
    erp5/trunk/products/ERP5/Document/EmailDocument.py

Modified: erp5/trunk/products/ERP5/Document/EmailDocument.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/EmailDocument.py?rev=34395&r1=34394&r2=34395&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/EmailDocument.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/EmailDocument.py [utf8] Thu Apr  8 16:45:13 2010
@@ -216,35 +216,42 @@
     **kw - support for listbox (TODO: improve it)
     """
     result = []
-    i = 0
-    for part in self._getMessage().walk():
+    for i, part in enumerate(self._getMessage().walk()):
       if not part.is_multipart():
         kw = dict(part.items())
         kw['uid'] = 'part_%s' % i
         kw['index'] = i
-        if kw.has_key('Content-Disposition'):
-          content_disposition = kw['Content-Disposition']
-          if content_disposition.split(';')[0] == 'attachment':
-            file_name = re.findall(file_name_regexp, content_disposition, re.MULTILINE)
-            if file_name:
-              kw['file_name'] = file_name[0]
-            else:
-              kw['file_name'] = 'attachment_%s' % i
-          elif content_disposition.split(';')[0] == 'inline':
-            file_name = re.findall(file_name_regexp, content_disposition, re.MULTILINE)
-            if file_name:
-              kw['file_name'] = file_name[0]
-            else:
-              kw['file_name'] = 'inline_%s' % i
-          else:
-            kw['file_name'] = 'part_%s' % i
-        if kw.has_key('Content-Type'):
-          content_type = kw['Content-Type']
-          file_name = re.findall(file_name_regexp, content_type, re.MULTILINE)
-          if file_name: kw['file_name'] = file_name[0]
-          kw['content_type'] = content_type.split(';')[0]
+        file_name = part.get_filename()
+        if not file_name:
+          # get_filename return name only from Content-Disposition header
+          # of the message but sometimes this value is stored in
+          # Content-Type header
+          if 'Content-Type' in kw:
+            content_type_header = kw['Content-Type']
+          elif 'Content-type' in kw:
+            content_type_header = kw['Content-Type']
+          file_name_list = re.findall(file_name_regexp,
+                                      content_type_header,
+                                      re.MULTILINE)
+          if file_name_list:
+            file_name = file_name_list[0]
+        if file_name:
+          kw['file_name'] = file_name
+        else:
+          content_disposition = None
+          prefix = 'part_'
+          if 'Content-Disposition' in kw:
+            content_disposition = kw['Content-Disposition']
+          elif 'Content-disposition' in kw:
+            content_disposition = kw['Content-disposition']
+          if content_disposition:
+            if content_disposition.split(';')[0] == 'attachment':
+              prefix = 'attachment_'
+            elif content_disposition.split(';')[0] == 'inline':
+              prefix = 'inline_'
+          kw['file_name'] = '%s%s' % (prefix, i)
+        kw['content_type'] = part.get_content_type()
         result.append(kw)
-      i += 1
     return result
 
   security.declareProtected(Permissions.AccessContentsInformation, 'getAttachmentData')
@@ -256,34 +263,27 @@
       if index == i:
         # This part should be handled in skin script
         # but it was a bit easier to access items here
+        kw = dict(part.items())
+        content_type = part.get_content_type()
         if REQUEST is not None:
-          kw = dict(part.items())
+          file_name = part.get_filename()
+          if not file_name:
+            # get_filename return name only from Content-Disposition header
+            # of the message but sometimes this value is stored in
+            # Content-Type header
+            if 'Content-Type' in kw:
+              content_type_header = kw['Content-Type']
+            elif 'Content-type' in kw:
+              content_type_header = kw['Content-Type']
+            file_name_list = re.findall(file_name_regexp,
+                                        content_type_header,
+                                        re.MULTILINE)
+            if file_name_list:
+              file_name = file_name_list[0]
           RESPONSE = REQUEST.RESPONSE
           RESPONSE.setHeader('Accept-Ranges', 'bytes')
-          if kw.has_key('Content-Type'):
-            content_type = kw['Content-Type']
+          if content_type and file_name:
             RESPONSE.setHeader('Content-Type', content_type)
-          elif kw.has_key('Content-type'):
-            content_type = kw['Content-type']
-            RESPONSE.setHeader('Content-Type', content_type)
-          else:
-            content_type = None
-          if kw.has_key('Content-Disposition'):
-            content_disposition = kw['Content-Disposition']
-          elif kw.has_key('Content-disposition'):
-            content_disposition = kw['Content-disposition']
-          else:
-            content_disposition = None
-          file_name = None
-          if content_type:
-            file_name = re.findall(file_name_regexp, content_type, re.MULTILINE)
-          if content_disposition:
-            if not file_name:
-              file_name = re.findall(file_name_regexp,
-                                     content_disposition,
-                                     re.MULTILINE)
-          if file_name:
-            file_name = file_name[0]
             RESPONSE.setHeader('Content-disposition',
                                'attachment; filename="%s"' % file_name)
         if 'text/html' in content_type:




More information about the Erp5-report mailing list