From 084e0f6e7417033b633370255a441cb267943fe9 Mon Sep 17 00:00:00 2001 From: KKamaa Date: Wed, 17 Dec 2025 16:51:39 +0300 Subject: [PATCH 1/2] Draft: [18.0][FIX] change membership product on invoice line --- addons/membership/models/account_move.py | 48 ++++++++++++---------- addons/membership/tests/common.py | 9 ++++ addons/membership/tests/test_membership.py | 36 +++++++++++++++- 3 files changed, 71 insertions(+), 22 deletions(-) diff --git a/addons/membership/models/account_move.py b/addons/membership/models/account_move.py index 83f1a4f7a867e..82e6f3ee1f413 100644 --- a/addons/membership/models/account_move.py +++ b/addons/membership/models/account_move.py @@ -42,6 +42,22 @@ def write(self, vals): class AccountMoveLine(models.Model): _inherit = 'account.move.line' + def _prepare_membership_line_data(self): + self.ensure_one() + date_from = self.product_id.membership_date_from + date_to = self.product_id.membership_date_to + if (date_from and date_from < (self.move_id.invoice_date or date.min) < (date_to or date.min)): + date_from = self.move_id.invoice_date + return { + 'partner': self.move_id.partner_id.id, + 'membership_id': self.product_id.id, + 'member_price': self.price_unit, + 'date': fields.Date.today(), + 'date_from': date_from, + 'date_to': date_to, + 'account_invoice_line': self.id, + } + def write(self, vals): # OVERRIDE res = super(AccountMoveLine, self).write(vals) @@ -54,28 +70,18 @@ def write(self, vals): existing_memberships = self.env['membership.membership_line'].search([ ('account_invoice_line', 'in', to_process.ids)]) - to_process = to_process - existing_memberships.mapped('account_invoice_line') - - # All memberships already exist, break. - if not to_process: - return res + to_create = to_process - existing_memberships.mapped('account_invoice_line') memberships_vals = [] - for line in to_process: - date_from = line.product_id.membership_date_from - date_to = line.product_id.membership_date_to - if (date_from and date_from < (line.move_id.invoice_date or date.min) < (date_to or date.min)): - date_from = line.move_id.invoice_date - memberships_vals.append({ - 'partner': line.move_id.partner_id.id, - 'membership_id': line.product_id.id, - 'member_price': line.price_unit, - 'date': fields.Date.today(), - 'date_from': date_from, - 'date_to': date_to, - 'account_invoice_line': line.id, - }) - self.env['membership.membership_line'].create(memberships_vals) + for line in to_create: + memberships_vals.append(line._prepare_membership_line_data()) + + if memberships_vals: + self.env['membership.membership_line'].create(memberships_vals) + + for membership in existing_memberships: + membership.write(membership.account_invoice_line._prepare_membership_line_data()) + return res @api.model_create_multi @@ -111,5 +117,5 @@ def create(self, vals_list): 'date_to': date_to, 'account_invoice_line': line.id, }) - self.env['membership.membership_line'].create(memberships_vals) + memberships_vals.append(line._prepare_membership_line_data()) return lines diff --git a/addons/membership/tests/common.py b/addons/membership/tests/common.py index dcd8302a59997..1fc4e2b5933b1 100644 --- a/addons/membership/tests/common.py +++ b/addons/membership/tests/common.py @@ -12,6 +12,15 @@ class TestMembershipCommon(AccountTestInvoicingCommon): def setUpClass(cls): super().setUpClass() + cls.membership = cls.env['product.product'].create({ + 'membership': True, + 'membership_date_from': datetime.date.today() + relativedelta(months=-1), + 'membership_date_to': datetime.date.today() + relativedelta(days=-2), + 'name': 'Basic Limited', + 'type': 'service', + 'list_price': 90.00, + }) + # Test memberships cls.membership_1 = cls.env['product.product'].create({ 'membership': True, diff --git a/addons/membership/tests/test_membership.py b/addons/membership/tests/test_membership.py index 5d2d76495f60f..6e80787499a12 100644 --- a/addons/membership/tests/test_membership.py +++ b/addons/membership/tests/test_membership.py @@ -6,7 +6,7 @@ import time from odoo.addons.membership.tests.common import TestMembershipCommon -from odoo.tests import tagged +from odoo.tests import tagged, Form from odoo import fields @@ -158,3 +158,37 @@ def patched_today(*args, **kwargs): self.partner_1._compute_membership_state() self.assertEqual(invoice.state, 'cancel') self.assertEqual(self.partner_1.membership_state, 'canceled') + + def test_change_membership_on_account_move_line(self): + invoice = self.partner_1.create_membership_invoice( + self.membership, self.membership.list_price + ) + with Form(invoice) as invoice_form: + line_form = invoice_form.invoice_line_ids.edit(0) + line_form.product_id = self.membership_1 + line_form.save() + + invoice_line = invoice.invoice_line_ids[0] + self.assertEqual( + invoice_line.price_unit, + self.membership_1.list_price + ) + membership_line = self.env["membership.membership_line"].search( + [("account_invoice_line", "=", invoice_line.id)] + ) + self.assertEqual( + membership_line.membership_id, + self.membership_1 + ) + self.assertEqual( + membership_line.member_price, + self.membership_1.list_price + ) + self.assertEqual( + membership_line.date_from, + self.membership_1.membership_date_from + ) + self.assertEqual( + membership_line.date_to, + self.membership_1.membership_date_to + ) From a709d930ca83735db81025175e378530e9549116 Mon Sep 17 00:00:00 2001 From: Dan Kiplangat Date: Thu, 12 Mar 2026 17:07:51 +0300 Subject: [PATCH 2/2] [FIX] mail_group: 405 Method not allowed in mail_footer --- addons/mail_group/models/mail_group.py | 2 +- doc/cla/corporate/therp.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/mail_group/models/mail_group.py b/addons/mail_group/models/mail_group.py index 3b1f0c27d503b..5ae79e0b689c0 100644 --- a/addons/mail_group/models/mail_group.py +++ b/addons/mail_group/models/mail_group.py @@ -451,7 +451,7 @@ def _notify_members(self, message): 'mailto': f'{self.alias_email}', 'group_url': f'{base_url}/groups/{self.env["ir.http"]._slug(self)}', 'unsub_label': f'{base_url}/groups?unsubscribe', - 'unsub_url': unsubscribe_url, + 'unsub_url': f'{base_url}/groups?unsubscribe', } footer = self.env['ir.qweb']._render('mail_group.mail_group_footer', template_values, minimal_qcontext=True) member_body = append_content_to_html(body, footer, plaintext=False) diff --git a/doc/cla/corporate/therp.md b/doc/cla/corporate/therp.md index 7a29c6fa36a98..9715b9b3cb152 100644 --- a/doc/cla/corporate/therp.md +++ b/doc/cla/corporate/therp.md @@ -27,4 +27,5 @@ List of contributors: * Nikos Tsirintanis ntsirintanis@therp.nl https://github.com/ntsirintanis * Jan Verbeek jverbeek@therp.nl https://github.com/janverb * Danny de Jong ddejong@therp.nl https://github.com/ddejong-therp +* Dan Kiplangat dkiplangat@therp.nl https://github.com/Kiplangatdan