【问题标题】:Odoo 14, issue when trying to computing bank balance in treasury moduleOdoo 14,尝试计算国库模块中的银行余额时出现问题
【发布时间】:2022-11-14 11:10:04
【问题描述】:

我在计算时得到了修复错误的工作,但我仍然不知道如何修复它,因为我还是新手

Odoo 服务器错误

Traceback(最近一次调用最后一次):文件 “/home/equipAccounting/equip/odoo/addons/base/models/ir_http.py”,行 第237章 结果 = request.dispatch() 文件“/home/equipAccounting/equip/odoo/http.py”,第 683 行,在调度中 结果 = self._call_function(**self.params) 文件“/home/equipAccounting/equip/odoo/http.py”,第 359 行,在 _call_function 返回 checked_call(self.db, args, *kwargs) 文件“/home/equipAccounting/equip/odoo/service/model.py”,第 94 行,在 包装 return f(dbname, args, *kwargs) File "/home/equipAccounting/equip/odoo/http.py", line 347, in checked_call 结果 = self.endpoint(*a, **kw) 文件“/home/equipAccounting/equip/odoo/http.py”,第 912 行,调用中 return self.method(*args, **kw) 文件“/home/equipAccounting/equip/odoo/http.py”,第 531 行,在 response_wrap 响应 = f(*args, **kw) 文件“/home/equipAccounting/equip/addons/basic/web/controllers/main.py”, 第 1393 行,在 call_button 中 action = self._call_kw(model, method, args, kwargs) 文件 "/home/equipAccounting/equip/addons/basic/web/controllers/main.py", 第 1381 行,在 _call_kw return call_kw(request.env[model], method, args, kwargs) File "/home/equipAccounting/equip/odoo/api.py", line 396, in call_kw 结果 = _call_kw_multi(method, model, args, kwargs) 文件“/home/equipAccounting/equip/odoo/api.py”,第 383 行,在 _call_kw_multi 结果=方法(recs,args,*kwargs)文件“/home/equipAccounting/equip/addons/core/treasury_forecast/models/treasury_bank_forecast.py”, 第 290 行,在 compute_bank_balances 中 self.env.cr.execute(main_query) 文件“/usr/local/lib/python3.8/dist-packages/decorator.py”,第 232 行,在 乐趣 return caller(func, (extras + args), *kw) 文件“/home/equipAccounting/equip/odoo/sql_db.py”,第 101 行,检查中 返回 f(self, args, *kwargs) 文件“/home/equipAccounting/equip/odoo/sql_db.py”,第 298 行,在执行中 res = self._obj.execute(query, params) 异常

上述异常是以下异常的直接原因:

Traceback(最近一次通话最后一次):文件 “/home/equipAccounting/equip/odoo/http.py”,第 639 行,在 _handle_exception 返回 super(JsonRequest, self)._handle_exception(exception) 文件“/home/equipAccounting/equip/odoo/http.py”,第 315 行,在 _handle_exception 从 new_cause psycopg2.errors.SyntaxError 引发 exception.with_traceback(None):在“)”第 9 行或附近出现语法错误:
在哪里 abs.journal_id ()

这是代码:

def get_bank_fc_query(self, fc_journal_list, date_start, date_end,company_domain):
    query = """                
            UNION
            SELECT CAST('FBK' AS text) AS type, absl.id AS ID, am.date,                    absl.payment_ref as name, am.company_id, absl.amount_main_currency                    as amount, absl.cf_forecast, abs.journal_id, NULL as kind                FROM account_bank_statement_line absl                
            LEFT JOIN account_move am ON (absl.move_id = am.id)                
            LEFT JOIN account_bank_statement abs ON (absl.statement_id = abs.id)
            WHERE abs.journal_id IN {}                    
            AND am.date BETWEEN '{}' AND '{}'                    
            AND am.company_id in {}            """
            .format(str(fc_journal_list), date_start, date_end,company_domain)
            return query

def get_acc_move_query(self, date_start, date_end, company_domain):
    query = """            
            UNION
            SELECT CAST('FPL' AS text) AS type, aml.id AS ID,aml.treasury_date AS date, am.name AS name, aml.company_id,                aml.amount_residual AS amount, NULL AS cf_forecast,                
            NULL AS journal_id, am.move_type as kind            
            FROM account_move_line aml            
            LEFT JOIN account_move am ON (aml.move_id = am.id)            
            WHERE am.state NOT IN ('draft')                
            AND aml.treasury_planning AND aml.amount_residual != 0                
            AND aml.treasury_date BETWEEN '{}' AND '{}'                
            AND aml.company_id in {}        """
            .format(date_start, date_end, company_domain)
            return query

提前致谢

【问题讨论】:

标签: python postgresql odoo odoo-14


【解决方案1】:

Odoo 有一个非常强大的 ORM API 来执行 psql 查询。您是否有充分的理由使用 sql 代替?

您需要的功能是,Read 用于选择您使用的字段,search 和filtered 用于过滤结果。

我建议阅读以下教程。 https://www.odoo.com/documentation/14.0/developer/reference/addons/orm.html#search-read

也看看odoo源码里面的好例子,我认为stock模块是一个看一些例子的好地方。 https://github.com/odoo/odoo/blob/14.0/addons/stock/models/stock_move.py

【讨论】:

    【解决方案2】:

    该错误与 Odoo 无关。

    psycopg2.errors.SyntaxError:“)”第 9 行或附近的语法错误: WHERE abs.journal_id 在 ()

    很明显,查询本身存在语法错误。您使用 IN 运算符,之后没有值列表。

    您的 fc_journal_list 参数在您的调用中没有值。您应该在创建查询之前捕获一个空列表。

    然后您的代码中至少存在 2 个大的安全风险:

    1. 永远不要对查询使用字符串格式,您问题下的评论已经指向variables in SQL queries,这是使 SQL 注入变得容易的常见错误......

    2. 不要将这种有安全风险的方法(这里是两个查询返回方法)公开给 odoo 外部 API。只需在方法名称的开头添加一个_ 就可以了。

    【讨论】:

      猜你喜欢
      • 2021-07-05
      • 2021-04-13
      • 1970-01-01
      • 2019-06-18
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多