Merge PR #965 into 15.0

Signed-off-by etobella
This commit is contained in:
OCA-git-bot 2023-01-24 14:14:11 +00:00
commit 8a8e41a43e
24 changed files with 1182 additions and 0 deletions

View File

@ -0,0 +1,97 @@
===========================
Restrict follower selection
===========================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsocial-lightgray.png?logo=github
:target: https://github.com/OCA/social/tree/15.0/mail_restrict_follower_selection
:alt: OCA/social
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/social-15-0/social-15-0-mail_restrict_follower_selection
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/205/15.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module was written to allow you to restrict the selection of possible
followers. For example, if you use the social ERP functions only internally,
it makes sense to filter possible followers for being employees. Otherwise,
you'll get a quite crowded list of partners to choose from.
Moreover, the module disables the option to automatically add followers that
do not meet the domain.
**Table of contents**
.. contents::
:local:
Configuration
=============
To configure this module, you need to go to `System parameters` and adjust
`mail_restrict_follower_selection.domain` as you see fit. This restricts
followers globally, if you want to restrict only the followers for a certain
record type (or have different restrictions for different record types),
create a parameter `mail_restrict_follower_selection.domain.$your_model`.
As an example, you could use `[('category_id.name', '=', 'Employees')]` to allow
only contacts with 'Employees' tag to be added as follower - this also is
the default.
Note: This module won't change existing followers!
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/social/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/social/issues/new?body=module:%20mail_restrict_follower_selection%0Aversion:%2015.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Therp BV
* Creu Blanca
Contributors
~~~~~~~~~~~~
* Holger Brunn <hbrunn@therp.nl>
* Nguyen Tan Phuc <phuc.nt@komit-consulting.com>
* Enric Tobella <etobella@creublanca.es>
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/social <https://github.com/OCA/social/tree/15.0/mail_restrict_follower_selection>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@ -0,0 +1,5 @@
# Copyright (C) 2015 Therp BV <http://therp.nl>
# Copyright (C) 2017 Komit <http://www.komit-consulting.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import models

View File

@ -0,0 +1,16 @@
# Copyright (C) 2015 Therp BV <http://therp.nl>
# Copyright (C) 2017 Komit <http://www.komit-consulting.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
"name": "Restrict follower selection",
"version": "15.0.1.0.0",
"author": "Therp BV,Creu Blanca,Odoo Community Association (OCA)",
"license": "AGPL-3",
"category": "Social Network",
"website": "https://github.com/OCA/social",
"summary": "Define a domain from which followers can be selected",
"depends": ["mail"],
"data": ["data/ir_config_parameter.xml", "data/ir_actions.xml"],
"installable": True,
}

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record model="ir.actions.act_window" id="action_setup">
<field name="name">Configure the restriction on followers</field>
<field name="res_model">ir.config_parameter</field>
<field name="res_id" ref="parameter_domain" />
<field name="view_mode">form</field>
</record>
<record id="todo_setup" model="ir.actions.todo">
<field name="name">Configure the restriction on followers</field>
<field name="action_id" ref="action_setup" />
</record>
</odoo>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo noupdate="1">
<record id="parameter_domain" model="ir.config_parameter">
<field name="key">mail_restrict_follower_selection.domain</field>
<field name="value">[('category_id.name', '=', 'Employees')]</field>
</record>
</odoo>

View File

@ -0,0 +1,58 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mail_restrict_follower_selection
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2018-12-15 14:58+0000\n"
"Last-Translator: Maria Sparenberg <maria.sparenberg@gmx.net>\n"
"Language-Team: none\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.3\n"
#. module: mail_restrict_follower_selection
#: model:ir.actions.act_window,name:mail_restrict_follower_selection.action_setup
msgid "Configure the restriction on followers"
msgstr "Beschränkung der Abonnenten konfigurieren"
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers__display_name
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__display_name
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite__display_name
msgid "Display Name"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_followers
msgid "Document Followers"
msgstr "Abonnenten des Dokuments"
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_thread
msgid "Email Thread"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers__id
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__id
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite__id
msgid "ID"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_wizard_invite
msgid "Invite wizard"
msgstr "Assistent zum Einladen von Abonnenten"
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers____last_update
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread____last_update
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite____last_update
msgid "Last Modified on"
msgstr ""

View File

