PDFレポートを作成

重要

このチュートリアルは、 :doc:の server_framework_101 チュートリアルの拡張です。 完了したことを確認し、このチュートリアルの演習のベースとして構築した`estate`モジュールを使用してください。

We were previously introduced to QWeb where it was used to build a kanban view. Now we will expand on one of QWeb's other main uses: creating PDF reports. A common business requirement is the ability to create documents to send to customers and to use internally. These reports can be used to summarize and display information in an organized template to support the business in different ways. Odoo can additionally add our company's header and footer to our reports with minimal extra effort.

このトピックに関連するドキュメントは、 QWeb テンプレートQWeb レポート、およびアクションリファレンスの :ref:`reference/actions/report`セクションにあります。

ファイル構造

PDFレポートの大部分はQWebテンプレートです。通常は対応する``ir'が必要です。 ctions.report`` でモジュールのビジネスロジックにレポートを含めます。 ファイル名や場所に厳格なルールはありません。 しかし、これらの2つの部分は通常、モジュールのディレクトリのトップレベルにある report フォルダ内に2つの別々のファイルに保存されます。 モジュールに多数または複数の長いレポートテンプレートがある場合、モジュールは多くの場合、それらが含まれるレポートの名前にちなんで異なるファイル間で論理的に整理されます。 レポートのすべてのアクションは通常、 _reports.xml で終わる同じファイルに含まれているレポートの数に関係なく保存されます。

したがって、あなたの作業ツリーは次のようになります。

estate
├── models
│   ├── *.py
│   └── __init__.py
├── report
│   ├── estate_property_templates.xml
│   └── estate_property_reports.xml
├── security
│   └── ir.model.access.csv
├── views
│   └── *.xml
├── __init__.py
└── __manifest__.py

テンプレートとアクションビューが「__manifest__」に含まれるファイルを追加することを忘れないでください。 この場合は data リストにファイルを追加し、マニフェストにリストされているファイルが順番にロードされることを忘れないでください。

基本レポート

注釈

目標: このセクションの最後に、プロパティのすべてのオファーを表示するレポートを印刷することができます。

シンプルなPDFレポート

今回の不動産の例では、作成できる便利なレポートがたくさんあります。簡単なレポートとしては、ある物件のすべてのオファーを表示するものがあります。

レポートデータ

何かをする前に、まず、レポートを作成するためのデータが必要です。レポートを作成する際には、レポートのコードをテストし、結果が期待通りであることを確認するために、いくつかのデータが必要になります。想定されるユースケースのほとんどまたはすべてをカバーするデータでテストすることをお勧めします。今回のシンプルなレポートでは、次のような内容を網羅します。

  • 少なくとも3つの物件があり、1つは "sold" (売約済み)、1つは "offer received" (オファーあり)、1つは "new" (新規)とします。

  • "sold" (売却済み) や "offer received" (オファーあり)の物件情報として、少なくとも2~3件のオファーがあるものとします。

このようなデータがまだない場合は、次のいずれかを実行します。

  • :doc:の define_module_data チュートリアルを完了し(まだ実行していない場合)、デモデータに追加のケースを追加します(デモデータにロードするために新しいデータベースを作成する必要があります)。

  • データベースにデータを手動で作成します。

  • この`data file <https://github.com/odoo/technical-training-solutions/blob/18.0-J_reports/estate/data/estate_demo.xml>`_ を不動産モジュールの新しいディレクトリ (データ) にコピーし、these lines を __manifest__にコピーします。 yファイル(デモデータにロードするために新しいデータベースを作成する必要があるかもしれません)。

続行する前に、データベース内のデータをクリックして、データが期待通りであることを確認してください。もちろん、レポートのコードを書いた後にデータを追加することもできますが、そうするとコードを書きながら部分的にテストすることができなくなります。そのため、複雑なレポートの場合、コードの間違いをチェックしたり、デバッグすることが結局、難しくなります。

最小限のテンプレート

最小限の実行可能なテンプレートは、 レポート テンプレート ドキュメンテーションの "最小限の実行可能なテンプレート" セクションで見ることができます。この例を修正して、最小の物件オファーテンプレートファイルを作成してみましょう。

