@@ -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