details:   https://code.tryton.org/tryton/commit/0795dca1e366
branch:    default
user:      sbend <[email protected]>
date:      Tue Sep 22 12:35:06 2026 +0200
description:
        Use the summary as the fallback record name for lines without a product

        Closes #14198
diffstat:

 modules/account_invoice/invoice.py |  31 ++++++++++++++++++++-----------
 modules/purchase/purchase.py       |  20 +++++++++++++++-----
 modules/sale/sale.py               |  20 +++++++++++++++-----
 3 files changed, 50 insertions(+), 21 deletions(-)

diffs (128 lines):

diff -r d5ea3f916372 -r 0795dca1e366 modules/account_invoice/invoice.py
--- a/modules/account_invoice/invoice.py        Mon Sep 21 15:28:29 2026 +0200
+++ b/modules/account_invoice/invoice.py        Tue Sep 22 12:35:06 2026 +0200
@@ -3054,19 +3054,27 @@
     def get_rec_name(self, name):
         pool = Pool()
         Lang = pool.get('ir.lang')
-        if self.product:
+        name = self.product.rec_name if self.product else self.summary
+        if not name and self.account:
+            name = self.account.rec_name
+
+        if self.type == 'line':
             lang = Lang.get()
-            prefix = (lang.format_number_symbol(
-                self.quantity or 0, self.unit, digits=self.unit.digits)
-                + ' %s' % self.product.rec_name)
-        elif self.account:
-            prefix = self.account.rec_name
-        else:
-            prefix = '(%s)' % self.id
+            if self.unit:
+                quantity = lang.format_number_symbol(
+                    self.quantity or 0, self.unit, digits=self.unit.digits)
+            else:
+                quantity = lang.format_number(self.quantity or 0)
+            if name:
+                name = f'{quantity} {name}'
+            else:
+                name = quantity
+        elif not name:
+            name = f'({self.id})'
+
         if self.invoice:
-            return '%s @ %s' % (prefix, self.invoice.rec_name)
-        else:
-            return prefix
+            name = f'{name} @ {self.invoice.rec_name}'
+        return name
 
     @classmethod
     def search_rec_name(cls, name, clause):
@@ -3079,6 +3087,7 @@
             ('invoice.rec_name', *clause[1:]),
             ('product.rec_name', *clause[1:]),
             ('account.rec_name', *clause[1:]),
+            ('summary', *clause[1:]),
             ]
 
     @classmethod
diff -r d5ea3f916372 -r 0795dca1e366 modules/purchase/purchase.py
--- a/modules/purchase/purchase.py      Mon Sep 21 15:28:29 2026 +0200
+++ b/modules/purchase/purchase.py      Tue Sep 22 12:35:06 2026 +0200
@@ -2135,13 +2135,22 @@
     def get_rec_name(self, name):
         pool = Pool()
         Lang = pool.get('ir.lang')
-        if self.product:
+        name = self.product.rec_name if self.product else self.summary
+        if self.type == 'line':
             lang = Lang.get()
-            return (lang.format_number_symbol(
+            if self.unit:
+                quantity = lang.format_number_symbol(
                     self.quantity or 0, self.unit, digits=self.unit.digits)
-                + ' %s @ %s' % (self.product.rec_name, self.purchase.rec_name))
-        else:
-            return self.purchase.rec_name
+            else:
+                quantity = lang.format_number(self.quantity or 0)
+            if name:
+                name = f'{quantity} {name}'
+            else:
+                name = quantity
+        elif not name:
+            name = f'({self.id})'
+
+        return f'{name} @ {self.purchase.rec_name}'
 
     @classmethod
     def search_rec_name(cls, name, clause):
@@ -2153,6 +2162,7 @@
         return [bool_op,
             ('purchase.rec_name', *clause[1:]),
             ('product.rec_name', *clause[1:]),
+            ('summary', *clause[1:]),
             ]
 
     @classmethod
diff -r d5ea3f916372 -r 0795dca1e366 modules/sale/sale.py
--- a/modules/sale/sale.py      Mon Sep 21 15:28:29 2026 +0200
+++ b/modules/sale/sale.py      Tue Sep 22 12:35:06 2026 +0200
@@ -2287,13 +2287,22 @@
     def get_rec_name(self, name):
         pool = Pool()
         Lang = pool.get('ir.lang')
-        if self.product:
+        name = self.product.rec_name if self.product else self.summary
+        if self.type == 'line':
             lang = Lang.get()
-            return (lang.format_number_symbol(
+            if self.unit:
+                quantity = lang.format_number_symbol(
                     self.quantity or 0, self.unit, digits=self.unit.digits)
-                + ' %s @ %s' % (self.product.rec_name, self.sale.rec_name))
-        else:
-            return self.sale.rec_name
+            else:
+                quantity = lang.format_number(self.quantity or 0)
+            if name:
+                name = f'{quantity} {name}'
+            else:
+                name = quantity
+        elif not name:
+            name = f'({self.id})'
+
+        return f'{name} @ {self.sale.rec_name}'
 
     @classmethod
     def search_rec_name(cls, name, clause):
@@ -2305,6 +2314,7 @@
         return [bool_op,
             ('sale.rec_name', *clause[1:]),
             ('product.rec_name', *clause[1:]),
+            ('summary', *clause[1:]),
             ]
 
     @classmethod

Reply via email to