Odoo Help


How to inherit standard report parser class in qweb reports

on 10/31/14, 4:53 AM 7,234 views

I am modifying hr_payslip report in custom module. I want to add a custom method to this report for this I need to update localcontext with custom method for this report. I am trying


class payslip_report(report_sxw.rml_parse):

    def __init__(self, cr, uid, name, context):
        super(payslip_report, self).__init__(cr, uid, name, context)

    def get_payslip_total(self, obj):
        payslip_line = self.pool.get('hr.payslip.line')
        res = []
        total = 0.0
        for id in range(len(obj)):
            if obj[id].appears_on_payslip is True:
                total = total + obj.total

        return total


and calling in qweb template like

<td><span t-esc="get_payslip_total(o.line_ids)"/> </td>


but getting error  "QWebException: "'NoneType' object is not callable" while evaluating
'get_payslip_lines(o.line_ids)". Can anyone help me what I am missing here?

Hi, I've you solved your issue?

Houssine BAKKALI
on 11/17/14, 10:39 AM


on 11/17/14, 10:41 AM

I'm also stuck with this. Just trying to reuse the parser for a new qweb report and it doesn't seems to be possible...

Houssine BAKKALI
on 11/17/14, 11:29 AM

I also got stuck and had to pause the task , if you get solution please post the answer it will help me and others. I have to start that task again in 3-4 days.

on 11/17/14, 11:48 AM

i've maybe go a solution for my case... and I think that for your case you will need to override payslip_report instead of report_sxw.rml_parse with something like : class payslip_report(payslip_report): and importing previously the payslip_report with someting like import addons.hr_payroll.report.report_payslip hope this help

Houssine BAKKALI
on 11/17/14, 12:02 PM

try this, https://www.odoo.com/forum/help-1/question/how-output-a-odoo-8-datetime-field-without-time-on-a-qweb-report-67948#answer-67995

Sajin Aziz
on 11/18/14, 12:27 AM

Did you solve this post? I have the same.

Pascal Tremblay
on 1/23/15, 7:16 AM



| 4 4 6
Hyderabad, India

On 9/4/15, 1:39 AM


In order to inherit your"payslip_report" class, just inherit your previous class, using python inheritance.....as:

from openerp.addons.[your_mocule_name].[directory_structue/parent_folder] import payslip_report

and then redefine the class,

class payslip_report(payslip_report.payslip_report):

# here you can override or add previous/new functions.......

Don't forget to keep your [your_module_name] dependency in __openerp__.py

Hope it helps you and i am posting this post after so much long time, since i got it now and it may help you or someone else :)




| 5 3 6
Jakarta, Indonesia
On 10/31/14, 8:41 AM

You should be inheriting from the payslip_report class in hr_payroll/report/report_payslip.py.  First, before the class definition you should put: from hr_payroll.report import report_payslip.  Then the class definition should be class payslip_report(report_payslip.payslip_report).  This way, you chain your inheritance (this is python inheritance, not Odoo ORM inheritance) through the class that provides the get_payslip_lines method.

Also don't forget to re-register your report with the new parser.  At the end of the py file, add the following line: report_sxw.report_sxw('report.payslip', 'hr.payslip', 'hr_payroll/report/report_payslip.rml', parser=payslip_report) adjust the information as necessary.

Thanks for your reply. I haven't gave a try yet all seems okay to me except registry of new parser. it is qweb report so no .rml.

on 10/31/14, 8:48 AM
Vinicio Llumiquinga
On 6/7/17, 5:49 PM

Hi friends:

I solved it in the following way:

I wanted to increase a column in trial balance, this column show before account balance to period or date chosen by the user in the wizard of trial balance.

First Inherit template of tria balance:

<template id="report_trialbalance_saldo_anterior" inherit_id="account.report_trialbalance">
            <xpath expr="//table[@class='table table-condensed']" position="replace">
                <table class="table table-condensed">
                            <th>Saldo Anterior</th>
                            <th class="text-right">Debit</th>
                            <th class="text-right">Credit</th>
                            <th class="text-right">Balance</th>
                        <tr t-foreach="lines_comprobacion(data['form'])" t-as="childrenaccount">
                            <t t-if="childrenaccount['type'] == 'view'">
                                <t t-set="style" t-value="'font-weight:bold;'"/>
                            <t t-if="childrenaccount['type'] != 'view'">
                                <t t-set="style" t-value="'font-weight:normal;'"/>
                                <span t-att-style="style" t-esc="childrenaccount['code']"/>                                   
                                <span style="color: white;" t-esc="'.' * (childrenaccount['level'] - 1)"/>
                                <span t-att-style="style" t-esc="childrenaccount['name']"/>
                            <td class="text-right">
                                 <span t-att-style="style" t-esc="childrenaccount['sal_ant']" />
                            <td class="text-right">
                                 <span t-att-style="style" t-esc="childrenaccount['debit']"/>
                            <td class="text-right">
                                <span t-att-style="style" t-esc="childrenaccount['credit']"/>
                            <td class="text-right">
                                <span t-att-style="style" t-esc="formatLang(childrenaccount['balance'], currency_obj=res_company.currency_id)"/>


And the .py in my module is:

import time

from openerp.osv import osv from openerp.report import report_sxw from openerp.addons.account.report.common_report_header import common_report_header from openerp.addons.account.report.account_balance import account_balance from datetime import datetime, timedelta

class account_balance_comprobacion(report_sxw.rml_parse, common_report_header):

    def __init__(self, cr, uid, name, context=None):
        super(account_balance_comprobacion, self).__init__(cr, uid, name, context=context)
        self.sum_debit = 0.00
        self.sum_credit = 0.00
        self.date_lst = []
        self.date_lst_string = ''
        self.result_acc = []
            'time': time,
            'lines_comprobacion': self.lines_comprobacion,
            'sum_debit': self._sum_debit,
            'sum_credit': self._sum_credit,
            'get_filter': self._get_filter,
            'get_start_period': self.get_start_period,
            'get_end_period': self.get_end_period ,
            'get_account': self._get_account,
            'get_journal': self._get_journal,
            'get_target_move': self._get_target_move,
        self.context = context

    def lines_comprobacion(self, form, ids=None, done=None):


class report_trialbalance_comprobacion(osv.AbstractModel):  
    _name = 'report.account.report_trialbalance'
    _inherit = 'report.abstract_report'
    _template = 'account.report_trialbalance'
    _wrapped_report_class = account_balance_comprobacion

That was all i hope it helps



Axel Mendoza

--Axel Mendoza--
| 7 8 8
Camaguey, Cuba
--Axel Mendoza--

DevOps - Full stack - Software Architect - Developer - Technology Integrator

I could help you to develop anything and solve complex problems based on technologies, integrations and tricky stuffs mostly in Python with OpenERP/Odoo, Zato, Django and many others frameworks programming languages and technologies.

I offers consulting services to anyone with an unanswered questions or needs for customizations. Think about it, maybe it's better to have an expert to solve your issues and projects than having a full-time employee trying to understand what to do and how

Reach me at aekroft@gmail.com

Axel Mendoza
On 10/15/15, 5:54 AM

I write a more extensive explanation of qweb report parsers at:


About This Community

This platform is for beginners and experts willing to share their Odoo knowledge. It's not a forum to discuss ideas, but a knowledge base of questions and their answers.


Odoo Training Center

Access to our E-learning platform and experience all Odoo Apps through learning videos, exercises and Quizz.

Test it now

Question tools

6 follower(s)


Asked: 10/31/14, 4:53 AM
Seen: 7234 times
Last updated: 6/7/17, 5:49 PM