← Back to team overview

openerp-dev-web team mailing list archive

[Merge] lp:~openerp-dev/openobject-addons/6.0-bug-750508-xrg into lp:openobject-addons/6.0

 

xrg has proposed merging lp:~openerp-dev/openobject-addons/6.0-bug-750508-xrg into lp:openobject-addons/6.0.

Requested reviews:
  OpenERP Core Team (openerp)
Related bugs:
  Bug #750508 in OpenERP Addons: "mailgate filename unique error - DATA LOSS"
  https://bugs.launchpad.net/openobject-addons/+bug/750508

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-addons/6.0-bug-750508-xrg/+merge/58817
-- 
https://code.launchpad.net/~openerp-dev/openobject-addons/6.0-bug-750508-xrg/+merge/58817
Your team OpenERP R&D Team is subscribed to branch lp:~openerp-dev/openobject-addons/6.0-bug-750508-xrg.
=== modified file 'mail_gateway/mail_gateway.py'
--- mail_gateway/mail_gateway.py	2011-03-28 14:51:27 +0000
+++ mail_gateway/mail_gateway.py	2011-04-22 14:02:50 +0000
@@ -29,11 +29,20 @@
 import base64
 import re
 from tools.translate import _
+import random
 import logging
 import xmlrpclib
 
 _logger = logging.getLogger('mailgate')
 
+def mkpasswd(nlen):
+    ret = ''
+    rnd = random.SystemRandom()
+    crange = string.ascii_letters + string.digits + '_-.'
+    for c in range(nlen):
+        ret += rnd.choice(crange)
+    return ret
+
 class mailgate_thread(osv.osv):
     '''
     Mailgateway Thread
@@ -112,11 +121,31 @@
         if attach is None:
             attach = []
 
+        avail_alt_names = [ (None, ''), # the simple name
+                    (fmt_date_suffix, False),
+                    (fmt_date_suffix, True),
+                    (None, '-2'),
+                    (random_suffix, None),
+                    (random_suffix, None), # second attempt with random
+                    ]
+
+        edate = None
         if email_date:
             edate = parsedate(email_date)
             if edate is not None:
                 email_date = time.strftime('%Y-%m-%d %H:%M:%S', edate)
 
+        def fmt_date_suffix(have_time=False):
+            if not edate:
+                edate = time.time()
+            if have_time:
+                return time.strftime('-%Y%m%d-%H%M%S', edate)
+            else:
+                return time.strftime('-%Y%m%d', edate)
+        
+        def random_suffix(*arg):
+            return '-' + mkpasswd(6)
+
         # The mailgate sends the ids of the cases and not the object list
 
         if all(isinstance(case_id, (int, long)) for case_id in cases):
@@ -127,8 +156,22 @@
 
         for case in cases:
             attachments = []
+            
             for att in attach:
-                    attachments.append(att_obj.create(cr, uid, {'res_model':case._name,'res_id':case.id,'name': att[0], 'datas': base64.encodestring(att[1])}))
+                alt_names = avail_alt_names[:] # make a copy
+                att_name = att[0].replace('/','_')
+                while att_obj.search(cr, uid, [('res_model', '=', case._name),
+                            ('res_id','=',case.id),('name', '=', att_name)], context=context):
+                    if not alt_names:
+                        raise ValueError("Cannot find a valid name to save attachment %s as." % att[0])
+                    fn, arg = alt.names.pop(0)
+                    if fn:
+                        att_name = att[0] + fn(arg)
+                    else:
+                        att_name = att[0] + arg
+                    attachments.append(att_obj.create(cr, uid, 
+                            {'res_model':case._name,'res_id':case.id,
+                              'name': att[0], 'datas': base64.encodestring(att[1])}))
 
             partner_id = hasattr(case, 'partner_id') and (case.partner_id and case.partner_id.id or False) or False
             if not partner_id and case._name == 'res.partner':