1) Odoo 側のメタ情報の実体
- Odoo DB の
public.ir_model/public.ir_model_fieldsを 直接参照して抽出する方針(FDWは使わない)。 field_descriptionは jsonb(例:{"en_US":"…","ja_JP":"…"})。helpも jsonb(空ならNULL/false相当、入っているものは{"en_US": "...", "ja_JP": "..."})。- あなたの確認結果:
help_type = jsonbが確定。
- あなたの確認結果:
→ 結論:DB→DB の同期なら CSV エスケープ事故は起きない。
CSVで "\"" が増えて壊れて見えるのは “CSVにしたせい” で、DBの中身は健全。
2) ir_****_src の位置づけ(重要な前提)
public.ir_model_src / public.ir_field_src / public.ir_view_srcは、- 「既存のモデル(例: sale.order)をフロントで選べる」
- 「そのモデルに紐づく既存フィールド/既存ビューを“すでにあるもの”として表示する」
ための 参照用ソーステーブル。
- 今回の開発のために “勝手なモデルやフィールドをSQLで捏造しない” という目的が根底。
- SQL生成は ChromaDB側の情報(=正しいメタ)を主にする、という制約は維持する。
ir_*_srcは補助(UIで既存を選ぶ・境界を守る)で使う。
3) 取り込み方針(同期の考え方)
- まずは Odooから抽出できることを確認し、その抽出(SQL)を正として同期実装する。
- 手順は段階的に:
- model
- field
- view
の順に進める。
4) APIの入り口
- Dev-Portal 側は
POST /admin/ir_src/sync/fieldsを入口に進める方針。 - 既存状態を壊さない(= UPSERT / idempotent)が前提。
開発内容(これから実装すること)
Phase 1: Model 同期(最優先)
目的:Odooの ir_model を正として public.ir_model_src を埋める。
- 抽出元(Odoo DB):
public.ir_model(id, model, name, create_date, write_date)
- 反映先(Dev-Portal DB):
public.ir_model_src
- 格納する値(案:最小セット)
idmodelmodel_table(replace(model,'.','_'))label_i18n(nameを{"en_US": "...", "ja_JP": "..."}として保持できるならそのまま/少なくともen_USは入れる)created_at,updated_at(create/write date)
- 実装要件
- UPSERT(既存があれば更新、なければ挿入)
- “既存破壊しない”(不要なDELETEはしない)
- 件数と差分(insert/update count)をレスポンスで返す
Phase 2: Field 同期
目的:Odooの ir_model_fields を正として public.ir_field_src を埋める。
- 抽出元:
public.ir_model_fields
- 重要確定:
field_descriptionもhelpも jsonbなので そのままlabel_i18n / notesに反映できる
- 反映先:
public.ir_field_src
- 格納内容:
id, model, model_table, field_name, ttypelabel_i18n(field_description)notes(help)- relational系(
relation, relation_field, relation_table, column1, column2)も必要なら追加
- 実装要件:
- UPSERT
- model単位・limit/cursor等のページングは任意(大量になるため将来的に必要)
Phase 3: View 同期(action-centric)
目的:Odoo UIの実体をフロントで辿れるように、public.ir_view_src を整備。
- 抽出元候補:
ir_ui_viewir_act_windowir_act_window_viewir_model_data(xmlid解決)
- 反映先:
public.ir_view_src
- 方向性:
- 「ビュー単体」ではなく「アクション起点(action-centric)」の集約を作る(あなたの既存SQL方針)
直近の検証結果(貼れる“証跡”)
ir_model_fieldsの例:field_description_type = jsonbhelp_type = jsonb- 値例:
{"en_US": "Column 1", "ja_JP": "カラム1"}{"en_US": "Column referring to ...", "ja_JP": "モデルテーブル内の..."}
運用イメージ(ユーザーの意図)
- Odoo側のメタ情報は更新され続けるので、
- Dev-Portal側の
ir_*_srcも **定期更新(同期ジョブ)**が必要。
- Dev-Portal側の
- ただし目的は “Odooへ書き込む” ではなく、Odooから読んでDev-Portalへ反映する。
コメントを残す