Как получить report_name в заголовке Qweb в Odoo 10? - PullRequest
0 голосов
/ 26 ноября 2018

Мне нужно показать строку в заголовке нескольких отчетов, которая должна меняться в зависимости от печатаемого отчета.

К настоящему времени я сделал это:

<template id="external_layout_header" inherit_id="report.external_layout_header">
    ...
    <t t-if="o._table=='sale_order'">
        ... Print here what I need to show in sale order reports ...
    </t>
    ...
</template>

Это хорошо сработало для меня, но теперь строка зависит не от модели / таблицы, а от печатного отчета.

У меня есть модель, в которой есть два разных отчета для печати.Если один напечатан, я должен показать 'X' в заголовке, если другой напечатан, я должен показать 'Y' в заголовке.Между ними нет никакой разницы, я имею в виду, что в модели нет атрибута, который позволил бы мне их идентифицировать.

Например, в предыдущем случае, несмотря на то, что у меня была та же модель, я смог показать правильнуюстрока из-за значения поля state:

<template id="external_layout_header" inherit_id="report.external_layout_header">
    ...
    <t t-if="o._table=='sale_order'">
        <t t-if="o.state=='draft'">
            ... Print Sale Quotation ...
        </t>
        <t t-if="o.state!='draft'">
            ... Print Sale Order ...
        </t>
    </t>
    ...
</template>

Но в этом случае нет поля, которое бы мне помогло.Только название отчета, поэтому мне нужно получить его из шапки.

Кто-нибудь знает, как этого добиться?

1 Ответ

0 голосов
/ 26 ноября 2018

Я попробовал это, и это сработало, надеюсь, вы поняли идею.Во-первых, есть некоторый факт, который я знаю (но не уверен), что заставило меня прийти с этой логикой.

  1. Нет прямого способа установить атрибут на docs или o (RecordSetпередано в отчет) на Qweb.
  2. У нас есть доступ к контексту o.env.context.
  3. , когда вы вызываете шаблон внутри другого, последний имеет доступ к области видимости первого шаблона.

Вместо добавления атрибута, почему мы не просто добавляем ключ в контекст магического атрибута, используя o.with_context, используя силу t-set, мы можем добавить дополнительный key, но нам нужно сделатьубедитесь, что мы делаем это прежде, чем мы вызовем <t t-call="report.external_layout"> в шаблоне отчета, чтобы external_layout смог найти этот дополнительный key в контексте ^^

 <!-- add extra key to context -->
 <!-- you can set it one time on docs it's better -->
 <t t-set="o" t-value="o.with_context(report_name='hello_report')"/> 
 <t t-call="report.external_layout">     

Теперь, потому что контекст - это экземпляр frozendict или что-то подобное(Я не уверен), мы можем использовать get со значением по умолчанию, чтобы проверить, передается ли этот специальный ключ в контексте.

<template id="external_layout_header" inherit_id="report.external_layout_header">
        ...
        <t t-if="o.env.context.get('report_name', False) == 'hello_report'">
                   <!-- show what you want to show  for this report -->

Или вы можете сделать его еще лучше, сделав это поведение общимпросто передав само значение в соТаким образом, это сведет к минимуму число if statements для вас external_layout.

<template id="external_layout_header" inherit_id="report.external_layout_header">
        ...
        <t t-if="o.env.context.get('extra_value', False)">
              <p t-esc="o.env.context.get('extra_value')"></p>

Таким образом, для любого отчета, который вам нужен, чтобы иметь такое поведение.если он существует, наследуйте шаблон и убедитесь, что вы добавили ключ перед вызовом external_layout, используя x-path.

. Правки:

пример результатаэто в odoo 8.0 Я не использовал наследование, я непосредственно обновил remplates.

sale.order template

<template id="report_saleorder_document">
    <t t-set="o" t-value="o.with_context(extra_info='show this on header')"/>
    <t t-call="report.external_layout">

внешний макет отчета

 <template id="external_layout_header">
        <div class="header">
            <div class="row">
                <t t-if=" 'extra_info' in o.env.context" >
                    <p t-esc="o.env.context.get('extra_info')"></p>
                </t>
                <div class="col-xs-3">
                    <img t-if="company.logo" t-att-src="'data:image/png;base64,%s' % company.logo" style="max-height: 45px;"/>
                </div>
                <div class="col-xs-9 text-right" style="margin-top:20px;" t-field="company.rml_header1"/>
            </div>
            ....
            .....
            ...

результат таков

final result

...