変更すること:
View typeが今はひとつしか登録できないようになっているのでそれぞれ複数でもできるように、する必要がある。
複数のViewに対してXMLコードが紐づくようにする。カードにして選択できるようして、タブでxmlをすれば、XMLが表示できるように。
1) portal_view:共通(全Viewタイプ共通)
| 画面側(共通項目) | 画面UI | DB列(portal_view) | 型 | 備考 |
|---|---|---|---|---|
| Viewタイプ(左メニューで選択) | 例:Form View / List View… | view_type | text | 'form','list','kanban','calendar','search','graph','pivot','dashboard','tree','map' のいずれか(CHECK制約) |
| ビュー名 | テキスト入力 | view_name | text | 例:partner.form / partner.tree |
| モデル | テキスト入力 | model | text | 例:res.partner |
| (現画面では未表示) | (現画面では未表示) | id | bigserial PRIMARY KEY | 自動採番 |
| (現画面では未表示) | (現画面では未表示) | enabled | boolean | 既定 true。Portal側でスイッチを置くならここ |
| Primary | (現画面では未表示) | is_primary | boolean | 既定 false。tg_enforce_single_primary_per_common() により 同じcommon_id内で単一化 |
| common連携 | (内部) | common_id | bigint | portal_view_common.id FK(画面に出さない想定) |
| 監査 | (内部) | created_at,updated_at | timestamptz | 更新は trg_touch_portal_view |
2) Form View(フォームビュー)
画像の項目:ビュー名 / モデル / ヘッダーを表示 / フッターを表示 / 優先度
| 画面側(Form) | 画面UI | DB列(portal_view) |
|---|---|---|
| ビュー名 | テキスト入力 | view_name |
| モデル | テキスト入力 | model |
| ヘッダーを表示 | トグル | form_show_header |
| フッターを表示 | トグル | form_show_footer |
| 優先度 | セレクト | priority_num |
3) List View(リスト/ツリービュー)
画像の項目:ビュー名 / モデル / インライン編集 / エクスポートボタン / ページあたりの行数
| 画面側(List) | 画面UI | DB列(portal_view) | 備考 |
|---|---|---|---|
| ビュー名 | テキスト入力 | view_name | 例:partner.tree |
| モデル | テキスト入力 | model | |
| インライン編集 | トグル | list_inline_edit | |
| エクスポートボタン | トグル | list_export_button | |
| ページあたりの行数 | 数値入力 | list_page_size | 例:80 |
※この画面には「優先度」が出ていませんでした → Portal側で統一して出すなら priority_num を共通ブロックに置くのが一番ラクです。
4) Kanban View(かんばんビュー)
画像の項目:ビュー名 / モデル / デフォルトグループ化 / クイック作成 / ドラッグ可能フィールド
| 画面側(Kanban) | 画面UI | DB列(portal_view) |
|---|---|---|
| ビュー名 | テキスト入力 | view_name |
| モデル | テキスト入力 | model |
| デフォルトグループ化 | テキスト入力 | kanban_default_group_by |
| クイック作成 | トグル | kanban_quick_create |
| ドラッグ可能フィールド | テキスト入力 | kanban_draggable_field |
5) Calendar View(カレンダービュー)
画像の項目:ビュー名 / モデル / 開始日フィールド / 終了日フィールド / 色分けフィールド / デフォルト表示
| 画面側(Calendar) | 画面UI | DB列(portal_view) | 備考 |
|---|---|---|---|
| ビュー名 | テキスト入力 | view_name | |
| モデル | テキスト入力 | model | |
| 開始日フィールド | テキスト入力 | calendar_start_field | 例:start_date |
| 終了日フィールド | テキスト入力 | calendar_end_field | 例:end_date |
| 色分けフィールド | テキスト入力 | calendar_color_field | 例:user_id |
| デフォルト表示 | セレクト | calendar_default_view | month/week/day(CHECK制約) |
6) Search View(検索ビュー)
画像の項目:ビュー名 / モデル / 優先度
(※ search_fields / filters / group_by_filters はこの画面には出ていない)
| 画面側(Search) | 画面UI | DB列(portal_view) | 備考 |
|---|---|---|---|
| ビュー名 | テキスト入力 | view_name | |
| モデル | テキスト入力 | model | |
| 優先度 | セレクト | priority_num | |
| 検索フィールド定義 | (別UI想定) | search_fields | jsonb/複雑なので今は使わない |
| フィルタ定義 | (別UI想定) | search_filters | jsonb/複雑なので今は使わない |
| group by定義 | (別UI想定) | search_group_by_filters | jsonb/複雑なので今は使わない |
7) Graph / Pivot / Dashboard / Tree / Map
指定が複雑であるためXMLで書くが前提、存在確認ための用途
入力項目はSearch Viewと同様とする
下記のフィールドは形だけなので、画面と紐づかなくてOK。共通項目の
priority_num integer, enabled boolean NOT NULL DEFAULT true, is_primary boolean NOT NULL DEFAULT falseを表示でOK。
Graph
graph_type/graph_measure_fields/graph_row_group_by/graph_col_group_by/graph_stacked
Pivot
pivot_measures/pivot_rows/pivot_cols/pivot_show_totals
Dashboard
dashboard_layout/dashboard_widgets/dashboard_refresh_secs
Tree
tree_parent_field/tree_expand_all
Map
map_lat_field/map_lng_field/map_address_field/map_color_field/map_cluster/map_default_zoom
portal_view_common:画面項目マッピング(共通設定)
0) キー/基本情報(※この共通設定画面には通常“表示しない”想定)
| 区分 | 画面側 | DB列(portal_view_common) | 型 | 備考 |
|---|---|---|---|---|
| Actionキー | (内部/一覧で表示しても良い) | action_xmlid | text | 業務キー(UNIQUE)。view_common の主キー的扱い srcから取り込み。モデルがカスタマイズの場合、つまり新規の場合は下記の方式で自動生成:action_xmlid は何のため? |
| Actionメタ | (内部) | action_id, action_name | bigint/text | 取り込み元(ir_view_src)由来 |
| Model | (内部/フィルタ用に表示しても良い) | model | text | NOT NULL(= ir_view_src.model_tech) |
| Model補助 | (内部) | model_tech,model_table,model_label | text | 正規化/検索用 |
| Viewタイプ群 | (内部) | view_types | text[] | portal_view 子から派生させる運用が自然 |
| Primary Viewタイプ | (内部) | primary_view_type | text | primary_view_type = ANY(view_types) 制約あり |
1. 表示制御(画像:表示フィールド/フィルタ条件/Sort by/Default group by)
1-1) 表示フィールドの選択(基本フィールド/関連モデルフィールド)
| 画面項目 | 画面UI | DB列 | 型 | 備考(あなたの仕様に合わせる) |
|---|---|---|---|---|
| 表示フィールドの選択(チェック/並び替え) | チェック + ドラッグで順序 | display_fields | jsonb | 選択した「モデル + フィールド」が入る。順序も保持する(配列順) |
| 関連モデルフィールド(他モデルを追加) | 「+ 他モデルを追加」→モデル→フィールド | display_fields | jsonb | 関連モデルも同じ display_fields に格納 |
display_fields の推奨フォーマット例(実装案)
[
{"model":"res.partner","field":"name"},
{"model":"res.partner","field":"email"},
{"model":"res.country","field":"name","via":"country_id"}
]
viaは「res.partner.country_id → res.country.name」みたいな 関連経路を残したい場合の補助(必須ではない)
1-2) フィルタ条件(ドメイン形式)
| 画面項目 | 画面UI | DB列 | 型 | 備考 |
|---|---|---|---|---|
| フィルタ条件(条件式) | テキスト入力(ドメイン形式) | default_filters | jsonb | DBは jsonb なので 内部はJSON配列で保持するのが安全 |
domain 推奨フォーマット例
[["active","=",true],["country_id","=","Japan"]]
※UIがPython風の文字列を受ける場合は、保存時にJSONへ正規化(もしくはエラーにする)がおすすめ。
1-3) Sort by(デフォルトソート)
| 画面項目 | 画面UI | DB列 | 型 | 備考 |
|---|---|---|---|---|
| ソートフィールド | ドロップダウン | sort_field | text | フィールド技術名(例:name) |
| ソート順 | ドロップダウン | sort_dir | text | 'asc'/'desc'(CHECK制約) |
1-4) Default group by(デフォルトグループ化)
| 画面項目 | 画面UI | DB列 | 型 | 備考 |
|---|---|---|---|---|
| グループ化フィールド | ドロップダウン | default_group_by | text | フィールド技術名(例:stage_id) |
まず整理:action_xmlid は何のため?
あなたの
portal_view_commonは action-centric で、action_xmlidが UNIQUE business key。
ここが揺れると、
portal_view_commonが別物扱いになって履歴/翻訳/Chroma doc が増殖portal_view(子)との紐付けが壊れる- フロントのURLや参照も揺れる
なので Portalで一度発行した action_xmlid は不変にするのが正解です。
推奨運用(手動置き換え不要)
A) Portalが action_xmlid を発行する(Odooとは独立)
例(命名ルール案):
portal.<model>.<slug>
portal.res_partner.customer_list- あるいは衝突しないようにUUIDを混ぜる:
portal.<model>.<slug>.<shortid>(shortid=8桁)slug はUIで入力できる(なければ自動生成)にしておくと運用しやすいです。
B) Odoo側の “本物の xmlid / action_id” は「対応付け」として持つ
あなたのDDLにはすでに受け皿がある:
action_idaction_nameview_mode / context / domain- (必要なら拡張)
odoo_action_xmlidを追加つまり、
portal_view_common.action_xmlid= Portalが発行した固定ID(不変)portal_view_common.action_idや(追加するなら)odoo_action_xmlid= Odoo実体(変わり得る)これなら「Odooで実装されたら置き換え」ではなく “リンクを張り替えるだけ” で済みます。
2. 操作権限制御(画像:Can create/edit/delete など)
このブロックは 現行の portal_view_common DDLに対応カラムがありません(=マッピング先が無い)。
| 画面項目 | 画面UI | 現行DBでの置き場所 | コメント |
|---|---|---|---|
| Can create / Can edit / Can delete | トグル | (未対応) | 共通設定なので portal_view_common に boolean を足すのが素直 |
| Enable mass editing | トグル | (未対応) | 同上 |
| Show invisible elements | トグル | (未対応) | 同上 |
推奨(次のDDL拡張案)
portal_view_commonに以下を追加(共通設定なのでここが自然)can_create boolean,can_edit boolean,can_delete booleanenable_mass_editing boolean,show_invisible_elements boolean
※「DDLは今は変えない」なら暫定として context(jsonb)に {"can_create":true,...} を埋め込む手もありますが、後で確実に負債になります(検索/比較/表示の全部がつらい)。
3. レコード作成時の動作(画像:When creating record)
| 画面項目 | 画面UI | DB列 | 型 | 備考 |
|---|---|---|---|---|
| 作成時の動作 | ドロップダウン | creation_mode | text | 'open_new_page','inline_create','modal_create','quick_create'(CHECK制約) |
| デフォルト値 | テキスト入力(JSON形式) | default_values | text | 現DDLは text。将来 jsonb にしたいなら移行余地あり |
| Allow duplicate | トグル | allow_duplicate | boolean | |
| Enable archive | トグル | enable_archive | boolean |
4. AI学習用途(画像:Domain Guide テキスト)
| 画面項目 | 画面UI | DB列 | 型 | 備考 |
|---|---|---|---|---|
| ドメインガイド(Domain Guide) | テキストエリア | ai_purpose | text | ここにそのまま保存でOK(YAML/プレーンテキスト) |
| (多言語化する場合) | (未表示) | ai_purpose_i18n | jsonb | 例:{"ja_JP":"...","en_US":"..."} |
コメントを残す