From d67589191e4e58e7f0ed43908acbae196fb4241d Mon Sep 17 00:00:00 2001
From: Patrick Hoste <pko@odoo.com>
Date: Wed, 16 Nov 2022 12:22:18 +0000
Subject: [PATCH] [FIX] mass_mailing: fix unsubscription_date when opt_out on
 create
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Before this commit when creating a mailing contact with a mailing
list opt_out at creation the unsubscription_date wasn't set.
Indeed, from the mailing contact view the mailing list uses an
editable list that passes all the values at create even when not set
contrary to when one update the contact only the changed values are
passed. This commit fix this issue.

Task-3070852

closes odoo/odoo#105867

Signed-off-by: Warnon Aurélien (awa) <awa@odoo.com>
---
 addons/mass_mailing/models/mailing_contact.py  |  2 +-
 addons/mass_mailing/tests/test_mailing_list.py | 16 ++++++++++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/addons/mass_mailing/models/mailing_contact.py b/addons/mass_mailing/models/mailing_contact.py
index 75ea8d0f15c7..025bf7b2d7ef 100644
--- a/addons/mass_mailing/models/mailing_contact.py
+++ b/addons/mass_mailing/models/mailing_contact.py
@@ -31,7 +31,7 @@ class MassMailingContactListRel(models.Model):
     def create(self, vals_list):
         now = fields.Datetime.now()
         for vals in vals_list:
-            if 'opt_out' in vals and 'unsubscription_date' not in vals:
+            if 'opt_out' in vals and not vals.get('unsubscription_date'):
                 vals['unsubscription_date'] = now if vals['opt_out'] else False
             if vals.get('unsubscription_date'):
                 vals['opt_out'] = True
diff --git a/addons/mass_mailing/tests/test_mailing_list.py b/addons/mass_mailing/tests/test_mailing_list.py
index 92b2924b8ba2..e7edabf42528 100644
--- a/addons/mass_mailing/tests/test_mailing_list.py
+++ b/addons/mass_mailing/tests/test_mailing_list.py
@@ -1,6 +1,9 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
+from datetime import datetime
+from freezegun import freeze_time
+
 from odoo import exceptions
 from odoo.addons.mass_mailing.tests.common import MassMailCommon
 from odoo.tests.common import Form, users
@@ -99,6 +102,19 @@ class TestMailingListMerge(MassMailCommon):
             new = new.with_context(default_list_ids=[list_id])
             self.assertFalse(any(contact.opt_out for contact in new))
 
+        with freeze_time('2022-01-01 12:00'):
+            contact_form = Form(self.env['mailing.contact'])
+            contact_form.name = 'Contact_test'
+            with contact_form.subscription_list_ids.new() as subscription:
+                subscription.list_id = self.mailing_list_1
+                subscription.opt_out = True
+            with contact_form.subscription_list_ids.new() as subscription:
+                subscription.list_id = self.mailing_list_2
+                subscription.opt_out = False
+            contact = contact_form.save()
+        self.assertEqual(contact.subscription_list_ids[0].unsubscription_date, datetime(2022, 1, 1, 12, 0, 0))
+        self.assertFalse(contact.subscription_list_ids[1].unsubscription_date)
+
     @users('user_marketing')
     def test_mailing_list_contact_copy_in_context_of_mailing_list(self):
         MailingContact = self.env['mailing.contact']
-- 
GitLab