見出し画像

Odooの設定画面に項目を追加する ~ AddOnモジュールを作る(3)

前回の記事ではOdooのAddOnモジュールとして、購買オーダの明細数をカウントして表示する機能を追加してみました。
https://note.com/nora_j/n/n1bd98b2a949c
今回は、設定画面に設定項目を追加する方法を調べてみました。

Odooの設定画面項目保存方法

Odooの設定項目はどこに保存されているのでしょうか?項目の情報を見てみます。
デバッグモードを有効にして、設定項目上でマウスカーソルをしばらく停止させます。すると項目情報が表示されます。

この項目情報からすると、設定項目はres.config.settingsとして保存されているようです。

res.config.settingsは保存できない

res.config.settingsはそのままでは保存できません。どのように保存すればよいかを検索してみました。
この記事によると、res.config.settingsは一時的な情報で、データベースには保存できません。いくつかの方法で設定を保存する必要があるようです。
今回は方法2.を選択しました。

方法1. シングルトンモデルで保存する

設定データをDB全体のデータとして保存したい場合、新しい専用のモデルを作り、継承したres.config.settingsから専用のモデルを呼び出して設定項目を保存するようです。

方法2. res.companyを使う

シングルトンモデルを使う代わりに、res.companyを継承して、保存したい項目を保存します。項目はDBのres_companyテーブルに保存されます。
設定情報は会社レベルでの設定になります。

方法3.  ir.config_parameterを使う

ir.config_parameterを使用して設定項目の読み書きをします。この場合、情報は全て文字列として扱う必要があり、書き込み、見出し時には型変換が必要となります。

AddOnモジュールのスケルトンを作る

bobtemplates.odooを使ってAddOnモジュールのスケルトンを作ります。

$ mrbob bobtemplates.odoo:addon

質問に答えていくとスケルトンが作られます。
今回は名称をmy_test_002としました。

manifestのdependsを追加

manifestへ依存するモジュールを追加しておきます。
モジュールのとオプディレクトリ内にある__manifest__.pyを編集します。
dependsとして、baseとpurchaseを追加します。

    'depends': [
        'base',
        'purchase'
    ],

モデルの追加

生成されたモジュールのディレクトリに移動して、以下のコマンドを実行します。

mrbob bobtemplates.odoo:model

今回は、res.companyとres.config.settingsを継承したモデルを作ります。
res.companyについては継承したモデルのみ生成し、res.config.settingsはモデルとFormビューを追加します。
モジュールとビューが生成された後は、このようなファイル構成となっています。

AddOnモジュールの実装

生成されたスケルトンを編集して、機能を実装していきます。

res_company.pyの実装

res.companyを継承して、項目を定義します。
BooleanとCharの項目を定義しました。

class ResCompany(models.Model):

    _inherit = "res.company"

    my_test_bool_field = fields.Boolean(
        string="Boolean Field",
        default=False,
        readonly=False
    )
    my_test_chars_field = fields.Char(
        string="Some text",
        default="default text",
        readonly=False
    )

res_config_settings.pyの実装

項目定義の引数として、relatedを指定します。

class ResConfigSettings(models.TransientModel):

    _inherit = "res.config.settings"

    my_test_bool_field = fields.Boolean(
        related="company_id.my_test_bool_field",
        readonly=False
    )
    my_test_chars_field = fields.Char(
        related="company_id.my_test_chars_field",
        readonly=False
    )

res_config_settings.xmlの実装

ここで設定画面を定義します。ここは、base_setup.res_config_settings_view_formを継承する形で定義します。
xpathを使用して、business_documentsのdivの前に割り込ませます。

<odoo>
    <record model="ir.ui.view" id="res_config_settings_form_view_inherit">
        <field name="name">res.config.settings.form (in my_test_002)</field>
        <field name="model">res.config.settings</field>
        <field name="inherit_id" ref="base_setup.res_config_settings_view_form"/>
        <field name="arch" type="xml">
            <xpath expr="//div[@id='business_documents']" position="before">
                <h2>My Test Settings</h2>
                <div class="row mt16 o_settings_container" name="my_settings">
                    <div class="col-12 col-lg-6 o_setting_box" id="my_setting_pane">
                        <div class="o_setting_left_pane">
                            <field name="my_test_bool_field"/>
                        </div>
                        <div class="o_setting_right_pane" id="my_setting_pane">
                            <label for="my_test_bool_field" />
                            <div class="mt16 row">
                                <label for="my_test_chars_field" string="Text Area" class="col-3 col-lg-3 o_light_label" />
                                <field name="my_test_chars_field" class="oe_inline" />
                            </div>
                        </div>
                    </div>
                </div>
            </xpath>
        </field>
    </record>
</odoo>

デバッグメニューのビュー編集:フォームから、base_setup.res_config_settings_view_formを継承しているビューを参考にして、設定画面のレイアウトを指定します。

インストールと動作の確認

実装が終わったら、Odooにインストールして動作を確認します。
Odooが認識しているAddOnディレクトリへ、モジュールのディレクトリへのシンボリックリンクを作っておきます。
インストールが完了したら、設定画面を開きます。

business_documentsのdiv (日本語版だとビジネス帳票)の前に、今までなかったMy Test Settings という設定項目が表示されます。

Boolean Fieldにチェックをつけると、管理設定上部の保存ボタン付近に「未保存の変更」が表示されるので保存ボタンを押します。

設定画面が再度読み込まれ、Boolean Fieldの状態も保存されています。
念の為、別のアプリの画面(購買など)を開いて、再度設定画面に戻ってきても設定が保存されているかも確認しておきましょう。

Boolean Fieldと同様に、Text Area についても同様に保存されるか確認しておきます。

終わりに

設定画面に項目を追加し、それを保存することができるようになりました。アプリによっては、入力の条件などによって画面が変化する。といった凝った画面を作っている物もあります。それらを参考に高度な画面の設計ができるようにしてみたいです。

今回作成したテスト用AddOnのモジュール"my_test_002"は、以下のリポジトリに納められています(実験用のリポジトリなのでゴミも入っています)。
https://github.com/tkuratty/odoo-addons

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