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
 

Reply via email to