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

2024-04-28 20:21:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个服务器操作,它应该获取所选记录的数据,以向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\u pay\u 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 evaluating\n%r' % (ustr(type(e)), ustr(e), expr))

这表明错误在“检查详细信息”记录器之后开始,它似乎没有从self正确获取记录。我真的不知道该怎么做,也不知道该怎么做


Tags: nameselfinfoidtreefieldexecuteemployee
1条回答
网友
1楼 · 发布于 2024-04-28 20:21:05

代码中有一些奇怪的东西

  1. 确保_one是一种方法。必须在末尾添加()-&燃气轮机;(可能是错误)
  2. 您的action.server位于列表视图中(意味着您可以处理多条记录),在第一个函数中,您在self上循环(直到这里它是逻辑的),但是当您调用下一个方法execute_payment时,您使用self进行操作,但方法execute_payment的第一行是sure\u one,这没有意义
  3. 切克从未使用过(我认为它是“棋盘格”)
  4. 你的else: continue毫无意义。你已经到了你的循环的终点了

及供参考

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

More complicated POST requests

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

JSON Response Content

相关问题 更多 >