既存モデル(例:account.payment ↔ account.move)でも、ir_field_src の many2one 1行(種)から
by_model(モデル→field配列)aliases(orders/lines みたいな2モデルalias)flat(alias.field の修飾名配列)
を生成して、portal_view_common.display_fields に入るかを 検証できるSQLを出します。
ここではあなたが貼ってくれた例の
id = 5024account.payment.move_idmany2one →account.move
を使います。
1) まず payload を “生成して見るだけ”(SELECT)
(既存モデルでもデータが揃っているかを確認する用途)
WITH seed AS (
SELECT
id AS seed_id,
relation AS header_model, -- parent側: account.move
model AS line_model -- child側: account.payment
FROM public.ir_field_src
WHERE id = 5024
),
by_model AS (
SELECT jsonb_object_agg(model, fields_arr) AS v
FROM (
SELECT
m.model,
to_jsonb(array_agg(f.field_name ORDER BY f.field_name)) AS fields_arr
FROM (
SELECT header_model AS model FROM seed
UNION ALL
SELECT line_model AS model FROM seed
) m
JOIN public.ir_field_src f ON f.model = m.model
GROUP BY m.model
) t
),
aliases AS (
SELECT jsonb_build_object(
'header', (SELECT header_model FROM seed),
'line', (SELECT line_model FROM seed)
) AS v
),
flat AS (
SELECT to_jsonb(array_agg(qualified ORDER BY qualified)) AS v
FROM (
SELECT 'header.' || f.field_name AS qualified
FROM public.ir_field_src f
JOIN seed s ON f.model = s.header_model
UNION ALL
SELECT 'line.' || f.field_name
FROM public.ir_field_src f
JOIN seed s ON f.model = s.line_model
) q
),
payload AS (
SELECT jsonb_build_object(
'by_model', (SELECT v FROM by_model),
'aliases', (SELECT v FROM aliases),
'flat', (SELECT v FROM flat),
'tag', 'E2E_VERIFY_EXISTING',
'scope', 'account',
'seed_ir_field_src_id', (SELECT seed_id FROM seed)
) AS v
)
SELECT
(SELECT header_model FROM seed) AS header_model,
(SELECT line_model FROM seed) AS line_model,
v AS display_fields_payload
FROM payload;
✅ これで by_model が 2キー(account.move と account.payment)になっていて、配列が埋まっていればOKです。
2) 検証用に portal_view_common を “仮で1行” 作る(INSERT)
既存モデルでも view_common は必要なので、検証用の action_xmlid を作ります。
INSERT INTO public.portal_view_common
(action_xmlid, action_name, model_label, model_tech, model_table, view_types, primary_view_type, display_fields)
VALUES
(
'e2e.verify.account_payment_move',
'E2E Verify: account.payment ↔ account.move',
'E2E Verify',
'account.payment',
'account_payment',
'{form}',
'form',
'[]'::jsonb
)
ON CONFLICT (action_xmlid) DO NOTHING;
3) その行に display_fields を流し込む(UPDATE + RETURNING)
(ここが “埋まるか” の最終検証)
WITH seed AS (
SELECT
id AS seed_id,
relation AS header_model,
model AS line_model
FROM public.ir_field_src
WHERE id = 5024
),
by_model AS (
SELECT jsonb_object_agg(model, fields_arr) AS v
FROM (
SELECT
m.model,
to_jsonb(array_agg(f.field_name ORDER BY f.field_name)) AS fields_arr
FROM (
SELECT header_model AS model FROM seed
UNION ALL
SELECT line_model AS model FROM seed
) m
JOIN public.ir_field_src f ON f.model = m.model
GROUP BY m.model
) t
),
aliases AS (
SELECT jsonb_build_object(
'header', (SELECT header_model FROM seed),
'line', (SELECT line_model FROM seed)
) AS v
),
flat AS (
SELECT to_jsonb(array_agg(qualified ORDER BY qualified)) AS v
FROM (
SELECT 'header.' || f.field_name AS qualified
FROM public.ir_field_src f
JOIN seed s ON f.model = s.header_model
UNION ALL
SELECT 'line.' || f.field_name
FROM public.ir_field_src f
JOIN seed s ON f.model = s.line_model
) q
),
payload AS (
SELECT jsonb_build_object(
'by_model', (SELECT v FROM by_model),
'aliases', (SELECT v FROM aliases),
'flat', (SELECT v FROM flat),
'tag', 'E2E_VERIFY_EXISTING',
'scope', 'account',
'seed_ir_field_src_id', (SELECT seed_id FROM seed)
) AS v
)
UPDATE public.portal_view_common pvc
SET display_fields = payload.v,
updated_at = now()
FROM payload
WHERE pvc.action_xmlid = 'e2e.verify.account_payment_move'
RETURNING pvc.action_xmlid, jsonb_typeof(pvc.display_fields) AS display_fields_type, pvc.display_fields;
✅ RETURNING で 1行返って、display_fields_type = 'object' なら成功です。
4) 片付け(検証用行だけ消す)
DELETE FROM public.portal_view_common
WHERE action_xmlid = 'e2e.verify.account_payment_move';
コメントを残す