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のビューを開き、アーキテクチャを確認します。最後の方にある
<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上にマウスカーソルを置いてしばらく待ちます。すると項目の技術情報が表示されます。
この技術情報によると分納状態では"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のモジュール変更管理や、コントリビューター登録などについては以下の記事を参照してください。