見出し画像

OCAのモジュールでビューを変更してみる

OCAのPurchase Reception Status を変更してみる

変更するAddOnをOCAから探してみました。
OCAでのモジュール探し方はこちらの記事にまとめてあります。

Purchase Reception Statusモジュールは、OCA/Purchase-workflowというプロジェクトの中で開発されています。このモジュールは購買発注の入庫ステータスを発注一覧に表示する物です。
今回はこのモジュールを変更してみます。

リポジトリをOdooコンテナのAddOn開発ディレクトリにクローンする

まずはOdooコンテナのAddOn開発ディレクトリに、OCA/Purchase-workflowをクローンします。
このプロジェクトのGitHubリポジトリで、git cloneするための情報を入手します。

Odooコンテナに接続します。コマンドラインからgitを使ってリポジトリをクローンします。

git clone git@github.com:OCA/purchase-workflow.git

purchase-workflow に移動して14.0にリベースします。

git rebase 14.0
Current branch 14.0 is up to date.

これでリポジトリのクローンが終了しました。

OdooにPurchase Reception Statusモジュールをインストールする

OdooにPurchase Reception Statusモジュールをインストールします。
purchase-workflow内のpurchase_reception_statusがモジュールのディレクトリです。
OdooからAddOnを認識させるために、/opt/odoo/custom-addons内にモジュールディレクトリへのシンボリクリンクを作ります。

/opt/odoo/custom-addons# ln -s ./purchase-workflow/purchase_reception_status

シンボリックリンクを作った後に、Odooのアプリ管理からアプリリストを更新します。

アプリ管理のアプリリストを更新ボタン

更新後に"Purchase"で検索して出てくる"Purchase Reception Status"をインストールします。

インストール後に購買オーダの一覧を確認して見ましょう。
一覧に”Reception Status”という項目が追加されています。

Reception Status の見た目がしょぼい

隣の請求ステータスと見比べると、バッジ表示で色がついている請求ステータスに対して、Reception Statusは文字だけの表現となっていて見た目がしょぼいです。
これをもう少し見栄えが良くできないでしょうか?

Odooのビュー変更方法

Odooの画面はビューという単位で管理されています。ビューの中に表示項目が定義され保存されています。このビューを変更するには、OdooのGUIから変更する方法とアプリケーションやモジュールのソースコード側から変更する方法があります。

GUI上でビュー編集から変更する

OdooのビューをGUI上で変更するには、変更したい画面を開いて、"ビュー編集"を実行します。ビュー編集が含まれるデバッグオプションを表示するためには、開発者モードに切り替えておく必要があります。
開発者モードとデバッグオプションについては、以下の記事を参照してください。

変更したい画面でビュー編集を実行する以外に、管理設定>技術設定>ユーザインターフェース>ビューからビューの名称で検索することも可能です。

管理設定画面でのビュー変更メニュー

ビューの構造

OdooのビューはXMLによって定義された項目の集まりで、表示する画面に応じてビュータイプを選択するようになっています。
購買オーダの一覧画面はツリータイプのビューで、ビュー内で使用するデータの源泉として"purchase.order"を使用しています。
ビューは基本ビューと継承ビューがあり、基本ビューを継承して一部の項目をXPathによって上書きすることが可能です。

購買オーダの一覧画面ビュー"purchase.order.view.tree"

項目のバッジ表示

項目のバッジ表示はどう表現されているのでしょうか?請求ステータスがどのように設定されているか見てみましょう。
purchase.order.view.treeのビューを開き、アーキテクチャを確認します。最後の方にある

<field name="invoice_status" widget="badge" decoration-success="invoice_status == 'invoiced'" decoration-info="invoice_status == 'to invoice'" optional="show"/>

この部分が請求ステータスを表示する部分です。
widgetで"badge"を指定して、成功(decoration-success)と情報(decoration-info)に対して項目のステータスを割り当てているようです。

received status はインストール時に、purchase.order.view.treeを継承したreceived_status.purchase.order.view.treeを作ります。

