@@ -41,7 +41,7 @@ def make_index_name(table_name, column_name):
41
41
from .const import ENVIRON
42
42
from .domains import _adapt_one_domain , _replace_path , _valid_path_to , adapt_domains
43
43
from .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
45
45
from .inherit import for_each_inherit
46
46
from .misc import SelfPrintEvalContext , log_progress , version_gte
47
47
from .orm import env , invalidate
@@ -82,7 +82,7 @@ def make_index_name(table_name, column_name):
82
82
83
83
ResolvedExportsLine = namedtuple (
84
84
"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 " ,
86
86
)
87
87
88
88
@@ -105,64 +105,47 @@ def get_resolved_ir_exports(cr, models=None, fields=None, only_missing=False):
105
105
"""
106
106
assert bool (models ) ^ bool (fields ), "One of models or fields must be given, and not both."
107
107
extra_where = ""
108
- query_params = {}
108
+ extra_params = {}
109
109
if models :
110
110
extra_where += " AND field_model = ANY(%(models)s)"
111
- query_params ["models" ] = list (models )
111
+ extra_params ["models" ] = list (models )
112
112
if fields :
113
113
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 )
115
115
if only_missing :
116
116
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 []
118
131
cr .execute (
119
132
"""
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 )],
164
143
)
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
+ ]
166
149
167
150
168
151
def rename_ir_exports_fields (cr , models_fields_map ):
@@ -182,15 +165,16 @@ def rename_ir_exports_fields(cr, models_fields_map):
182
165
return
183
166
_logger .debug ("Renaming %d export template lines with renamed fields" , len (matching_exports ))
184
167
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
194
178
execute_values (
195
179
cr ,
196
180
"""
0 commit comments