Skip to content

Commit b910e43

Browse files
committed
[IMP] util.change_field_selection_values
Handle company_dependent fields. closes #316 Signed-off-by: Christophe Simonis (chs) <[email protected]>
1 parent cc87c6d commit b910e43

File tree

1 file changed

+49
-4
lines changed

1 file changed

+49
-4
lines changed

src/util/fields.py

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def make_index_name(table_name, column_name):
4141
from . import json
4242
from .const import ENVIRON
4343
from .domains import _adapt_one_domain, _replace_path, _valid_path_to, adapt_domains
44-
from .exceptions import SleepyDeveloperError
44+
from .exceptions import SleepyDeveloperError, UpgradeError
4545
from .helpers import _dashboard_actions, _validate_model, resolve_model_fields_path, table_of_model
4646
from .inherit import for_each_inherit
4747
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=()):
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

Comments
 (0)