@@ -40,7 +40,13 @@ def make_index_name(table_name, column_name):
40
40
from .const import ENVIRON
41
41
from .domains import _adapt_one_domain , _replace_path , _valid_path_to , adapt_domains
42
42
from .exceptions import SleepyDeveloperError
43
- from .helpers import _dashboard_actions , _validate_model , resolve_model_fields_path , table_of_model
43
+ from .helpers import (
44
+ _dashboard_actions ,
45
+ _remove_export_lines ,
46
+ _validate_model ,
47
+ resolve_model_fields_path ,
48
+ table_of_model ,
49
+ )
44
50
from .inherit import for_each_inherit
45
51
from .misc import SelfPrintEvalContext , log_progress , version_gte
46
52
from .orm import env , invalidate
@@ -79,69 +85,6 @@ def make_index_name(table_name, column_name):
79
85
)
80
86
81
87
82
- def _get_resolved_ir_exports (cr , models = None , fields = None ):
83
- """
84
- Return a list of ir.exports.line records which models or fields match the given arguments.
85
-
86
- Export lines can reference nested models through relationship field "paths"
87
- (e.g. "partner_id/country_id/name"), therefore these needs to be resolved properly.
88
-
89
- Only one of ``models`` or ``fields`` arguments should be provided.
90
-
91
- :param list[str] models: a list of model names to match in exports
92
- :param list[(str, str)] fields: a list of (model, field) tuples to match in exports
93
- :return: the resolved field paths parts for each matched export line id
94
- :rtype: dict[int, list[FieldsPathPart]]
95
-
96
- :meta private: exclude from online docs
97
- """
98
- assert bool (models ) ^ bool (fields ), "One of models or fields must be given, and not both."
99
-
100
- # Get the model fields paths for exports.
101
- # When matching fields we can already broadly filter on field names (will be double-checked later).
102
- # When matching models we can't exclude anything because we don't know intermediate models.
103
- where = ""
104
- params = {}
105
- if fields :
106
- fields = {(model , fields ) for model , fields in fields } # noqa: C416 # make sure set[tuple]
107
- where = "WHERE el.name ~ ANY(%(field_names)s)"
108
- params ["field_names" ] = [f [1 ] for f in fields ]
109
- cr .execute (
110
- """
111
- SELECT el.id, e.resource AS model, string_to_array(el.name, '/') AS path
112
- FROM ir_exports e
113
- JOIN ir_exports_line el ON e.id = el.export_id
114
- {where}
115
- """ .format (where = where ),
116
- params ,
117
- )
118
- paths_to_line_ids = {}
119
- for line_id , model , path in cr .fetchall ():
120
- paths_to_line_ids .setdefault ((model , tuple (path )), set ()).add (line_id )
121
-
122
- # Resolve intermediate models for all model fields paths, filter only matching paths parts
123
- matching_paths_parts = {}
124
- for model , path in paths_to_line_ids :
125
- resolved_paths = resolve_model_fields_path (cr , model , path )
126
- if fields :
127
- matching_parts = [p for p in resolved_paths if (p .field_model , p .field_name ) in fields ]
128
- else :
129
- matching_parts = [p for p in resolved_paths if p .field_model in models ]
130
- if not matching_parts :
131
- continue
132
- matching_paths_parts [(model , path )] = matching_parts
133
-
134
- # Return the matched parts for each export line id
135
- result = {}
136
- for (model , path ), matching_parts in matching_paths_parts .items ():
137
- line_ids = paths_to_line_ids .get ((model , path ))
138
- if not line_ids :
139
- continue # wut?
140
- for line_id in line_ids :
141
- result .setdefault (line_id , []).extend (matching_parts )
142
- return result
143
-
144
-
145
88
def ensure_m2o_func_field_data (cr , src_table , column , dst_table ):
146
89
"""
147
90
Fix broken m2o relations.
@@ -266,9 +209,7 @@ def clean_context(context):
266
209
)
267
210
268
211
# ir.exports.line
269
- matching_exports = _get_resolved_ir_exports (cr , fields = [(model , fieldname )])
270
- if matching_exports :
271
- cr .execute ("DELETE FROM ir_exports_line WHERE id IN %s" , [tuple (matching_exports .keys ())])
212
+ _remove_export_lines (cr , model , fieldname )
272
213
273
214
def adapter (leaf , is_or , negated ):
274
215
# replace by TRUE_LEAF, unless negated or in a OR operation but not negated
@@ -1153,12 +1094,12 @@ def _update_field_usage_multi(cr, models, old, new, domain_adapter=None, skip_in
1153
1094
[r"\y{}\y" .format (old )],
1154
1095
)
1155
1096
fixed_lines_paths = {}
1156
- for line_id , model , path in cr .fetchall ():
1097
+ for line_id , line_model , line_path in cr .fetchall ():
1157
1098
new_path = [
1158
1099
new if x .field_name == old and x .field_model in only_models else x .field_name
1159
- for x in resolve_model_fields_path (cr , model , path )
1100
+ for x in resolve_model_fields_path (cr , line_model , line_path )
1160
1101
]
1161
- if len (new_path ) == len (path ) and new_path != path :
1102
+ if len (new_path ) == len (line_path ) and new_path != line_path :
1162
1103
fixed_lines_paths [line_id ] = "/" .join (new_path )
1163
1104
if fixed_lines_paths :
1164
1105
cr .execute (
0 commit comments