odoo再開発日記二
この開発日記は自分で odoo を再開発する時に、解決が難しい問題と効率良くやり方とかを記述しております。
開発環境: OS:ubuntu
作業フォルダ説明:
作業フォルダ
├── test.conf # odoo配置ファイル
├── my_addons # 開発モジュールの格納フォルダ
│ ├── hello # 前回作成したモジュール
│ │ ├── controllers
│ │ ├── demo
│ │ ├── models
│ │ ├── security
│ │ └── views
└── odoo12 # ここにodoo 12.0をインストルされました
目標
- アクション作成
- メニュー作成
- ビィー作成
アクション作成
参考資料:odoo のアクション
上記資料に odoo のアクションが5つあります:
- Window Actions (ir.actions.act_window)
- URL Actions (ir.actions.act_url)
- Server Actions (ir.actions.server)
- Report Actions (ir.actions.report)
- Client Actions (ir.actions.client)
この5つアクションが対応テーブルがあります:
対応テーブルに新しいレコードを追加すれば、新しいアクションが定義されます。勿論データベースの管理ツールでテーブルを編集して、直接レコードを追加することができますが、メンテナンスが悪いです。このついて、odoo はメンテナンス安い方法を提供しています。
まず、一番簡単なアクション URL アクションを作って見ます。下記の様な xml ファイルを作成します、名前は何でもいいですが、ここは hello/views/actions.xml となります。
<!-- hello/views/actions.xml -->
<odoo>
<data>
<record id="action_hello_url" model="ir.actions.act_url">
<field name="name">Hello url action</field>
<field name="url">http://www.google.com/</field>
<field name="target">new</field>
</record>
</data>
</odoo>
上記 xml ファイルの意味は、モデル ir.actions.act_url に新しいレコード:
name フィルドが Hello url action
url フィルドがhttp://www.google.com/
taget フィルドが new
を追加する。モデル ir.actions.act_url は odoo/addons/base/models/ir_actions.py ファイルに定義されます。
class IrActionsActUrl(models.Model):
_name = 'ir.actions.act_url'
_description = 'Action URL'
_table = 'ir_act_url'
_inherit = 'ir.actions.actions'
_sequence = 'ir_actions_id_seq'
_order = 'name'
name = fields.Char(string='Action Name', translate=True)
type = fields.Char(default='ir.actions.act_url')
url = fields.Text(string='Action URL', required=True)
target = fields.Selection([('new', 'New Window'), ('self', 'This Window')],
string='Action Target', default='new', required=True)
各フィルドの意味は下記のリックを参照してください。
https://www.odoo.com/documentation/12.0/reference/actions.html#url-actions-ir-actions-act-url
IrActionsActUrl クラスの_table フィルド、値が’ir_act_url’によると、モデル’ir.actions.act_url’とテーブル’ir_act_url’の対応関係がすぐ分かります。
そして、hello モジュールの定義ファイル__manifest__.py
の data 項目に actions.xml ファイルを追加します。
...
# always loaded
'data': [
'views/actions.xml',
],
...
下記のコマンドで hello モージュルを更新して odoo を起動します。
$./odoo12/odoo-bin -d test_odoo -c test.conf -u hello
起動成功すれば ir_act_url テーブルを確認すると追加されたアクションレコードが見えます。
メニュー作成
次は新しいメニュー項目を作成して上記アクションを呼び出します
メニュー作成方法はアクションの作成方法大体同じ、まず、views/menu.xml ファイルを作成して、下記内容を追加します。
<odoo>
<data>
<menuitem name="Hello" id="hello.menu_root" action="hello.action_hello_msg" />
</data>
</odoo>
上記 xml ファイルに action が”hello.action_hello_msg”と設定されます、つまり、このメーニュをクリックすると、”hello.action_hello_msg”アクションを呼び出すことができます。
上記 xml ファイルを使用のため、hello モジュールの定義ファイル__manifest__.py
の data 項目に menu.xml ファイルを追加します。
...
# always loaded
'data': [
'views/actions.xml',
'views/menu.xml'
],
...
再度コマンドで hello モジュールを更新して起動します。
$./odoo12/odoo-bin -d test_odoo -c test.conf -u hello
起動成功すれば、odoo の画面を開くするとトップメニューには Hello のメニューを見えます。ただし、アクションがないメニュー項目が表示されないので注意が必要です。
Hello メニューをクリックすると、新しいページ http:://www.google.comが開けます。
ビィー作成
odoo のビューが下記の種類があります:
- Lists
- Forms
- Graphs
- Pivots
- Kanban
- Calendar
- Gantt
- Diagram
- Dashboard
- Cohort
- Activity
- Search
- QWeb
QWeb が普通の HTML タッグも使えますから、一番理解安いと思います。では簡単の QWeb ビューから作りしましょう。
まず、template.xml を作成し、下記のコードを入力します。
<odoo>
<data>
<template id="hello_msg">
<h1>Hello</h1>
</template>
</data>
</odoo>
次は定義ファイル__manifest__.py
の data 項目に追加します。
# always loaded
'data': [
'views/templates.xml',
'views/actions.xml',
'views/menu.xml',
],
ここまで、qweb ビュー”hello_msg”の定義が完了しました。ただし、このビューにアクセスすることがまたできないので、アクセスルードの定義が必要です。
hello/controllers/controllers.py を編集して、下記のコードを入力します。
# -*- coding: utf-8 -*-
from odoo import http
class Hello(http.Controller):
@http.route('/hello/hello/', auth='public')
def index(self, **kw):
return http.request.render('hello.hello_msg')
そこまで、/hello/hello ルードを定義しました。
$./odoo12/odoo-bin -d test_odoo -c test.conf -u hello
上記コマンドで hello モジュールを更新して再起動します、問題なけれは、http://localhost:8069/hello/hello/
をブラウザで開くと、下記の画面が見えます。
最後、先ほど作成した URL アクション(/views/actions.xml)を下記のように変更して、再起動すると、Hello メニューから/hello/hello に遷移することが出来るになります。
<odoo>
<data>
<record id="action_hello_url" model="ir.actions.act_url">
<field name="name">Hello url action</field>
<field name="url">/hello/hello</field>
<field name="target">new</field>
</record>
</data>
</odoo>