openerp-dev-web team mailing list archive
-
openerp-dev-web team
-
Mailing list archive
-
Message #05846
[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':