Odoo Help

Welcome!

This community 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.

0

Target all element td with xpath in qweb view

By
dark
on 10/7/15, 5:18 AM 3,158 views

Hello, 

I try to add condition in all td element of first table in report sale_order. For this i use xpath.
But, just the first td element is targeting. Why ? It's bug ? This error come to qweb ? wkhtmltopdf ? 
My code

<template id="report_so_no_print_lines" inherit_id="sale.report_saleorder_document">

	<xpath expr="//table[1]/tbody/tr/td" position="attributes">	

		<attribute name="t-if">l.product_id.product_tmpl_id.no_print_in_invoice != True</attribute>

	</xpath> 

</template>


I try with other element, other position for test and with this code : 

<xpath expr="//span" position="replace">	

<span>COUCOU</span>
</xpath>

And I've the same problem, just the first element span is replace. 
Please, can you help me ?

0
TK Fontaine
On 11/25/15, 6:48 AM

Hello dark,

I adapted your xpath's expression to "//table[1]/tbody/t/tr/td", because my template is :

template id="report_saleorder_document">
<t t-call="report.external_layout">
<t t-set="doc" t-value="doc.with_context({'lang':doc.partner_id.lang})" />
<div class="page">
<div class="oe_structure"/>
<div class="row">
<div class="col-xs-6">
<strong t-if="doc.partner_shipping_id == doc.partner_invoice_id">Invoicing and shipping address:</strong>
<strong t-if="doc.partner_shipping_id != doc.partner_invoice_id">Invoicing address:</strong>
<div t-field="doc.partner_invoice_id"
t-field-options='{"widget": "contact", "fields": ["address", "name", "phone", "fax"], "no_marker": true, "phone_icons": true}'/>
<p t-if="doc.partner_id.vat">VAT: <span t-field="doc.partner_id.vat"/></p>
<div t-if="doc.partner_shipping_id != doc.partner_invoice_id" class="mt8">
<strong>Shipping address:</strong>
<div t-field="doc.partner_shipping_id"
t-field-options='{"widget": "contact", "fields": ["address", "name", "phone", "fax"], "no_marker": true, "phone_icons": true}'/>
<p t-if="doc.partner_id.vat">VAT: <span t-field="doc.partner_id.vat"/></p>
</div>
</div>
<div class="col-xs-5 col-xs-offset-1">
<div t-field="doc.partner_id"
t-field-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": true}' />
</div>
</div>

<h2>
<span t-if="doc.state not in ['draft','sent']">Order # </span>
<span t-if="doc.state in ['draft','sent']">Quotation # </span>
<span t-field="doc.name"/>
</h2>

<div class="row mt32 mb32" id="informations">
<div t-if="doc.client_order_ref" class="col-xs-3">
<strong>Your Reference:</strong>
<p t-field="doc.client_order_ref"/>
</div>
<div t-if="doc.date_order" class="col-xs-3">
<strong t-if="doc.state not in ['draft','sent']">Date Ordered:</strong>
<strong t-if="doc.state in ['draft','sent']">Quotation Date:</strong>
<p t-field="doc.date_order"/>
</div>
<div t-if="doc.user_id.name" class="col-xs-3">
<strong>Salesperson:</strong>
<p t-field="doc.user_id"/>
</div>
<div name="payment_term" t-if="doc.payment_term_id" class="col-xs-3">
<strong>Payment Term:</strong>
<p t-field="doc.payment_term_id"/>
</div>
</div>

<!-- Is there a discount on at least one line? -->
<t t-set="display_discount" t-value="any([l.discount for l in doc.order_line])"/>

<table class="table table-condensed">
<thead>
<tr>
<th>Description</th>
<th class="text-right">Quantity</th>
<th class="text-right">Unit Price</th>
<th t-if="display_discount" class="text-right" groups="sale.group_discount_per_so_line">Disc.(%)</th>
<th class="text-right">Taxes</th>
<th class="text-right">Price</th>
</tr>
</thead>
<tbody class="sale_tbody">
<t t-foreach="doc.order_line" t-as="l">
<tr t-if="l.product_uom_qty">
<td>
<span t-field="l.name"/>
</td>
<td class="text-right">
<span t-field="l.product_uom_qty"/>
<span groups="product.group_uom" t-field="l.product_uom"/>
</td>
<td class="text-right">
<span t-field="l.price_unit"/>
</td>
<td t-if="display_discount" class="text-right" groups="sale.group_discount_per_so_line">
<span t-field="l.discount"/>
</td>
<td class="text-right">
<span t-esc="', '.join(map(lambda x: (x.description or x.name), l.tax_id))"/>
</td>
<td class="text-right">
<span t-field="l.price_subtotal"
t-field-options='{"widget": "monetary", "display_currency": "doc.pricelist_id.currency_id"}'/>
</td>
</tr>
</t>
</tbody>
</table>

<div class="row" name="total">
<div class="col-xs-4 pull-right">
<table class="table table-condensed">
<tr class="border-black">
<td><strong>Total Without Taxes</strong></td>
<td class="text-right">
<span t-field="doc.amount_untaxed"
t-field-options='{"widget": "monetary", "display_currency": "doc.pricelist_id.currency_id"}'/>
</td>
</tr>
<tr>
<td>Taxes</td>
<td class="text-right">
<span t-field="doc.amount_tax"
t-field-options='{"widget": "monetary", "display_currency": "doc.pricelist_id.currency_id"}'/>
</td>
</tr>
<tr class="border-black">
<td><strong>Total</strong></td>
<td class="text-right">
<span t-field="doc.amount_total"
t-field-options='{"widget": "monetary", "display_currency": "doc.pricelist_id.currency_id"}'/>
</td>
</tr>
</table>
</div>
</div>

