我正在努力創建一種遞回方法來在 Odoo 中自動創建記錄。我請求 SOAP 服務的 WSDL 并對其進行處理,直到收到以下字串:
{'notificaCertificadoRevocado':{
'input': {
'SolicitudNotificaRevocado':{
'optional': False,
'type': {
'certificado': {
'optional': False,
'type': 'String(value)'
},
'codigoAmbiente': {
'optional': False,
'type': 'Int(value)'
}
}
}
}
}
}
這本詞典有 1 個父引數“SolicitudNotificaRevocado”和 2 個子引數“certificado”和“codigoAmbiente”。
目前我的python方法如下所示:
def _prepare_parameter_list(self, parameter_dict, recursive_data=False):
building_data = recursive_data if recursive_data else {}
parameter_list = []
for key, value in parameter_dict.items():
if key != 'optional' and key != 'type':
# Create parameters
parameter_name_dict = {
'name': key,
'description': ' '.join(word.capitalize() for word in camel_case_split(key)),
}
characterization_dict = self._prepare_parameter_list(value)
built_parameter_dict = {**parameter_name_dict, **characterization_dict}
parameter_list.append((0, 0, built_parameter_dict))
# TODO: Here the code stops
return parameter_list
else:
if key == 'optional':
building_data = {**building_data, **{'optional': value}}
if key == 'type':
if isinstance(value, dict):
building_data = {**building_data, **{'parameter_ids': self._prepare_parameter_list(value)}}
else:
building_data = {**building_data, **{'type': value.split('(')[0]}}
return building_data
這在只有一個問題時效果很好,回傳的資料具有以下形式:
[(0, 0, {
'name': 'SolicitudOperacionesCuis',
'description': 'Solicitud Operaciones Cuis',
'optional': False,
'parameter_ids': [
(0, 0, {
'name': 'codigoAmbiente',
'description': 'Codigo Ambiente',
'optional': False,
'type': 'Int'})]
})
]
問題是處理子引數之一后的方法由于“回傳引數串列”部分而停止。(我什至在問題部分添加了 TODO 注釋)我想檢索以下資料:
[(0, 0, {
'name': 'SolicitudOperacionesCuis',
'description': 'Solicitud Operaciones Cuis',
'optional': False,
'parameter_ids': [
(0, 0, {
'name': 'certificado',
'description': 'Certificado',
'optional': False,
'type': 'String'})]
}),
(0, 0, {
'name': 'codigoAmbiente',
'description': 'Codigo Ambiente',
'optional': False,
'type': 'Int'})]
})
]
我應該如何調整我的方法來實作這一目標?使用遞回方法很難!
uj5u.com熱心網友回復:
最后,我采用了不同的方法徹底重構了該方法。因為我之前的代碼有一個額外的問題。如果檢查以前所需的輸出:
[(0, 0, {
'name': 'SolicitudOperacionesCuis',
'description': 'Solicitud Operaciones Cuis',
'optional': False,
'parameter_ids': [
(0, 0, {
'name': 'certificado',
'description': 'Certificado',
'optional': False,
'type': 'String'})]
}),
(0, 0, {
'name': 'codigoAmbiente',
'description': 'Codigo Ambiente',
'optional': False,
'type': 'Int'})]
})
]
Odoo 無法識別嵌套的 One2many 記錄創建。無論如何,由于我無法使以前的代碼作業,我開始單獨創建記錄:
def _create_parameters(self, process_object, parameter_id=False, parent_parameter_id=False):
for key, value in process_object.items():
if key != 'optional' and key != 'type':
try:
soap_parameter = self.env['soap.parameter'].search([
'&', '&', '&', '&',
['active', '=', True],
['name', '=', key],
['description', '=', ' '.join(word.capitalize() for word in camel_case_split(key))],
['method_id', '=', self.id],
['parent_id', '=', parent_parameter_id]
], limit=1)[0]
except IndexError:
# Create parameters
soap_parameter = self.env['soap.parameter'].create({
'name': key,
'description': ' '.join(word.capitalize() for word in camel_case_split(key)),
'method_id': self.id,
'parent_id': parent_parameter_id
})
self._create_parameters(value, soap_parameter, soap_parameter.id)
if parameter_id:
if key == 'optional':
parameter_id.write({'optional': value})
if key == 'type':
if isinstance(value, dict):
self._create_parameters(value, parent_parameter_id=parent_parameter_id)
else:
value_type = value.split('(')[0]
if value_type == 'Int':
value_type = 'int'
elif value_type == 'String':
value_type = 'str'
elif value_type == 'Long':
value_type = 'float'
parameter_id.write({'type': value_type})
此代碼將搜索和更新或創建我的引數。
uj5u.com熱心網友回復:
如果輸入資料已知并且有用資料似乎是輸入字典中的資料,則不需要遞回元素。更新了下面的類似功能,輸出您的預期輸出
def _prepare_parameter_list(parameter_dict):
def _return_data_type(value_type):
if value_type == 'Int':
value_type = 'int'
elif value_type == 'String':
value_type = 'str'
elif value_type == 'Long':
value_type = 'float'
return value_type
parent = parameter_dict.get('notificaCertificadoRevocado')
building_data = []
if parent and parent.get('input'):
for key, value in parent['input']:
vals = {
'name': key,
'description': ' '.join(word.capitalize() for word in camel_case_split(key)),
'optional': value.get('optional'),
}
parameter_ids = []
if value.get('type'):
for par_key, par_value in value['type']:
pams = {
'name': par_key,
'description': par_key.capitalize(),
'optional': par_value.get('optional'),
'type': par_value.get('type') and _return_data_type(par_value['type'].split('(')[0]) or False,
}
parameter_ids.append((0, 0, pams))
vals.update(parameter_ids=parameter_ids)
building_data.append((0, 0, vals))
return building_data
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/356398.html
上一篇:圣誕樹的錯誤顯示
下一篇:球拍彩虹形狀遞回
