Bugfixes and improvement CRM cases and email gateway

Escalation system

bzr revid: fp@tinyerp.com-5a31ad4e106c8c421875ccf91bb227df8960ee9b
This commit is contained in:
Fabien Pinckaers 2007-04-12 20:08:18 +00:00
parent a6b34be4d7
commit 3e42bfae81
4 changed files with 93 additions and 84 deletions

View File

@ -30,6 +30,7 @@ import tools
from osv import fields,osv,orm
import mx.DateTime
import base64
MAX_LEVEL = 15
AVAILABLE_STATES = [
@ -182,6 +183,7 @@ class crm_case_rule(osv.osv):
'act_remind_partner': fields.boolean('Remind partner'),
'act_remind_user': fields.boolean('Remind responsible'),
'act_remind_attach': fields.boolean('Remind with attachment'),
'act_mail_to_user': fields.boolean('Mail to responsible'),
'act_mail_to_partner': fields.boolean('Mail to partner'),
@ -333,9 +335,9 @@ class crm_case(osv.osv):
self.write(cr, uid, [case.id], write, context)
caseobj = self.pool.get('crm.case')
if action.act_remind_user:
caseobj.remind_user(cr, uid, [case.id], context)
caseobj.remind_user(cr, uid, [case.id], context, attach=action.act_remind_attach)
if action.act_remind_partner:
caseobj.remind_partner(cr, uid, [case.id], context)
caseobj.remind_partner(cr, uid, [case.id], context, attach=action.act_remind_attach)
if action.act_method:
getattr(caseobj, 'act_method')(cr, uid, [case.id], action, context)
emails = []
@ -408,26 +410,35 @@ class crm_case(osv.osv):
self._action(cr,uid, cases, 'draft')
return res
def remind_partner(self, cr, uid, ids, *args):
for case in self.browse(cr, uid, ids):
if case.user_id and case.user_id.address_id and case.user_id.address_id.email and case.email_from:
tools.email_send(
case.user_id.address_id.email,
[case.email_from],
'Reminder: '+'['+str(case.id)+']'+' '+case.name,
case.email_last or case.description, reply_to=case.section_id.reply_to
)
return True
def remind_partner(self, cr, uid, ids, context={}, attach=False):
return self.remind_user(cr, uid, ids, context, attach, destination=False)
def remind_user(self, cr, uid, ids, *args):
def remind_user(self, cr, uid, ids, context={}, attach=False, destination=True):
for case in self.browse(cr, uid, ids):
if case.user_id and case.user_id.address_id and case.user_id.address_id.email and case.email_from:
tools.email_send(
case.email_from,
[case.user_id.address_id.email],
'Reminder: '+'['+str(case.id)+']'+' '+case.name,
case.email_last or case.description, reply_to=case.section_id.reply_to
)
src = case.email_from
dest = case.user_id.address_id.email
if not destination:
src,dest = dest,src
dest = [dest]
if not attach:
tools.email_send(
src,
dest,
'Reminder: '+'['+str(case.id)+']'+' '+case.name,
case.email_last or case.description, reply_to=case.section_id.reply_to
)
else:
attach_ids = self.pool.get('ir.attachment').search(cr, uid, [('res_model','=','crm.case'),('res_id','=',case.id)])
res = self.pool.get('ir.attachment').read(cr, uid, attach_ids, ['datas_fname','datas'])
res = map(lambda x: (x['datas_fname'], base64.decodestring(x['datas'])), res)
tools.email_send_attach(
src,
dest,
'Reminder: '+'['+str(case.id)+']'+' '+case.name,
case.email_last or case.description, reply_to=case.section_id.reply_to,
attach=res
)
return True
def case_log(self, cr, uid, ids, *args):

View File

@ -148,13 +148,14 @@
<field name="act_priority"/>
<field name="act_remind_user"/>
<field name="act_remind_partner"/>
<field name="act_remind_attach"/>
<field name="act_email_cc" colspan="3"/>
<!--
<field name="act_method" colspan="3" readonly="1"/>
-->
</page><page string="E-Mail Information">
<separator string="Email to send"/>
<separator string="Email to send" colspan="3"/>
<field name="act_mail_to_user"/>
<field name="act_mail_to_partner"/>
<field name="act_mail_to_watchers"/>
@ -233,9 +234,7 @@
<notebook>
<page string="General Information">
<field name="name" select="1"/>
<field name="id" select="1"/>
<field name="section_id"/>
<field name="categ_id" select="1" on_change="onchange_categ_id(categ_id)"/>
<field name="date" select="1"/>
<field name="priority"/>
<field name="partner_id" select="1" on_change="onchange_partner_id(partner_id, email_from)"/>
@ -255,8 +254,8 @@
<field name="date_deadline" select="1"/>
<group col="2" colspan="2">
<button name="case_log" string="Silent Process" states="open" type="object"/>
<button name="case_log_reply" string="Reply &amp; Process" states="open" type="object"/>
<button name="case_log_reply" string="Send" states="open" type="object"/>
<button name="case_log" string="Clear" states="open" type="object"/>
</group>
<field name="state" select="1"/>
@ -269,6 +268,8 @@
<button name="case_reset" string="Reset to Draft" states="done,cancel" type="object"/>
</group>
</page><page string="References">
<field name="id" select="1"/>
<field name="categ_id" select="1" on_change="onchange_categ_id(categ_id)"/>
<field name="date_closed"/>
<field name="active" select="1"/>
<field name="ref" colspan="3"/>

View File

@ -1,5 +1,5 @@
# .fetchmailrc
poll pop.tiny.be proto pop3:
username efl@tiny.be password fle843 mda "/home/pinky/code/terp/trunk/server/bin/addons/crm/scripts/tinyerp-mailgate/tinyerp-mailgate.py -u3 -padmin -ssupport -eefl@tiny.be -mfp@tiny.be -dterp"
username testcli@tiny.be password tiny mda "/home/pinky/code/terp/trunk/server/bin/addons/crm/scripts/tinyerp-mailgate/tinyerp-mailgate.py -u3 -padmin -ssupport -etestcli@tiny.be -mfp@tiny.be -dterp"

View File

@ -38,6 +38,7 @@ class rpc_proxy(object):
def __call__(self, *request):
print self.dbname, self.user_id, self.passwd
print request
return self.rpc.execute(self.dbname, self.user_id, self.passwd, *request)
class email_parser(object):
@ -74,10 +75,10 @@ class email_parser(object):
return ''.join(map(lambda x:x[0].decode(x[1] or 'ascii', 'replace'), s))
def msg_new(self, msg):
message = self.msg_body_get(msg);
message = self.msg_body_get(msg)
data = {
'name': self._decode_header(msg['Subject']),
'description': message['body'],
'description': '> '+message['body'].replace('\n','\n> '),
'section_id': self.section_id,
'email_from': self._decode_header(msg['From']),
'email_cc': self._decode_header(msg['Cc'] or ''),
@ -86,18 +87,18 @@ class email_parser(object):
try:
data.update(self.partner_get(self._decode_header(msg['From'])))
except Exception, e:
print e;
print e
#end try
id = self.rpc('crm.case', 'create', data)
attachments = message['attachment'];
attachments = message['attachment']
for attach in attachments:
for attach in attachments or []:
data_attach = {
'name': 'Attachment : ' + str(attach),
'name': str(attach),
'datas':binascii.b2a_base64(str(attachments[attach])),
'datas_fname': attach,
'description': 'Attachment comes with mail ',
'description': 'Mail attachment',
'res_model': 'crm.case',
'res_id': id
}
@ -117,46 +118,46 @@ class email_parser(object):
# }
# #
def msg_body_get(self, msg):
message = {};
message['body'] = False;
message['attachment'] = {};
attachment = message['attachment'];
file_name = 1;
message = {}
message['body'] = ''
message['attachment'] = {}
attachment = message['attachment']
file_name = 1
if msg.is_multipart():
for part in msg.get_payload():
if part.get_content_maintype()=='application' or part.get_content_maintype()=='image':
filename = part.get_filename();
filename = part.get_filename()
if filename != None:
attachment[filename] = part.get_payload(decode=1);
attachment[filename] = part.get_payload(decode=1)
else:
filename = 'attach_file'+str(file_name);
file_name += 1;
attachment[filename] = part.get_payload(decode=1);
filename = 'attach_file'+str(file_name)
file_name += 1
attachment[filename] = part.get_payload(decode=1)
#end if
#attachment[filename] = part.get_payload(decode=1);
#attachment[filename] = part.get_payload(decode=1)
# fp = open(os.path.join('/home/admin/test-src/', filename), 'wb')
# fp.write(part.get_payload(decode=1))
# fp.close()
elif(part.get_content_maintype()=='text') and (part.get_content_subtype()=='plain'):
message['body'] += part.get_payload(decode=1);
message['body'] += part.get_payload(decode=1).decode(part.get_charsets()[0])
#end if
#end for
message['attachment'] = attachment;
message['attachment'] = attachment
else:
message['body'] = msg.get_payload(decode=1).decode(msg.get_charsets()[0])
message['attachment'] = None;
message['attachment'] = None
return message
def msg_user(self, msg, id):
body = self.msg_body_get(msg)
data = {
'description': body['body'],
'description': '> '+body['body'].replace('\n','\n> '),
'email_last': body['body']
}
# handle email body commands (ex: Set-State: Draft)
actions = {}
for line in body.split('\n'):
for line in body['body'].split('\n'):
res = command_re.match(line)
if res:
actions[res.group(1).lower()] = res.group(2).lower()
@ -198,23 +199,19 @@ class email_parser(object):
if 'Cc' in msg:
del msg['Cc']
msg['Cc'] = ','.join(emails[1:])
msg['Reply-To'] = msg['From'] + ',' + self.email
msg['Reply-To'] = self.email
if priority:
msg['X-Priority'] = priorities.get(priority, '3 (Normal)')
s = smtplib.SMTP()
print '1'
s.connect()
print '2'
s.sendmail(self.email, emails[0], msg.as_string())
print '3'
s.close()
print '4'
print 'Email Sent To', emails[0], emails[1:]
print 'Email Sent To', emails[0], emails
return True
def msg_partner(self, msg, id):
message = self.msg_body_get(msg)
body = message['body'];
body = message['body']
act = 'case_open'
self.rpc('crm.case', act, [id])
body2 = '\n'.join(map(lambda l: '> '+l, (body or '').split('\n')))
@ -232,33 +229,35 @@ class email_parser(object):
return (int(case_str), emails)
def parse(self, msg):
try:
case_str = project_re.search(msg.get('Subject', ''))
(case_id, emails) = self.msg_test(msg, case_str and case_str.group(1))
if case_id:
if emails[0] and self.email_get(emails[0])==self.email_get(self._decode_header(msg['From'])):
print 'From User', case_id
self.msg_user(msg, case_id)
else:
print 'From Partner', case_id
self.msg_partner(msg, case_id)
case_str = project_re.search(msg.get('Subject', ''))
(case_id, emails) = self.msg_test(msg, case_str and case_str.group(1))
if case_id:
if emails[0] and self.email_get(emails[0])==self.email_get(self._decode_header(msg['From'])):
print 'From User', case_id
self.msg_user(msg, case_id)
else:
case_id = self.msg_new(msg)
if msg.get('Subject', ''):
del msg['Subject']
msg['Subject'] = '['+str(case_id)+'] '+self._decode_header(msg['subject'])
print 'Case', case_id, 'created...'
print 'From Partner', case_id
self.msg_partner(msg, case_id)
else:
case_id = self.msg_new(msg)
subject = self._decode_header(msg['subject'])
if msg.get('Subject', ''):
del msg['Subject']
msg['Subject'] = '['+str(case_id)+'] '+subject
print 'Case', case_id, 'created...'
emails = self.rpc('crm.case', 'emails_get', case_id)
priority = emails[3]
em = [emails[0], emails[1]] + (emails[2] or '').split(',')
emails = map(self.email_get, filter(None, em))
emails = self.rpc('crm.case', 'emails_get', case_id)
priority = emails[3]
em = [emails[0], emails[1]] + (emails[2] or '').split(',')
emails = map(self.email_get, filter(None, em))
mm = [self._decode_header(msg['From']), self._decode_header(msg['To'])]+self._decode_header(msg.get('Cc','')).split(',')
msg_mails = map(self.email_get, filter(None, mm))
mm = [self._decode_header(msg['From']), self._decode_header(msg['To'])]+self._decode_header(msg.get('Cc','')).split(',')
msg_mails = map(self.email_get, filter(None, mm))
emails = filter(lambda m: m and m not in msg_mails, emails)
self.msg_send(msg, emails, priority)
emails = filter(lambda m: m and m not in msg_mails, emails)
self.msg_send(msg, emails, priority)
try:
pass
except:
print 'Sending mail to default address', self.email_default
if self.email_default:
@ -288,13 +287,11 @@ if __name__ == '__main__':
(options, args) = parser.parse_args()
parser = email_parser(options.userid, options.password, options.section, options.email, options.default, dbname=options.dbname)
print
print '-.- ICI'
#msg_txt = email.message_from_file(sys.stdin)
msg_txt = email.message_from_file(sys.stdin)
fp = open('/home/admin/Desktop/email1.eml');
msg_txt = email.message_from_file(fp)
fp.close()
#fp = open('/home/admin/Desktop/email1.eml')
#msg_txt = email.message_from_file(fp)
#fp.close()
print 'Mail Sent to ', parser.parse(msg_txt)