如何在odoo中为更新多个记录编写服务器操作代码



我有一个服务器操作,它应该提取所选记录的数据,以向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,它似乎没有正确地从自己那里获得记录。我真的不知道该做什么,也不知道该怎么做。

您的代码中有一些奇怪的东西。

  1. ensure_one是一种方法。您必须在末尾添加((->(可能是错误(
  2. action.server在列表视图中(意味着你可以处理多条记录(,在第一个函数中,你在self上循环(直到它是逻辑的(,但当你调用下一个方法execute_payment时,你用self来做,但方法execute_payment的第一行是ensure_one,这毫无意义
  3. cheker从未使用过(我认为它是"checker"(
  4. 你的else: continue没有意义。你已经到了循环的尽头

和仅供参考的

  • requests.post有一个参数json将自动编码您的dict

更复杂的POST请求

  • 您可以简单地使用r.json()来获取响应数据

JSON响应内容

最新更新