From d95f747d392efc8e6f5c15859eca9a1b547fd617 Mon Sep 17 00:00:00 2001 From: Marcos Oitaben Date: Mon, 13 Nov 2023 16:26:23 +0100 Subject: [PATCH] [MIG] account_move_name_sequence: Migration to 17.0 --- account_move_name_sequence/__manifest__.py | 2 +- account_move_name_sequence/hooks.py | 5 +- .../models/account_journal.py | 37 ++++++------ .../models/account_move.py | 4 +- .../models/ir_sequence.py | 2 +- .../tests/test_account_move_name_seq.py | 60 ++++++------------- .../views/account_journal.xml | 4 +- .../views/account_move.xml | 6 +- 8 files changed, 44 insertions(+), 76 deletions(-) diff --git a/account_move_name_sequence/__manifest__.py b/account_move_name_sequence/__manifest__.py index 217ff296c..0feb2f643 100644 --- a/account_move_name_sequence/__manifest__.py +++ b/account_move_name_sequence/__manifest__.py @@ -7,7 +7,7 @@ { "name": "Account Move Number Sequence", - "version": "16.0.1.1.6", + "version": "17.0.1.0.0", "category": "Accounting", "license": "AGPL-3", "summary": "Generate journal entry number from sequence", diff --git a/account_move_name_sequence/hooks.py b/account_move_name_sequence/hooks.py index d499c3c73..86d330ef7 100644 --- a/account_move_name_sequence/hooks.py +++ b/account_move_name_sequence/hooks.py @@ -5,11 +5,8 @@ # @author: Francisco Luna # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import SUPERUSER_ID, api - -def post_init_hook(cr, registry): - env = api.Environment(cr, SUPERUSER_ID, {}) +def post_init_hook(env): create_journal_sequences(env) diff --git a/account_move_name_sequence/models/account_journal.py b/account_move_name_sequence/models/account_journal.py index a8813a81e..f5c855e9e 100644 --- a/account_move_name_sequence/models/account_journal.py +++ b/account_move_name_sequence/models/account_journal.py @@ -86,10 +86,11 @@ class AccountJournal(models.Model): @api.model def _prepare_sequence(self, vals, refund=False): code = vals.get("code") and vals["code"].upper() or "" - prefix = "%s%s/%%(range_year)s/" % (refund and "R" or "", code) + prefix = "{}{}/%(range_year)s/".format(refund and "R" or "", code) seq_vals = { - "name": "%s%s" - % (vals.get("name", _("Sequence")), refund and " " + _("Refund") or ""), + "name": "{}{}".format( + vals.get("name", _("Sequence")), refund and " " + _("Refund") or "" + ), "company_id": vals.get("company_id") or self.env.company.id, "implementation": "no_gap", "prefix": prefix, @@ -124,8 +125,8 @@ class AccountJournal(models.Model): move_domain, limit=1, order="id DESC" ) msg_err = ( - "Journal %s could not get sequence %s values based on current moves. " - "Using default values." % (self.id, refund and "refund" or "") + "Journal {} could not get sequence {} values based on current moves. " + "Using default values.".format(self.id, refund and "refund" or "") ) if not last_move: _logger.warning("%s %s", msg_err, "No moves found") @@ -168,7 +169,7 @@ class AccountJournal(models.Model): if month: prefix += "%(range_month)s" prefix3 = seq_format_values.get("prefix3") or "" - where_name_value = "%s%s%s%s%s%%" % ( + where_name_value = "{}{}{}{}{}%".format( prefix1, "_" * seq_format_values["year_length"], prefix2, @@ -177,31 +178,27 @@ class AccountJournal(models.Model): ) prefixes = prefix1 + prefix2 select_year = ( - "split_part(name, '%s', %d)" % (prefix2, prefixes.count(prefix2)) + f"split_part(name, '{prefix2}', {prefixes.count(prefix2)})" if prefix2 else "''" ) prefixes += prefix3 select_month = ( - "split_part(name, '%s', %d)" % (prefix3, prefixes.count(prefix3)) + f"split_part(name, '{prefix3}', {prefixes.count(prefix3)})" if prefix3 else "''" ) select_max_number = ( - "MAX(split_part(name, '%s', %d)::INTEGER) AS max_number" - % ( + "MAX(split_part(name, '{}', {})::INTEGER) AS max_number".format( prefixes[-1], prefixes.count(prefixes[-1]) + 1, ) ) query = ( - "SELECT %s, %s, %s FROM account_move " - "WHERE name LIKE %%s AND journal_id=%%s GROUP BY 1,2" - ) % ( - select_year, - select_month, - select_max_number, - ) + "SELECT {}, {}, {} FROM account_move " + "WHERE name LIKE %s AND journal_id=%s GROUP BY 1,2" + ).format(select_year, select_month, select_max_number) + # It is not using user input # pylint: disable=sql-injection self.env.cr.execute(query, (where_name_value, self.id)) @@ -231,11 +228,11 @@ class AccountJournal(models.Model): else: year = "20" + year if month: - date_from = fields.Date.to_date("%s-%s-1" % (year, month)) + date_from = fields.Date.to_date(f"{year}-{month}-1") date_to = fields.Date.end_of(date_from, "month") else: - date_from = fields.Date.to_date("%s-1-1" % year) - date_to = fields.Date.to_date("%s-12-31" % year) + date_from = fields.Date.to_date(f"{year}-1-1") + date_to = fields.Date.to_date(f"{year}-12-31") seq_vals["date_range_ids"].append( ( 0, diff --git a/account_move_name_sequence/models/account_move.py b/account_move_name_sequence/models/account_move.py index 3dfcfdaf4..f99bc9fde 100644 --- a/account_move_name_sequence/models/account_move.py +++ b/account_move_name_sequence/models/account_move.py @@ -75,5 +75,5 @@ class AccountMove(models.Model): self.flush_model(["name", "journal_id", "move_type", "state"]) return super()._fetch_duplicate_supplier_reference(only_posted=only_posted) - def _get_last_sequence(self, relaxed=False, with_prefix=None, lock=True): - return super()._get_last_sequence(relaxed, None, lock) + def _get_last_sequence(self, relaxed=False, with_prefix=None): + return super()._get_last_sequence(relaxed, None) diff --git a/account_move_name_sequence/models/ir_sequence.py b/account_move_name_sequence/models/ir_sequence.py index 7dc7d2656..75c5265cf 100644 --- a/account_move_name_sequence/models/ir_sequence.py +++ b/account_move_name_sequence/models/ir_sequence.py @@ -11,7 +11,7 @@ class IrSequence(models.Model): # https://github.com/odoo/odoo/pull/91019 date_obj = fields.Date.from_string(date) sequence_range = self.env["ir.sequence.date_range"] - prefix_suffix = "%s %s" % (self.prefix, self.suffix) + prefix_suffix = f"{self.prefix} {self.suffix}" if "%(range_day)s" in prefix_suffix: date_from = date_obj date_to = date_obj diff --git a/account_move_name_sequence/tests/test_account_move_name_seq.py b/account_move_name_sequence/tests/test_account_move_name_seq.py index d698a32a4..5d3e0ac6f 100644 --- a/account_move_name_sequence/tests/test_account_move_name_seq.py +++ b/account_move_name_sequence/tests/test_account_move_name_seq.py @@ -72,7 +72,7 @@ class TestAccountMoveNameSequence(TransactionCase): self.assertEqual(move.name, "/") move.action_post() seq = self.misc_journal.sequence_id - move_name = "%s%s" % (seq.prefix, "1".zfill(seq.padding)) + move_name = "{}{}".format(seq.prefix, "1".zfill(seq.padding)) move_name = move_name.replace("%(range_year)s", str(self.date.year)) self.assertEqual(move.name, move_name) self.assertTrue(seq.date_range_ids) @@ -170,22 +170,6 @@ class TestAccountMoveNameSequence(TransactionCase): self.assertEqual(in_invoice.name, "/") in_invoice.action_post() - move_reversal = ( - self.env["account.move.reversal"] - .with_context(active_model="account.move", active_ids=in_invoice.ids) - .create( - { - "journal_id": in_invoice.journal_id.id, - "reason": "no reason", - "refund_method": "cancel", - } - ) - ) - reversal = move_reversal.reverse_moves() - reversed_move = self.env["account.move"].browse(reversal["res_id"]) - self.assertTrue(reversed_move) - self.assertEqual(reversed_move.state, "posted") - in_invoice = in_invoice.copy( { "invoice_date": self.date, @@ -193,18 +177,14 @@ class TestAccountMoveNameSequence(TransactionCase): ) in_invoice.action_post() - move_reversal = ( - self.env["account.move.reversal"] - .with_context(active_model="account.move", active_ids=in_invoice.ids) - .create( - { - "journal_id": in_invoice.journal_id.id, - "reason": "no reason", - "refund_method": "modify", - } - ) + move_reversal = self.env["account.move.reversal"].create( + { + "move_ids": in_invoice.ids, + "journal_id": in_invoice.journal_id.id, + "reason": "no reason", + } ) - reversal = move_reversal.reverse_moves() + reversal = move_reversal.modify_moves() draft_invoice = self.env["account.move"].browse(reversal["res_id"]) self.assertTrue(draft_invoice) self.assertEqual(draft_invoice.state, "draft") @@ -217,18 +197,14 @@ class TestAccountMoveNameSequence(TransactionCase): ) in_invoice.action_post() - move_reversal = ( - self.env["account.move.reversal"] - .with_context(active_model="account.move", active_ids=in_invoice.ids) - .create( - { - "journal_id": in_invoice.journal_id.id, - "reason": "no reason", - "refund_method": "refund", - } - ) + move_reversal = self.env["account.move.reversal"].create( + { + "move_ids": in_invoice.ids, + "journal_id": in_invoice.journal_id.id, + "reason": "no reason", + } ) - reversal = move_reversal.reverse_moves() + reversal = move_reversal.refund_moves() draft_reversed_move = self.env["account.move"].browse(reversal["res_id"]) self.assertTrue(draft_reversed_move) self.assertEqual(draft_reversed_move.state, "draft") @@ -257,7 +233,7 @@ class TestAccountMoveNameSequence(TransactionCase): self.assertEqual(in_refund_invoice.name, "/") in_refund_invoice.action_post() seq = self.purchase_journal.refund_sequence_id - move_name = "%s%s" % (seq.prefix, "1".zfill(seq.padding)) + move_name = "{}{}".format(seq.prefix, "1".zfill(seq.padding)) move_name = move_name.replace("%(range_year)s", str(self.date.year)) self.assertEqual(in_refund_invoice.name, move_name) in_refund_invoice.button_draft() @@ -277,7 +253,7 @@ class TestAccountMoveNameSequence(TransactionCase): ) self.assertEqual(invoice.name, "/") invoice.action_post() - error_msg = "You cannot delete an item linked to a posted entry." + error_msg = "You can't delete a posted journal item. Don’t play games with your accounting records; reset the journal entry to draft before deleting it." with self.assertRaisesRegex(UserError, error_msg): invoice.unlink() invoice.button_draft() @@ -309,7 +285,7 @@ class TestAccountMoveNameSequence(TransactionCase): ) self.assertEqual(in_refund_invoice.name, "/") in_refund_invoice.action_post() - error_msg = "You cannot delete an item linked to a posted entry." + error_msg = "You can't delete a posted journal item. Don’t play games with your accounting records; reset the journal entry to draft before deleting it." with self.assertRaisesRegex(UserError, error_msg): in_refund_invoice.unlink() in_refund_invoice.button_draft() diff --git a/account_move_name_sequence/views/account_journal.xml b/account_move_name_sequence/views/account_journal.xml index e0a28adc1..102f49273 100644 --- a/account_move_name_sequence/views/account_journal.xml +++ b/account_move_name_sequence/views/account_journal.xml @@ -22,8 +22,8 @@ diff --git a/account_move_name_sequence/views/account_move.xml b/account_move_name_sequence/views/account_move.xml index c537b17a7..450e829c0 100644 --- a/account_move_name_sequence/views/account_move.xml +++ b/account_move_name_sequence/views/account_move.xml @@ -17,13 +17,11 @@ expr="//div[hasclass('oe_title')]//field[@name='name']" position="attributes" > - {'invisible': [('name', '=', '/')]} + name == '/' 1 - {'invisible': ['|', ('state', '!=', 'draft'), ('name', '!=', '/')]} + state != 'draft' or name != '/'