@@ -41,7 +41,7 @@ def make_index_name(table_name, column_name):
41
41
from . import json
42
42
from .const import ENVIRON
43
43
from .domains import _adapt_one_domain , _replace_path , _valid_path_to , adapt_domains
44
- from .exceptions import SleepyDeveloperError
44
+ from .exceptions import SleepyDeveloperError , UpgradeError
45
45
from .helpers import _dashboard_actions , _validate_model , resolve_model_fields_path , table_of_model
46
46
from .inherit import for_each_inherit
47
47
from .misc import AUTO , log_progress , safe_eval , version_gte
@@ -1122,13 +1122,58 @@ def change_field_selection_values(cr, model, field, mapping, skip_inherit=()):
1122
1122
table = table_of_model (cr , model )
1123
1123
1124
1124
if column_exists (cr , table , field ):
1125
- query = "UPDATE {table} SET {field}= %s::jsonb->>{field} WHERE {field} IN %s" .format (table = table , field = field )
1125
+ ctype = column_type (cr , table , field )
1126
+ if ctype == "varchar" :
1127
+ query = "UPDATE {table} t SET {column} = %(json)s::jsonb->>t.{column} WHERE t.{column} = ANY(%(keys)s)"
1128
+ elif ctype == "jsonb" :
1129
+ # company dependent selection field
1130
+ query = """
1131
+ WITH upd AS (
1132
+ SELECT t.id,
1133
+ jsonb_object_agg(v.key, COALESCE(%(json)s::jsonb->>v.value, v.value)) AS value
1134
+ FROM {table} t
1135
+ JOIN LATERAL jsonb_each_text(t.{column}) v
1136
+ ON true
1137
+ WHERE jsonb_path_query_array(t.{column}, '$.*') ?| %(keys)s
1138
+ AND {{parallel_filter}}
1139
+ GROUP BY t.id
1140
+ )
1141
+ UPDATE {table} t
1142
+ SET {column} = upd.value
1143
+ FROM upd
1144
+ WHERE upd.id = t.id
1145
+ """
1146
+ else :
1147
+ raise UpgradeError ("unsupported column type for selection field: {}" .format (ctype ))
1148
+
1149
+ data = {
1150
+ "keys" : list (mapping ),
1151
+ "json" : json .dumps (mapping ),
1152
+ }
1126
1153
queries = [
1127
- cr .mogrify (q , [ json . dumps ( mapping ), tuple ( mapping )] ).decode ()
1128
- for q in explode_query_range (cr , query , table = table )
1154
+ cr .mogrify (q , data ).decode ()
1155
+ for q in explode_query_range (cr , format_query ( cr , query , table = table , column = field ), table = table , alias = "t" )
1129
1156
]
1130
1157
parallel_execute (cr , queries )
1131
1158
1159
+ elif table_exists (cr , "ir_property" ):
1160
+ cr .execute ("SELECT id FROM ir_model_fields WHERE model=%s AND name=%s" , [model , field ])
1161
+ if cr .rowcount :
1162
+ fields_id = cr .fetchone ()[0 ]
1163
+ query = """
1164
+ UPDATE ir_property
1165
+ SET value_text = %(json)s::jsonb->>value_text
1166
+ WHERE value_text IN %(keys)s
1167
+ AND fields_id = %(fields_id)s
1168
+ """
1169
+ data = {
1170
+ "keys" : tuple (mapping ),
1171
+ "json" : json .dumps (mapping ),
1172
+ "fields_id" : fields_id ,
1173
+ }
1174
+ queries = [cr .mogrify (q , data ).decode () for q in explode_query_range (cr , query , table = "ir_property" )]
1175
+ parallel_execute (cr , queries )
1176
+
1132
1177
if table_exists (cr , "ir_model_fields_selection" ):
1133
1178
cr .execute (
1134
1179
"""
0 commit comments