@@ -41,7 +41,7 @@ def make_index_name(table_name, column_name):
4141from .const import ENVIRON
4242from .domains import _adapt_one_domain , _replace_path , _valid_path_to , adapt_domains
4343from .exceptions import SleepyDeveloperError
44- from .helpers import _dashboard_actions , _validate_model , table_of_model
44+ from .helpers import _dashboard_actions , _validate_model , resolve_model_fields_path , table_of_model
4545from .inherit import for_each_inherit
4646from .misc import SelfPrintEvalContext , log_progress , version_gte
4747from .orm import env , invalidate
@@ -82,7 +82,7 @@ def make_index_name(table_name, column_name):
8282
8383ResolvedExportsLine = namedtuple (
8484 "ResolvedExportsLine" ,
85- "export_id export_name export_model line_id path_parts part_index field_name field_model field_id relation_model " ,
85+ "export_id export_name export_model line_id fields_path resolved_path " ,
8686)
8787
8888
@@ -105,64 +105,47 @@ def get_resolved_ir_exports(cr, models=None, fields=None, only_missing=False):
105105 """
106106 assert bool (models ) ^ bool (fields ), "One of models or fields must be given, and not both."
107107 extra_where = ""
108- query_params = {}
108+ extra_params = {}
109109 if models :
110110 extra_where += " AND field_model = ANY(%(models)s)"
111- query_params ["models" ] = list (models )
111+ extra_params ["models" ] = list (models )
112112 if fields :
113113 extra_where += " AND (field_model, field_name) IN %(fields)s"
114- query_params ["fields" ] = tuple ((model , field ) for model , field in fields )
114+ extra_params ["fields" ] = tuple ((model , field ) for model , field in fields )
115115 if only_missing :
116116 extra_where += " AND field_id IS NULL"
117- # Resolve exports using a recursive CTE query
117+
118+ input_paths_query = """
119+ SELECT e.resource AS model, string_to_array(el.name, '/') AS path
120+ FROM ir_exports_line el
121+ JOIN ir_exports e ON el.export_id = e.id
122+ """
123+ resolved_paths = resolve_model_fields_path (
124+ cr ,
125+ input_paths_query = input_paths_query ,
126+ extra_where = extra_where ,
127+ extra_params = extra_params ,
128+ )
129+ if not resolved_paths :
130+ return []
118131 cr .execute (
119132 """
120- WITH RECURSIVE resolved_exports_fields AS (
121- -- non-recursive term
122- SELECT e.id AS export_id,
123- e.name AS export_name,
124- e.resource AS export_model,
125- el.id AS line_id,
126- string_to_array(el.name, '/') AS path_parts,
127- 1 AS part_index,
128- replace((string_to_array(el.name, '/'))[1], '.id', 'id') AS field_name,
129- e.resource AS field_model,
130- elf.id AS field_id,
131- elf.relation AS relation_model
132- FROM ir_exports_line el
133- JOIN ir_exports e
134- ON el.export_id = e.id
135- LEFT JOIN ir_model_fields elf
136- ON elf.model = e.resource AND elf.name = (string_to_array(el.name, '/'))[1]
137- LEFT JOIN ir_model em
138- ON em.model = e.resource
139-
140- UNION ALL
141-
142- -- recursive term
143- SELECT ref.export_id,
144- ref.export_name,
145- ref.export_model,
146- ref.line_id,
147- ref.path_parts,
148- ref.part_index + 1 AS part_index,
149- replace(ref.path_parts[ref.part_index + 1], '.id', 'id') AS field_name,
150- ref.relation_model AS field_model,
151- refmf.id AS field_id,
152- refmf.relation AS relation_model
153- FROM resolved_exports_fields ref
154- LEFT JOIN ir_model_fields refmf
155- ON refmf.model = ref.relation_model AND refmf.name = ref.path_parts[ref.part_index + 1]
156- WHERE cardinality(ref.path_parts) > ref.part_index AND ref.relation_model IS NOT NULL
157- )
158- SELECT *
159- FROM resolved_exports_fields
160- WHERE field_name != 'id' {extra_where}
161- ORDER BY export_id, line_id, part_index
162- """ .format (extra_where = extra_where ),
163- query_params ,
133+ SELECT e.id AS export_id,
134+ e.name AS export_name,
135+ e.resource AS export_model,
136+ el.id AS line_id,
137+ el.name AS fields_path
138+ FROM ir_exports_line el
139+ JOIN ir_exports e ON el.export_id = e.id
140+ WHERE (e.resource, el.name) IN %s
141+ """ ,
142+ [tuple ((m , "/" .join (p )) for m , p in resolved_paths )],
164143 )
165- return [ResolvedExportsLine (** row ) for row in cr .dictfetchall ()]
144+ return [
145+ ResolvedExportsLine (resolved_path = resolved_path , ** row )
146+ for row in cr .dictfetchall ()
147+ for resolved_path in resolved_paths .get ((row ["export_model" ], tuple (row ["fields_path" ].split ("/" ))), ())
148+ ]
166149
167150
168151def rename_ir_exports_fields (cr , models_fields_map ):
@@ -182,15 +165,16 @@ def rename_ir_exports_fields(cr, models_fields_map):
182165 return
183166 _logger .debug ("Renaming %d export template lines with renamed fields" , len (matching_exports ))
184167 fixed_lines_paths = {}
185- for row in matching_exports :
186- assert row .field_model in models_fields_map
187- fields_map = models_fields_map [row .field_model ]
188- assert row .field_name in fields_map
189- assert row .path_parts [row .part_index - 1 ] == row .field_name
190- new_field_name = fields_map [row .field_name ]
191- fixed_path = list (row .path_parts )
192- fixed_path [row .part_index - 1 ] = new_field_name
193- fixed_lines_paths [row .line_id ] = fixed_path
168+ for export_line_row in matching_exports :
169+ resolved_path = export_line_row .resolved_path
170+ assert resolved_path .field_model in models_fields_map
171+ fields_map = models_fields_map [resolved_path .field_model ]
172+ assert resolved_path .field_name in fields_map
173+ assert resolved_path .path [resolved_path .part_index - 1 ] == resolved_path .field_name
174+ new_field_name = fields_map [resolved_path .field_name ]
175+ fixed_path = list (resolved_path .path )
176+ fixed_path [resolved_path .part_index - 1 ] = new_field_name
177+ fixed_lines_paths [export_line_row .line_id ] = fixed_path
194178 execute_values (
195179 cr ,
196180 """
0 commit comments