<p t-field="doc.note" />
<p t-if="doc.payment_term_id.note">
<span t-field="doc.payment_term_id.note"/>
</p>
<p t-if="not doc.payment_term_id and doc.partner_id.property_payment_term_id">
<span t-field="doc.partner_id.property_payment_term_id.note"/>
</p>
<p id="fiscal_position_remark" t-if="doc.fiscal_position_id and doc.fiscal_position_id.note">
<strong>Fiscal Position Remark:</strong>
<span t-field="doc.fiscal_position_id.note"/>
</p>
<div class="oe_structure"/>
</div>
</t>
</template>

And I got the first too. But when I try on "online xpath tester", like : www.codebeautify.org/Xpath-Tester

I have what you wanted:

<td>
<span t:field="l.name"/>
</td>
<td class="text:right">
<span t:field="l.product_uom_qty"/>
<span groups="product.group_uom" t:field="l.product_uom"/>
</td>
<td class="text:right">
<span t:field="l.price_unit"/>
</td>
<td t:if="display_discount" class="text:right" groups="sale.group_discount_per_so_line">
<span t:field="l.discount"/>
</td>
<td class="text:right">
<span t:esc="', '.join(map(lambda x: (x.description or x.name), l.tax_id))"/>
</td>
<td class="text:right">
<span t:field="l.price_subtotal" t:field:options="{&quot;widget&quot;: &quot;monetary&quot;, &quot;display_currency&quot;: &quot;doc.pricelist_id.currency_id&quot;}"/>
</td>


So my conclusion is that there is a bug.

0

Akhil P Sivan

--Akhil P Sivan--
3423
| 5 3 6
Kochi, India
--Akhil P Sivan--

Interested in exploring Odoo both technically & functionality wise.

email-id : akhilpsivan01@gmail.com

Akhil P Sivan
On 10/7/15, 7:18 AM

Hi,

Your code target only the first element and its not an error. A possible solution, please try:

<template id="report_so_no_print_lines" inherit_id="sale.report_saleorder_document">
<xpath expr="//table[1]/tbody/tr" position="replace">
<tr t-foreach="o.order_line" t-as="l">
<t t-if="l.product_id.product_tmpl_id.no_print_in_invoice != True">
<td>
<span t-field="l.name"/>
</td>
<td>
<span t-esc="', '.join(map(lambda x: x.name, l.tax_id))"/>
</td>
<td class="text-right">
<span t-field="l.product_uom_qty"/>
<span groups="product.group_uom" t-field="l.product_uom"/>
</td>
<td class="text-right">
<span t-field="l.price_unit"/>
</td>
<td groups="sale.group_discount_per_so_line">
<span t-field="l.discount"/>
</td>
<td class="text-right">
<span t-field="l.price_subtotal"
t-field-options='{"widget": "monetary", "display_currency": "o.pricelist_id.currency_id"}'/>
</td>
</t>
</tr>
</xpath>
</template>

Thank for your response but i try to generalize this fonctionality for all my project which have different sale.order report. So if you have an idea to put this element after element but before first , i take ! ;)

dark
on 10/7/15, 8:29 AM

*So if you have an idea to put this element t after element tr but before first td element, i take ! ;)

dark
on 10/7/15, 8:40 AM

Sorry dark, I didn't get you. You want to check that same condition on each column? You just tell me what exactly you need, I can help you to solve it.

Akhil P Sivan
on 10/8/15, 1:19 AM

I want to hide a line of sale.order.line when user print report if product in this line is mark as hide in print (just checkbox in product form). I can't put condition in tr element because they are iteration. So i want to check that condition in each column, yes.

dark
on 10/9/15, 7:18 AM

Means if you check "hide in print" on product form, then that product should not appear in sale order lines on the report right? Did you check report with the above code? As the condition is same and applicable to an entire line or row, I didn't put the condition on each column. If you need I can put the condition in each column, but before that please check with the above code.

Akhil P Sivan
on 10/9/15, 11:10 AM
0

Temur

--Temur--
2896
| 6 5 7
Tbilisi, Georgia
--Temur--
Programmer
Temur
On 10/7/15, 5:27 AM

Add brackets () at the end, it means All Elements... otherwise it matches the first element, it's expected behavior, not an error.

for all span, your example will become:

<xpath expr="//span()" position="replace">	

<span>COUCOU</span>

</xpath>

Doesn't work, i have a parse error : ParseError: "ValidateError Field(s) `arch` failed against a constraint: Invalid view definition

dark
on 10/7/15, 5:46 AM

You tried for span?

Temur
on 10/7/15, 5:54 AM

For //span and for //table[1]/tbody/tr/td And i've this error

dark
on 10/7/15, 6:08 AM

and for expr="//table[1]/tbody/tr::td()" ? I never tried it in Odoo, but in Xpath "//node()" should select all "node"-s. I do not know why you get that error.

Temur
on 10/7/15, 6:34 AM

Thanks for your responses, but it doesn't work too :( I think odoo's parser has little problem.

dark
on 10/7/15, 8:22 AM

Your Answer

Please try to give a substantial answer. If you wanted to comment on the question or answer, just use the commenting tool. Please remember that you can always revise your answers - no need to answer the same question twice. Also, please don't forget to vote - it really helps to select the best questions and answers!

About This Community

This community is for professionals and enthusiasts of our products and services. Read Guidelines

Question tools

1 follower(s)

Stats

Asked: 10/7/15, 5:18 AM
Seen: 3158 times
Last updated: 11/25/15, 6:48 AM