def _save_for_mapper(mapper, mapping_table=None): #get model corresponding to specified mapper obj_model = mapper.content_type.model_class() if mapping_table is None: #get root mapping if no mapping is specified mapping_table = ModelMapper.get_for_model(obj_model)[mapper.oerp_model] res = True try: if mapper.sync_now: #The object is synced now oerp_object = Oerp(mapper.oerp_model, mapper.oerp_id) if oerp_object.exists: #object has to be updated data_dict = ModelMapper.parse_data( mapper.object, mapping_table, mapper.oerp_model, 'update')[0] oerp_object.update(data_dict) else: #create object if it doesn't exist data_dict = ModelMapper.parse_data( mapper.object, mapping_table, mapper.oerp_model, 'create')[0] oerp_object.create(data_dict) #update mapper mapper.oerp_id = oerp_object.id #consider sync successful if we get to this point mapper.save_state('clean') else: #This object is synced later. Only change mapper status... mapper.save_state('dirty') except MappingError as errmsg: log.error('Sync failed -- %s' % errmsg) mapper.save_state('dirty') res = False except OerpSyncFailed as errmsg: log.error('Sync failed -- %s' % errmsg) mapper.save_state('dirty') res = False else: #the sync was successful #run this recursively if child mappings are found children = ModelMapper.get_children(mapping_table) for child_model, child_mapping in children.items(): #create child mapper log.debug('Mapping child model (%s)' % child_model) child_mapper = ObjMapper.objects.get_or_create( parent = mapper, content_type = mapper.content_type, object_id = mapper.object_id, oerp_model = child_model,)[0] child_mapper.sync_now = mapper.sync_now res = res and _save_for_mapper(child_mapper, child_mapping) return res