@ -0,0 +1,61 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mail_restrict_follower_selection
#
# Translators:
# Quentin THEURET <odoo@kerpeo.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-22 09:45+0000\n"
"PO-Revision-Date: 2018-06-18 09:40+0000\n"
"Last-Translator: c2cdidier <didier.donze@camptocamp.com>\n"
"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.0.1\n"
#. module: mail_restrict_follower_selection
#: model:ir.actions.act_window,name:mail_restrict_follower_selection.action_setup
msgid "Configure the restriction on followers"
msgstr "Configurer les restrictions sur les abonnés"
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers__display_name
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__display_name
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite__display_name
msgid "Display Name"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_followers
msgid "Document Followers"
msgstr "Suiveurs du document"
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_thread
msgid "Email Thread"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers__id
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__id
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite__id
msgid "ID"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_wizard_invite
msgid "Invite wizard"
msgstr "Assistant d'invitation"
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers____last_update
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread____last_update
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite____last_update
msgid "Last Modified on"
msgstr ""

View File

@ -0,0 +1,61 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mail_restrict_follower_selection
#
# Translators:
# Bole <bole@dajmi5.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-29 14:24+0000\n"
"PO-Revision-Date: 2016-11-29 14:24+0000\n"
"Last-Translator: Bole <bole@dajmi5.com>, 2016\n"
"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n"
"Language: hr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
#. module: mail_restrict_follower_selection
#: model:ir.actions.act_window,name:mail_restrict_follower_selection.action_setup
msgid "Configure the restriction on followers"
msgstr "Postavi ograničenja na pratitelje"
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers__display_name
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__display_name
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite__display_name
msgid "Display Name"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_followers
msgid "Document Followers"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_thread
msgid "Email Thread"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers__id
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__id
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite__id
msgid "ID"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_wizard_invite
msgid "Invite wizard"
msgstr "Čarobnjak za pozivnce"
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers____last_update
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread____last_update
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite____last_update
msgid "Last Modified on"
msgstr ""

View File

@ -0,0 +1,61 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mail_restrict_follower_selection
#
# Translators:
# Marius Marolla <mariusmarolla@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-05-17 01:02+0000\n"
"PO-Revision-Date: 2020-12-03 18:36+0000\n"
"Last-Translator: Alessandro Fiorino <alessandro.fiorino@digitaldomus.it>\n"
"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.10\n"
#. module: mail_restrict_follower_selection
#: model:ir.actions.act_window,name:mail_restrict_follower_selection.action_setup
msgid "Configure the restriction on followers"
msgstr "Imposta restrizioni sui follower"
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers__display_name
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__display_name
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite__display_name
msgid "Display Name"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_followers
msgid "Document Followers"
msgstr "Follower Documento"
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_thread
msgid "Email Thread"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers__id
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__id
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite__id
msgid "ID"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_wizard_invite
msgid "Invite wizard"
msgstr "Wizard Creazione Invito"
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers____last_update
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread____last_update
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite____last_update
msgid "Last Modified on"
msgstr ""

View File

@ -0,0 +1,55 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mail_restrict_follower_selection
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: mail_restrict_follower_selection
#: model:ir.actions.act_window,name:mail_restrict_follower_selection.action_setup
msgid "Configure the restriction on followers"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers__display_name
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__display_name
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite__display_name
msgid "Display Name"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_followers
msgid "Document Followers"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_thread
msgid "Email Thread"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers__id
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__id
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite__id
msgid "ID"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_wizard_invite
msgid "Invite wizard"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers____last_update
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread____last_update
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite____last_update
msgid "Last Modified on"
msgstr ""

View File

@ -0,0 +1,62 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mail_restrict_follower_selection
#
# Translators:
# Matjaž Mozetič <m.mozetic@matmoz.si>, 2015
msgid ""
msgstr ""
"Project-Id-Version: social (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-30 16:56+0000\n"
"PO-Revision-Date: 2015-10-01 13:00+0000\n"
"Last-Translator: Matjaž Mozetič <m.mozetic@matmoz.si>\n"
"Language-Team: Slovenian (http://www.transifex.com/oca/OCA-social-8-0/"
"language/sl/)\n"
"Language: sl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
"%100==4 ? 2 : 3);\n"
#. module: mail_restrict_follower_selection
#: model:ir.actions.act_window,name:mail_restrict_follower_selection.action_setup
msgid "Configure the restriction on followers"
msgstr "Nastavitev omejitev za sledilce"
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers__display_name
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__display_name
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite__display_name
msgid "Display Name"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_followers
msgid "Document Followers"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_thread
msgid "Email Thread"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers__id
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread__id
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite__id
msgid "ID"
msgstr ""
#. module: mail_restrict_follower_selection
#: model:ir.model,name:mail_restrict_follower_selection.model_mail_wizard_invite
msgid "Invite wizard"
msgstr "Čarovnik za vabila"
#. module: mail_restrict_follower_selection
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_followers____last_update
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_thread____last_update
#: model:ir.model.fields,field_description:mail_restrict_follower_selection.field_mail_wizard_invite____last_update
msgid "Last Modified on"
msgstr ""

View File

@ -0,0 +1,7 @@
# Copyright (C) 2015 Therp BV <http://therp.nl>
# Copyright (C) 2017 Komit <http://www.komit-consulting.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import mail_followers
from . import mail_wizard_invite
from . import mail_thread

View File

@ -0,0 +1,52 @@
# Copyright (C) 2018 Creu Blanca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import models
from odoo.tools import config
from odoo.tools.safe_eval import safe_eval
class MailFollowers(models.Model):
_inherit = "mail.followers"
def _add_followers(
self,
res_model,
res_ids,
partner_ids,
subtypes,
check_existing=False,
existing_policy="skip",
):
test_condition = config["test_enable"] and not self.env.context.get(
"test_restrict_follower"
)
if test_condition or self.env.context.get("no_restrict_follower"):
return super()._add_followers(
res_model,
res_ids,
partner_ids,
subtypes,
check_existing=check_existing,
existing_policy=existing_policy,
)
domain = self.env[
"mail.wizard.invite"
]._mail_restrict_follower_selection_get_domain(res_model=res_model)
partners = self.env["res.partner"].search(
[("id", "in", partner_ids)] + safe_eval(domain)
)
_res_ids = res_ids.copy() or [0]
new, update = super()._add_followers(
res_model,
res_ids,
partners.ids,
subtypes,
check_existing=check_existing,
existing_policy=existing_policy,
)
for res_id in _res_ids:
if res_id not in new:
new.setdefault(res_id, list())
return new, update

View File

@ -0,0 +1,32 @@
from odoo import models
from odoo.tools import config
from odoo.tools.safe_eval import safe_eval
class MailThread(models.AbstractModel):
_inherit = "mail.thread"
def _message_add_suggested_recipient(
self, result, partner=None, email=None, reason=""
):
result = super()._message_add_suggested_recipient(
result, partner=partner, email=email, reason=reason
)
test_condition = config["test_enable"] and not self.env.context.get(
"test_restrict_follower"
)
if test_condition or self.env.context.get("no_restrict_follower"):
return result
domain = self.env[
"mail.wizard.invite"
]._mail_restrict_follower_selection_get_domain()
eval_domain = safe_eval(domain)
for key in result:
for partner_id, email, reason in result[key]:
if partner_id:
partner = self.env["res.partner"].search(
[("id", "=", partner_id)] + eval_domain
)
if not partner:
result[key].remove((partner_id, email, reason))
return result

View File

@ -0,0 +1,40 @@
# Copyright (C) 2015 Therp BV <http://therp.nl>
# Copyright (C) 2017 Komit <http://www.komit-consulting.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from lxml import etree
from odoo import api, models
class MailWizardInvite(models.TransientModel):
_inherit = "mail.wizard.invite"
@api.model
def _mail_restrict_follower_selection_get_domain(self, res_model=None):
if not res_model:
res_model = self.env.context.get("default_res_model")
parameter_name = "mail_restrict_follower_selection.domain"
return (
self.env["ir.config_parameter"]
.sudo()
.get_param(
"{}.{}".format(parameter_name, res_model),
self.env["ir.config_parameter"]
.sudo()
.get_param(parameter_name, default="[]"),
)
)
@api.model
def fields_view_get(
self, view_id=None, view_type="form", toolbar=False, submenu=False
):
result = super(MailWizardInvite, self).fields_view_get(
view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu
)
arch = etree.fromstring(result["arch"])
for field in arch.xpath('//field[@name="partner_ids"]'):
field.attrib["domain"] = self._mail_restrict_follower_selection_get_domain()
result["arch"] = etree.tostring(arch)
return result

View File

@ -0,0 +1,11 @@
To configure this module, you need to go to `System parameters` and adjust
`mail_restrict_follower_selection.domain` as you see fit. This restricts
followers globally, if you want to restrict only the followers for a certain
record type (or have different restrictions for different record types),
create a parameter `mail_restrict_follower_selection.domain.$your_model`.
As an example, you could use `[('category_id.name', '=', 'Employees')]` to allow
only contacts with 'Employees' tag to be added as follower - this also is
the default.
Note: This module won't change existing followers!

View File

@ -0,0 +1,3 @@
* Holger Brunn <hbrunn@therp.nl>
* Nguyen Tan Phuc <phuc.nt@komit-consulting.com>
* Enric Tobella <etobella@creublanca.es>

View File

