在树视图中使用“分组依据”时如何对其他列求和?

Cés*_*sar 3 python xml openerp-8 odoo

我有一个自定义模块,其中包含三个不同的金额字段:

\n\n
    \n
  • Total a pagar是一个float字段
  • \n
  • Total pendiente并由Total pagado函数计算
  • \n
\n\n

这就是我的树视图的样子:

\n\n

在此输入图像描述

\n\n


\n\n

使用分组过滤器时,我想显示函数字段的总和,但只显示第一个字段:

\n\n

在此输入图像描述

\n\n


\n\n

我尝试sum在 XML 记录中使用参数,但这不起作用。

\n\n

这是我的模块:

\n\n
class res_partner_current_account(osv.osv):\n    def _amount_pending_wrapper(self, cr, uid, ids, field_name, arg, context=None):\n        """\n        Wrapper because of direct method passing as parameter for function fields\n        """\n        return self._amount_pending(cr, uid, ids, field_name, arg, context=context)\n\n    def _amount_pending(self, cr, uid, ids, field_name, arg, context=None):\n        cur_obj = self.pool.get(\'res.currency\')\n        res = {}\n        for current_account in self.browse(cr, uid, ids, context=context):\n            res[current_account.id] = {\n                \'amount_pending\': 0.0,\n                \'amount_payed\': 0.0,\n            }\n            cur = current_account.currency_id\n            payed = 0.0\n            for line in current_account.pay_line:\n                payed += line.amount\n            pending = current_account.amount_total - payed\n            res[current_account.id][\'amount_pending\'] = cur_obj.round(cr, uid, cur, pending)\n            res[current_account.id][\'amount_payed\'] = cur_obj.round(cr, uid, cur, payed)\n        return res\n\n    _name = \'res.partner.current.account\'\n    _columns = {\n        \'name\': fields.char(\'Concepto\'),\n        \'order_id\': fields.many2one(\'sale.order\', \'Presupuesto\', select=True, required=True, ondelete=\'cascade\'),\n        \'general_account_id\': fields.many2one(\'res.partner.general.account\', \'Cuenta general\', select=True, required=True, ondelete=\'cascade\'),\n        \'currency_id\': fields.many2one(\'res.currency\', \'Moneda\', required=True),\n        \'amount_total\': fields.float(\'Total a pagar\', help=\'El total de la deuda\'),\n        \'amount_pending\': fields.function(_amount_pending_wrapper, digits_compute=dp.get_precision(\'Account\'), string=\'Total pendiente\', multi=\'sums\', help=\'El importe pendiente por pagar\'),\n        \'amount_payed\': fields.function(_amount_pending_wrapper, digits_compute=dp.get_precision(\'Account\'),  string=\'Total pagado\', multi=\'sums\', help=\'El importe acumulado de pagos\'),\n        \'pay_line\': fields.one2many(\'res.partner.current.account.line\', \'current_account_id\', \'L\xc3\xadneas de pago\',),\n        \'partner_id\': fields.related(\'general_account_id\', \'partner_id\', type=\'many2one\', relation=\'res.partner\', string=\'Contratista\', readonly=True, store=True),\n        \'account_analytic_id\': fields.related(\'general_account_id\', \'account_analytic_id\', type=\'many2one\', relation=\'account.analytic.account\', string=\'Proyecto\', readonly=True, store=True),\n    }\n    _defaults = {\n        \'amount_total\': 0.0,\n    }\n    _rec_name = \'name\'\n    _order = \'create_date desc\'\n\n    def create_pay(self, cr, uid, ids, context=None):\n        return {\n            \'name\': \'Pagos\',\n            \'view_type\': \'form\',\n            \'view_mode\': \'form\',\n            \'res_model\': \'res.partner.current.account\',\n            \'view_id\': False,\n            \'res_id\': ids[0],\n            \'type\': \'ir.actions.act_window\',\n        }\n
Run Code Online (Sandbox Code Playgroud)\n

Cés*_*sar 5

找到了解决方案。关键是重写read_group类的方法:

class your_class(osv.osv):
    # ...        

    def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None, orderby=False, lazy=True):
        res = super(your_class, self).read_group(cr, uid, domain, fields, groupby, offset, limit=limit, context=context, orderby=orderby, lazy=lazy)
        if 'amount_pending' in fields:
            for line in res:
                if '__domain' in line:
                    lines = self.search(cr, uid, line['__domain'], context=context)
                    pending_value = 0.0
                    for current_account in self.browse(cr, uid, lines, context=context):
                        pending_value += current_account.amount_pending
                    line['amount_pending'] = pending_value
        if 'amount_payed' in fields:
            for line in res:
                if '__domain' in line:
                    lines = self.search(cr, uid, line['__domain'], context=context)
                    payed_value = 0.0
                    for current_account in self.browse(cr, uid, lines, context=context):
                        payed_value += current_account.amount_payed
                    line['amount_payed'] = payed_value
        return res
Run Code Online (Sandbox Code Playgroud)


例如,如果您想删除分组依据中某一列的总和,您可以执行以下操作:

class your_class(osv.osv):
    # ...     

    def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None, orderby=False, lazy=True):
        if 'column' in fields:
            fields.remove('column')
        return super(your_class, self).read_group(cr, uid, domain, fields, groupby, offset, limit=limit, context=context, orderby=orderby, lazy=lazy):
Run Code Online (Sandbox Code Playgroud)