Cés*_*sar 3 python xml openerp-8 odoo
我有一个自定义模块,其中包含三个不同的金额字段:
\n\nTotal a pagar
是一个float
字段Total pendiente
并由Total pagado
函数计算这就是我的树视图的样子:
\n\n使用分组过滤器时,我想显示函数字段的总和,但只显示第一个字段:
\n\n
我尝试sum
在 XML 记录中使用参数,但这不起作用。
这是我的模块:
\n\nclass 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
找到了解决方案。关键是重写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)
归档时间: |
|
查看次数: |
8554 次 |
最近记录: |