<?xml version="1.0"?>
 <field name="invoice_status" position="before">
 <field name="reception_status"/>
</field>

これを直接書き換えることは、ビュー編集の画面でも表示されているように、Odoo本体やAddOnのバージョンアップ時に上書きされてしまうため推奨されません。しかし、ここでは実験的に書き換えてみます。

ビュー変更時の警告

バッジのデザインを選択するためのdecoration-successとdecoration-infoには、どのようなステータスを割り当てれば良いでしょうか?
開発者モードを有効にして、購買オーダ一覧画面のReception Status上にマウスカーソルを置いてしばらく待ちます。すると項目の技術情報が表示されます。

Reception Status の項目技術情報

この技術情報によると分納状態では"partial"、完納状態では"received"となるようです。
widget="badge"
decoration-sucess="reception_status == 'received'"
decoration-info="reception_status == 'partial'"
として書き換えてみます。

<?xml version="1.0"?>
 <field name="invoice_status" position="before">
 <field name="reception_status" widget="badge" decoration-success="reception_status == 'received'" decoration-info="reception_status == 'partial'" optional="show"/>
</field>

書き換え後に購買オーダの一覧画面を読み込み直して更新します。

Reception Statusがバッジ表示になりました。
実験のためにモジュールによって追加されたビューを変更したので、一旦変更を元に戻しておきます。
この変更を本格的に使用したい場合は、ビューを継承して書き換える必要があります。Odoo本体やAddOnモジュールによって追加されたビューは、将来のアップデートで上書きされる可能性があります。

モジュールのソースコード側からビューを変更する

モジュールのソースコード側からビューを変更するには、どうするのでしょうか?
OdooのAddOnを開発するために、AddOnの雛形を作ることができました。

Odooによって出力される雛形には、Viewディレクトリが含まれています。ここにAddOnで使用されるViewが定義されています。
purchase_reception_statusのViewディレクトリを確認してみると、purchase_order.xmlというファイルがありました。これがビュー定義ファイルです。

Odooのビュー定義XMLファイル

Odooのビュー定義XMLファイルを見てみると、各ビューが<odoo>要素内にまとめて定義されています。

AddOnによって追加されるreceived_status.purchase.order.treeで検索してみると、継承ビューの名称とビュー名称から以下の部分が購買オーダの一覧画面用View定義のようです。

<record id="purchase_order_view_tree" model="ir.ui.view">
    <field name="name">received_status.purchase.order.tree</field>
    <field name="model">purchase.order</field>
    <field name="inherit_id" ref="purchase.purchase_order_view_tree" />
    <field name="arch" type="xml">
        <field name="invoice_status" position="before">
            <field name="reception_status" />
        </field>
    </field>
</record>

この reception_status部分を書き換えてみます。

<record id="purchase_order_view_tree" model="ir.ui.view">
    <field name="name">received_status.purchase.order.tree</field>
    <field name="model">purchase.order</field>
    <field name="inherit_id" ref="purchase.purchase_order_view_tree" />
    <field name="arch" type="xml">
        <field name="invoice_status" position="before">
            <field 
                name="reception_status"
                widget="badge"
                decoration-success="reception_status == 'received'"
                decoration-info="reception_status == 'partial'"
                optional="show"
            />
        </field>
    </field>
</record>

書き換え後に、Odooのアプリ管理画面から"アプリリストを更新"します。更新実行後にPurchase Reception Statusをアップグレードします。

無事更新が終了したら、購買オーダの一覧画面を開いてみると、Reception Statusがバッジ表示に変更されています。

まとめ

Odooユーザインターフェースのビューを変更する方法は、OdooのGUIからビューを継承して編集する方法と、AddOnモジュールのソースコード上でビュー定義を編集する方法があることがわかりました。
この変更をOCAに反映させるためには、OCAのコントリビューターとして登録し、リポジトリにマージしてもらう必要があります。
OCAのモジュール変更管理や、コントリビューター登録などについては以下の記事を参照してください。

この記事が気に入ったらサポートをしてみませんか?