From a9525d360d86ae81d52a85e3d0a360f0f27b77c9 Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Wed, 6 Apr 2011 13:02:08 +0530 Subject: [PATCH 01/25] [IMP]: Import Meetings and Tasks into Crm Meetings bzr revid: atp@tinyerp.com-20110406073208-z61njs01eph9oa0l --- addons/import_sugarcrm/import_sugarcrm.py | 141 +++++++++++++++++- .../import_sugarcrm/import_sugarcrm_view.xml | 2 + .../sugarcrm_fields_mapping.py | 9 +- 3 files changed, 147 insertions(+), 5 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index a7f231d117b..d119fe7ef21 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -303,6 +303,122 @@ def import_partners(sugar_obj, cr, uid, context=None): address_obj.write(cr,uid,address.id,{'partner_id':data_id[0]}) return True +def get_alarm_id(sugar_obj, cr, uid, val, context=None): + + alarm_dict = {'60': '1 minute before', + '300': '5 minutes before', + '600': '10 minutes before', + '900': '15 minutes before', + '1800':'30 minutes before', + '3600': '1 hour before', + } + alarm_id = False + alarm_obj = sugar_obj.pool.get('res.alarm') + if alarm_dict.get(val): + alarm_ids = alarm_obj.search(cr, uid, [('name', 'like', alarm_dict.get(val))]) + for alarm in alarm_obj.browse(cr, uid, alarm_ids, context): + alarm_id = alarm.id + return alarm_id + +def get_meeting_state(sugar_obj, cr, uid, val,context=None): + if not context: + context = {} + state = False + state_dict = {'status': #field in the sugarcrm database + { #Mapping of sugarcrm stage : openerp meeting stage + 'Planned' : 'draft', + 'Held':'open', + 'Not Held': 'draft', + },} + state = state_dict['status'].get(val, '') + return state + +def get_task_state(sugar_obj, cr, uid, val, context=None): + if not context: + context = {} + state = False + state_dict = {'status': #field in the sugarcrm database + { #Mapping of sugarcrm stage : openerp meeting stage + 'Completed' : 'done', + 'Not Started':'draft', + 'In Progress': 'open', + 'Pending Input': 'draft', + 'deferred': 'cancel' + },} + state = state_dict['status'].get(val, '') + return state + +def import_tasks(sugar_obj, cr, uid, context=None): + if not context: + context = {} + map_task = {'id' : 'id', + 'name': 'name', + 'date': 'date_entered', + 'user_id/id': 'assigned_user_id', + 'categ_id/.id': 'categ_id/.id', + 'partner_address_id/name': 'contact_name', + 'state': 'state' + } + meeting_obj = sugar_obj.pool.get('crm.meeting') + categ_obj = sugar_obj.pool.get('crm.case.categ') + PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) + categ_ids = categ_obj.search(cr, uid, [('object_id.model','=','crm.meeting'), ('name', 'like', 'Tasks')]) + if categ_ids: + categ_id = categ_ids[0] + else: + categ_id = categ_obj.create(cr, uid, {'name': 'Tasks', 'object_id.model': 'crm.meeting'}) + sugar_data = sugar.search(PortType, sessionid, 'Tasks') + for val in sugar_data: + partner_xml_id = find_mapped_id(sugar_obj, cr, uid, 'res.partner.address', val.get('contact_id'), context) + if not partner_xml_id: + raise osv.except_osv(_('Warning !'), _('Reference Partner %s cannot be created, due to Lower Record Limit in SugarCRM Configuration.') % val.get('contact_name')) + val['categ_id/.id'] = categ_id + val['state'] = get_task_state(sugar_obj, cr, uid, val.get('status'), context=None) + fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_task) + meeting_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) + return True + +def import_meetings(sugar_obj, cr, uid, context=None): + if not context: + context = {} + map_meeting = {'id' : 'id', + 'name': 'name', + 'date': 'date_start', + 'duration': ['duration_hours', 'duration_minutes'], + 'location': 'location', + 'alarm_id/.id': 'alarm_id/.id', + 'user_id/id': 'assigned_user_id', + 'state': 'state' + } + meeting_obj = sugar_obj.pool.get('crm.meeting') + PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) + sugar_data = sugar.search(PortType, sessionid, 'Meetings') + for val in sugar_data: + val['state'] = get_meeting_state(sugar_obj, cr, uid, val.get('status'),context) + val['alarm_id/.id'] = get_alarm_id(sugar_obj, cr, uid, val.get('reminder_time'), context) + fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_meeting) + meeting_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) + return True + + +def import_calls(sugar_obj, cr, uid, context=None): + if not context: + context = {} + map_calls = {'id' : 'id', + 'name': 'name', + 'date': 'date_start', + 'duration': ['duration_hours', 'duration_minutes'], + 'user_id/id': 'assigned_user_id', + 'categ_id/.id': 'categ_id/.id', + 'state': 'state', + } + phonecall_obj = sugar_obj.pool.get('crm.phonecall') + PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) + sugar_data = sugar.search(PortType, sessionid, 'Calls') + for val in sugar_data: + fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_calls) + phonecall_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) + return True def import_resources(sugar_obj, cr, uid, context=None): if not context: @@ -492,6 +608,18 @@ MAP_FIELDS = {'Opportunities': #Object Mapping name {'dependencies' : [], 'process' : import_users, }, + 'Meetings': + {'dependencies' : ['Users', 'Tasks'], + 'process' : import_meetings, + }, + 'Tasks': + {'dependencies' : ['Users', 'Accounts', 'Contacts'], + 'process' : import_tasks, + }, + 'Calls': + {'dependencies' : ['Users'], + 'process' : import_calls, + }, 'Employees': {'dependencies' : ['Resources'], 'process' : import_employees, @@ -514,6 +642,8 @@ class import_sugarcrm(osv.osv): 'contact': fields.boolean('Contacts', help="If Contacts are checked, SugarCRM Contacts data imported in openERP partner address form"), 'account': fields.boolean('Accounts', help="If Accounts are checked, SugarCRM Accounts data imported in openERP partners form"), 'employee': fields.boolean('Employee', help="If Employees is checked, SugarCRM Employees data imported in openERP employees form"), + 'meeting': fields.boolean('Meetings', help="If Meetings is checked, SugarCRM Meetings data imported in openERP meetings form"), + 'call': fields.boolean('Calls', help="If Calls is checked, SugarCRM Calls data imported in openERP phonecalls form"), 'username': fields.char('User Name', size=64), 'password': fields.char('Password', size=24), } @@ -523,7 +653,10 @@ class import_sugarcrm(osv.osv): 'user' : True, 'contact' : True, 'account' : True, - 'employee' : True, + 'employee' : True, + 'meeting' : True, + 'call' : True, + } def get_key(self, cr, uid, ids, context=None): @@ -543,7 +676,11 @@ class import_sugarcrm(osv.osv): if current.account: key_list.append('Accounts') if current.employee: - key_list.append('Employees') + key_list.append('Employees') + if current.meeting: + key_list.append('Meetings') + if current.call: + key_list.append('Calls') return key_list def import_all(self, cr, uid, ids, context=None): diff --git a/addons/import_sugarcrm/import_sugarcrm_view.xml b/addons/import_sugarcrm/import_sugarcrm_view.xml index 8410dacdbb1..6495b0640d7 100644 --- a/addons/import_sugarcrm/import_sugarcrm_view.xml +++ b/addons/import_sugarcrm/import_sugarcrm_view.xml @@ -17,6 +17,8 @@ + + diff --git a/addons/import_sugarcrm/sugarcrm_fields_mapping.py b/addons/import_sugarcrm/sugarcrm_fields_mapping.py index b3f1c3002fa..513b814ca18 100644 --- a/addons/import_sugarcrm/sugarcrm_fields_mapping.py +++ b/addons/import_sugarcrm/sugarcrm_fields_mapping.py @@ -23,10 +23,13 @@ def sugarcrm_fields_mapp(dict_sugar, openerp_dict): fields=[] data_lst = [] for key,val in openerp_dict.items(): - if key not in fields and dict_sugar.get(isinstance(val, list) and val[0] or val): + if key not in fields and dict_sugar: fields.append(key) - if isinstance(val, list): - data_lst.append(' '.join(map(lambda x : dict_sugar[x], val))) + if isinstance(val, list) and val: + if key == 'duration': + data_lst.append('.'.join(map(lambda x : dict_sugar[x], val))) + else: + data_lst.append(' '.join(map(lambda x : dict_sugar[x], val))) else: data_lst.append(dict_sugar.get(val,'')) return fields,data_lst From a7b51b32883e40fd06071dfc7f176e8f3b269467 Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Wed, 6 Apr 2011 18:52:20 +0530 Subject: [PATCH 02/25] [IMP]: Import Calls data into crm phonecall. and also Add emails data into mailgate.message. bzr revid: atp@tinyerp.com-20110406132220-6t3ztp1g4g44j7ks --- addons/import_sugarcrm/import_sugarcrm.py | 127 ++++++++++++++++-- .../import_sugarcrm/import_sugarcrm_view.xml | 1 + 2 files changed, 114 insertions(+), 14 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index d119fe7ef21..da3f81e773e 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -303,6 +303,16 @@ def import_partners(sugar_obj, cr, uid, context=None): address_obj.write(cr,uid,address.id,{'partner_id':data_id[0]}) return True +def get_category(sugar_obj, cr, uid, model, name, context=None): + categ_id = False + categ_obj = sugar_obj.pool.get('crm.case.categ') + categ_ids = categ_obj.search(cr, uid, [('object_id.model','=',model), ('name', 'like', name)] ) + if categ_ids: + categ_id = categ_ids[0] + else: + categ_id = categ_obj.create(cr, uid, {'name': name, 'object_id.model': model}) + return categ_id + def get_alarm_id(sugar_obj, cr, uid, val, context=None): alarm_dict = {'60': '1 minute before', @@ -347,31 +357,51 @@ def get_task_state(sugar_obj, cr, uid, val, context=None): },} state = state_dict['status'].get(val, '') return state - + +def get_account(sugar_obj, cr, uid, val, context=None): + if not context: + context = {} + partner_id = False + partner_address_id = False + model_obj = sugar_obj.pool.get('ir.model.data') + if val.get('parent_type') == 'Accounts': + model_ids = model_obj.search(cr, uid, [('name', '=', val.get('parent_id')), ('model', '=', 'res.partner')]) + if model_ids: + model = model_obj.browse(cr, uid, model_ids)[0] + partner_id = model.res_id + + if val.get('parent_type') == 'Contacts': + model_ids = model_obj.search(cr, uid, [('name', '=', val.get('parent_id')), ('model', '=', 'res.partner.address')]) + for model in model_obj.browse(cr, uid, model_ids): + partner_address_id = model.res_id + return partner_id, partner_address_id + def import_tasks(sugar_obj, cr, uid, context=None): if not context: context = {} + partner_id = False + partner_address_id = False map_task = {'id' : 'id', 'name': 'name', 'date': 'date_entered', 'user_id/id': 'assigned_user_id', 'categ_id/.id': 'categ_id/.id', - 'partner_address_id/name': 'contact_name', + 'partner_id/.id': 'partner_id/.id', + 'partner_address_id/.id': 'partner_address_id/.id', 'state': 'state' } meeting_obj = sugar_obj.pool.get('crm.meeting') - categ_obj = sugar_obj.pool.get('crm.case.categ') + model_obj = sugar_obj.pool.get('ir.model.data') PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) - categ_ids = categ_obj.search(cr, uid, [('object_id.model','=','crm.meeting'), ('name', 'like', 'Tasks')]) - if categ_ids: - categ_id = categ_ids[0] - else: - categ_id = categ_obj.create(cr, uid, {'name': 'Tasks', 'object_id.model': 'crm.meeting'}) + categ_id = get_category(sugar_obj, cr, uid, 'crm.meeting', 'Tasks') sugar_data = sugar.search(PortType, sessionid, 'Tasks') for val in sugar_data: partner_xml_id = find_mapped_id(sugar_obj, cr, uid, 'res.partner.address', val.get('contact_id'), context) if not partner_xml_id: - raise osv.except_osv(_('Warning !'), _('Reference Partner %s cannot be created, due to Lower Record Limit in SugarCRM Configuration.') % val.get('contact_name')) + raise osv.except_osv(_('Warning !'), _('Reference Contact %s cannot be created, due to Lower Record Limit in SugarCRM Configuration.') % val.get('contact_name')) + partner_id, partner_address_id = get_account(sugar_obj, cr, uid, val, context) + val['partner_id/.id'] = partner_id + val['partner_address_id/.id'] = partner_address_id val['categ_id/.id'] = categ_id val['state'] = get_task_state(sugar_obj, cr, uid, val.get('status'), context=None) fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_task) @@ -381,6 +411,8 @@ def import_tasks(sugar_obj, cr, uid, context=None): def import_meetings(sugar_obj, cr, uid, context=None): if not context: context = {} + partner_id = False + partner_address_id = False map_meeting = {'id' : 'id', 'name': 'name', 'date': 'date_start', @@ -388,38 +420,69 @@ def import_meetings(sugar_obj, cr, uid, context=None): 'location': 'location', 'alarm_id/.id': 'alarm_id/.id', 'user_id/id': 'assigned_user_id', + 'partner_id/.id':'partner_id/.id', + 'partner_address_id/.id':'partner_address_id/.id', 'state': 'state' } meeting_obj = sugar_obj.pool.get('crm.meeting') + model_obj = sugar_obj.pool.get('ir.model.data') PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) sugar_data = sugar.search(PortType, sessionid, 'Meetings') for val in sugar_data: + partner_id, partner_address_id = get_account(sugar_obj, cr, uid, val, context) + val['partner_id/.id'] = partner_id + val['partner_address_id/.id'] = partner_address_id val['state'] = get_meeting_state(sugar_obj, cr, uid, val.get('status'),context) val['alarm_id/.id'] = get_alarm_id(sugar_obj, cr, uid, val.get('reminder_time'), context) fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_meeting) meeting_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) return True +def get_calls_state(sugar_obj, cr, uid, val,context=None): + if not context: + context = {} + state = False + state_dict = {'status': #field in the sugarcrm database + { #Mapping of sugarcrm stage : openerp calls stage + 'Planned' : 'open', + 'Held':'done', + 'Not Held': 'pending', + },} + state = state_dict['status'].get(val, '') + return state + def import_calls(sugar_obj, cr, uid, context=None): if not context: context = {} + partner_id = False + partner_address_id = False map_calls = {'id' : 'id', 'name': 'name', 'date': 'date_start', 'duration': ['duration_hours', 'duration_minutes'], 'user_id/id': 'assigned_user_id', + 'partner_id/.id': 'partner_id/.id', + 'partner_address_id/.id': 'partner_address_id/.id', 'categ_id/.id': 'categ_id/.id', 'state': 'state', } phonecall_obj = sugar_obj.pool.get('crm.phonecall') + partner_address_obj = sugar_obj.pool.get('res.partner.address') + model_obj = sugar_obj.pool.get('ir.model.data') PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) sugar_data = sugar.search(PortType, sessionid, 'Calls') for val in sugar_data: + categ_id = get_category(sugar_obj, cr, uid, 'crm.phonecall', val.get('direction')) + val['categ_id/.id'] = categ_id + partner_id, partner_address_id = get_account(sugar_obj, cr, uid, val, context) + val['partner_id/.id'] = partner_id + val['partner_address_id/.id'] = partner_address_id + val['state'] = get_calls_state(sugar_obj, cr, uid, val.get('status'), context) fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_calls) phonecall_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) - return True - + return True + def import_resources(sugar_obj, cr, uid, context=None): if not context: context = {} @@ -484,6 +547,33 @@ def get_contact_title(sugar_obj, cr, uid, salutation, domain, context=None): title_id = contact_title_obj.create(cr, uid, {'name': salutation, 'shortcut': salutation, 'domain': domain}) return title_id +def import_emails(sugar_obj, cr, uid, context=None): + + map_emails = {'id': 'id', + 'name':'name', + 'date':'date_sent', + 'email_from': 'from_addr_name', + 'email_to': 'reply_to_addr', + 'email_cc': 'cc_addrs_names', + 'email_bcc': 'bcc_addrs_names', + 'message_id': 'message_id', + 'user_id/id': 'assigned_user_id', + 'description': 'description_html', + 'res_id': 'res_id', + 'model': 'model', + } + mailgate_obj = sugar_obj.pool.get('mailgate.message') + model_obj = sugar_obj.pool.get('ir.model.data') + PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) + sugar_data = sugar.search(PortType, sessionid, 'Emails') + for val in sugar_data: + model_ids = model_obj.search(cr, uid, [('name', 'like', val.get('parent_id'))]) + for model in model_obj.browse(cr, uid, model_ids): + val['res_id'] = model.res_id + val['model'] = model.model + fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_emails) + mailgate_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) + return True def import_leads(sugar_obj, cr, uid, context=None): if not context: @@ -617,13 +707,18 @@ MAP_FIELDS = {'Opportunities': #Object Mapping name 'process' : import_tasks, }, 'Calls': - {'dependencies' : ['Users'], + {'dependencies' : ['Users', 'Accounts', 'Contacts'], 'process' : import_calls, }, 'Employees': {'dependencies' : ['Resources'], 'process' : import_employees, + }, + 'Emails': + {'dependencies' : ['Users'], + 'process' : import_emails, }, + 'Resources': {'dependencies' : ['Users'], 'process' : import_resources, @@ -644,6 +739,7 @@ class import_sugarcrm(osv.osv): 'employee': fields.boolean('Employee', help="If Employees is checked, SugarCRM Employees data imported in openERP employees form"), 'meeting': fields.boolean('Meetings', help="If Meetings is checked, SugarCRM Meetings data imported in openERP meetings form"), 'call': fields.boolean('Calls', help="If Calls is checked, SugarCRM Calls data imported in openERP phonecalls form"), + 'email': fields.boolean('Emails', help="If Emails is checked, SugarCRM Emails data imported in openERP Emails form"), 'username': fields.char('User Name', size=64), 'password': fields.char('Password', size=24), } @@ -655,7 +751,8 @@ class import_sugarcrm(osv.osv): 'account' : True, 'employee' : True, 'meeting' : True, - 'call' : True, + 'call' : True, + 'email' : True, } @@ -680,7 +777,9 @@ class import_sugarcrm(osv.osv): if current.meeting: key_list.append('Meetings') if current.call: - key_list.append('Calls') + key_list.append('Calls') + if current.email: + key_list.append('Emails') return key_list def import_all(self, cr, uid, ids, context=None): diff --git a/addons/import_sugarcrm/import_sugarcrm_view.xml b/addons/import_sugarcrm/import_sugarcrm_view.xml index 6495b0640d7..0875d75e1ac 100644 --- a/addons/import_sugarcrm/import_sugarcrm_view.xml +++ b/addons/import_sugarcrm/import_sugarcrm_view.xml @@ -19,6 +19,7 @@ + From c499ff13ad14a660d9ce5e3992e3178d3aec7fe6 Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Thu, 7 Apr 2011 14:27:52 +0530 Subject: [PATCH 03/25] [ADD]: Import Project and Project Tasks data into Projects bzr revid: atp@tinyerp.com-20110407085752-ehf4qq98npk8li8q --- addons/import_sugarcrm/__openerp__.py | 4 +- addons/import_sugarcrm/import_sugarcrm.py | 111 +++++++++++++++++- .../import_sugarcrm/import_sugarcrm_view.xml | 2 + 3 files changed, 111 insertions(+), 6 deletions(-) diff --git a/addons/import_sugarcrm/__openerp__.py b/addons/import_sugarcrm/__openerp__.py index ee9c436b598..ffae7ecac9f 100644 --- a/addons/import_sugarcrm/__openerp__.py +++ b/addons/import_sugarcrm/__openerp__.py @@ -24,10 +24,10 @@ 'version': '1.0', 'category': 'Generic Modules', 'description': """This Module Import SugarCRM "Leads", "Opportunities", "Users", "Accounts", - "Contacts" and "Employees" Data into OpenERP Module.""", + "Contacts", "Employees", Meetings, Phonecalls, Emails, and Project, Project Tasks Data into OpenERP Module.""", 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', - 'depends': ['crm', 'hr'], + 'depends': ['crm', 'hr', 'project'], 'init_xml': [], 'update_xml': ["wizard/sugarcrm_login_view.xml", "wizard/import_message_view.xml", diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index da3f81e773e..3fa60e726e4 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -62,6 +62,7 @@ def get_all_states(sugar_obj, cr, uid, sugar_val, country_id, context=None): else: state_id = res_country_state_obj.create(cr, uid, {'name': sugar_val, 'code': sugar_val, 'country_id': country_id}) return state_id + def get_all_countries(sugar_obj, cr, uid, sugar_country_val, context=None): """Get Country or Create new country""" res_country_obj = sugar_obj.pool.get('res.country') @@ -358,6 +359,48 @@ def get_task_state(sugar_obj, cr, uid, val, context=None): state = state_dict['status'].get(val, '') return state +def get_project_state(sugar_obj, cr, uid, val,context=None): + if not context: + context = {} + state = False + state_dict = {'status': #field in the sugarcrm database + { #Mapping of sugarcrm staus : openerp Projects state + 'Draft' : 'draft', + 'In Review': 'open', + 'Published': 'close', + },} + state = state_dict['status'].get(val, '') + return state + +def get_project_task_state(sugar_obj, cr, uid, val,context=None): + if not context: + context = {} + state = False + state_dict = {'status': #field in the sugarcrm database + { #Mapping of sugarcrm status : openerp Porject Tasks state + 'Not Started': 'draft', + 'In Progress': 'open', + 'Completed': 'done', + 'Pending Input': 'pending', + 'Deferred': 'cancelled', + },} + state = state_dict['status'].get(val, '') + return state + +def get_project_task_priority(sugar_obj, cr, uid, val,context=None): + if not context: + context = {} + priority = False + priority_dict = {'priority': #field in the sugarcrm database + { #Mapping of sugarcrm status : openerp Porject Tasks state + 'High': '0', + 'Medium': '2', + 'Low': '3' + },} + priority = priority_dict['priority'].get(val, '') + return priority + + def get_account(sugar_obj, cr, uid, val, context=None): if not context: context = {} @@ -575,6 +618,52 @@ def import_emails(sugar_obj, cr, uid, context=None): mailgate_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) return True +def import_projects(sugar_obj, cr, uid, context=None): + if not context: + context = {} + map_project = {'id': 'id', + 'name': 'name', + 'date_start': 'estimated_start_date', + 'date': 'estimated_end_date', + 'user_id/id': 'assigned_user_id', + 'state': 'state' + } + project_obj = sugar_obj.pool.get('project.project') + PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) + sugar_data = sugar.search(PortType, sessionid, 'Project') + for val in sugar_data: + val['state'] = get_project_state(sugar_obj, cr, uid, val.get('status'),context) + fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_project) + project_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) + return True + + +def import_project_tasks(sugar_obj, cr, uid, context=None): + if not context: + context = {} + map_project_task = {'id': 'id', + 'name': 'name', + 'date_start': 'date_start', + 'date_end': 'date_finish', + 'progress': 'progress', + 'project_id/name': 'project_name', + 'planned_hours': 'estimated_effort', + 'total_hours': 'actual_effort', + 'priority': 'priority', + 'description': 'description', + 'user_id/id': 'assigned_user_id', + 'state': 'state' + } + task_obj = sugar_obj.pool.get('project.task') + PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) + sugar_data = sugar.search(PortType, sessionid, 'ProjectTask') + for val in sugar_data: + val['state'] = get_project_task_state(sugar_obj, cr, uid, val.get('status'),context) + val['priority'] = get_project_task_priority(sugar_obj, cr, uid, val.get('priority'),context) + fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_project_task) + task_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) + return True + def import_leads(sugar_obj, cr, uid, context=None): if not context: context = {} @@ -718,7 +807,14 @@ MAP_FIELDS = {'Opportunities': #Object Mapping name {'dependencies' : ['Users'], 'process' : import_emails, }, - + 'Projects': + {'dependencies' : ['Users'], + 'process' : import_projects, + }, + 'Project Tasks': + {'dependencies' : ['Users', 'Projects'], + 'process' : import_project_tasks, + }, 'Resources': {'dependencies' : ['Users'], 'process' : import_resources, @@ -740,6 +836,8 @@ class import_sugarcrm(osv.osv): 'meeting': fields.boolean('Meetings', help="If Meetings is checked, SugarCRM Meetings data imported in openERP meetings form"), 'call': fields.boolean('Calls', help="If Calls is checked, SugarCRM Calls data imported in openERP phonecalls form"), 'email': fields.boolean('Emails', help="If Emails is checked, SugarCRM Emails data imported in openERP Emails form"), + 'project': fields.boolean('Projects', help="If Projects is checked, SugarCRM Projects data imported in openERP Projects form"), + 'project_task': fields.boolean('Project Tasks', help="If Project Tasks is checked, SugarCRM Project Tasks data imported in openERP Project Tasks form"), 'username': fields.char('User Name', size=64), 'password': fields.char('Password', size=24), } @@ -752,8 +850,9 @@ class import_sugarcrm(osv.osv): 'employee' : True, 'meeting' : True, 'call' : True, - 'email' : True, - + 'email' : True, + 'project' : True, + 'project_task': True } def get_key(self, cr, uid, ids, context=None): @@ -779,7 +878,11 @@ class import_sugarcrm(osv.osv): if current.call: key_list.append('Calls') if current.email: - key_list.append('Emails') + key_list.append('Emails') + if current.project: + key_list.append('Projects') + if current.project_task: + key_list.append('Project Tasks') return key_list def import_all(self, cr, uid, ids, context=None): diff --git a/addons/import_sugarcrm/import_sugarcrm_view.xml b/addons/import_sugarcrm/import_sugarcrm_view.xml index 0875d75e1ac..d7cb7c3f5d2 100644 --- a/addons/import_sugarcrm/import_sugarcrm_view.xml +++ b/addons/import_sugarcrm/import_sugarcrm_view.xml @@ -20,6 +20,8 @@ + + From 8fee1f06aaeed1ac7248f1886d9fed93af5f7d2b Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Thu, 7 Apr 2011 16:28:16 +0530 Subject: [PATCH 04/25] [FIX]: Fix buildbot error. bzr revid: atp@tinyerp.com-20110407105816-d6yjefe8kthteh6q --- addons/import_sugarcrm/import_sugarcrm.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index 3fa60e726e4..e1e301bf12f 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -434,7 +434,6 @@ def import_tasks(sugar_obj, cr, uid, context=None): 'state': 'state' } meeting_obj = sugar_obj.pool.get('crm.meeting') - model_obj = sugar_obj.pool.get('ir.model.data') PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) categ_id = get_category(sugar_obj, cr, uid, 'crm.meeting', 'Tasks') sugar_data = sugar.search(PortType, sessionid, 'Tasks') @@ -468,7 +467,6 @@ def import_meetings(sugar_obj, cr, uid, context=None): 'state': 'state' } meeting_obj = sugar_obj.pool.get('crm.meeting') - model_obj = sugar_obj.pool.get('ir.model.data') PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) sugar_data = sugar.search(PortType, sessionid, 'Meetings') for val in sugar_data: @@ -511,8 +509,6 @@ def import_calls(sugar_obj, cr, uid, context=None): 'state': 'state', } phonecall_obj = sugar_obj.pool.get('crm.phonecall') - partner_address_obj = sugar_obj.pool.get('res.partner.address') - model_obj = sugar_obj.pool.get('ir.model.data') PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) sugar_data = sugar.search(PortType, sessionid, 'Calls') for val in sugar_data: From 984990ff6303a6d30a37f26ad74d2e729856cd29 Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Fri, 8 Apr 2011 12:22:51 +0530 Subject: [PATCH 05/25] [FIX]: Code optimize bzr revid: atp@tinyerp.com-20110408065251-d1jj4mzx3r40yapf --- addons/import_sugarcrm/import_sugarcrm.py | 48 +++++++++++++---------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index e1e301bf12f..b8e5432c1dc 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -407,16 +407,24 @@ def get_account(sugar_obj, cr, uid, val, context=None): partner_id = False partner_address_id = False model_obj = sugar_obj.pool.get('ir.model.data') + address_obj = sugar_obj.pool.get('res.partner.address') + partner_obj = sugar_obj.pool.get('res.partner') if val.get('parent_type') == 'Accounts': model_ids = model_obj.search(cr, uid, [('name', '=', val.get('parent_id')), ('model', '=', 'res.partner')]) if model_ids: model = model_obj.browse(cr, uid, model_ids)[0] partner_id = model.res_id + address_ids = address_obj.search(cr, uid, [('partner_id', '=', partner_id)]) + partner_address_id = address_ids[0] if val.get('parent_type') == 'Contacts': model_ids = model_obj.search(cr, uid, [('name', '=', val.get('parent_id')), ('model', '=', 'res.partner.address')]) for model in model_obj.browse(cr, uid, model_ids): partner_address_id = model.res_id + address_id = address_obj.browse(cr, uid, partner_address_id) + if address_id.partner_id: + partner_id = address_id.partner_id + return partner_id, partner_address_id def import_tasks(sugar_obj, cr, uid, context=None): @@ -492,7 +500,6 @@ def get_calls_state(sugar_obj, cr, uid, val,context=None): state = state_dict['status'].get(val, '') return state - def import_calls(sugar_obj, cr, uid, context=None): if not context: context = {} @@ -536,6 +543,18 @@ def import_resources(sugar_obj, cr, uid, context=None): resource_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) return True +def get_job_id(sugar_obj, cr, uid, val, context=None): + if not context: + context={} + job_id = False + job_obj = sugar_obj.pool.get('hr.job') + job_ids = job_obj.search(cr, uid, [('name', '=', val)]) + if job_ids: + job_id = job_ids[0] + else: + job_id = job_obj.create(cr, uid, {'name': val}) + return job_id + def import_employees(sugar_obj, cr, uid, context=None): if not context: context = {} @@ -553,7 +572,6 @@ def import_employees(sugar_obj, cr, uid, context=None): 'job_id/.id': 'job_id/.id' } employee_obj = sugar_obj.pool.get('hr.employee') - job_obj = sugar_obj.pool.get('hr.job') PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) sugar_data = sugar.search(PortType, sessionid, 'Employees') for val in sugar_data: @@ -563,13 +581,7 @@ def import_employees(sugar_obj, cr, uid, context=None): resource_id = sugar_obj.pool.get('ir.model.data').browse(cr, uid, model_ids) if resource_id: val['resource_id/.id'] = resource_id[0].res_id - - job_ids = job_obj.search(cr, uid, [('name', '=', val.get('title'))]) - if job_ids: - job_id = job_ids[0] - else: - job_id = job_obj.create(cr, uid, {'name': val.get('title')}) - val['job_id/.id'] = job_id + val['job_id/.id'] = get_job_id(sugar_obj, cr, uid, val.get('title'), context) fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_employee) employee_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) return True @@ -587,7 +599,9 @@ def get_contact_title(sugar_obj, cr, uid, salutation, domain, context=None): return title_id def import_emails(sugar_obj, cr, uid, context=None): - + if not context: + context=None + map_emails = {'id': 'id', 'name':'name', 'date':'date_sent', @@ -643,8 +657,8 @@ def import_project_tasks(sugar_obj, cr, uid, context=None): 'date_end': 'date_finish', 'progress': 'progress', 'project_id/name': 'project_name', - 'planned_hours': 'estimated_effort', - 'total_hours': 'actual_effort', + 'planned_hours': 'planned_hours', + 'total_hours': 'total_hours', 'priority': 'priority', 'description': 'description', 'user_id/id': 'assigned_user_id', @@ -737,7 +751,6 @@ def import_opportunities(sugar_obj, cr, uid, context=None): 'type' : 'type', 'categ_id.id': 'categ_id.id' } - lead_obj = sugar_obj.pool.get('crm.lead') partner_obj = sugar_obj.pool.get('res.partner') categ_obj = sugar_obj.pool.get('crm.case.categ') @@ -748,13 +761,8 @@ def import_opportunities(sugar_obj, cr, uid, context=None): if not partner_xml_id: raise osv.except_osv(_('Warning !'), _('Reference Partner %s cannot be created, due to Lower Record Limit in SugarCRM Configuration.') % val.get('account_name')) partner_contact_name = get_opportunity_contact(sugar_obj,cr,uid, PortType, sessionid, val, partner_xml_id, context) - val['partner_address_id/name'] = partner_contact_name - categ_ids = categ_obj.search(cr, uid, [('object_id.model','=','crm.lead'), ('name', 'like',val.get('opportunity_type'))]) - if categ_ids: - categ_id = categ_ids[0] - else: - categ_id = categ_obj.create(cr, uid, {'name': val.get('opportunity_type'), 'object_id.model': 'crm.lead'}) - val['categ_id.id'] = categ_id + val['partner_address_id/name'] = partner_contact_name + val['categ_id.id'] = get_category(sugar_obj, cr, uid, 'crm.lead', val.get('opportunity_type')) val['type'] = 'opportunity' stage_id = get_opportunity_status(sugar_obj, cr, uid, val, context) val['stage_id.id'] = stage_id From e0a6f66a5819ae19e07f31d288716f4f01d7f73c Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Fri, 8 Apr 2011 12:50:27 +0530 Subject: [PATCH 06/25] [FIX]: Fix buildbot warning. bzr revid: atp@tinyerp.com-20110408072027-4bogx2iiy4pzp1ur --- addons/import_sugarcrm/import_sugarcrm.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index 516e542fd09..b4e9402e4bd 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -411,7 +411,6 @@ def get_account(sugar_obj, cr, uid, val, context=None): partner_address_id = False model_obj = sugar_obj.pool.get('ir.model.data') address_obj = sugar_obj.pool.get('res.partner.address') - partner_obj = sugar_obj.pool.get('res.partner') if val.get('parent_type') == 'Accounts': model_ids = model_obj.search(cr, uid, [('name', '=', val.get('parent_id')), ('model', '=', 'res.partner')]) if model_ids: @@ -561,7 +560,6 @@ def get_job_id(sugar_obj, cr, uid, val, context=None): def import_employees(sugar_obj, cr, uid, context=None): if not context: context = {} - job_id = False map_employee = {'id' : 'user_hash', 'resource_id/.id': 'resource_id/.id', 'name': ['first_name', 'last_name'], @@ -739,7 +737,6 @@ def get_opportunity_contact(sugar_obj,cr,uid, PortType, sessionid, val, partner_ def import_opportunities(sugar_obj, cr, uid, context=None): if not context: context = {} - categ_id = False partner_contact_name = False map_opportunity = {'id' : 'id', 'name': 'name', @@ -756,7 +753,6 @@ def import_opportunities(sugar_obj, cr, uid, context=None): } lead_obj = sugar_obj.pool.get('crm.lead') partner_obj = sugar_obj.pool.get('res.partner') - categ_obj = sugar_obj.pool.get('crm.case.categ') PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) sugar_data = sugar.search(PortType, sessionid, 'Opportunities') for val in sugar_data: From 51dc8821cc6081a2bc6cdd6411a906c524fbcaea Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Fri, 8 Apr 2011 14:24:22 +0530 Subject: [PATCH 07/25] [FIX]: Minor Fix bzr revid: atp@tinyerp.com-20110408085422-wyj3vjtkhqyims0h --- addons/import_sugarcrm/import_sugarcrm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index b4e9402e4bd..ba77def87fc 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -417,7 +417,7 @@ def get_account(sugar_obj, cr, uid, val, context=None): model = model_obj.browse(cr, uid, model_ids)[0] partner_id = model.res_id address_ids = address_obj.search(cr, uid, [('partner_id', '=', partner_id)]) - partner_address_id = address_ids[0] + partner_address_id = address_ids and address_ids[0] if val.get('parent_type') == 'Contacts': model_ids = model_obj.search(cr, uid, [('name', '=', val.get('parent_id')), ('model', '=', 'res.partner.address')]) From 5e2bc14de956a2dd23734158f6ba80bb7260d7ca Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Mon, 11 Apr 2011 11:32:16 +0530 Subject: [PATCH 08/25] [ADD]: Add Attendee in Meeting For sugarcrm bzr revid: atp@tinyerp.com-20110411060216-obzpdy3cbm6vetid --- addons/import_sugarcrm/import_sugarcrm.py | 22 +++++++++++++++++++--- addons/import_sugarcrm/sugar.py | 23 ++++++++++++++++++++++- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index ba77def87fc..4ee5f77260a 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -424,9 +424,7 @@ def get_account(sugar_obj, cr, uid, val, context=None): for model in model_obj.browse(cr, uid, model_ids): partner_address_id = model.res_id address_id = address_obj.browse(cr, uid, partner_address_id) - if address_id.partner_id: - partner_id = address_id.partner_id - + partner_id = address_id and address_id.partner_id or False return partner_id, partner_address_id def import_tasks(sugar_obj, cr, uid, context=None): @@ -460,6 +458,23 @@ def import_tasks(sugar_obj, cr, uid, context=None): meeting_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) return True +def get_attendee_id(PortType, sessionid, module_name=None, module_id=None, val, context=None): + if not context: + context = {} + model_obj = sugar_obj.pool.get('ir.model.data') + att_obj = sugar_obj.pool.get('calendar.attendee') + user_xml_id, user_email_id = sugar.user_get_attendee_list(PortType, sessionid, module_name='Meetings', module_id=val.get('id')) + user_model_ids = find_mapped_id(sugar_obj, cr, uid, 'res.users', user_xml_id, context) + user_resource_id = model_obj.browse(cr, uid, user_model_ids) + if user_resource_id: + user_id = user_resource_id[0].res_id + attendees = att_obj.create(cr, uid, {'user_id': user_id, 'email': user_email_id}) + meeting_model_ids = find_mapped_id(sugar_obj, cr, uid, 'crm.meeting', val.get('id'), context) + meeting_xml_id = sugar_obj.pool.get('ir.model.data').browse(cr, uid, meeting_model_ids) + if meeting_xml_id: + meeting_obj.write(cr, uid, [meeting_xml_id[0].res_id], {'attendee_ids': [(4, attendees)]}) + return True + def import_meetings(sugar_obj, cr, uid, context=None): if not context: context = {} @@ -487,6 +502,7 @@ def import_meetings(sugar_obj, cr, uid, context=None): val['alarm_id/.id'] = get_alarm_id(sugar_obj, cr, uid, val.get('reminder_time'), context) fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_meeting) meeting_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) + get_attendee_id(portType, sessionid, module_name=None, module_id=None, val, context) return True def get_calls_state(sugar_obj, cr, uid, val,context=None): diff --git a/addons/import_sugarcrm/sugar.py b/addons/import_sugarcrm/sugar.py index c6cac53c06a..0425bd1a73d 100644 --- a/addons/import_sugarcrm/sugar.py +++ b/addons/import_sugarcrm/sugar.py @@ -25,7 +25,8 @@ from sugarsoap_services import * from sugarsoap_services_types import * from osv import osv from tools.translate import _ - +import base64 +from lxml import etree class LoginError(Exception): pass def login(username, password, url): @@ -61,6 +62,26 @@ def relation_search(portType, sessionid, module_name=None, module_id=None, relat ans_list.append(i.get_element_id()) return ans_list +def user_get_attendee_list(portType, sessionid, module_name=None, module_id=None): + se_req = get_attendee_listRequest() + se_req._session = sessionid + se_req._module_name = module_name + se_req._id = module_id + se_resp = portType.get_attendee_list(se_req) + list = se_resp.get_element_return() + arch = base64.decodestring(list.Result) + eview = False + attende_id = False + attende_email_id = False + eview = etree.XML(arch) + for child in eview: + for ch in child.getchildren(): + if ch.tag == 'id': + attende_id = ch.text + if ch.tag == 'email1': + attende_email_id = ch.text + return attende_id, attende_email_id + def search(portType, sessionid, module_name=None): se_req = get_entry_listRequest() From 46879adbb30cfda25d79aba38bfb9f598adb0cf6 Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Mon, 11 Apr 2011 11:39:36 +0530 Subject: [PATCH 09/25] [FIX]: Fixed None-keyword argument bzr revid: atp@tinyerp.com-20110411060936-qu1e9clhhrrhxi2f --- addons/import_sugarcrm/import_sugarcrm.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index 4ee5f77260a..479f29b2b94 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -458,18 +458,18 @@ def import_tasks(sugar_obj, cr, uid, context=None): meeting_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) return True -def get_attendee_id(PortType, sessionid, module_name=None, module_id=None, val, context=None): +def get_attendee_id(PortType, sessionid, module_name, module_id, context=None): if not context: context = {} model_obj = sugar_obj.pool.get('ir.model.data') att_obj = sugar_obj.pool.get('calendar.attendee') - user_xml_id, user_email_id = sugar.user_get_attendee_list(PortType, sessionid, module_name='Meetings', module_id=val.get('id')) + user_xml_id, user_email_id = sugar.user_get_attendee_list(PortType, sessionid, module_name, module_id) user_model_ids = find_mapped_id(sugar_obj, cr, uid, 'res.users', user_xml_id, context) user_resource_id = model_obj.browse(cr, uid, user_model_ids) if user_resource_id: user_id = user_resource_id[0].res_id attendees = att_obj.create(cr, uid, {'user_id': user_id, 'email': user_email_id}) - meeting_model_ids = find_mapped_id(sugar_obj, cr, uid, 'crm.meeting', val.get('id'), context) + meeting_model_ids = find_mapped_id(sugar_obj, cr, uid, 'crm.meeting', module_id, context) meeting_xml_id = sugar_obj.pool.get('ir.model.data').browse(cr, uid, meeting_model_ids) if meeting_xml_id: meeting_obj.write(cr, uid, [meeting_xml_id[0].res_id], {'attendee_ids': [(4, attendees)]}) @@ -502,7 +502,7 @@ def import_meetings(sugar_obj, cr, uid, context=None): val['alarm_id/.id'] = get_alarm_id(sugar_obj, cr, uid, val.get('reminder_time'), context) fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_meeting) meeting_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) - get_attendee_id(portType, sessionid, module_name=None, module_id=None, val, context) + get_attendee_id(portType, sessionid, 'Meetings', val.get('id'), context) return True def get_calls_state(sugar_obj, cr, uid, val,context=None): From 73642ab390de51b4e116d90da4f787777b0a7ec7 Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Mon, 11 Apr 2011 11:46:18 +0530 Subject: [PATCH 10/25] [FIX]: Correction in function argument bzr revid: atp@tinyerp.com-20110411061618-fqwlocchont84xkd --- addons/import_sugarcrm/import_sugarcrm.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index 479f29b2b94..26c2559f982 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -458,11 +458,12 @@ def import_tasks(sugar_obj, cr, uid, context=None): meeting_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) return True -def get_attendee_id(PortType, sessionid, module_name, module_id, context=None): +def get_attendee_id(sugar_obj, cr, uid, PortType, sessionid, module_name, module_id, context=None): if not context: context = {} model_obj = sugar_obj.pool.get('ir.model.data') att_obj = sugar_obj.pool.get('calendar.attendee') + meeting_obj = sugar_obj.pool.get('crm.meeting') user_xml_id, user_email_id = sugar.user_get_attendee_list(PortType, sessionid, module_name, module_id) user_model_ids = find_mapped_id(sugar_obj, cr, uid, 'res.users', user_xml_id, context) user_resource_id = model_obj.browse(cr, uid, user_model_ids) @@ -470,7 +471,7 @@ def get_attendee_id(PortType, sessionid, module_name, module_id, context=None): user_id = user_resource_id[0].res_id attendees = att_obj.create(cr, uid, {'user_id': user_id, 'email': user_email_id}) meeting_model_ids = find_mapped_id(sugar_obj, cr, uid, 'crm.meeting', module_id, context) - meeting_xml_id = sugar_obj.pool.get('ir.model.data').browse(cr, uid, meeting_model_ids) + meeting_xml_id = model_obj.browse(cr, uid, meeting_model_ids) if meeting_xml_id: meeting_obj.write(cr, uid, [meeting_xml_id[0].res_id], {'attendee_ids': [(4, attendees)]}) return True @@ -502,7 +503,7 @@ def import_meetings(sugar_obj, cr, uid, context=None): val['alarm_id/.id'] = get_alarm_id(sugar_obj, cr, uid, val.get('reminder_time'), context) fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_meeting) meeting_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) - get_attendee_id(portType, sessionid, 'Meetings', val.get('id'), context) + get_attendee_id(sugar_obj, cr, uid, PortType, sessionid, 'Meetings', val.get('id'), context) return True def get_calls_state(sugar_obj, cr, uid, val,context=None): From 79c8fd0c8bc2c1ab7af8e6afd83c79ea639ebd42 Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Mon, 11 Apr 2011 12:18:50 +0530 Subject: [PATCH 11/25] [ADD]: Invite Multiple Attendee for One Meetings bzr revid: atp@tinyerp.com-20110411064850-r6747b32nglan069 --- addons/import_sugarcrm/import_sugarcrm.py | 25 ++++++++++++++--------- addons/import_sugarcrm/sugar.py | 10 ++++----- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index 26c2559f982..44c67621dbf 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -464,16 +464,21 @@ def get_attendee_id(sugar_obj, cr, uid, PortType, sessionid, module_name, module model_obj = sugar_obj.pool.get('ir.model.data') att_obj = sugar_obj.pool.get('calendar.attendee') meeting_obj = sugar_obj.pool.get('crm.meeting') - user_xml_id, user_email_id = sugar.user_get_attendee_list(PortType, sessionid, module_name, module_id) - user_model_ids = find_mapped_id(sugar_obj, cr, uid, 'res.users', user_xml_id, context) - user_resource_id = model_obj.browse(cr, uid, user_model_ids) - if user_resource_id: - user_id = user_resource_id[0].res_id - attendees = att_obj.create(cr, uid, {'user_id': user_id, 'email': user_email_id}) - meeting_model_ids = find_mapped_id(sugar_obj, cr, uid, 'crm.meeting', module_id, context) - meeting_xml_id = model_obj.browse(cr, uid, meeting_model_ids) - if meeting_xml_id: - meeting_obj.write(cr, uid, [meeting_xml_id[0].res_id], {'attendee_ids': [(4, attendees)]}) + user_xml_ids, user_email_ids = sugar.user_get_attendee_list(PortType, sessionid, module_name, module_id) + for user_xml_id in user_xml_ids: + user_model_ids = find_mapped_id(sugar_obj, cr, uid, 'res.users', user_xml_id, context) + user_resource_id = model_obj.browse(cr, uid, user_model_ids) + if user_resource_id: + user_id = user_resource_id[0].res_id + attend_ids = att_obj.search(cr, uid, [('user_id', '=', user_id)]) + if attend_ids: + attendees = attend_ids[0] + else: + attendees = att_obj.create(cr, uid, {'user_id': user_id, 'email': user_email_ids[0]}) + meeting_model_ids = find_mapped_id(sugar_obj, cr, uid, 'crm.meeting', module_id, context) + meeting_xml_id = model_obj.browse(cr, uid, meeting_model_ids) + if meeting_xml_id: + meeting_obj.write(cr, uid, [meeting_xml_id[0].res_id], {'attendee_ids': [(4, attendees)]}) return True def import_meetings(sugar_obj, cr, uid, context=None): diff --git a/addons/import_sugarcrm/sugar.py b/addons/import_sugarcrm/sugar.py index 0425bd1a73d..8b25c5ec974 100644 --- a/addons/import_sugarcrm/sugar.py +++ b/addons/import_sugarcrm/sugar.py @@ -71,16 +71,16 @@ def user_get_attendee_list(portType, sessionid, module_name=None, module_id=None list = se_resp.get_element_return() arch = base64.decodestring(list.Result) eview = False - attende_id = False - attende_email_id = False + attende_id = [] + attende_email_id = [] eview = etree.XML(arch) for child in eview: for ch in child.getchildren(): if ch.tag == 'id': - attende_id = ch.text + attende_id.append(ch.text) if ch.tag == 'email1': - attende_email_id = ch.text - return attende_id, attende_email_id + attende_email_id.append(ch.text) + return attende_id,attende_email_id def search(portType, sessionid, module_name=None): From e78f5d33f99ec4e6875040de626b11206ac7319b Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Mon, 11 Apr 2011 13:08:23 +0530 Subject: [PATCH 12/25] [IMP]: Improve code for attendees in sugarcrm bzr revid: atp@tinyerp.com-20110411073823-qp1t4mw6e26tb5ww --- addons/import_sugarcrm/import_sugarcrm.py | 8 ++++---- addons/import_sugarcrm/sugar.py | 12 +++++------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index 44c67621dbf..b2fba2005c9 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -464,9 +464,9 @@ def get_attendee_id(sugar_obj, cr, uid, PortType, sessionid, module_name, module model_obj = sugar_obj.pool.get('ir.model.data') att_obj = sugar_obj.pool.get('calendar.attendee') meeting_obj = sugar_obj.pool.get('crm.meeting') - user_xml_ids, user_email_ids = sugar.user_get_attendee_list(PortType, sessionid, module_name, module_id) - for user_xml_id in user_xml_ids: - user_model_ids = find_mapped_id(sugar_obj, cr, uid, 'res.users', user_xml_id, context) + user_dict = sugar.user_get_attendee_list(PortType, sessionid, module_name, module_id) + for user in user_dict: + user_model_ids = find_mapped_id(sugar_obj, cr, uid, 'res.users', user.get('id'), context) user_resource_id = model_obj.browse(cr, uid, user_model_ids) if user_resource_id: user_id = user_resource_id[0].res_id @@ -474,7 +474,7 @@ def get_attendee_id(sugar_obj, cr, uid, PortType, sessionid, module_name, module if attend_ids: attendees = attend_ids[0] else: - attendees = att_obj.create(cr, uid, {'user_id': user_id, 'email': user_email_ids[0]}) + attendees = att_obj.create(cr, uid, {'user_id': user_id, 'email': user.get('email1')}) meeting_model_ids = find_mapped_id(sugar_obj, cr, uid, 'crm.meeting', module_id, context) meeting_xml_id = model_obj.browse(cr, uid, meeting_model_ids) if meeting_xml_id: diff --git a/addons/import_sugarcrm/sugar.py b/addons/import_sugarcrm/sugar.py index 8b25c5ec974..0ec87238e77 100644 --- a/addons/import_sugarcrm/sugar.py +++ b/addons/import_sugarcrm/sugar.py @@ -71,16 +71,14 @@ def user_get_attendee_list(portType, sessionid, module_name=None, module_id=None list = se_resp.get_element_return() arch = base64.decodestring(list.Result) eview = False - attende_id = [] - attende_email_id = [] eview = etree.XML(arch) + attendee_list = [] for child in eview: + attendee_dict = {} for ch in child.getchildren(): - if ch.tag == 'id': - attende_id.append(ch.text) - if ch.tag == 'email1': - attende_email_id.append(ch.text) - return attende_id,attende_email_id + attendee_dict[ch.tag] = ch.text + attendee_list.append(attendee_dict) + return attendee_list def search(portType, sessionid, module_name=None): From 1a65890225fd2a0e8f412447905ca99a1944fba6 Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Mon, 11 Apr 2011 15:26:03 +0530 Subject: [PATCH 13/25] [FIX]: Fix regression problem of user in employee form. bzr revid: atp@tinyerp.com-20110411095603-ivdsajweg3xdrvgz --- addons/import_sugarcrm/import_sugarcrm.py | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index b2fba2005c9..647f0339bcd 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -211,7 +211,7 @@ def get_user_address(sugar_obj, cr, uid, val, context=None): 'street': 'address_street', 'zip': 'address_postalcode', } - address_ids = address_obj.search(cr, uid, [('name', '=',val.get('first_name') +''+ val.get('last_name'))]) + address_ids = address_obj.search(cr, uid, [('name', 'like', val.get('first_name') +' '+ val.get('last_name'))]) country_id = get_all_countries(sugar_obj, cr, uid, val.get('address_country'), context) state_id = get_all_states(sugar_obj, cr, uid, val.get('address_state'), country_id, context) val['country_id'] = country_id @@ -851,17 +851,17 @@ class import_sugarcrm(osv.osv): _name = "import.sugarcrm" _description = __doc__ _columns = { - 'lead': fields.boolean('Leads', help="If Leads are checked, SugarCRM Leads data imported in openERP crm-Lead form"), - 'opportunity': fields.boolean('Opportunities', help="If Opportunities are checked, SugarCRM opportunities data imported in openERP crm-Opportunity form"), - 'user': fields.boolean('User', help="If Users are checked, SugarCRM Users data imported in openERP Users form"), - 'contact': fields.boolean('Contacts', help="If Contacts are checked, SugarCRM Contacts data imported in openERP partner address form"), - 'account': fields.boolean('Accounts', help="If Accounts are checked, SugarCRM Accounts data imported in openERP partners form"), - 'employee': fields.boolean('Employee', help="If Employees is checked, SugarCRM Employees data imported in openERP employees form"), - 'meeting': fields.boolean('Meetings', help="If Meetings is checked, SugarCRM Meetings data imported in openERP meetings form"), - 'call': fields.boolean('Calls', help="If Calls is checked, SugarCRM Calls data imported in openERP phonecalls form"), - 'email': fields.boolean('Emails', help="If Emails is checked, SugarCRM Emails data imported in openERP Emails form"), - 'project': fields.boolean('Projects', help="If Projects is checked, SugarCRM Projects data imported in openERP Projects form"), - 'project_task': fields.boolean('Project Tasks', help="If Project Tasks is checked, SugarCRM Project Tasks data imported in openERP Project Tasks form"), + 'lead': fields.boolean('Leads', help="If Leads are checked, SugarCRM Leads data imported in OpenERP crm-Lead form"), + 'opportunity': fields.boolean('Opportunities', help="If Opportunities are checked, SugarCRM opportunities data imported in OpenERP crm-Opportunity form"), + 'user': fields.boolean('User', help="If Users are checked, SugarCRM Users data imported in OpenERP Users form"), + 'contact': fields.boolean('Contacts', help="If Contacts are checked, SugarCRM Contacts data imported in OpenERP partner address form"), + 'account': fields.boolean('Accounts', help="If Accounts are checked, SugarCRM Accounts data imported in OpenERP partners form"), + 'employee': fields.boolean('Employee', help="If Employees is checked, SugarCRM Employees data imported in OpenERP employees form"), + 'meeting': fields.boolean('Meetings', help="If Meetings is checked, SugarCRM Meetings data imported in OpenERP meetings form"), + 'call': fields.boolean('Calls', help="If Calls is checked, SugarCRM Calls data imported in OpenERP phonecalls form"), + 'email': fields.boolean('Emails', help="If Emails is checked, SugarCRM Emails data imported in OpenERP Emails form"), + 'project': fields.boolean('Projects', help="If Projects is checked, SugarCRM Projects data imported in OpenERP Projects form"), + 'project_task': fields.boolean('Project Tasks', help="If Project Tasks is checked, SugarCRM Project Tasks data imported in OpenERP Project Tasks form"), 'username': fields.char('User Name', size=64), 'password': fields.char('Password', size=24), } From 777e5e2d7f39b02228d6fe3e3fdd319d77080bcf Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Tue, 12 Apr 2011 17:57:59 +0530 Subject: [PATCH 14/25] [ADD]: Add History into Leads and Opportunity bzr revid: atp@tinyerp.com-20110412122759-3bmrtisnpa7lel8h --- addons/import_sugarcrm/import_sugarcrm.py | 53 ++++++++++++++++++----- addons/import_sugarcrm/sugar.py | 10 +++++ 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index 647f0339bcd..f8db74bec18 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -124,7 +124,6 @@ def import_users(sugar_obj, cr, uid, context=None): map_user = {'id' : 'id', 'name': ['first_name', 'last_name'], 'login': 'user_name', - 'context_lang' : 'context_lang', 'password' : 'password', '.id' : '.id', @@ -430,8 +429,6 @@ def get_account(sugar_obj, cr, uid, val, context=None): def import_tasks(sugar_obj, cr, uid, context=None): if not context: context = {} - partner_id = False - partner_address_id = False map_task = {'id' : 'id', 'name': 'name', 'date': 'date_entered', @@ -484,8 +481,6 @@ def get_attendee_id(sugar_obj, cr, uid, PortType, sessionid, module_name, module def import_meetings(sugar_obj, cr, uid, context=None): if not context: context = {} - partner_id = False - partner_address_id = False map_meeting = {'id' : 'id', 'name': 'name', 'date': 'date_start', @@ -527,8 +522,6 @@ def get_calls_state(sugar_obj, cr, uid, val,context=None): def import_calls(sugar_obj, cr, uid, context=None): if not context: context = {} - partner_id = False - partner_address_id = False map_calls = {'id' : 'id', 'name': 'name', 'date': 'date_start', @@ -579,6 +572,45 @@ def get_job_id(sugar_obj, cr, uid, val, context=None): job_id = job_obj.create(cr, uid, {'name': val}) return job_id +def get_attachment(sugar_obj, cr, uid, val, model, File, context=None): + if not context: + context = {} + attachment_obj = sugar_obj.pool.get('ir.attachment') + model_ids = find_mapped_id(sugar_obj, cr, uid, model, val.get('id'), context) + new_attachment_id = attachment_obj.create(cr, uid, {'name': val.get('name'), 'datas': File, 'res_id': val['res_id'],'res_model': val['model']}) + message_model_ids = find_mapped_id(sugar_obj, cr, uid, model, val.get('id'), context) + message_xml_id = model_obj.browse(cr, uid, message_model_ids) + if message_xml_id: + mailgate_obj.write(cr, uid, [message_xml_id[0].res_id], {'attachment_ids': [(4, new_attachment_id)]}) + return True + +def import_history(sugar_obj, cr, uid, xml_id, model, context=None): + if not context: + context = {} + map_attachment = {'id' : 'id', + 'name':'name', + 'date':'date_entered', + 'user_id/id': 'assigned_user_id', + 'description': 'description_html', + 'res_id': 'res_id', + 'model': 'model', + } + mailgate_obj = sugar_obj.pool.get('mailgate.message') + model_obj = sugar_obj.pool.get('ir.model.data') + + PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) + sugar_data = sugar.search(PortType, sessionid, 'Notes') + for val in sugar_data: + File = sugar.attachment_search(PortType, sessionid, 'Notes', val.get('id')) + model_ids = model_obj.search(cr, uid, [('name', 'like', xml_id)]) + for model in model_obj.browse(cr, uid, model_ids): + val['res_id'] = model.res_id + val['model'] = model.model + fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_attachment) + mailgate_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) + get_attachment(sugar_obj, cr, uid, val, 'mailgate.message', File, context) + return True + def import_employees(sugar_obj, cr, uid, context=None): if not context: context = {} @@ -624,7 +656,6 @@ def get_contact_title(sugar_obj, cr, uid, salutation, domain, context=None): def import_emails(sugar_obj, cr, uid, context=None): if not context: context=None - map_emails = {'id': 'id', 'name':'name', 'date':'date_sent', @@ -700,7 +731,6 @@ def import_project_tasks(sugar_obj, cr, uid, context=None): def import_leads(sugar_obj, cr, uid, context=None): if not context: context = {} - title_id = False map_lead = { 'id' : 'id', 'name': ['first_name', 'last_name'], @@ -736,6 +766,7 @@ def import_leads(sugar_obj, cr, uid, context=None): val['state'] = get_lead_state(sugar_obj, cr, uid, val,context) fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_lead) lead_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) + import_history(sugar_obj, cr, uid, val.get('id'), 'crm.lead', context) return True def get_opportunity_contact(sugar_obj,cr,uid, PortType, sessionid, val, partner_xml_id, context=None): @@ -759,7 +790,6 @@ def get_opportunity_contact(sugar_obj,cr,uid, PortType, sessionid, val, partner_ def import_opportunities(sugar_obj, cr, uid, context=None): if not context: context = {} - partner_contact_name = False map_opportunity = {'id' : 'id', 'name': 'name', 'probability': 'probability', @@ -789,6 +819,7 @@ def import_opportunities(sugar_obj, cr, uid, context=None): val['stage_id.id'] = stage_id fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_opportunity) lead_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) + import_history(sugar_obj, cr, uid, val.get('id'), 'crm.lead', context) return True MAP_FIELDS = {'Opportunities': #Object Mapping name @@ -906,7 +937,7 @@ class import_sugarcrm(osv.osv): if current.project: key_list.append('Projects') if current.project_task: - key_list.append('Project Tasks') + key_list.append('Project Tasks') return key_list def import_all(self, cr, uid, ids, context=None): diff --git a/addons/import_sugarcrm/sugar.py b/addons/import_sugarcrm/sugar.py index 0ec87238e77..7e6fd2dcf8e 100644 --- a/addons/import_sugarcrm/sugar.py +++ b/addons/import_sugarcrm/sugar.py @@ -62,6 +62,16 @@ def relation_search(portType, sessionid, module_name=None, module_id=None, relat ans_list.append(i.get_element_id()) return ans_list +def attachment_search(portType, sessionid, module_name, module_id=None): + se_req = get_note_attachmentRequest() + se_req._session = sessionid + se_req._id = module_id + se_req._module_name = module_name + se_resp = portType.get_note_attachment(se_req) + file = False + file = se_resp._return._note_attachment.File + return file + def user_get_attendee_list(portType, sessionid, module_name=None, module_id=None): se_req = get_attendee_listRequest() se_req._session = sessionid From 2059d2c6ec7a150fe3495d33ab13241f014123c4 Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Tue, 12 Apr 2011 18:05:02 +0530 Subject: [PATCH 15/25] [FIX]: Correct code for history. bzr revid: atp@tinyerp.com-20110412123502-qrw6wyw75ckwnbke --- addons/import_sugarcrm/import_sugarcrm.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index f8db74bec18..499d450d0f3 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -576,6 +576,8 @@ def get_attachment(sugar_obj, cr, uid, val, model, File, context=None): if not context: context = {} attachment_obj = sugar_obj.pool.get('ir.attachment') + model_obj = sugar_obj.pool.get('ir.model.data') + mailgate_obj = sugar_obj.pool.get('mailgate.message') model_ids = find_mapped_id(sugar_obj, cr, uid, model, val.get('id'), context) new_attachment_id = attachment_obj.create(cr, uid, {'name': val.get('name'), 'datas': File, 'res_id': val['res_id'],'res_model': val['model']}) message_model_ids = find_mapped_id(sugar_obj, cr, uid, model, val.get('id'), context) @@ -597,7 +599,6 @@ def import_history(sugar_obj, cr, uid, xml_id, model, context=None): } mailgate_obj = sugar_obj.pool.get('mailgate.message') model_obj = sugar_obj.pool.get('ir.model.data') - PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) sugar_data = sugar.search(PortType, sessionid, 'Notes') for val in sugar_data: From 1660458a17ca734ed74441a5c1bef0cbe284e75a Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Wed, 13 Apr 2011 12:54:05 +0530 Subject: [PATCH 16/25] [IMP]: Add only those contact which is link with the account bzr revid: atp@tinyerp.com-20110413072405-876b35u9msa7tluq --- addons/import_sugarcrm/import_sugarcrm.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index 499d450d0f3..b7f68aae4ef 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -776,8 +776,10 @@ def get_opportunity_contact(sugar_obj,cr,uid, PortType, sessionid, val, partner_ partner_contact_name = False model_obj = sugar_obj.pool.get('ir.model.data') partner_address_obj = sugar_obj.pool.get('res.partner.address') - sugar_opportunity_contact = sugar.relation_search(PortType, sessionid, 'Opportunities', module_id=val.get('id'), related_module='Contacts', query=None, deleted=None) - for contact in sugar_opportunity_contact: + model_account_ids = model_obj.search(cr, uid, [('res_id', '=', partner_xml_id[0]), ('model', '=', 'res.partner'), ('module', '=', 'sugarcrm_import')]) + model_xml_id = model_obj.browse(cr, uid, model_account_ids)[0].name + sugar_account_contact = sugar.relation_search(PortType, sessionid, 'Accounts', module_id=model_xml_id, related_module='Contacts', query=None, deleted=None) + for contact in sugar_account_contact: model_ids = find_mapped_id(sugar_obj, cr, uid, 'res.partner.address', contact, context) if model_ids: model_id = model_obj.browse(cr, uid, model_ids)[0].res_id From f52cd06996960807323abbe4afb60cc90d107a57 Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Wed, 13 Apr 2011 15:37:29 +0530 Subject: [PATCH 17/25] [FIX]: Correct contact and add contact link with account bzr revid: atp@tinyerp.com-20110413100729-uuh8fxc0mn67zlj5 --- addons/import_sugarcrm/import_sugarcrm.py | 27 +++++++++++++---------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index b7f68aae4ef..a2ef4591cec 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -778,16 +778,19 @@ def get_opportunity_contact(sugar_obj,cr,uid, PortType, sessionid, val, partner_ partner_address_obj = sugar_obj.pool.get('res.partner.address') model_account_ids = model_obj.search(cr, uid, [('res_id', '=', partner_xml_id[0]), ('model', '=', 'res.partner'), ('module', '=', 'sugarcrm_import')]) model_xml_id = model_obj.browse(cr, uid, model_account_ids)[0].name - sugar_account_contact = sugar.relation_search(PortType, sessionid, 'Accounts', module_id=model_xml_id, related_module='Contacts', query=None, deleted=None) - for contact in sugar_account_contact: - model_ids = find_mapped_id(sugar_obj, cr, uid, 'res.partner.address', contact, context) - if model_ids: - model_id = model_obj.browse(cr, uid, model_ids)[0].res_id - address_id = partner_address_obj.browse(cr, uid, model_id) - partner_address_obj.write(cr, uid, [address_id.id], {'partner_id': partner_xml_id[0]}) - partner_contact_name = address_id.name - else: - partner_contact_name = val.get('account_name') + sugar_account_contact = set(sugar.relation_search(PortType, sessionid, 'Accounts', module_id=model_xml_id, related_module='Contacts', query=None, deleted=None)) + sugar_opportunities_contact = set(sugar.relation_search(PortType, sessionid, 'Opportunities', module_id=val.get('id'), related_module='Contacts', query=None, deleted=None)) + sugar_contact = list(sugar_account_contact.intersection(sugar_opportunities_contact)) + if sugar_contact: + for contact in sugar_contact: + model_ids = find_mapped_id(sugar_obj, cr, uid, 'res.partner.address', contact, context) + if model_ids: + model_id = model_obj.browse(cr, uid, model_ids)[0].res_id + address_id = partner_address_obj.browse(cr, uid, model_id) + partner_address_obj.write(cr, uid, [address_id.id], {'partner_id': partner_xml_id[0]}) + partner_contact_name = address_id.name + else: + partner_contact_name = val.get('account_name') return partner_contact_name def import_opportunities(sugar_obj, cr, uid, context=None): @@ -826,7 +829,7 @@ def import_opportunities(sugar_obj, cr, uid, context=None): return True MAP_FIELDS = {'Opportunities': #Object Mapping name - {'dependencies' : ['Users', 'Accounts'], #Object to import before this table + {'dependencies' : ['Users', 'Accounts', 'Contacts'], #Object to import before this table 'process' : import_opportunities, }, 'Leads': @@ -872,7 +875,7 @@ MAP_FIELDS = {'Opportunities': #Object Mapping name 'Project Tasks': {'dependencies' : ['Users', 'Projects'], 'process' : import_project_tasks, - }, + }, 'Resources': {'dependencies' : ['Users'], 'process' : import_resources, From b9223a385da0e319a3199df9a512e90d3b8c6ebf Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Wed, 13 Apr 2011 17:55:11 +0530 Subject: [PATCH 18/25] [ADD]: ADD Bugs into Project Issues bzr revid: atp@tinyerp.com-20110413122511-6ukw8qg80sdr1xle --- addons/import_sugarcrm/import_sugarcrm.py | 60 ++++++++++++++++++- .../import_sugarcrm/import_sugarcrm_view.xml | 1 + 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index a2ef4591cec..6b81afb7d27 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -560,6 +560,56 @@ def import_resources(sugar_obj, cr, uid, context=None): resource_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) return True +def get_bug_priority(sugar_obj, cr, uid, val,context=None): + if not context: + context = {} + priority = False + priority_dict = {'priority': #field in the sugarcrm database + { #Mapping of sugarcrm priority : openerp bugs priority + 'Urgent': '1', + 'High': '2', + 'Medium': '3', + 'Low': '4' + },} + priority = priority_dict['priority'].get(val, '') + return priority + +def get_bug_state(sugar_obj, cr, uid, val,context=None): + if not context: + context = {} + state_id = False + state_dict = {'status': #field in the sugarcrm database + { #Mapping of sugarcrm status : openerp Bugs state + 'New' : 'draft', + 'Assigned':'open', + 'Closed': 'done', + 'Pending': 'pending', + 'Rejected': 'cancel', + },} + state = state_dict['status'].get(val, '') + return state + +def import_bug(sugar_obj, cr, uid, context=None): + if not context: + context = {} + map_resource = {'id' : 'id', + 'name': 'name', + 'categ_id.id': 'categ_id.id', + 'priority':'priority', + 'description': 'description', + 'state': 'state' + } + issue_obj = sugar_obj.pool.get('project.issue') + PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) + sugar_data = sugar.search(PortType, sessionid, 'Bugs') + for val in sugar_data: + val['categ_id.id'] = get_category(sugar_obj, cr, uid, 'project.issue', val.get('type')) + val['priority'] = get_bug_priority(sugar_obj, cr, uid, val.get('priority'),context) + val['state'] = get_bug_state(sugar_obj, cr, uid, val.get('status'),context) + fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_resource) + issue_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) + return True + def get_job_id(sugar_obj, cr, uid, val, context=None): if not context: context={} @@ -876,6 +926,10 @@ MAP_FIELDS = {'Opportunities': #Object Mapping name {'dependencies' : ['Users', 'Projects'], 'process' : import_project_tasks, }, + 'Bugs': + {'dependencies' : ['Users', 'Projects', 'Project Tasks'], + 'process' : import_bug, + }, 'Resources': {'dependencies' : ['Users'], 'process' : import_resources, @@ -899,6 +953,7 @@ class import_sugarcrm(osv.osv): 'email': fields.boolean('Emails', help="If Emails is checked, SugarCRM Emails data imported in OpenERP Emails form"), 'project': fields.boolean('Projects', help="If Projects is checked, SugarCRM Projects data imported in OpenERP Projects form"), 'project_task': fields.boolean('Project Tasks', help="If Project Tasks is checked, SugarCRM Project Tasks data imported in OpenERP Project Tasks form"), + 'bug': fields.boolean('Bugs', help="If Bugs is checked, SugarCRM Bugs data imported in OpenERP Project Issues form"), 'username': fields.char('User Name', size=64), 'password': fields.char('Password', size=24), } @@ -913,7 +968,8 @@ class import_sugarcrm(osv.osv): 'call' : True, 'email' : True, 'project' : True, - 'project_task': True + 'project_task': True, + 'bug': True } def get_key(self, cr, uid, ids, context=None): @@ -944,6 +1000,8 @@ class import_sugarcrm(osv.osv): key_list.append('Projects') if current.project_task: key_list.append('Project Tasks') + if current.bug: + key_list.append('Bugs') return key_list def import_all(self, cr, uid, ids, context=None): diff --git a/addons/import_sugarcrm/import_sugarcrm_view.xml b/addons/import_sugarcrm/import_sugarcrm_view.xml index d7cb7c3f5d2..9c62c413ea9 100644 --- a/addons/import_sugarcrm/import_sugarcrm_view.xml +++ b/addons/import_sugarcrm/import_sugarcrm_view.xml @@ -22,6 +22,7 @@ + From a6a69bd01ea588822309e8afa3289651de6262e9 Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Wed, 13 Apr 2011 18:52:40 +0530 Subject: [PATCH 19/25] [ADD]: Add Partner to Project Module. bzr revid: atp@tinyerp.com-20110413132240-xxxjbbdh7vkl02jw --- addons/import_sugarcrm/__openerp__.py | 2 +- addons/import_sugarcrm/import_sugarcrm.py | 25 ++++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/addons/import_sugarcrm/__openerp__.py b/addons/import_sugarcrm/__openerp__.py index ffae7ecac9f..01abb7133bf 100644 --- a/addons/import_sugarcrm/__openerp__.py +++ b/addons/import_sugarcrm/__openerp__.py @@ -27,7 +27,7 @@ "Contacts", "Employees", Meetings, Phonecalls, Emails, and Project, Project Tasks Data into OpenERP Module.""", 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', - 'depends': ['crm', 'hr', 'project'], + 'depends': ['crm', 'hr', 'project', 'project_timesheet'], 'init_xml': [], 'update_xml': ["wizard/sugarcrm_login_view.xml", "wizard/import_message_view.xml", diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index 6b81afb7d27..3bc4496429e 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -733,6 +733,24 @@ def import_emails(sugar_obj, cr, uid, context=None): mailgate_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) return True +def get_project_account(sugar_obj,cr,uid, PortType, sessionid, val, context=None): + if not context: + context={} + partner_id = False + partner_invoice_id = False + model_obj = sugar_obj.pool.get('ir.model.data') + partner_obj = sugar_obj.pool.get('res.partner') + partner_address_obj = sugar_obj.pool.get('res.partner.address') + sugar_project_account = sugar.relation_search(PortType, sessionid, 'Project', module_id=val.get('id'), related_module='Accounts', query=None, deleted=None) + for account_id in sugar_project_account: + model_ids = find_mapped_id(sugar_obj, cr, uid, 'res.partner', account_id, context) + if model_ids: + model_id = model_obj.browse(cr, uid, model_ids)[0].res_id + partner_id = partner_obj.browse(cr, uid, model_id).id + address_ids = partner_address_obj.search(cr, uid, [('partner_id', '=', partner_id),('type', '=', 'invoice')]) + partner_invoice_id = address_ids[0] + return partner_id, partner_invoice_id + def import_projects(sugar_obj, cr, uid, context=None): if not context: context = {} @@ -741,12 +759,17 @@ def import_projects(sugar_obj, cr, uid, context=None): 'date_start': 'estimated_start_date', 'date': 'estimated_end_date', 'user_id/id': 'assigned_user_id', + 'partner_id/.id': 'partner_id/.id', + 'contact_id/.id': 'contact_id/.id', 'state': 'state' } project_obj = sugar_obj.pool.get('project.project') PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) sugar_data = sugar.search(PortType, sessionid, 'Project') for val in sugar_data: + partner_id, partner_invoice_id = get_project_account(sugar_obj,cr,uid, PortType, sessionid, val, context) + val['partner_id/.id'] = partner_id + val['contact_id/.id'] = partner_invoice_id val['state'] = get_project_state(sugar_obj, cr, uid, val.get('status'),context) fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_project) project_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) @@ -919,7 +942,7 @@ MAP_FIELDS = {'Opportunities': #Object Mapping name 'process' : import_emails, }, 'Projects': - {'dependencies' : ['Users'], + {'dependencies' : ['Users', 'Accounts', 'Contacts'], 'process' : import_projects, }, 'Project Tasks': From 7d1f15b165cb0d22271b35596de51c37588fe698 Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Thu, 14 Apr 2011 10:07:27 +0530 Subject: [PATCH 20/25] [FIX]: Fixed buidbot warning! bzr revid: atp@tinyerp.com-20110414043727-melsfdnihwx68f2p --- addons/import_sugarcrm/import_sugarcrm.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index 3bc4496429e..13a830c4e45 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -577,7 +577,7 @@ def get_bug_priority(sugar_obj, cr, uid, val,context=None): def get_bug_state(sugar_obj, cr, uid, val,context=None): if not context: context = {} - state_id = False + state = False state_dict = {'status': #field in the sugarcrm database { #Mapping of sugarcrm status : openerp Bugs state 'New' : 'draft', @@ -628,7 +628,6 @@ def get_attachment(sugar_obj, cr, uid, val, model, File, context=None): attachment_obj = sugar_obj.pool.get('ir.attachment') model_obj = sugar_obj.pool.get('ir.model.data') mailgate_obj = sugar_obj.pool.get('mailgate.message') - model_ids = find_mapped_id(sugar_obj, cr, uid, model, val.get('id'), context) new_attachment_id = attachment_obj.create(cr, uid, {'name': val.get('name'), 'datas': File, 'res_id': val['res_id'],'res_model': val['model']}) message_model_ids = find_mapped_id(sugar_obj, cr, uid, model, val.get('id'), context) message_xml_id = model_obj.browse(cr, uid, message_model_ids) From 8b39c2a6971623da0a8efaaec7327a3a9fbee246 Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Thu, 14 Apr 2011 16:09:21 +0530 Subject: [PATCH 21/25] [FIX]: Fixed Opening Of Partner form. bzr revid: atp@tinyerp.com-20110414103921-ni74n1pwocf7vwjk --- addons/import_sugarcrm/__openerp__.py | 2 +- addons/import_sugarcrm/import_sugarcrm.py | 35 ++++++++++--------- .../import_sugarcrm/import_sugarcrm_view.xml | 28 ++++++++------- 3 files changed, 34 insertions(+), 31 deletions(-) diff --git a/addons/import_sugarcrm/__openerp__.py b/addons/import_sugarcrm/__openerp__.py index 01abb7133bf..36d58ddb46c 100644 --- a/addons/import_sugarcrm/__openerp__.py +++ b/addons/import_sugarcrm/__openerp__.py @@ -27,7 +27,7 @@ "Contacts", "Employees", Meetings, Phonecalls, Emails, and Project, Project Tasks Data into OpenERP Module.""", 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', - 'depends': ['crm', 'hr', 'project', 'project_timesheet'], + 'depends': ['project_timesheet', 'project_issue'], 'init_xml': [], 'update_xml': ["wizard/sugarcrm_login_view.xml", "wizard/import_message_view.xml", diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index 13a830c4e45..6804d92d2b3 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -90,17 +90,18 @@ def import_partner_address(sugar_obj, cr, uid, context=None): 'street': 'primary_address_street', 'zip': 'primary_address_postalcode', 'city': 'primary_address_city', - 'country_id/.id': 'country_id/.id', - 'state_id/.id': 'state_id/id' + 'country_id.id': 'country_id.id', + 'state_id.id': 'state_id.id' } address_obj = sugar_obj.pool.get('res.partner.address') PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) sugar_data = sugar.search(PortType, sessionid, 'Contacts') for val in sugar_data: - country_id = get_all_countries(sugar_obj, cr, uid, val.get('primary_address_country'), context) - state = get_all_states(sugar_obj,cr, uid, val.get('primary_address_state'), country_id, context) - val['country_id/.id'] = country_id - val['state_id/.id'] = state + if val.get('primary_address_country'): + country_id = get_all_countries(sugar_obj, cr, uid, val.get('primary_address_country'), context) + state = get_all_states(sugar_obj,cr, uid, val.get('primary_address_state'), country_id, context) + val['country_id.id'] = country_id + val['state_id.id'] = state fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_partner_address) address_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) return True @@ -211,10 +212,11 @@ def get_user_address(sugar_obj, cr, uid, val, context=None): 'zip': 'address_postalcode', } address_ids = address_obj.search(cr, uid, [('name', 'like', val.get('first_name') +' '+ val.get('last_name'))]) - country_id = get_all_countries(sugar_obj, cr, uid, val.get('address_country'), context) - state_id = get_all_states(sugar_obj, cr, uid, val.get('address_state'), country_id, context) - val['country_id'] = country_id - val['state_id'] = state_id + if val.get('address_country'): + country_id = get_all_countries(sugar_obj, cr, uid, val.get('address_country'), context) + state_id = get_all_states(sugar_obj, cr, uid, val.get('address_state'), country_id, context) + val['country_id'] = country_id + val['state_id'] = state_id fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_user_address) dict_val = dict(zip(fields,datas)) if address_ids: @@ -240,10 +242,11 @@ def get_address_type(sugar_obj, cr, uid, val, map_partner_address, type, context 'type': 'type', }) val['type'] = type - country_id = get_all_countries(sugar_obj, cr, uid, val.get(type_address +'_address_country'), context) - state = get_all_states(sugar_obj, cr, uid, val.get(type_address +'_address_state'), country_id, context) - val['country_id'] = country_id - val['state_id'] = state + if val.get(type_address +'_address_country'): + country_id = get_all_countries(sugar_obj, cr, uid, val.get(type_address +'_address_country'), context) + state = get_all_states(sugar_obj, cr, uid, val.get(type_address +'_address_state'), country_id, context) + val['country_id'] = country_id + val['state_id'] = state fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_partner_address) #Convert To list into Dictionary(Key, val). value pair. dict_val = dict(zip(fields,datas)) @@ -705,7 +708,7 @@ def get_contact_title(sugar_obj, cr, uid, salutation, domain, context=None): def import_emails(sugar_obj, cr, uid, context=None): if not context: - context=None + context= {} map_emails = {'id': 'id', 'name':'name', 'date':'date_sent', @@ -839,7 +842,6 @@ def import_leads(sugar_obj, cr, uid, context=None): val['state'] = get_lead_state(sugar_obj, cr, uid, val,context) fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_lead) lead_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) - import_history(sugar_obj, cr, uid, val.get('id'), 'crm.lead', context) return True def get_opportunity_contact(sugar_obj,cr,uid, PortType, sessionid, val, partner_xml_id, context=None): @@ -897,7 +899,6 @@ def import_opportunities(sugar_obj, cr, uid, context=None): val['stage_id.id'] = stage_id fields, datas = sugarcrm_fields_mapping.sugarcrm_fields_mapp(val, map_opportunity) lead_obj.import_data(cr, uid, fields, [datas], mode='update', current_module='sugarcrm_import', noupdate=True, context=context) - import_history(sugar_obj, cr, uid, val.get('id'), 'crm.lead', context) return True MAP_FIELDS = {'Opportunities': #Object Mapping name diff --git a/addons/import_sugarcrm/import_sugarcrm_view.xml b/addons/import_sugarcrm/import_sugarcrm_view.xml index 9c62c413ea9..8fb7be8c408 100644 --- a/addons/import_sugarcrm/import_sugarcrm_view.xml +++ b/addons/import_sugarcrm/import_sugarcrm_view.xml @@ -9,20 +9,22 @@ form
- + - - - - - - - - - - - - + + + + + + + + + + + + + + From 30d1bcb232de54502481066b58dd5a805ca6ba7e Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Thu, 14 Apr 2011 18:21:54 +0530 Subject: [PATCH 22/25] [IMP]: Add attachment as Different module. bzr revid: atp@tinyerp.com-20110414125154-pq50pfucad5v2vmo --- addons/import_sugarcrm/import_sugarcrm.py | 17 ++++++++++++----- addons/import_sugarcrm/import_sugarcrm_view.xml | 2 ++ addons/import_sugarcrm/wizard/sugarcrm_login.py | 2 +- .../wizard/sugarcrm_login_view.xml | 3 +-- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index 6804d92d2b3..0f318b4f379 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -638,7 +638,7 @@ def get_attachment(sugar_obj, cr, uid, val, model, File, context=None): mailgate_obj.write(cr, uid, [message_xml_id[0].res_id], {'attachment_ids': [(4, new_attachment_id)]}) return True -def import_history(sugar_obj, cr, uid, xml_id, model, context=None): +def import_history(sugar_obj, cr, uid, context=None): if not context: context = {} map_attachment = {'id' : 'id', @@ -655,7 +655,7 @@ def import_history(sugar_obj, cr, uid, xml_id, model, context=None): sugar_data = sugar.search(PortType, sessionid, 'Notes') for val in sugar_data: File = sugar.attachment_search(PortType, sessionid, 'Notes', val.get('id')) - model_ids = model_obj.search(cr, uid, [('name', 'like', xml_id)]) + model_ids = model_obj.search(cr, uid, [('name', 'like', val.get('parent_id'))]) for model in model_obj.browse(cr, uid, model_ids): val['res_id'] = model.res_id val['model'] = model.model @@ -952,7 +952,11 @@ MAP_FIELDS = {'Opportunities': #Object Mapping name 'Bugs': {'dependencies' : ['Users', 'Projects', 'Project Tasks'], 'process' : import_bug, - }, + }, + 'Notes': + {'dependencies' : ['Users', 'Projects', 'Project Tasks', 'Accounts', 'Contacts', 'Leads', 'Opportunities', 'Meetings', 'Calls'], + 'process' : import_history, + }, 'Resources': {'dependencies' : ['Users'], 'process' : import_resources, @@ -977,6 +981,7 @@ class import_sugarcrm(osv.osv): 'project': fields.boolean('Projects', help="If Projects is checked, SugarCRM Projects data imported in OpenERP Projects form"), 'project_task': fields.boolean('Project Tasks', help="If Project Tasks is checked, SugarCRM Project Tasks data imported in OpenERP Project Tasks form"), 'bug': fields.boolean('Bugs', help="If Bugs is checked, SugarCRM Bugs data imported in OpenERP Project Issues form"), + 'attachment': fields.boolean('Attachments', help="If Attachments is checked, SugarCRM Notes data imported in OpenERP's Related module's History with attachment"), 'username': fields.char('User Name', size=64), 'password': fields.char('Password', size=24), } @@ -992,7 +997,7 @@ class import_sugarcrm(osv.osv): 'email' : True, 'project' : True, 'project_task': True, - 'bug': True + 'bug': True, } def get_key(self, cr, uid, ids, context=None): @@ -1024,7 +1029,9 @@ class import_sugarcrm(osv.osv): if current.project_task: key_list.append('Project Tasks') if current.bug: - key_list.append('Bugs') + key_list.append('Bugs') + if current.attachment: + key_list.append('Notes') return key_list def import_all(self, cr, uid, ids, context=None): diff --git a/addons/import_sugarcrm/import_sugarcrm_view.xml b/addons/import_sugarcrm/import_sugarcrm_view.xml index 8fb7be8c408..a966469257a 100644 --- a/addons/import_sugarcrm/import_sugarcrm_view.xml +++ b/addons/import_sugarcrm/import_sugarcrm_view.xml @@ -25,6 +25,8 @@ + + diff --git a/addons/import_sugarcrm/wizard/sugarcrm_login.py b/addons/import_sugarcrm/wizard/sugarcrm_login.py index e63574a5513..3c5fe7488aa 100644 --- a/addons/import_sugarcrm/wizard/sugarcrm_login.py +++ b/addons/import_sugarcrm/wizard/sugarcrm_login.py @@ -30,7 +30,7 @@ class sugarcrm_login(osv.osv): _columns = { 'username': fields.char('User Name', size=64, required=True), 'password': fields.char('Password', size=24,required=True), - 'url' : fields.char('SugarCRM Path', size=264, required=True, help="Path for SugarCRM connection should be 'http://localhost/sugarcrm/soap.php' Format."), + 'url' : fields.char('Service', size=264, required=True, help="Path for SugarCRM connection should be 'http://localhost/sugarcrm/soap.php' Format."), } _defaults = { 'username' : 'admin', diff --git a/addons/import_sugarcrm/wizard/sugarcrm_login_view.xml b/addons/import_sugarcrm/wizard/sugarcrm_login_view.xml index 517cb3e6a4d..c21ee0dade0 100644 --- a/addons/import_sugarcrm/wizard/sugarcrm_login_view.xml +++ b/addons/import_sugarcrm/wizard/sugarcrm_login_view.xml @@ -10,9 +10,8 @@ - + - From ed0a1026632030624984a5df0cea98d9b670b453 Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Fri, 15 Apr 2011 11:43:38 +0530 Subject: [PATCH 23/25] [FIX]: Use tools.ustr() bzr revid: atp@tinyerp.com-20110415061338-8gh77c7rx8m7ry47 --- addons/import_sugarcrm/import_sugarcrm.py | 18 +++++++++++++++++- addons/import_sugarcrm/sugar.py | 8 ++++---- .../import_sugarcrm/wizard/sugarcrm_login.py | 2 +- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index 0f318b4f379..0a6f937e4be 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -591,21 +591,37 @@ def get_bug_state(sugar_obj, cr, uid, val,context=None): },} state = state_dict['status'].get(val, '') return state + +def get_issue_related_project(sugar_obj,cr,uid, PortType, sessionid, val, context=None): + if not context: + context={} + project_id = False + model_obj = sugar_obj.pool.get('ir.model.data') + project_obj = sugar_obj.pool.get('project.project') + sugar_bug_project = sugar.relation_search(PortType, sessionid, 'Bugs', module_id=val.get('id'), related_module='Project', query=None, deleted=None) + for project_id in sugar_bug_project: + model_ids = find_mapped_id(sugar_obj, cr, uid, 'project.project', project_id, context) + if model_ids: + model_id = model_obj.browse(cr, uid, model_ids)[0].res_id + project_id = project_obj.browse(cr, uid, model_id).id + return project_id def import_bug(sugar_obj, cr, uid, context=None): if not context: context = {} map_resource = {'id' : 'id', 'name': 'name', + 'project_id/.id':'project_id/.id', 'categ_id.id': 'categ_id.id', 'priority':'priority', 'description': 'description', - 'state': 'state' + 'state': 'state', } issue_obj = sugar_obj.pool.get('project.issue') PortType, sessionid = sugar.login(context.get('username', ''), context.get('password', ''), context.get('url','')) sugar_data = sugar.search(PortType, sessionid, 'Bugs') for val in sugar_data: + val['project_id/.id'] = get_issue_related_project(sugar_obj,cr,uid, PortType, sessionid, val, context) val['categ_id.id'] = get_category(sugar_obj, cr, uid, 'project.issue', val.get('type')) val['priority'] = get_bug_priority(sugar_obj, cr, uid, val.get('priority'),context) val['state'] = get_bug_state(sugar_obj, cr, uid, val.get('status'),context) diff --git a/addons/import_sugarcrm/sugar.py b/addons/import_sugarcrm/sugar.py index 7e6fd2dcf8e..d50287dad91 100644 --- a/addons/import_sugarcrm/sugar.py +++ b/addons/import_sugarcrm/sugar.py @@ -27,6 +27,7 @@ from osv import osv from tools.translate import _ import base64 from lxml import etree +import tools class LoginError(Exception): pass def login(username, password, url): @@ -86,10 +87,9 @@ def user_get_attendee_list(portType, sessionid, module_name=None, module_id=None for child in eview: attendee_dict = {} for ch in child.getchildren(): - attendee_dict[ch.tag] = ch.text + attendee_dict[ch.tag] = tools.ustr(ch.text) attendee_list.append(attendee_dict) - return attendee_list - + return attendee_list def search(portType, sessionid, module_name=None): se_req = get_entry_listRequest() @@ -102,7 +102,7 @@ def search(portType, sessionid, module_name=None): for i in list: ans_dir = {} for j in i._name_value_list: - ans_dir[j._name.encode('utf-8')] = j._value.encode('utf-8') + ans_dir[tools.ustr(j._name)] = tools.ustr(j._value) #end for ans_list.append(ans_dir) #end for diff --git a/addons/import_sugarcrm/wizard/sugarcrm_login.py b/addons/import_sugarcrm/wizard/sugarcrm_login.py index 3c5fe7488aa..b7060fb6b58 100644 --- a/addons/import_sugarcrm/wizard/sugarcrm_login.py +++ b/addons/import_sugarcrm/wizard/sugarcrm_login.py @@ -30,7 +30,7 @@ class sugarcrm_login(osv.osv): _columns = { 'username': fields.char('User Name', size=64, required=True), 'password': fields.char('Password', size=24,required=True), - 'url' : fields.char('Service', size=264, required=True, help="Path for SugarCRM connection should be 'http://localhost/sugarcrm/soap.php' Format."), + 'url' : fields.char('Service', size=264, required=True, help="Connection with Sugarcrm Using Soap Protocol Services and For that Path should be 'http://localhost/sugarcrm/soap.php' Format."), } _defaults = { 'username' : 'admin', From f556835a89b9523d5972f48aea0287e2af184595 Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Fri, 15 Apr 2011 12:21:39 +0530 Subject: [PATCH 24/25] [IMP]: Usability Improvement bzr revid: atp@tinyerp.com-20110415065139-ej1j1qbw6jmhxuuy --- addons/import_sugarcrm/import_sugarcrm_view.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/import_sugarcrm/import_sugarcrm_view.xml b/addons/import_sugarcrm/import_sugarcrm_view.xml index a966469257a..c19529c43af 100644 --- a/addons/import_sugarcrm/import_sugarcrm_view.xml +++ b/addons/import_sugarcrm/import_sugarcrm_view.xml @@ -24,9 +24,8 @@ + - - From 7b819369458e8b546b4eee1a9811ed76dd414b77 Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Fri, 15 Apr 2011 15:05:18 +0530 Subject: [PATCH 25/25] [IMP]: Change Icon bzr revid: atp@tinyerp.com-20110415093518-hakigqvvar3p2eqv --- addons/import_sugarcrm/import_sugarcrm_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/import_sugarcrm/import_sugarcrm_view.xml b/addons/import_sugarcrm/import_sugarcrm_view.xml index c19529c43af..eb4af473b39 100644 --- a/addons/import_sugarcrm/import_sugarcrm_view.xml +++ b/addons/import_sugarcrm/import_sugarcrm_view.xml @@ -34,7 +34,7 @@