Skip to content

Commit

Permalink
Merge PR #405 into 14.0
Browse files Browse the repository at this point in the history
Signed-off-by NL66278
  • Loading branch information
OCA-git-bot committed Dec 5, 2023
2 parents b084355 + 2ec172d commit eddabb7
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 2 deletions.
46 changes: 45 additions & 1 deletion l10n_nl_tax_statement/models/account_move_line.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,53 @@ def _get_l10n_nl_vat_statement_protected_fields(self):
"tax_tag_ids",
]

def check_field_is_equal(self, changed_protected_field, values):
self.ensure_one()
field = self._fields.get(changed_protected_field)
old_value = self[changed_protected_field]
new_value = values[changed_protected_field]
if field.type in ["many2many", "one2many"]:
# if field is X2M , the only acceptable value is
# [[6,0,self[changed_protected_field].ids]]
# wich is what the web client posts in case there is a editable X2M in form
# that is unchanged.
# If it is a list of tuple-commands, and the last one is precisely
# values[changed_protected_field][2] == self[changed_protected_field].ids
# we will not accept any modification to protected fields,
# only the standard 6,0,[ids] coming from the default web edit.
return (
len(new_value) == 1
and new_value[0][0] == 6
and new_value[0][2] == old_value.ids
)
if new_value:
return old_value == new_value
return bool(old_value) == bool(new_value)

def write(self, values):
# before doing anything we check the nl_vat_statement:check_state,
if not self._l10n_nl_vat_statement_should_check_write(values):
return super().write(values)
# now we add code to check if any of the modified fields present in
# values are the same as existing field value. this is a known limitation
# of odoo web client, it passes all non-readonly value fields in a form
# for writing , even if the value has not been changed.
protected_fields = self._get_l10n_nl_vat_statement_protected_fields()
protected_fields_in_values = [x for x in values.keys() if x in protected_fields]
invalid_fields = set()
for this in self:
for protected_field in protected_fields_in_values:
is_equal = this.check_field_is_equal(protected_field, values)
if not is_equal:
# if the field is invalid in even one
# of the records it cannot be popped
invalid_fields.add(protected_field)
for protected_field in protected_fields_in_values:
if protected_field not in invalid_fields:
values.pop(protected_field)
if self._l10n_nl_vat_statement_should_check_write(values):
self._l10n_nl_vat_statement_check_state()
for this in self:
this._l10n_nl_vat_statement_check_state()
return super().write(values)

@api.model
Expand Down
21 changes: 20 additions & 1 deletion l10n_nl_tax_statement/tests/test_l10n_nl_vat_statement.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

import datetime
import logging

from dateutil.relativedelta import relativedelta

Expand All @@ -13,6 +14,8 @@
from odoo.tests.common import TransactionCase
from odoo.tools import convert_file

_logger = logging.getLogger(__name__)


class TestVatStatement(TransactionCase):
def _load(self, module, *args):
Expand Down Expand Up @@ -157,6 +160,22 @@ def _create_test_invoice(self):
self.invoice_1 = invoice_form.save()
self.assertEqual(len(self.invoice_1.line_ids), 5)

# testing noop writing now allowed
for line in self.invoice_1.line_ids:
values = {"name": line.name}
self.assertEqual(line.write(values), True)
self.assertEqual(line.check_field_is_equal("name", values), True)
# testing noop writing on tax_id Many2Many allowed
for line in self.invoice_1.line_ids:
values = {"tax_ids": [(6, 0, line.tax_ids.ids)]}
self.assertEqual(line.check_field_is_equal("tax_ids", values), True)
self.assertEqual(line.write(values), True)

# testing no protected field code branch:
line = self.invoice_1.line_ids[0]
values = {"ref": 12345}
self.assertEqual(line.write(values), True)

def test_01_onchange(self):
daterange_type = self.env["date.range.type"].create({"name": "Type 1"})
daterange = self.env["date.range"].create(
Expand Down Expand Up @@ -355,7 +374,7 @@ def test_12_undeclared_invoice(self):
)
self.assertTrue(invoice_lines)
with self.assertRaises(UserError):
invoice_lines[0].date = fields.Date.today()
invoice_lines[0].date = fields.Date.today() + relativedelta(day=1)

def test_13_no_previous_statement_posted(self):
statement2 = self.env["l10n.nl.vat.statement"].create({"name": "Statement 2"})
Expand Down

0 comments on commit eddabb7

Please sign in to comment.