我有一个服务器操作,它应该提取所选记录的数据,以向api发出post请求。这是我的服务器操作
<record model="ir.actions.server" id="action_hr_payroll_execute_payroll">
<field name="name">Execute Payment</field>
<field name="model_id" ref="hr_payroll.model_hr_payslip"/>
<field name="binding_model_id" ref="hr_payroll.model_hr_payslip"/>
<field name="binding_view_types">list</field>
<field name="state">code</field>
<field name="code">
records.check_pay_execute()
</field>
</record>
这是被称为的check_pay_execute函数
def check_pay_execute(self):
cheker = 0
for rec in self:
if rec.state != 'done':
raise Warning(_('You cannot process a draft payslip '
'for payment'))
if rec.pay_status != 'approved':
raise Warning(_('You cannot execute payslip not approved '
'for payment'))
else:
continue
return self.execute_payment()
这就是被称为的execute_payment函数
def execute_payment(self):
self.ensure_one
print("Execute Payment")
pay_acquirer = self.env['payment.acquirer'].
search([('provider', '=', 'rave')], limit=1)
_logger.info('Flutter secret key: %s', pay_acquirer.rave_secret_key)
print("Checking details")
_logger.info("Getting name %s", self.employee_id.name)
_logger.info("Getting account number %s", self.employee_id.bank_account_id.acc_number)
_logger.info("Getting account code %s", self.employee_id.bank_account_id.bic)
emp_name = self.employee_id.name
acc_num = self.employee_id.bank_account_id.acc_number
acc_bank = self.employee_id.bank_account_id.bank_id.bic
_logger.info("Getting data %s", emp_name)
data = {
"account_bank": acc_bank,
"account_number": acc_num,
"amount": self.net_wage,
"seckey": pay_acquirer.rave_secret_key,
"narration": "New transfer",
"currency": self.currency_id.name,
# "reference": ,
"beneficiary_name": emp_name
}
## Make transfer to Employee bank details
api_url = "https://%s/v2/gpx/transfers/create" %
(pay_acquirer._get_rave_api_url())
_logger.info('API URL: %s', api_url)
headers = {
'Content-Type': 'application/json',
# 'Authorization': 'Bearer %s' % (pay_acquirer.rave_secret_key)
}
_logger.info('Posting to API: n%s', data)
r = requests.post(api_url, headers=headers, data=json.dumps(data))
tree = json.loads(r.text)
_logger.info("tree: n%s", tree)
self.write({'pay_status': 'submitted'})
if tree['status'] == "error":
raise UserError(_(tree['message']))
print("Payment submitted")
return self._rave_validate_tree(tree)
当我执行";执行支付";操作我得到这个错误:
Checking details
> /home/akoh/isodir/odoo/odoo/tools/safe_eval.py(346)safe_eval()
-> raise ValueError('%s: "%s" while evaluatingn%r' % (ustr(type(e)), ustr(e), expr))
这表明错误在"0"之后开始;检查细节";logger,它似乎没有正确地从自己那里获得记录。我真的不知道该做什么,也不知道该怎么做。
您的代码中有一些奇怪的东西。
- ensure_one是一种方法。您必须在末尾添加((->(可能是错误(
- action.server在列表视图中(意味着你可以处理多条记录(,在第一个函数中,你在self上循环(直到它是逻辑的(,但当你调用下一个方法
execute_payment
时,你用self来做,但方法execute_payment
的第一行是ensure_one,这毫无意义 - cheker从未使用过(我认为它是"checker"(
- 你的
else: continue
没有意义。你已经到了循环的尽头
和仅供参考的
- requests.post有一个参数
json
将自动编码您的dict
更复杂的POST请求
- 您可以简单地使用
r.json()
来获取响应数据
JSON响应内容