77
88
99from .data_wrappers import Spreadsheet , create_data_source_from_cmd
10- from .misc import apply_in_all_spreadsheets , adapt_view_link_cells , remove_data_source_function , remove_lists , remove_pivots , remove_odoo_charts , transform_data_source_functions
11-
12- from .revisions import CommandAdapter , Drop , transform_revisions_data
10+ from .misc import (
11+ apply_in_all_spreadsheets ,
12+ adapt_view_link_cells ,
13+ remove_data_source_function ,
14+ remove_lists ,
15+ remove_pivots ,
16+ remove_odoo_charts ,
17+ transform_data_source_functions ,
18+ )
19+
20+ from .revisions import CommandAdapter , transform_revisions_data
1321
1422from odoo .osv import expression
1523
1624from odoo .upgrade .util .context import adapt_context , clean_context
1725from odoo .upgrade .util .domains import _adapt_one_domain
1826
27+
28+ # stolen from util.fields:def remove_fields
29+ def remove_adapter (leaf , is_or , negated ):
30+ # replace by TRUE_LEAF, unless negated or in a OR operation but not negated
31+ if is_or ^ negated :
32+ return [expression .FALSE_LEAF ]
33+ return [expression .TRUE_LEAF ]
34+
35+
1936def rename_field_in_all_spreadsheets (cr , model , old_value , new_value ):
20- apply_in_all_spreadsheets (cr , old_value , (lambda data , revisions_data : rename_field (cr , model , old_value , new_value , data , revisions_data )))
37+ apply_in_all_spreadsheets (
38+ cr ,
39+ old_value ,
40+ (lambda data , revisions_data : rename_field (cr , model , old_value , new_value , data , revisions_data )),
41+ )
42+
2143
22- def rename_field (cr , model , old , new , data , revisions = ()):
44+ def rename_field (cr , model , old , new , data , revisions = ()):
2345 spreadsheet = Spreadsheet (data )
2446 adapters = _rename_field_in_list (cr , spreadsheet , model , old , new )
25- adapters += _rename_field_in_pivot (cr , spreadsheet , model , old , new )
26- adapters += _rename_field_in_chart (cr , spreadsheet , model , old , new )
27- adapters += _rename_field_in_filters (cr , spreadsheet , model , old , new )
28- adapters += _rename_field_in_view_link (cr , spreadsheet , model , old , new )
47+ # adapters += _rename_field_in_pivot(cr, spreadsheet, model, old, new)
48+ # adapters += _rename_field_in_chart(cr, spreadsheet, model, old, new)
49+ # adapters += _rename_field_in_filters(cr, spreadsheet, model, old, new)
50+ # adapters += _rename_field_in_view_link(cr, spreadsheet, model, old, new)
2951 return spreadsheet .data , transform_revisions_data (revisions , * adapters )
3052
53+
3154def remove_field_in_all_spreadsheets (cr , model , field ):
32- apply_in_all_spreadsheets (cr , field , (lambda data , revisions_data : remove_field (cr , model , field , data , revisions_data )))
55+ apply_in_all_spreadsheets (
56+ cr , field , (lambda data , revisions_data : remove_field (cr , model , field , data , revisions_data ))
57+ )
3358
3459
3560def remove_field (cr , model , field , data , revisions = ()):
3661 spreadsheet = Spreadsheet (data )
3762 _remove_field_from_filter_matching (cr , spreadsheet , model , field )
38- adapters = _remove_field_from_list (spreadsheet , model , field )
39- adapters += _remove_field_from_pivot (spreadsheet , model , field )
40- adapters += _remove_field_from_graph (spreadsheet , model , field )
41- adapters += _remove_field_from_view_link (spreadsheet , model , field )
63+ adapters = _remove_field_from_list (cr , spreadsheet , model , field )
64+ adapters += _remove_field_from_pivot (cr , spreadsheet , model , field )
65+ adapters += _remove_field_from_graph (cr , spreadsheet , model , field )
66+ adapters += _remove_field_from_view_link (cr , spreadsheet , model , field )
4267 spreadsheet .clean_empty_cells ()
4368 return spreadsheet .data , transform_revisions_data (revisions , * adapters )
4469
@@ -185,6 +210,27 @@ def _rename_data_source_field(cr, data_source, model, old, new):
185210 data_source .order_by = _rename_order_by (data_source .order_by , old , new )
186211
187212
213+ def _remove_data_source_field (cr , data_source , model , field ):
214+ if data_source .model == model :
215+ data_source .domain = (
216+ _adapt_one_domain (
217+ cr , model , field , "ignored" , data_source .model , data_source .domain , remove_adapter , force_adapt = True
218+ )
219+ or data_source .domain
220+ )
221+
222+ adapt_context (data_source .context , field , "ignored" )
223+ if data_source .order_by :
224+ data_source .order_by = _remove_order_by (data_source .order_by , field )
225+
226+
227+ def _remove_order_by (order_by , field ):
228+ if isinstance (order_by , list ):
229+ return [order for order in order_by if order ["field" ] != field ]
230+ if order_by and order_by ["field" ] == field :
231+ return None
232+ return order_by
233+
188234def _rename_order_by (order_by , old , new ):
189235 if isinstance (order_by , list ):
190236 return [_rename_order_by (order , old , new ) for order in order_by ]
@@ -269,6 +315,8 @@ def adapt_view_link(action):
269315 return adapt_view_link_cells (spreadsheet , adapt_view_link )
270316
271317
318+ ## Removal
319+
272320
273321def _remove_list_functions (content , list_ids , field ):
274322 """Remove functions such as ODOO.LIST(1, 'field') or ODOO.LIST.HEADER(1, 'field')"""
@@ -279,33 +327,18 @@ def filter_func(func_call_ast):
279327 return remove_data_source_function (content , list_ids , {"ODOO.LIST" , "ODOO.LIST.HEADER" }, filter_func )
280328
281329
282- def _remove_field_from_list (spreadsheet : Spreadsheet , model , field ):
283- # remove only functions where the field appears otherwise
284- remove_column = []
285- for list in spreadsheet .lists :
286- if list .model == model :
287- remove_column .append (list .id )
288- list .fields = [column for column in list .fields if column != field ]
330+ def _remove_field_from_list (cr , spreadsheet : Spreadsheet , model , field ):
331+ def _remove_field (olist ):
332+ _remove_data_source_field (cr , olist , model , field )
333+ if olist .model == model :
334+ olist .fields = [column for column in olist .fields if column != field ]
289335
290- for cell in spreadsheet .cells :
291- cell ["content" ] = _remove_list_functions (cell ["content" ], remove_column , field )
292- lists_to_delete = [
293- list .id
294- for list in spreadsheet .lists
295- if list .model == model and field in (list_order_fields (list ) + domain_fields (list .domain ))
296- ]
297- # remove entirely lists where the field appears in the domain or in the order by
298- adapters = remove_lists (
299- spreadsheet ,
300- lists_to_delete ,
301- lambda list : list .model == model and field in (list_order_fields (list ) + domain_fields (list .domain )),
302- )
336+ for olist in spreadsheet .lists :
337+ _remove_field (olist )
303338
304339 def adapt_insert (cmd ):
305340 olist = create_data_source_from_cmd (cmd )
306- if olist .model == model and field in olist .fields :
307- remove_column .append (olist .id )
308- olist .fields = [column for column in olist .fields if column != field ]
341+ _remove_field (olist )
309342
310343 # collect all list models inserted by INSERT_ODOO_LIST
311344 # because we need the models to adapt RE_INSERT_ODOO_LIST
@@ -318,49 +351,57 @@ def collect_list(cmd):
318351 def adapt_re_insert (cmd ):
319352 olist = create_data_source_from_cmd (cmd )
320353 if list_models [olist .id ] == model :
321- olist . fields = [ column for column in olist . fields if column != field ]
354+ _remove_field ( olist )
322355
323- return adapters + (
356+ return (
324357 CommandAdapter ("INSERT_ODOO_LIST" , collect_list ),
325358 CommandAdapter ("INSERT_ODOO_LIST" , adapt_insert ),
326359 CommandAdapter ("RE_INSERT_ODOO_LIST" , adapt_re_insert ),
327- CommandAdapter (
328- "UPDATE_CELL" ,
329- lambda cmd : dict (cmd , content = _remove_list_functions (cmd .get ("content" ), remove_column , field )),
330- ),
331360 )
332361
333362
334- def _remove_field_from_pivot (spreadsheet : Spreadsheet , model , field ):
335- pivots_to_delete = [
336- pivot .id for pivot in spreadsheet .pivots if pivot .model == model and field in pivot_fields (pivot )
337- ]
363+ def _remove_field_from_pivot (cr , spreadsheet : Spreadsheet , model , field ):
364+ def _remove_field (pivot ):
365+ _remove_data_source_field (cr , pivot , model , field )
366+ if pivot .model == model :
367+ pivot .col_group_by = [f for f in pivot .col_group_by if f != field ]
368+ pivot .row_group_by = [f for f in pivot .row_group_by if f != field ]
369+ pivot .measures = [f for f in pivot .measures if f != field ]
338370
339- adapters = remove_pivots (
340- spreadsheet ,
341- pivots_to_delete ,
342- lambda pivot : pivot .model == model and field in pivot_fields (pivot ),
343- )
344- return adapters
371+ for pivot in spreadsheet .pivots :
372+ _remove_field (pivot )
345373
374+ def adapt_insert (cmd ):
375+ pivot = create_data_source_from_cmd (cmd )
376+ _remove_field (pivot )
346377
347- def _remove_field_from_graph (spreadsheet : Spreadsheet , model , field ):
348- charts_to_delete = [
349- chart .id for chart in spreadsheet .odoo_charts if chart .model == model and field in chart_fields (chart )
350- ]
351- return remove_odoo_charts (
352- spreadsheet ,
353- charts_to_delete ,
354- lambda chart : chart .model == model and field in chart_fields (chart ),
355- )
378+ return (CommandAdapter ("INSERT_PIVOT" , adapt_insert ),)
356379
357380
358- def _remove_field_from_view_link (spreadsheet : Spreadsheet , model , field ):
381+ def _remove_field_from_graph (cr , spreadsheet : Spreadsheet , model , field ):
382+ def _remove_field (chart ):
383+ _remove_data_source_field (cr , chart , model , field )
384+ if chart .model == model :
385+ chart .measure = chart .measure if chart .measure != field else None
386+
387+ for chart in spreadsheet .odoo_charts :
388+ _remove_field (chart )
389+
390+ def adapt_create_chart (cmd ):
391+ if cmd ["definition" ]["type" ].startswith ("odoo_" ):
392+ chart = create_data_source_from_cmd (cmd )
393+ _remove_field (chart )
394+
395+ return (CommandAdapter ("CREATE_CHART" , adapt_create_chart ),)
396+
397+
398+ def _remove_field_from_view_link (cr , spreadsheet : Spreadsheet , model , field ):
359399 def adapt_view_link (action ):
360400 if action ["modelName" ] == model :
361- changed = clean_context (action ["context" ], field )
362- if changed or field in domain_fields (action ["domain" ]):
363- return Drop
401+ clean_context (action ["context" ], field )
402+ action ["domain" ] = _adapt_one_domain (
403+ cr , model , field , "ignored" , model , action ["domain" ], remove_adapter , force_adapt = True
404+ )
364405
365406 return adapt_view_link_cells (spreadsheet , adapt_view_link )
366407
@@ -384,6 +425,7 @@ def adapter(*args, **kwargs):
384425 domain = _adapt_one_domain (cr , field_model , field , "ignored" , data_source_model , domain , adapter = adapter )
385426 return domain == expression .FALSE_DOMAIN
386427
428+
387429def domain_fields (domain ):
388430 """return all field names used in the domain
389431 >>> domain_fields([['field1', '=', 1], ['field2', '=', 2]])
@@ -398,17 +440,11 @@ def pivot_measure_fields(pivot):
398440
399441def pivot_fields (pivot ):
400442 """return all field names used in a pivot definition"""
401- # try:
402443 fields = set (pivot .col_group_by + pivot .row_group_by + pivot_measure_fields (pivot ) + domain_fields (pivot .domain ))
403444 measure = pivot .order_by and pivot .order_by ["field" ]
404445 if measure and measure != "__count" :
405446 fields .add (measure )
406447 return fields
407- # except:
408- # import ipdb;ipdb.set_trace()
409- # return []
410-
411-
412448
413449
414450def chart_fields (chart ):
@@ -419,5 +455,6 @@ def chart_fields(chart):
419455 fields .add (measure )
420456 return fields
421457
458+
422459def list_order_fields (list_definition ):
423460 return [order ["field" ] for order in list_definition .order_by ]
0 commit comments