@@ -41,7 +41,7 @@ def make_index_name(table_name, column_name):
4141from . import json
4242from .const import ENVIRON
4343from .domains import _adapt_one_domain , _replace_path , _valid_path_to , adapt_domains
44- from .exceptions import SleepyDeveloperError
44+ from .exceptions import SleepyDeveloperError , UpgradeError
4545from .helpers import _dashboard_actions , _validate_model , resolve_model_fields_path , table_of_model
4646from .inherit import for_each_inherit
4747from .misc import AUTO , log_progress , safe_eval , version_gte
@@ -1122,13 +1122,58 @@ def change_field_selection_values(cr, model, field, mapping, skip_inherit=()):
11221122 table = table_of_model (cr , model )
11231123
11241124 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+ }
11261153 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" )
11291156 ]
11301157 parallel_execute (cr , queries )
11311158
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+
11321177 if table_exists (cr , "ir_model_fields_selection" ):
11331178 cr .execute (
11341179 """
0 commit comments