<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
    <template id="report_property_offers">
        <t t-foreach="docs" t-as="property">
            <t t-call="web.html_container">
                <t t-call="web.external_layout">
                    <div class="page">
                        <h2>
                            <span t-field="property.name"/>
                        </h2>
                        <div>
                            <strong>Expected Price: </strong>
                            <span t-field="property.expected_price"/>
                        </div>
                        <table class="table">
                            <thead>
                                <tr>
                                    <th>Price</th>
                                </tr>
                            </thead>
                            <tbody>
                                <t t-set="offers" t-value="property.mapped('offer_ids')"/>
                                <tr t-foreach="offers" t-as="offer">
                                    <td>
                                        <span t-field="offer.price"/>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                </t>
            </t>
        </t>
    </template>
</odoo>

作成するファイルに含まれるOdoo特有の (HTMLではない) 項目のほとんどは、最小限の実行可能なテンプレートのセクションで説明されています。これらのテンプレートには次のような特徴があります。

  • class="table" 属性を使用するため、テーブルには素晴らしいフォーマットがあります。 Twitter Bootstrap(この場合はテーブルクラスを使用しています)やFont Awesome(アイコンを追加するのに便利です)クラスをレポートテンプレートで使用できます。

  • t-set, t-value, t-foreach, t-as を使用することで、すべての offer_ids をループさせることができます。

すでにウェブサイトのテンプレートエンジンに精通しているのであれば、QWeb のディレクティブ (すなわち t-コマンド) についてはあまり説明の必要はなく、 ドキュメント を一読し、次のサブセクションへと読み飛ばしてもよいでしょう。

そうでなけれ、熟読することをお勧めします ( Wikipedia は、高いレベルの記述があります) が、一般的な考え方としては、QWebはOdooデータと簡単なコマンドに基づいてWebコードを動的に生成する機能を提供しているということです。 すなわち、QWebはレコードセットデータ (およびメソッド) にアクセスし、一時変数の設定やアクセスなどの単純なプログラミング操作を処理することができます。 例えば、上記の例では次のようになります。

  • t-set は、"offers "という一時的な変数を作成し、その値は t-value によって、カレントな estate.property レコードセットの offer_ids に設定されます。

  • t-foreacht-as の使用法は Python と同等のものです:

for offer in offers:

レポートアクション

テンプレートができたので、 ir.actions.report を使ってアプリ内でアクセスできるようにする必要があります。 このテンプレート に対応する ir.actions.report の実用的な例は、 ここ にあります。その内容は、 ドキュメント で説明されています。

ir.actions.report は主にモデルビューの印刷メニューから使用されます。 実用的な例では、binding_model_id はレポートが表示するモデルのビューを指定し、Odoo は自動的に追加します。 レポートアクションのもう一つの一般的な使用例は、 第9章: アクションの準備はできましたか? で学んだようにボタンにリンクすることです。 これは、特定の条件下でのみ意味のあるレポートに便利です。 たとえば、「Final Sale」レポートを作成したい場合。 そして、それを「販売情報を印刷」ボタンにリンクすることができます。このボタンは、プロパティが「販売情報」である場合にのみ表示されます。

印刷メニューボタン

私たちのレポートテンプレートがレコードセットをループする理由に気づいたり、疑問に思ったかもしれません。 テンプレートが複数のレコードに渡されると、すべてのレコードに 1 つの PDF レポートを生成できます。 複数のレコードが選択されたリストビューでformat@@0メニューを使用すると、これを示します。

レポートの作成

ようやく、ファイルを作成する場所と、ファイルの内容がどのように見えるかを理解しました。レポート作成をお楽しみください。

Exercise

レポートを作成してみましょう。

  • 最小限テンプレートのサブセクションの物件オファーレポートを物件ビューのPrint(印刷)メニューに追加してみましょう。

  • さらにデータを追加してレポートを改善しましょう。このセクションの 目標 を参照して、どのようなデータを追加できるかを確認し、さらに自由に追加してみましょう。

  • ボーナス:いくつかのロジックを追加して、さらに柔軟なレポートを作成してみましょう。物件にオファーがない場合、表を作成せず、代わりにオファーがまだないことをきさいするようにしてみましょう。ヒント: t-ift-else を使う必要があります。

