changeset 876cb2ea8fe3 in modules/account_invoice:default
details: 
https://hg.tryton.org/modules/account_invoice?cmd=changeset&node=876cb2ea8fe3
description:
        Add validate_fields to ModelStorage

        issue11303
        review386191002
diffstat:

 invoice.py      |  79 +++++++++++++++++++++++++++++++++-----------------------
 payment_term.py |  36 ++++++++++++++-----------
 2 files changed, 67 insertions(+), 48 deletions(-)

diffs (166 lines):

diff -r 8a3ddc2e8aa5 -r 876cb2ea8fe3 invoice.py
--- a/invoice.py        Mon Apr 11 20:13:16 2022 +0200
+++ b/invoice.py        Mon Apr 11 23:24:20 2022 +0200
@@ -1276,18 +1276,27 @@
     def validate(cls, invoices):
         super(Invoice, cls).validate(invoices)
         for invoice in invoices:
-            invoice.check_same_account()
             invoice.check_payment_lines()
 
-    def check_same_account(self):
-        for line in self.lines:
-            if (line.type == 'line'
-                    and line.account == self.account):
-                raise InvoiceValidationError(
-                    gettext('account_invoice.msg_invoice_same_account_line',
-                        account=self.account.rec_name,
-                        invoice=self.rec_name,
-                        line=line.rec_name))
+    @classmethod
+    def validate_fields(cls, invoices, field_names):
+        super().validate_fields(invoices, field_names)
+        cls.check_same_account(invoices, field_names)
+
+    @classmethod
+    def check_same_account(cls, invoices, field_names=None):
+        if field_names and not (field_names & {'lines', 'account'}):
+            return
+        for invoice in invoices:
+            for line in invoice.lines:
+                if (line.type == 'line'
+                        and line.account == invoice.account):
+                    raise InvoiceValidationError(
+                        gettext(
+                            'account_invoice.msg_invoice_same_account_line',
+                            account=invoice.account.rec_name,
+                            invoice=invoice.rec_name,
+                            line=line.rec_name))
 
     def check_payment_lines(self):
         amount = sum(l.debit - l.credit for l in self.lines_to_pay)
@@ -2442,20 +2451,23 @@
         return super(InvoiceLine, cls).copy(lines, default=default)
 
     @classmethod
-    def validate(cls, lines):
-        super(InvoiceLine, cls).validate(lines)
-        for line in lines:
-            line.check_same_account()
+    def validate_fields(cls, lines, field_names):
+        super().validate_fields(lines, field_names)
+        cls.check_same_account(lines, field_names)
 
-    def check_same_account(self):
-        if self.type == 'line':
-            if (self.invoice
-                    and self.account == self.invoice.account):
+    @classmethod
+    def check_same_account(cls, lines, field_names=None):
+        if field_names and not (field_names & {'type', 'invoice', 'account'}):
+            return
+        for line in lines:
+            if (line.type == 'line'
+                    and line.invoice
+                    and line.account == line.invoice.account):
                 raise InvoiceLineValidationError(
                     gettext('account_invoice.msg_invoice_same_account_line',
-                        account=self.account.rec_name,
-                        invoice=self.invoice.rec_name,
-                        line=self.rec_name))
+                        account=line.account.rec_name,
+                        invoice=line.invoice.rec_name,
+                        line=line.rec_name))
 
     def _compute_taxes(self):
         pool = Pool()
@@ -2763,18 +2775,21 @@
         return super(InvoiceTax, cls).create(vlist)
 
     @classmethod
-    def validate(cls, taxes):
-        super().validate(taxes)
-        for tax in taxes:
-            tax.check_same_account()
+    def validate_fields(cls, taxes, field_names):
+        super().validate_fields(taxes, field_names)
+        cls.check_same_account(taxes, field_names)
 
-    def check_same_account(self):
-        if self.account == self.invoice.account:
-            raise InvoiceTaxValidationError(
-                gettext('account_invoice.msg_invoice_same_account_line',
-                    account=self.account.rec_name,
-                    invoice=self.invoice.rec_name,
-                    line=self.rec_name))
+    @classmethod
+    def check_same_account(cls, taxes, field_names=None):
+        if field_names and not (field_names & {'account', 'invoice'}):
+            return
+        for tax in taxes:
+            if tax.account == tax.invoice.account:
+                raise InvoiceTaxValidationError(
+                    gettext('account_invoice.msg_invoice_same_account_line',
+                        account=tax.account.rec_name,
+                        invoice=tax.invoice.rec_name,
+                        line=tax.rec_name))
 
     def get_move_lines(self):
         '''
diff -r 8a3ddc2e8aa5 -r 876cb2ea8fe3 payment_term.py
--- a/payment_term.py   Mon Apr 11 20:13:16 2022 +0200
+++ b/payment_term.py   Mon Apr 11 23:24:20 2022 +0200
@@ -33,17 +33,20 @@
         cls._order.insert(0, ('name', 'ASC'))
 
     @classmethod
-    def validate(cls, terms):
-        super(PaymentTerm, cls).validate(terms)
-        for term in terms:
-            term.check_remainder()
+    def validate_fields(cls, terms, field_names):
+        super().validate_fields(terms, field_names)
+        cls.check_remainder(terms, field_names)
 
-    def check_remainder(self):
-        if not self.lines or not self.lines[-1].type == 'remainder':
-            raise PaymentTermValidationError(
-                gettext('account_invoice'
-                    '.msg_payment_term_missing_last_remainder',
-                    payment_term=self.rec_name))
+    @classmethod
+    def check_remainder(cls, terms, field_names=None):
+        if field_names and 'lines' not in field_names:
+            return
+        for term in terms:
+            if not term.lines or not term.lines[-1].type == 'remainder':
+                raise PaymentTermValidationError(gettext(
+                        'account_invoice'
+                        '.msg_payment_term_missing_last_remainder',
+                        payment_term=term.rec_name))
 
     def compute(self, amount, currency, date):
         """Calculate payment terms and return a list of tuples
@@ -194,15 +197,16 @@
         return Decimal(number).quantize(quantize)
 
     @classmethod
-    def validate(cls, lines):
-        super(PaymentTermLine, cls).validate(lines)
-        cls.check_ratio_and_divisor(lines)
+    def validate_fields(cls, lines, field_names):
+        super().validate_fields(lines, field_names)
+        cls.check_ratio_and_divisor(lines, field_names)
 
     @classmethod
-    def check_ratio_and_divisor(cls, lines):
+    def check_ratio_and_divisor(cls, lines, field_names=None):
         "Check consistency between ratio and divisor"
-        # Use a copy because on_change will change the records
-        for line in cls.browse(lines):
+        if field_names and not (field_names & {'type', 'ratio', 'divisor'}):
+            return
+        for line in lines:
             if line.type not in ('percent', 'percent_on_total'):
                 continue
             if line.ratio is None or line.divisor is None:

Reply via email to