Odoo - page number in qweb reports - odoo

I am working with qweb reports in odoo 10 . Here is what i did
<odoo>
<template id="report_customer">
<t t-call="report.html_container">
<t t-set="data_report_margin_top" t-value="50"/>
<t t-foreach="range(5)" t-as="1">
<t t-foreach="docs" t-as="o">
<t t-call="report.internal_layout">
<div class="page example-css-class">
<h2>Report title</h2>
<p>This object's name is
<span t-field="o.full_name"/>
</p>
<ul class="list-inline">
<li>Page:</li>
<li><span class="page"/></li>
<li>/</li>
<li><span class="topage"/></li>
</ul>
</div>
</t>
</t>
</t>
</t>
</template>
</odoo>
and i also tried this
<odoo>
<template id="report_customer">
<t t-call="report.html_container">
<t t-set="data_report_margin_top" t-value="50"/>
<t t-foreach="range(5)" t-as="1">
<t t-foreach="docs" t-as="o">
<t t-call="report.internal_layout">
<div class="page example-css-class">
<h2>Report title</h2>
<p>This object's name is
<span t-field="o.full_name"/>
</p>
<div class="footer" style="text-align: center !important;">
Page <span class="page"/> of <span class="topage"/>
</div>
</div>
</t>
</t>
</t>
</t>
</template>
</odoo>
but in both cases i am not able to see page numbers. I also tried adding custom header and footer in separate templates but that also doesn't work.

Try this :
<div class="footer">
<div class="row">
<center><span>Page </span><span class="page" /> of <span class="topage" /></center>
</div>
</div>
It works perfectly for me.
Note : I have used without calling report.external_layout

Please try this code for page number in Qweb-report. It will automatically display page no.
<t t-call="report.external_layout"></t>

Related

Call template odoo

I create template in module labs.
<template id="worbook_employee_miss_message">
<t t-if="time_research">
<div>
<span style="color: red">test</span>
</div>
</t>
</template>
I call it in formview
<t t-call="labs.worbook_employee_miss_message">
<t t-set="time_research" t-value="time_research"/>
</t>
But there is no block div on form. time_research field is not empty.
I tried your code and it's ok. Be sure to call the template inside a
<div class="page">
</div>

Odoo 12 report sample

I am trying to make a report but without using external_layout or internal_layout because they have headers in them. I wanted to have my own header and footer.
I have tried using minimal_layout because it seems it is the less busy layout compared to other layouts.
But I kept having error body_parent = root.xpath('//main')[0] IndexError: list index out of range - - -
Here is my code
<template id="applicant_contract_css">
<t t-call="web._assets_helpers"/>
<link rel="stylesheet" type="text/scss" href="/fhid_recruitment/static/src/css/applicant-contract.css"/>
</template>
<template id="minimal_layout" inherit_id="web.minimal_layout">
<xpath expr="//head" position="inside">
<t t-call-assets="fhid_recruitment.applicant_contract_css"/>
</xpath>
</template>
<template id="applicant_contract_offering">
<t t-call="web.minimal_layout">
<t t-foreach="docs" t-as="o">
<div class="header">
My Header
</div>
<div class="article">
Content
</div>
<div class="footer">
My footer
</div>
</t>
</t>
</template>
How do I use minimal layout? or is there another layout should I use?
When you want create a template report you need to at least call, "web.html_container" witch call "web.report_layout" witch define Minal Report layout .
all css file for report template should be add to report_assets_common template:
<template id="assets_common" name="a proper name for your template purpuse" inherit_id="web.report_assets_common">
<xpath expr="." position="inside">
<link rel="stylesheet" type="text/scss" href="/fhid_recruitment/static/src/css/applicant-contract.css"/>
</xpath>
</template>
It's better to extract your header and footer to template so you use them in multiple report, like the external_layout, you can take a look at the external_layout_standard to get the basic Idea.
<template id="external_layout">
<div class="header">
My Header
</div>
<!-- everything inside t-call="fhid_recruitment.external_layout" will be rendered here -->
<t t-raw="0" />
<div class="footer">
My footer
</div>
</template>
In the template just call your custom external layout here:
<template id="applicant_contract_offering">
<t t-call="web.html_container">
<!-- because it's defined in this module "fhid_recruitment" -->
<t t-call="fhid_recruitment.external_layout">
<t t-foreach="docs" t-as="o">
<div call="page">
<div class="article">
Content
</div>
</div>
</t>
</t>
</t>
</template>
One of the most import thing you need to know about template is the <t t-raw="0" />, if for example a template x_template have this when we call it like this:
<t t-call="x_template">
any_content
</t>
what the Qweb engine will do is, replace <t t-raw="0" /> inside the x_template with any_content when rendering the report.
To simplify things if you are going to use header and footer only for one template:
<template id="applicant_contract_offering">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="o">
<div class="header">
My Header
</div>
<div class="article">
Content
</div>
<div class="footer">
My footer
</div>
</t>
</t>
</template>
You can inherit either external_layout or internal_layout and override the default behaviour with your custom code. And use it in your report.

Barcode not showing up

