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: