From dbc081ce9adf10a18e09de8ecbd44410c092fab1 Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Wed, 14 Dec 2022 15:18:15 +0100 Subject: [PATCH] [FIX] mail_environment: add search field for fetchmail.server's is_ssl Fixes ``` while parsing /home/odoo/16.0/addons/mail/views/fetchmail_views.xml:88 Error while validating view near: Unsearchable field 'is_ssl' in path 'is_ssl' in domain of ([('is_ssl', '=', True)])) ``` While upgrading --all on a setup with mail_environment installed. --- mail_environment/models/fetchmail_server.py | 16 ++++ mail_environment/tests/__init__.py | 1 + .../tests/test_mail_environment.py | 77 +++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 mail_environment/tests/__init__.py create mode 100644 mail_environment/tests/test_mail_environment.py diff --git a/mail_environment/models/fetchmail_server.py b/mail_environment/models/fetchmail_server.py index c6fa0de..f062422 100644 --- a/mail_environment/models/fetchmail_server.py +++ b/mail_environment/models/fetchmail_server.py @@ -4,6 +4,7 @@ import operator from odoo import api, fields, models +from odoo.osv.expression import FALSE_DOMAIN class FetchmailServer(models.Model): @@ -28,6 +29,7 @@ class FetchmailServer(models.Model): mail_fields.update(base_fields) return mail_fields + is_ssl = fields.Boolean(search="_search_is_ssl") server_type = fields.Selection(search="_search_server_type") @api.model @@ -38,6 +40,20 @@ class FetchmailServer(models.Model): """ return "incoming_mail" + @api.model + def _search_is_ssl(self, oper, value): + """Keep the is_ssl field searchable to allow domain in search view.""" + if not isinstance(value, bool): + return FALSE_DOMAIN + operators = { + "=": operator.eq, + "!=": operator.ne, + } + if oper not in operators: + return FALSE_DOMAIN + servers = self.search([]).filtered(lambda s: operators[oper](value, s.is_ssl)) + return [("id", "in", servers.ids)] + @api.model def _search_server_type(self, oper, value): operators = { diff --git a/mail_environment/tests/__init__.py b/mail_environment/tests/__init__.py new file mode 100644 index 0000000..82ffeb7 --- /dev/null +++ b/mail_environment/tests/__init__.py @@ -0,0 +1 @@ +from . import test_mail_environment diff --git a/mail_environment/tests/test_mail_environment.py b/mail_environment/tests/test_mail_environment.py new file mode 100644 index 0000000..44c396b --- /dev/null +++ b/mail_environment/tests/test_mail_environment.py @@ -0,0 +1,77 @@ +# Copyright 2018 Camptocamp (https://www.camptocamp.com). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) + + +from odoo.addons.server_environment.tests.common import ServerEnvironmentCase + +fetchmail_config = """ +[incoming_mail.fetchmail1] +server = safe_server +port = 993 +server_type = imap +is_ssl = 1 +attach = 1 +original = 1 +user = admin +password = admin +state = done +priority = 1 +active = 1 + +[incoming_mail.fetchmail2] +server = unsafe_server +port = 143 +server_type = imap +is_ssl = 0 +attach = 1 +original = 1 +user = admin +password = admin +state = done +priority = 1 +active = 1 +""" + + +class TestMailEnvironment(ServerEnvironmentCase): + def test_fetchmail_search_is_ssl(self): + fetchmail1 = self.env["fetchmail.server"].create({"name": "fetchmail1"}) + fetchmail2 = self.env["fetchmail.server"].create({"name": "fetchmail2"}) + with self.load_config(public=fetchmail_config): + # Test basic properties + self.assertTrue(fetchmail1.is_ssl) + self.assertEqual(fetchmail1.port, 993) + self.assertFalse(fetchmail2.is_ssl) + self.assertEqual(fetchmail2.port, 143) + + # Test is_ssl search method + self.assertIn( + fetchmail1, self.env["fetchmail.server"].search([("is_ssl", "=", True)]) + ) + self.assertIn( + fetchmail1, + self.env["fetchmail.server"].search([("is_ssl", "!=", False)]), + ) + self.assertNotIn( + fetchmail1, + self.env["fetchmail.server"].search([("is_ssl", "=", False)]), + ) + self.assertNotIn( + fetchmail1, + self.env["fetchmail.server"].search([("is_ssl", "!=", True)]), + ) + self.assertNotIn( + fetchmail2, self.env["fetchmail.server"].search([("is_ssl", "=", True)]) + ) + self.assertNotIn( + fetchmail2, + self.env["fetchmail.server"].search([("is_ssl", "!=", False)]), + ) + self.assertIn( + fetchmail2, + self.env["fetchmail.server"].search([("is_ssl", "=", False)]), + ) + self.assertIn( + fetchmail2, + self.env["fetchmail.server"].search([("is_ssl", "!=", True)]), + )