如何解决如何在odoo中编写用于更新多条记录的服务器操作
我有一个服务器操作,它应该获取所选记录的数据以向 api 发出发布请求。 这是我的服务器操作
dat <- data.frame(
stringsAsFactors = FALSE,Date = c("01-01-2020","02-01-2020","03-01-2020","04-01-2020"),ID1 = c("HL/PS/IITD/QF/227","HL/PS/IITD/QF/228","HL/PS/IITD/QF/229","HL/PS/IITD/QF/230"),Time1 = c(3.252661544,4.58741088,6.592053573,2.776812359),Conc1 = c(325.2661544,458.741088,659.2053573,277.6812359),ID2 = c("HL/PS/IITD/TF/500","HL/PS/IITD/TF/501","HL/PS/IITD/TF/502","HL/PS/IITD/TF/503"),Time2 = c(3.149086291,9.202242653,7.463162859,7.944689942),Conc2 = c(314.9086291,920.2242653,746.3162859,794.4689942)
)
library(tidyverse)
dat %>% separate(ID1,into = paste0('ID1_',1:5),sep = '\\/') %>%
separate(ID2,into = paste0('ID2_',sep = '\\/')
#> Date ID1_1 ID1_2 ID1_3 ID1_4 ID1_5 Time1 Conc1 ID2_1 ID2_2 ID2_3
#> 1 01-01-2020 HL PS IITD QF 227 3.252662 325.2662 HL PS IITD
#> 2 02-01-2020 HL PS IITD QF 228 4.587411 458.7411 HL PS IITD
#> 3 03-01-2020 HL PS IITD QF 229 6.592054 659.2054 HL PS IITD
#> 4 04-01-2020 HL PS IITD QF 230 2.776812 277.6812 HL PS IITD
#> ID2_4 ID2_5 Time2 Conc2
#> 1 TF 500 3.149086 314.9086
#> 2 TF 501 9.202243 920.2243
#> 3 TF 502 7.463163 746.3163
#> 4 TF 503 7.944690 794.4690
<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>
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()
当我执行“执行付款”操作时出现此错误:
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)
这表明错误在“检查详细信息”记录器之后开始,它似乎没有从 self.log 正确获取记录。我真的不知道该怎么做或如何正确地做到这一点。
解决方法
你的代码中有几个奇怪的地方。
- ensure_one 是一种方法。您必须在末尾添加 ()。 ->(可能是错误)
- 你的 action.server 在列表视图中(暗示你可以处理多个记录),在你的第一个函数中你循环 self(直到这里它是合乎逻辑的)但是当你调用下一个方法
execute_payment
你这样做使用 self,但您的方法execute_payment
的第一行是 ensure_one,这是没有意义的。 - 从未使用过 cheker(我认为它是“checker”)。
- 你的
else: continue
毫无意义。你已经到了循环的末尾。
仅供参考
- requests.post 有一个参数
json
会自动编码你的字典。
More complicated POST requests
- 您可以简单地使用
r.json()
来获取响应数据。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。