details: https://code.tryton.org/tryton/commit/f68616c5d23b
branch: default
user: Cédric Krier <[email protected]>
date: Fri Apr 24 23:01:55 2026 +0200
description:
Use ids from BrowseList instance instead of construct a new list
diffstat:
trytond/trytond/model/fields/many2one.py | 6 +++++
trytond/trytond/model/modelsql.py | 15 +++++++++---
trytond/trytond/model/modelstorage.py | 37 ++++++++++++++++++++++++-------
3 files changed, 45 insertions(+), 13 deletions(-)
diffs (152 lines):
diff -r a284570bb708 -r f68616c5d23b trytond/trytond/model/fields/many2one.py
--- a/trytond/trytond/model/fields/many2one.py Fri Apr 24 23:21:41 2026 +0200
+++ b/trytond/trytond/model/fields/many2one.py Fri Apr 24 23:01:55 2026 +0200
@@ -127,6 +127,12 @@
value = int(value)
return super().sql_format(value)
+ def _domain_value(self, operator, value):
+ from ..modelstorage import BrowseList
+ if isinstance(value, BrowseList):
+ value = value.ids
+ return super()._domain_value(operator, value)
+
def convert_domain_path(self, domain, tables):
cursor = Transaction().connection.cursor()
table, _ = tables[None]
diff -r a284570bb708 -r f68616c5d23b trytond/trytond/model/modelsql.py
--- a/trytond/trytond/model/modelsql.py Fri Apr 24 23:21:41 2026 +0200
+++ b/trytond/trytond/model/modelsql.py Fri Apr 24 23:01:55 2026 +0200
@@ -29,8 +29,8 @@
from . import fields
from .descriptors import dualmethod
from .modelstorage import (
- AccessError, ModelStorage, RequiredValidationError, SizeValidationError,
- ValidationError, is_leaf)
+ AccessError, BrowseList, ModelStorage, RequiredValidationError,
+ SizeValidationError, ValidationError, is_leaf)
from .modelview import ModelView
@@ -1526,7 +1526,10 @@
fields_to_set = {}
actions = iter(args)
for records, values in zip(actions, actions):
- ids = [r.id for r in records]
+ if isinstance(records, BrowseList):
+ ids = records.ids
+ else:
+ ids = [r.id for r in records]
values = values.copy()
# Clean values
@@ -2349,8 +2352,12 @@
def lock(cls, records=None):
transaction = Transaction()
if records is not None:
+ if isinstance(records, BrowseList):
+ record_ids = set(records.ids)
+ else:
+ record_ids = set(map(int, records))
new_ids = set(transaction.create_records[cls.__name__])
- ids = [id_ for id_ in map(int, records) if id_ not in new_ids]
+ ids = record_ids - new_ids
transaction.lock_records(cls._table, ids)
else:
transaction.lock_table(cls._table)
diff -r a284570bb708 -r f68616c5d23b trytond/trytond/model/modelstorage.py
--- a/trytond/trytond/model/modelstorage.py Fri Apr 24 23:21:41 2026 +0200
+++ b/trytond/trytond/model/modelstorage.py Fri Apr 24 23:01:55 2026 +0200
@@ -267,6 +267,11 @@
cls, records, icon, label, description=None, user=None, **extra):
pool = Pool()
Notification = pool.get('res.notification')
+ if isinstance(records, BrowseList):
+ record_ids = records.ids
+ else:
+ record_ids = [r.id for r in records]
+ records_json = json.dumps(record_ids)
for transaction, sub_records in groupby(
records, lambda r: r._transaction):
with Transaction().set_current_transaction(transaction):
@@ -278,7 +283,7 @@
label=label,
description=description,
model=cls.__name__,
- records=json.dumps([r.id for r in records]),
+ records=records_json,
**extra))
@classmethod
@@ -487,7 +492,10 @@
# Do not queue because records will be deleted
trigger.trigger_action(records)
- record_ids = [r.id for r in records]
+ if isinstance(records, BrowseList):
+ record_ids = records.ids
+ else:
+ record_ids = [r.id for r in records]
for fname, field in cls._fields.items():
if isinstance(field, fields.Binary):
field.queue_for_removal(cls, fname, record_ids)
@@ -661,7 +669,10 @@
assert _default_fields() <= fields_.keys(), (
f"Invalid default fields {_default_fields() - fields_.keys()} "
f"for {cls.__name__}")
- ids = list(map(int, records))
+ if isinstance(records, BrowseList):
+ ids = records.ids
+ else:
+ ids = list(map(int, records))
with without_check_access():
values = {
d['id']: d for d in cls.read(ids, fields_names=fields_names)}
@@ -671,6 +682,10 @@
data = convert_data(fields_, values[id_], default_values)
to_create.append(data)
new_records = cls.create(to_create)
+ if isinstance(new_records, BrowseList):
+ new_ids = new_records.ids
+ else:
+ new_ids = list(map(int, new_records))
fields_translate = {}
for field_name, field in fields_.items():
@@ -682,9 +697,9 @@
('translatable', '=', True),
])
if langs:
- id2new_records = defaultdict(list)
- for id_, new_record in zip(ids, new_records):
- id2new_records[id_].append(new_record)
+ id2new_ids = defaultdict(list)
+ for id_, new_id in zip(ids, new_ids):
+ id2new_ids[id_].append(new_id)
fields_names = list(fields_translate.keys()) + ['id']
for lang in langs:
# Prevent fuzzing translations when copying as the terms
@@ -696,7 +711,7 @@
values = cls.read(ids, fields_names=fields_names)
to_write = []
for data in values:
- to_write.append(id2new_records[data['id']])
+ to_write.append(cls.browse(id2new_ids[data['id']]))
to_write.append(
convert_data(
fields_translate, data, default_values))
@@ -790,8 +805,12 @@
fields_names = ['id']
if 'id' not in fields_names:
fields_names.append('id')
- rows = cls.read(list(map(int, records)), fields_names)
- index = {r.id: i for i, r in enumerate(records)}
+ if isinstance(records, BrowseList):
+ ids = records.ids
+ else:
+ ids = list(map(int, records))
+ rows = cls.read(ids, fields_names)
+ index = {id: i for i, id in enumerate(ids)}
rows.sort(key=lambda r: index[r['id']])
return rows