7
7
8
8
9
9
from .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
13
21
14
22
from odoo .osv import expression
15
23
16
24
from odoo .upgrade .util .context import adapt_context , clean_context
17
25
from odoo .upgrade .util .domains import _adapt_one_domain
18
26
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
+
19
36
def 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
+
21
43
22
- def rename_field (cr , model , old , new , data , revisions = ()):
44
+ def rename_field (cr , model , old , new , data , revisions = ()):
23
45
spreadsheet = Spreadsheet (data )
24
46
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)
29
51
return spreadsheet .data , transform_revisions_data (revisions , * adapters )
30
52
53
+
31
54
def 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
+ )
33
58
34
59
35
60
def remove_field (cr , model , field , data , revisions = ()):
36
61
spreadsheet = Spreadsheet (data )
37
62
_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 )
42
67
spreadsheet .clean_empty_cells ()
43
68
return spreadsheet .data , transform_revisions_data (revisions , * adapters )
44
69
@@ -185,6 +210,27 @@ def _rename_data_source_field(cr, data_source, model, old, new):
185
210
data_source .order_by = _rename_order_by (data_source .order_by , old , new )
186
211
187
212
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
+
188
234
def _rename_order_by (order_by , old , new ):
189
235
if isinstance (order_by , list ):
190
236
return [_rename_order_by (order , old , new ) for order in order_by ]
@@ -269,6 +315,8 @@ def adapt_view_link(action):
269
315
return adapt_view_link_cells (spreadsheet , adapt_view_link )
270
316
271
317
318
+ ## Removal
319
+
272
320
273
321
def _remove_list_functions (content , list_ids , field ):
274
322
"""Remove functions such as ODOO.LIST(1, 'field') or ODOO.LIST.HEADER(1, 'field')"""
@@ -279,33 +327,18 @@ def filter_func(func_call_ast):
279
327
return remove_data_source_function (content , list_ids , {"ODOO.LIST" , "ODOO.LIST.HEADER" }, filter_func )
280
328
281
329
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 ]
289
335
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 )
303
338
304
339
def adapt_insert (cmd ):
305
340
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 )
309
342
310
343
# collect all list models inserted by INSERT_ODOO_LIST
311
344
# because we need the models to adapt RE_INSERT_ODOO_LIST
@@ -318,49 +351,57 @@ def collect_list(cmd):
318
351
def adapt_re_insert (cmd ):
319
352
olist = create_data_source_from_cmd (cmd )
320
353
if list_models [olist .id ] == model :
321
- olist . fields = [ column for column in olist . fields if column != field ]
354
+ _remove_field ( olist )
322
355
323
- return adapters + (
356
+ return (
324
357
CommandAdapter ("INSERT_ODOO_LIST" , collect_list ),
325
358
CommandAdapter ("INSERT_ODOO_LIST" , adapt_insert ),
326
359
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
- ),
331
360
)
332
361
333
362
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 ]
338
370
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 )
345
373
374
+ def adapt_insert (cmd ):
375
+ pivot = create_data_source_from_cmd (cmd )
376
+ _remove_field (pivot )
346
377
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 ),)
356
379
357
380
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 ):
359
399
def adapt_view_link (action ):
360
400
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
+ )
364
405
365
406
return adapt_view_link_cells (spreadsheet , adapt_view_link )
366
407
@@ -384,6 +425,7 @@ def adapter(*args, **kwargs):
384
425
domain = _adapt_one_domain (cr , field_model , field , "ignored" , data_source_model , domain , adapter = adapter )
385
426
return domain == expression .FALSE_DOMAIN
386
427
428
+
387
429
def domain_fields (domain ):
388
430
"""return all field names used in the domain
389
431
>>> domain_fields([['field1', '=', 1], ['field2', '=', 2]])
@@ -398,17 +440,11 @@ def pivot_measure_fields(pivot):
398
440
399
441
def pivot_fields (pivot ):
400
442
"""return all field names used in a pivot definition"""
401
- # try:
402
443
fields = set (pivot .col_group_by + pivot .row_group_by + pivot_measure_fields (pivot ) + domain_fields (pivot .domain ))
403
444
measure = pivot .order_by and pivot .order_by ["field" ]
404
445
if measure and measure != "__count" :
405
446
fields .add (measure )
406
447
return fields
407
- # except:
408
- # import ipdb;ipdb.set_trace()
409
- # return []
410
-
411
-
412
448
413
449
414
450
def chart_fields (chart ):
@@ -419,5 +455,6 @@ def chart_fields(chart):
419
455
fields .add (measure )
420
456
return fields
421
457
458
+
422
459
def list_order_fields (list_definition ):
423
460
return [order ["field" ] for order in list_definition .order_by ]
0 commit comments