PDFレポートが期待通りにデータと一致しているか、忘れずにチェックしてください。

サブテンプレート

注釈

目標: このセクションの最後には、2 つのレポートから使用するサブテンプレートが出来上がっています。

サブテンプレートを使用してレポート

サブテンプレートを使用する主な理由は2つあります。 一つは、余分な長さまたは複雑なテンプレートを扱うときにコードを読みやすくすることです。もう一つは、可能な限りコードを再利用することです。 簡単なプロパティではレポートが役に立ちますが、listing プロパティではレポートテンプレートが1つ以上の場合に役に立ちます。 一例として、営業マンの特性のすべてを一覧表示するレポートがあります。

サブテンプレートを呼び出す方法を理解するには、 ドキュメント を読むか、 を読む必要があります。 (QWeb は、Odoo のレポートかビューかに関わらず、同じコントロールフローを使用することを覚えておいてください)

Exercise

サブテンプレートを作成し、使用してみましょう。

  • オファーの表部分を独自のテンプレートに分割してください。その後、元のレポートのように正しく印刷されるかどうかを確認することを忘れないでください。

  • フォームビュー (例: ''Settings'' アプリ) に表示されているすべての不動産物件情報を印刷することができるように、res.users に新しいレポートを追加してみましょう。 同じレポートにそれぞれの販売員の物件オファーが含まれるようにします。ヒント: この場合の binding_model_id は estate モジュール内にはないため、 ref="base.model_res_users" を使用する必要があります。

    最終的な結果は、このセクションの 目標 にある画像のようになるはずです。

レポートが期待通りにデータと一致しているか、忘れずにチェックしてください。

レポートの継承

注釈

目標: このセクションの最後には、 estate_account モジュールで物件レポートを継承できるようになっています。

継承したレポート

QWeb の継承は、 Views inherited from と同じ xpath 要素を使用します。 QWeb テンプレートは、別の方法でその親テンプレートを参照します。 template 要素に inherited from id 属性を追加し、module.parent_template_id と同じに設定するだけで、さらに簡単になります。

estate_account では、どの不動産モデルにも新しいフィールドを追加していませんが、既存の不動産レポートに情報を追加することはできます。例えば、 "Sold" (売約済み)の物件はすでに請求書が作成されていることがわかっているので、この情報をレポートに追加することができます。

Exercise

レポートを継承してみましょう。

  • 物件レポートを拡張して、請求書に関する情報を追加します。このセクションの 目標 を参考にしてください (例:物件がDone(完了)の場合、1行の文言を印刷し、それ以外は、何も印刷しません) 。

繰り返しになりますが、作成したレポートがデータと一致しているかどうかを確認してください。

追加機能

以下の追加機能は、それぞれの実装方法を含む、 :ref:の reference/reports/report ドキュメントで詳しく説明されています。

翻訳

自動化された手動翻訳のおかげで、Odooが複数の言語で使用されていることは誰でも知っています。 QWebレポートも例外ではありません! テンプレートのテキストコンテンツに不要なスペースがある場合、翻訳が正しく機能しないことがあります。 だから、可能な限りそれらを避けるようにしてください (特に主要なスペース)。

レポートはWebページ

QWebがHTMLを生成すると聞くのに飽きているかもしれませんが、私たちは再びそれを言っています! QWebで書かれているレポートのきちんとした機能の1つは、Webブラウザ内で見ることができることです。 これは、特定のレポートにつながるハイパーリンクを埋め込む場合に便利です。 許可されていないユーザーがレポートにアクセスすることを防ぐためには、通常のセキュリティチェックが適用されます。

バーコード

Odoo には、レポートにバーコードを埋め込むことができるバーコード作成機能が内蔵されています。 対応する code をチェックして、サポートされているすべてのバーコードタイプを確認してください。