<template id="report_label">
<t t-call="report.html_container">
<t t-foreach="docs" t-as="o">
<div class="page">
<div class="row">
<div class="example_class">
<t t-esc="o.name" />
<t t-esc="o.type" />
<p>Size: <span t-esc="o.calculate_size()"/></p>
<p>Color: <span t-esc ="o.calculate_color()" /></p>
<p>Price: </p>
<tr><td colspan="2"><img t-att-src="'/report/barcode/Code128/%s' % 'test-0001'" style="width:100%;height:25px"/> </td></tr>
</div>
</div>
</div>
</t>
</t>
</template>
this is my template and for some reason, barcode is not showing up.
if I test in http://localhost:8069/report/barcode/Code128/test-0001 then it returns me a barcode.
and reportlab is also installed.
same result but smaller borders with
<img t-if="o.barcode" t-att-src="'/report/barcode/?type=%s&value=%s&width=%s&height=%s' %('Code128',o.barcode,250,50)"/>
is Settings > System Parameters need to change
Key report.url
Value http://0.0.0.0:8069

How to hide "Automatic reconciliation" button from Qweb in Odoo10?

Go to Accounting => Accounting Dashboard => click on Reconcile button
We get below Qweb view.
In that Qweb view, How can we hide "Automatic reconciliation" button ?
I have tried following but didn't work:
<templates xml:space="preserve">
<!-- 1st try -->
<t t-name="automatic_reconciliation_1st" t-extend="reconciliation">
<t t-jquery=".btn" t-operation="replace"></t>
</t>
<!-- 2nd try -->
<t t-name="automatic_reconciliation_2nd" t-extend="reconciliation">
<t t-jquery=".js_automatic_reconciliation" t-operation="replace"></t>
</t>
<!-- 3rd try -->
<t t-name="automatic_reconciliation_3rd" t-extend="reconciliation">
<t t-jquery=".oe_form_sheet oe_form_sheet_width o_form_sheet" t-operation="replace">
<div class="oe_form_sheet oe_form_sheet_width o_form_sheet">
<h1><t t-esc="title"/></h1>
<div t-if="! hide_progress" class="progress progress-striped">
<div class="progress-text"><span class="valuenow">0</span> / <span class="valuemax"><t t-esc="total_lines"/></span></div>
<div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" t-att-aria-valuemax="total_lines" style="width: 0%;">
</div>
</div>
<div class="oe_clear o_clear"></div>
<div class="notification_area"></div>
<div class="interface_options oe_form o_form"></div>
<div class="reconciliation_lines_container"></div>
<div class="show_more_container"><button class="show_more btn btn-default btn-sm">Show more... (<span class="num_items_remaining"></span> remaining)</button></div>
<p class="o_protip text-muted" align="right">Tip: Hit CTRL-Enter to reconcile all the balanced items in the sheet.</p>
</div>
</t>
</t>
</templates>
Try this .
<t t-name="account.reconciliation">
<div class="o_form_view"><div class="oe_form_sheetbg o_form_sheet_bg"><div class="oe_form_sheet oe_form_sheet_width o_form_sheet">
<h1><t t-esc="title"/></h1>
<div t-if="! hide_progress" class="progress progress-striped">
<div class="progress-text"><span class="valuenow">0</span> / <span class="valuemax"><t t-esc="total_lines"/></span></div>
<div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" t-att-aria-valuemax="total_lines" style="width: 0%;">
</div>
</div>
<div class="oe_clear clearer"></div>
<div class="notification_area"></div>
<div class="interface_options oe_form o_form"></div>
<div class="reconciliation_lines_container"></div>
<div class="show_more_container"><button class="show_more btn btn-default btn-sm">Show more... (<span class="num_items_remaining"></span> remaining)</button></div>
<p class="o_protip text-muted" align="right">Tip: Hit CTRL-Enter to reconcile all the balanced items in the sheet.</p>
</div></div></div>
</t>
Alternative solution:
.js_automatic_reconciliation { display:none; }

Inherit sale order report in odoo 10

I have tried to add a new page beginning of sale order report by inherit and xpath. But it not work.
Here is the code:
<template id="report_saleorder_inherit" inherit_id="sale.report_saleorder">
<xpath expr="//t[#t-call='report.html_container']" position="before">
<t t-call="report.html_container">
<t t-call="report.external_layout">
<div class="page">
<h1>New Page</h1>
</div>
</t>
</t>
</xpath>
But i edited in core module Sale like below and it works.
<template id="report_saleorder">
<t t-call="report.html_container">
<t t-call="report.external_layout">
<div class="page">
<h1>New Page</h1>
</div>
</t>
</t>
<t t-call="report.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="sale.report_saleorder_document" t-
lang="doc.partner_id.lang"/>
</t>
</t>
</template>
How can i achieve this in my custom module?
Add dependency of "sale" module in your module and try below code
<template id="report_saleorder_inherit" inherit_id="sale.report_saleorder">
<xpath expr="t" position="before">
<t t-call="report.html_container">
<t t-call="report.external_layout">
<div class="page">
<h1>New Page</h1>
</div>
</t>
</t>
</xpath>
</template>