@ -0,0 +1,7 @@
This module was written to allow you to restrict the selection of possible
followers. For example, if you use the social ERP functions only internally,
it makes sense to filter possible followers for being employees. Otherwise,
you'll get a quite crowded list of partners to choose from.
Moreover, the module disables the option to automatically add followers that
do not meet the domain.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -0,0 +1,440 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: http://docutils.sourceforge.net/" />
<title>Restrict follower selection</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="restrict-follower-selection">
<h1 class="title">Restrict follower selection</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/social/tree/15.0/mail_restrict_follower_selection"><img alt="OCA/social" src="https://img.shields.io/badge/github-OCA%2Fsocial-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/social-15-0/social-15-0-mail_restrict_follower_selection"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/205/15.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module was written to allow you to restrict the selection of possible
followers. For example, if you use the social ERP functions only internally,
it makes sense to filter possible followers for being employees. Otherwise,
youll get a quite crowded list of partners to choose from.</p>
<p>Moreover, the module disables the option to automatically add followers that
do not meet the domain.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
<p>To configure this module, you need to go to <cite>System parameters</cite> and adjust
<cite>mail_restrict_follower_selection.domain</cite> as you see fit. This restricts
followers globally, if you want to restrict only the followers for a certain
record type (or have different restrictions for different record types),
create a parameter <cite>mail_restrict_follower_selection.domain.$your_model</cite>.</p>
<p>As an example, you could use <cite>[(category_id.name, =, Employees)]</cite> to allow
only contacts with Employees tag to be added as follower - this also is
the default.</p>
<p>Note: This module wont change existing followers!</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/social/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/social/issues/new?body=module:%20mail_restrict_follower_selection%0Aversion:%2015.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id4">Authors</a></h2>
<ul class="simple">
<li>Therp BV</li>
<li>Creu Blanca</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id5">Contributors</a></h2>
<ul class="simple">
<li>Holger Brunn &lt;<a class="reference external" href="mailto:hbrunn&#64;therp.nl">hbrunn&#64;therp.nl</a>&gt;</li>
<li>Nguyen Tan Phuc &lt;<a class="reference external" href="mailto:phuc.nt&#64;komit-consulting.com">phuc.nt&#64;komit-consulting.com</a>&gt;</li>
<li>Enric Tobella &lt;<a class="reference external" href="mailto:etobella&#64;creublanca.es">etobella&#64;creublanca.es</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/social/tree/15.0/mail_restrict_follower_selection">OCA/social</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,5 @@
# Copyright (C) 2015 Therp BV <http://therp.nl>
# Copyright (C) 2017 Komit <http://www.komit-consulting.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import test_mail_restrict_follower_selection

View File

@ -0,0 +1,82 @@
# Copyright (C) 2015 Therp BV <http://therp.nl>
# Copyright (C) 2017 Komit <http://www.komit-consulting.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from lxml import etree
from odoo.tests.common import TransactionCase
class TestMailRestrictFollowerSelection(TransactionCase):
def setUp(self):
super().setUp()
self.category_employees = self.env["res.partner.category"].create(
{"name": "Employees"}
)
self.partner = self.env["res.partner"].create(
{
"name": "Partner",
"category_id": self.category_employees,
"email": "test@test.com",
}
)
def test_fields_view_get(self):
result = self.env["mail.wizard.invite"].fields_view_get(view_type="form")
for field in etree.fromstring(result["arch"]).xpath(
'//field[@name="partner_ids"]'
):
self.assertTrue(field.get("domain"))
def send_action(self):
compose = (
self.env["mail.compose.message"]
.with_context(
mail_post_autofollow=True,
default_composition_mode="comment",
default_model="res.partner",
default_use_active_domain=True,
test_restrict_follower=True,
)
.create(
{
"subject": "From Composer Test",
"body": "${object.description}",
"res_id": self.partner.id,
"partner_ids": [(4, id) for id in self.partner.ids],
}
)
)
self.assertEqual(compose.partner_ids, self.partner)
compose._action_send_mail()
def test_followers_meet(self):
self.partner.write({"category_id": self.category_employees})
self.send_action()
self.assertIn(
self.partner, self.partner.message_follower_ids.mapped("partner_id")
)
def test_followers_not_meet(self):
self.partner.write({"category_id": False})
self.send_action()
self.assertNotIn(
self.partner, self.partner.message_follower_ids.mapped("partner_id")
)
def test_message_add_suggested_recipient(self):
res = self.partner.with_context(
test_restrict_follower=True
)._message_add_suggested_recipient({self.partner.id: []}, partner=self.partner)
self.assertEqual(res[self.partner.id][0][0], self.partner.id)
self.env["ir.config_parameter"].create(
{
"key": "mail_restrict_follower_selection.domain.res.partner",
"value": "[('category_id.name', '!=', 'Employees')]",
}
)
new_res = self.partner.with_context(
test_restrict_follower=True
)._message_add_suggested_recipient({self.partner.id: []})
self.assertFalse(new_res[self.partner.id][0][0])

View File

@ -0,0 +1 @@
../../../../mail_restrict_follower_selection

View File

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)