3
from tools.translate import _
7
def get_salesforce_account(self, cr, uid, context=None):
10
Get SalesForce account details
11
@param cr: database cusrsor
12
@param uid: id of the executing user
13
@return: browse record object
16
acc_obj = self.pool.get("salesforce.connection")
17
acc_ids = acc_obj.search(cr, uid, [('confirmed','=',True)],context=context)# get confirmed SalesForce connection
19
raise osv.except_osv(_("Error "),_("There is no active salesforce connection defined.\n Please add a salesforce connection and try again"))
20
return acc_obj.browse(cr,uid,acc_ids,context=context)[0]#browse
22
#Get SalesForce resource (Table)
24
def get_salesforce_resource(self, cr, uid, sequence=0, context=None):
26
Serch if a coneection to a given module is available
27
if yes return that resouce from salesforce.table
28
if not raise exception
29
@param cr: database cusrsor
30
@param uid: id of the executing user
31
@param sequence: sequence of the data, default is 0
37
resource_obj = self.pool.get('salesforce.tables')
38
# search for the given model and sequence in salesforce.table
39
resource_ids= resource_obj.search(cr, uid, [('model','=',self._name),('sequence','=',sequence)],context=context)
41
if not resource_ids : # if no refernce found raise the error
42
raise osv.except_osv(_("Error "),_("Saleforce connector is not available for this resource %s " %self._name))
44
# read that record and return
45
resource= resource_obj.read(cr, uid, resource_ids,[],context=context)[0]
49
def get_salesforce_field_mapping(self, cr, uid, table_id, move="in", context=None):
52
Get all the fields from salesforce.fields in a given model and return back
53
depending up on move "in" or "out this method will return the corresponding fields"
54
@param cr: database cusrsor
55
@param uid: id of the executing user
56
@param table_id: SalesForce table id --'salesforce.tables'
57
@param move: type of the method -- values 'in','out'
64
filter_string = [('table_id','=',table_id),('type','in',['in_out',move])]
65
sf_field_pool = self.pool.get('salesforce.fields')
66
field_ids = sf_field_pool.search(cr, uid, filter_string,context=context)
68
if field_ids : # if field is found read the values
69
fields = sf_field_pool.read(cr, uid, field_ids, context=context)
70
else: # in no field found set the fileds as empty list
74
# depending on move type prepare the dict key
75
key = move == 'in' and 'salesforce_name' or 'name'
77
result[field[key]]= field # for import dict key will be salesforce filed name and Internal filed name for export
80
# method to prapare a salesforce API (THis is not used )
81
def prepare_salesforce_query(resource, fields, context=None):
83
Generat Query for SalesForce
84
@param resource: SalesForce Table name
85
@param fields: fields list
90
for field in fields.keys():
91
field_string += field+','
93
query= "SELECT "+field_string+ " FROM "+resource
96
def salesforce_import_mapping(self, cr, uid, response, fields, con, account=False, context=None):
98
Map the fields to import ,
99
ARGS : cr : database cursor
101
response : API response dict from Salesforce
102
fields : fields dict prepared by get_salesforce_field_mapping()
103
: con : connection object to salesforce api
104
Return : dict which is ready to be wriiten or created a record
107
# iterate through the fileds
108
for key,value in fields.items():
110
if value['evaluation_type'] == 'direct' : #if the field is directy mapping type the assing the value from response
111
res[value['name']]= response.get(key,False)
113
elif value['evaluation_type'] == 'function' : # if its functional filed execute the function
114
space = { 'self': self,
118
'response': response,
122
} # these are the variables which will be availble in functions
124
exec value['in_function'] in space # execute the functions
125
except Exception, e: # If there is any execpion catch that
126
raise osv.except_osv(_("Error "),_(e))
128
result = space.get('result', False) # the ooutput of the function should be in variable result
130
if result: # If there is any result add that to res dict
131
if isinstance(result, list):
132
for each_tuple in result:
133
if isinstance(each_tuple, tuple) and len(each_tuple) == 2:
134
res[each_tuple[0]] = each_tuple[1]
135
else : # if the field is ot found assign it as false
136
res[value['name']]= False
138
return res # return the dict
140
def import_from_salesforce(self, cr, uid, internal_id, con, account=False, sequence=0, context=None):
144
salesforce_id =self.get_internal_reference(cr, uid, account.id, internal_id, sequence=sequence, context=context)
146
def import_from_salesforce(self, cr, uid, con, ids, account=False, sequence=0, context=None):
147
if not isinstance(ids, (list,tuple)):
150
self.import_all_from_salesforce(cr, uid, con, account=account, ids=ids, sequence=sequence, context=context)
153
def import_all_from_salesforce(self, cr, uid, con, account=False, ids=False, sequence=0, context=None):
155
Import all data from SalesForce
156
@param cr: database cursor
157
@param uid: id of the executing user
158
@param con: SalesForce connection object
159
@param account: SalesForce Account object
160
@param ids: ids of the corresponding erp record
161
@param sequence: SalesForce resouce sequence, default is 0
166
if isinstance(ids, (list,tuple)):
169
account = self.get_salesforce_account(cr,uid,context=context)
170
context.update({'tz':account.timezone})
171
resource = self.get_salesforce_resource(cr, uid, sequence=sequence, context=context)
172
model= resource['model']
173
fields = self.get_salesforce_field_mapping(cr, uid, resource['id'], move="in", context=context)
175
raise osv.except_osv(_("Error "),_("No fileds mapped for the model %s " %self._name))
178
sf_id =self.get_selesforce_reference(cr, uid, account.id, ids, context=context)
179
success,response = con.read_record(resource['salesforce_model'],str(sf_id))
181
success,response = con.read_allfields(resource['salesforce_model'])
183
raise osv.except_osv(_(response['errorCode']),_(response['message']))
185
if not isinstance(response, (list,tuple)):
186
response = [response]
191
for result in response :
193
salesforce_id = result['Id']
194
vals = self.salesforce_import_mapping(cr,uid,result,fields,con,account,context=context)
195
internal_id =self.get_internal_reference(cr, uid, account.id, salesforce_id, sequence=sequence, context=context)
198
self.write(cr,uid,[internal_id],vals,context=context)
199
self.set_salesforce_ref(cr, uid, account.id, internal_id, salesforce_id,sequence=sequence,context=context)
201
except Exception as e:
203
self.pool.get('log.details').register_log(cr, uid, module='Saleforce', connector_name=account.name, model=resource['model_id'][1], res_id=internal_id, sync_type='import', message=_("Writing of import data Failed - %s"%e), state='error', context=context)
207
internal_id = self.create(cr,uid,vals,context=context)
208
self.set_salesforce_ref(cr, uid, account.id, internal_id, salesforce_id, sequence=sequence, context=context)
210
except Exception as e:
211
self.pool.get('log.details').register_log(cr, uid, module='Saleforce', connector_name=account.name, model=resource['model_id'][1], res_id=internal_id, sync_type='import', message=_("Creation of import data Failed - %s"%e), state='error', context=context)
214
msg = 'Number of Records From SalesForce : '+ str(total_count) +'\nNumber of Records Created : '+ str(create_count)+'\nNumber of Records Updated : '+ str(update_count)+'\nNumber of Failed Imports : '+ str(total_count-(update_count+create_count))+"\n\n Please find the log to see the error report of failed operations"
215
title = 'Import ->'+ resource['model_id'][1]
217
return self.pool.get('warning.message').show_message(cr,uid,_(title),_(msg))
220
def salesforce_get_updated_ids(self, cr, uid, account, ids=[], context={}):
223
@param cr: database cursor
224
@param uid: id of the executing user
225
@param account: SalesForce Account object
226
@param ids: ids of the corresponding erp record
233
res_ids = self.search(cr, uid, [], context=context)
235
ref_pool = self.pool.get('salesforce.reference')
236
for res_id in res_ids :
238
ref_id = ref_pool.search(cr, uid, [
239
('model','=', self._name),
240
('internal_id', '=', res_id),
241
('account_id', '=', account.id),
244
up_ids.append(res_id)
247
reference = ref_pool.read(cr, uid,ref_id,['updated_on'], context=context)[0]
248
cur_id = self.search(cr, uid, [
250
('write_date','>',reference['updated_on']),
251
('create_date','>',reference['updated_on']),
257
up_ids.append(cur_id[0])
262
def salesforce_export_mapping(self, cr, uid, record, fields, con,account=False, context=None):
264
SalesForce Export Mapping
265
@param cr: database cursor
266
@param uid: id of the executing user
267
@param record: Data Object
268
@param con: SalesForce Connection Object
269
@param account: SalesForce Account object
273
for key,value in fields.items():
275
if value['evaluation_type'] == 'direct' and hasattr(record,key):
276
res[value['salesforce_name']]= getattr(record,key) or None
278
elif value['evaluation_type'] == 'function' :
279
space = { 'self': self,
289
exec value['out_function'] in space
291
raise osv.except_osv(_("Error "),_(e))
292
result = space.get('result', False)
294
if isinstance(result, list):
295
for each_tuple in result:
296
if isinstance(each_tuple, tuple) and len(each_tuple) == 2:
297
res[each_tuple[0]] = each_tuple[1]
299
res[value['salesforce_name']]= None
302
def export_to_salesforce(self, cr, uid, con, account=False, ids=[], sequence=0, context=None):
305
@param cr: database cursor
306
@param uid: id of the executing user
307
@param con: SalesForce connection object
308
@param account: SalesForce Account object
309
@param ids: ids of the corresponding erp record
310
@param sequence: SalesForce resouce sequence, default is 0
316
account = self.get_salesforce_account(cr,uid,context=context)
317
context.update({'tz':account.timezone})
318
resource = self.get_salesforce_resource(cr, uid, sequence=sequence, context=context)
319
model= resource['model']
320
fields = self.get_salesforce_field_mapping(cr, uid, resource['id'], move="out", context=context)
322
raise osv.except_osv(_("Error "),_("No fields mapped for the model %s " %self._name))
324
ids = self.salesforce_get_updated_ids(cr, uid, account, ids=ids, context = context )
329
for record in self.browse(cr, uid, ids, context = context) :
331
vals = self.salesforce_export_mapping(cr,uid,record,fields,con,account,context=context)
332
salesforce_id = self.get_salesforce_reference(cr,uid, account.id, record.id, sequence=sequence, context=None)
336
success,response = con.update_record(resource['salesforce_model'], salesforce_id, vals)
338
success,response= con.create_record(resource['salesforce_model'], vals)
339
salesforce_id =response
341
self.set_salesforce_ref(cr, uid, account.id, record.id, salesforce_id , sequence=sequence, context=context)
344
self.pool.get('log.details').register_log(cr, uid, module='Saleforce', connector_name=account.name, model=resource['model_id'][1], res_id=record.id, sync_type='export', message=_("Export failed - %s-%s"%(response['errorCode'],response['message'])), state='error', context=context)
347
msg = 'Number of Records Tried to Export : '+ str(total_count) +'\nNumber of Successed Export : '+ str(success_count)+"\n\n Please find the log to see the error report of failed operations"
348
title = 'Export ->'+ resource['model_id'][1]
349
return self.pool.get('warning.message').show_message(cr,uid,_(title),_(msg))
352
def delete_from_salesforce(self, cr, uid, con, account=False, ids=[], sequence=0, context=None) :
354
Delete from SalesForce
355
@param cr: database cursor
356
@param uid: id of the executing user
357
@param con: SalesForce connection object
358
@param account: SalesForce Account object
359
@param ids: ids of the corresponding erp record
360
@param sequence: SalesForce resouce sequence, default is 0
366
account = self.get_salesforce_account(cr,uid,context=context)
367
resource = self.get_salesforce_resource(cr, uid, sequence=sequence, context=context)
369
ref_obj=self.pool.get('salesforce.reference')
372
if not isinstance(ids, (list,tuple)):
376
salesforce_id = self.get_salesforce_reference(cr,uid, account.id, res_id, sequence=sequence, context=None)
378
success,response = con.delete_record(resource['salesforce_model'], salesforce_id)
379
print success,response
382
ref_id=ref_obj.search(cr,uid,[('model','=',self._name),('internal_id','=',res_id),('account_id', '=', account.id),('sequence','=',sequence)])
383
ref_obj.unlink(cr, uid, ref_id, context=context)
385
self.pool.get('log.details').register_log(cr, uid, module='Saleforce', connector_name=account.name, model=resource['model_id'][1], res_id=res_id, sync_type='delete', message=_("Delete failed - %s-%s"%(response['errorCode'],response['message'])), state='error', context=context)
388
raise osv.except_osv(_("Error "),_("This record has already been deleted from SalesForce"))
390
msg = 'Number of Records Tried to Delete : '+ str(total_count) +'\n Number of Successed delete : '+ str(success_count)+"\n\n Please find the log to see the error report of failed deletion"
391
title = 'Delete ->'+ resource['model_id'][1]
392
return self.pool.get('warning.message').show_message(cr,uid,_(title),_(msg))
395
def set_salesforce_ref(self, cr, uid, account_id, internal_id, salesforce_id,sequence=0,context={}):
397
Set SalesForce reference
398
@param cr: database cursor
399
@param uid: id of the executing user
400
@param account_id: SalesForce Account object
401
@param internal_id: erp id
402
@param salesforce_id: salesforce id
403
@param sequence: SalesForce resouce sequence, default is 0
408
Set the Salesforce ID for a resouce
409
ARGS: account : salesforce aconnection account obj
410
salesforce_id (int) : salesforce id from API response
411
result : res_id(int) or False
413
ref_pool = self.pool.get('salesforce.reference')
415
#search if its alreadt set
416
ref_ids = ref_pool.search(cr, uid, [
417
('model','=', self._name),
418
('internal_id', '=', internal_id),
419
('account_id', '=', account_id),
420
('sequence', '=', sequence),
422
updated_on = time.strftime('%Y-%m-%d %H:%M:%S')
423
if ref_ids: # if alreadt set update the time
425
ref_pool.write(cr, uid, ref_ids, {'salesforce_id':salesforce_id,'updated_on':updated_on,'sequence':sequence})
427
else: # if new item create a reference
429
ref_pool.create(cr, uid, {
431
'internal_id':internal_id,
432
'account_id':account_id,
433
'salesforce_id':salesforce_id,
434
'updated_on':updated_on,
440
def get_internal_reference(self, cr, uid, account_id, salesforce_id, sequence=0, context=None):
443
Find the Internal ID of a given record from a salesforce ID
444
ARGS: account : salesforce aconnection account obj
445
salesforce_id (int) : salesforce id from API response
446
result : res_id(int) or False
449
ref_pool = self.pool.get('salesforce.reference')
451
# search for a reference id for given condition
452
ref_ids = ref_pool.search(cr, uid, [
453
('model','=', self._name),
454
('salesforce_id', '=', salesforce_id),
455
('account_id', '=', account_id),
456
('sequence', '=', sequence),
459
if ref_ids: # if reference is available return the internal id
460
ref_data = ref_pool.read(cr, uid, ref_ids, ['internal_id'],context=context)[0]
461
return ref_data['internal_id']
463
return False # Return False if no reference is available
466
def get_salesforce_reference(self, cr, uid, account_id, internal_id, sequence=0, context=None):
468
Find the salesforce ID of a given internalID
469
ARGS: account : salesforce aconnection account obj
470
internal_id (int) : internal id for record
471
result : res_id(int) or False
474
ref_pool = self.pool.get('salesforce.reference')
476
# search for a reference id for given condition
477
ref_ids = ref_pool.search(cr, uid, [
478
('model','=', self._name),
479
('internal_id', '=', internal_id),
480
('account_id', '=', account_id),
481
('sequence', '=', sequence),
484
if ref_ids: # if reference is available return the salesforce id
485
ref_data = ref_pool.read(cr, uid, ref_ids, ['salesforce_id'],context=context)[0]
486
return ref_data['salesforce_id']
488
return False # Return False if no reference is available
490
def unlinkasd(self, cr, uid, ids, context={}):
492
Delete from ERP and SalesForce
493
@param cr: database cusrsor
494
@param uid: id of the executing user
495
@param ids: erp ids of the records to be deleted
496
@return: True or Flase
499
deleted = super(osv.osv, self).unlink(cr, uid, ids, context=context)
500
resource_obj = self.pool.get('salesforce.tables')
501
if resource_obj and resource_obj._columns.get('model'):
502
resource_ids= resource_obj.search(cr, uid, [('model','=',self._name)],context=context)
503
sf_objs = self.pool.get('salesforce.connection').search(cr, uid, [('confirmed','=',True)], context=context)
504
if deleted and resource_ids :
505
for sf_obj in sf_objs :
506
#delete from salesforce
508
sf_id = self.get_prestashop_ref(cr, uid, shop,id, context)
510
deleted_ref_ids.append(sf_id)
511
# self.delete_from_salesforce(cr, uid, sf_objs, deleted_ref_ids,convert_to_presta_id=False,context=context)
513
osv.osv.get_salesforce_resource = get_salesforce_resource
514
osv.osv.get_salesforce_field_mapping = get_salesforce_field_mapping
515
osv.osv.salesforce_import_mapping = salesforce_import_mapping
516
osv.osv.import_all_from_salesforce = import_all_from_salesforce
517
osv.osv.import_from_salesforce = import_from_salesforce
519
osv.osv.export_to_salesforce = export_to_salesforce
520
osv.osv.salesforce_export_mapping = salesforce_export_mapping
521
osv.osv.salesforce_get_updated_ids = salesforce_get_updated_ids
523
osv.osv.set_salesforce_ref = set_salesforce_ref
524
osv.osv.get_internal_reference = get_internal_reference
525
osv.osv.get_salesforce_reference = get_salesforce_reference
526
osv.osv.get_salesforce_account= get_salesforce_account
527
osv.osv.delete_from_salesforce = delete_from_salesforce