[ADD] mass_mailing_list_dynamic: Autopopulated mailing lists

pull/1368/head
Jairo Llopis 2017-10-31 14:44:52 +01:00 committed by Pedro Evaristo Gonzalez Sanchez
parent 54d7daa5d2
commit 7ebd79cc68
19 changed files with 1246 additions and 0 deletions

View File

@ -0,0 +1,91 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: https://www.gnu.org/licenses/agpl
:alt: License: AGPL-3
==========================
Dynamic Mass Mailing Lists
==========================
Without this addon you have to choose between providing a dynamic domain and
letting your mass mailings reach all partners that match it, or being able to
unsubscribe to certain mailing lists while still being subscribed to others.
This addon allows you to create dynamic mailing lists, so you can now benefit
from both things.
Configuration
=============
To create a dynamic mailing list, you need to:
#. Go to *Mass Mailing > Mailings > Mailing Lists > Create*.
#. Check the *Dynamic* box.
#. Choose a *Sync method*:
- Leave empty to use as a manual mailing list, the normal behavior.
- *Only add new records* to make sure no records disappear from the list
when partners stop matching the *Synchronization critera*.
- *Add and remove records as needed* to make the list be fully synchronized
with the *Synchronization critera*, even if that means removing contacts
from it.
#. Define a *Synchronization critera* that will be used to match the partners
that should go into the list as contacts. Only partners with emails will
be selected.
Usage
=====
When you hit the *Sync now* button or send a mass mailing to this list, its
contacts will be automatically updated.
Pay attention to the messages shown to you that tell you about some non-obvious
behaviour you could experience if you edit manually contacts from a dynamic
list.
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/205/10.0
Known issues / Roadmap
======================
* Tests affected by https://github.com/odoo/odoo/issues/20603. Do not run them
in stateful databases.
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 smash it by providing detailed and welcomed feedback.
Credits
=======
Images
------
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_.
Contributors
------------
* `Tecnativa <https://www.tecnativa.com>`_:
* Jairo Llopis <jairo.llopis@tecnativa.com>
Do not contact contributors directly about support or help with technical issues.
Maintainer
----------
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
This module is maintained by the OCA.
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.
To contribute to this module, please visit https://odoo-community.org.

View File

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import models

View File

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
"name": "Dynamic Mass Mailing Lists",
"summary": "Mass mailing lists that get autopopulated",
"version": "10.0.1.0.0",
"category": "Marketing",
"website": "https://github.com/OCA/social",
"author": "Tecnativa, Odoo Community Association (OCA)",
"license": "AGPL-3",
"application": False,
"installable": True,
"depends": [
"mass_mailing_partner",
],
"data": [
"views/mail_mass_mailing_list_view.xml",
],
}

View File

@ -0,0 +1,110 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mass_mailing_list_dynamic
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-01 02:19+0000\n"
"PO-Revision-Date: 2017-12-01 02:19+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
"Language-Team: Catalan (https://www.transifex.com/oca/teams/23907/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: ca\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid ""
"<i class=\"fa fa-info-circle\"/> If you want to remove contacts from a "
"dynamic list, just <b>set them as <i>Opt Out</i></b>."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid ""
"<i class=\"fa fa-info-circle\"/> You cannot make manual editions of contacts"
" in fully synchronized lists."
msgstr ""
#. module: mass_mailing_list_dynamic
#: selection:mail.mass_mailing.list,sync_method:0
msgid "Add and remove records as needed"
msgstr ""
#. module: mass_mailing_list_dynamic
#: code:addons/mass_mailing_list_dynamic/models/mail_mass_mailing_contact.py:18
#, python-format
msgid ""
"Cannot edit manually contacts in a fully synchronized list. Change its sync "
"method or execute a manual sync instead."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_method
msgid ""
"Choose the syncronization method for this list if you want to make it "
"dynamic"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_dynamic
msgid "Dynamic"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid "Dynamic list"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_domain
msgid "Filter partners to sync in this list"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing_list
msgid "Mailing List"
msgstr "Llista d'enviament"
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing
msgid "Mass Mailing"
msgstr "Correu massiu"
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing_contact
msgid "Mass Mailing Contact"
msgstr "Contactes del correu massiu"
#. module: mass_mailing_list_dynamic
#: selection:mail.mass_mailing.list,sync_method:0
msgid "Only add new records"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_dynamic
msgid ""
"Set this list as dynamic, to make it autosynchronized with partners from a "
"given criteria."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_method
msgid "Sync method"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid "Sync now"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_domain
msgid "Synchronization critera"
msgstr ""

View File

@ -0,0 +1,110 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mass_mailing_list_dynamic
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-01 02:19+0000\n"
"PO-Revision-Date: 2017-12-01 02:19+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid ""
"<i class=\"fa fa-info-circle\"/> If you want to remove contacts from a "
"dynamic list, just <b>set them as <i>Opt Out</i></b>."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid ""
"<i class=\"fa fa-info-circle\"/> You cannot make manual editions of contacts"
" in fully synchronized lists."
msgstr ""
#. module: mass_mailing_list_dynamic
#: selection:mail.mass_mailing.list,sync_method:0
msgid "Add and remove records as needed"
msgstr ""
#. module: mass_mailing_list_dynamic
#: code:addons/mass_mailing_list_dynamic/models/mail_mass_mailing_contact.py:18
#, python-format
msgid ""
"Cannot edit manually contacts in a fully synchronized list. Change its sync "
"method or execute a manual sync instead."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_method
msgid ""
"Choose the syncronization method for this list if you want to make it "
"dynamic"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_dynamic
msgid "Dynamic"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid "Dynamic list"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_domain
msgid "Filter partners to sync in this list"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing_list
msgid "Mailing List"
msgstr "Mailingliste"
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing
msgid "Mass Mailing"
msgstr "Massenmailing"
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing_contact
msgid "Mass Mailing Contact"
msgstr "Massenmail-Kontakt"
#. module: mass_mailing_list_dynamic
#: selection:mail.mass_mailing.list,sync_method:0
msgid "Only add new records"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_dynamic
msgid ""
"Set this list as dynamic, to make it autosynchronized with partners from a "
"given criteria."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_method
msgid "Sync method"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid "Sync now"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_domain
msgid "Synchronization critera"
msgstr ""

View File

@ -0,0 +1,110 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mass_mailing_list_dynamic
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-01 02:19+0000\n"
"PO-Revision-Date: 2017-12-01 02:19+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid ""
"<i class=\"fa fa-info-circle\"/> If you want to remove contacts from a "
"dynamic list, just <b>set them as <i>Opt Out</i></b>."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid ""
"<i class=\"fa fa-info-circle\"/> You cannot make manual editions of contacts"
" in fully synchronized lists."
msgstr ""
#. module: mass_mailing_list_dynamic
#: selection:mail.mass_mailing.list,sync_method:0
msgid "Add and remove records as needed"
msgstr ""
#. module: mass_mailing_list_dynamic
#: code:addons/mass_mailing_list_dynamic/models/mail_mass_mailing_contact.py:18
#, python-format
msgid ""
"Cannot edit manually contacts in a fully synchronized list. Change its sync "
"method or execute a manual sync instead."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_method
msgid ""
"Choose the syncronization method for this list if you want to make it "
"dynamic"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_dynamic
msgid "Dynamic"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid "Dynamic list"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_domain
msgid "Filter partners to sync in this list"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing_list
msgid "Mailing List"
msgstr "Lista de correo"
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing
msgid "Mass Mailing"
msgstr "Envío masivo"
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing_contact
msgid "Mass Mailing Contact"
msgstr "Contacto de envío masivo"
#. module: mass_mailing_list_dynamic
#: selection:mail.mass_mailing.list,sync_method:0
msgid "Only add new records"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_dynamic
msgid ""
"Set this list as dynamic, to make it autosynchronized with partners from a "
"given criteria."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_method
msgid "Sync method"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid "Sync now"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_domain
msgid "Synchronization critera"
msgstr ""

View File

@ -0,0 +1,110 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mass_mailing_list_dynamic
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-01 02:19+0000\n"
"PO-Revision-Date: 2017-12-01 02:19+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid ""
"<i class=\"fa fa-info-circle\"/> If you want to remove contacts from a "
"dynamic list, just <b>set them as <i>Opt Out</i></b>."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid ""
"<i class=\"fa fa-info-circle\"/> You cannot make manual editions of contacts"
" in fully synchronized lists."
msgstr ""
#. module: mass_mailing_list_dynamic
#: selection:mail.mass_mailing.list,sync_method:0
msgid "Add and remove records as needed"
msgstr ""
#. module: mass_mailing_list_dynamic
#: code:addons/mass_mailing_list_dynamic/models/mail_mass_mailing_contact.py:18
#, python-format
msgid ""
"Cannot edit manually contacts in a fully synchronized list. Change its sync "
"method or execute a manual sync instead."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_method
msgid ""
"Choose the syncronization method for this list if you want to make it "
"dynamic"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_dynamic
msgid "Dynamic"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid "Dynamic list"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_domain
msgid "Filter partners to sync in this list"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing_list
msgid "Mailing List"
msgstr "Liste de diffusion"
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing
msgid "Mass Mailing"
msgstr "Publipostage"
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing_contact
msgid "Mass Mailing Contact"
msgstr "Contact de la liste de diffusion"
#. module: mass_mailing_list_dynamic
#: selection:mail.mass_mailing.list,sync_method:0
msgid "Only add new records"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_dynamic
msgid ""
"Set this list as dynamic, to make it autosynchronized with partners from a "
"given criteria."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_method
msgid "Sync method"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid "Sync now"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_domain
msgid "Synchronization critera"
msgstr ""

View File

@ -0,0 +1,110 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mass_mailing_list_dynamic
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-01 02:19+0000\n"
"PO-Revision-Date: 2017-12-01 02:19+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: hr\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: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid ""
"<i class=\"fa fa-info-circle\"/> If you want to remove contacts from a "
"dynamic list, just <b>set them as <i>Opt Out</i></b>."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid ""
"<i class=\"fa fa-info-circle\"/> You cannot make manual editions of contacts"
" in fully synchronized lists."
msgstr ""
#. module: mass_mailing_list_dynamic
#: selection:mail.mass_mailing.list,sync_method:0
msgid "Add and remove records as needed"
msgstr ""
#. module: mass_mailing_list_dynamic
#: code:addons/mass_mailing_list_dynamic/models/mail_mass_mailing_contact.py:18
#, python-format
msgid ""
"Cannot edit manually contacts in a fully synchronized list. Change its sync "
"method or execute a manual sync instead."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_method
msgid ""
"Choose the syncronization method for this list if you want to make it "
"dynamic"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_dynamic
msgid "Dynamic"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid "Dynamic list"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_domain
msgid "Filter partners to sync in this list"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing_list
msgid "Mailing List"
msgstr "Mailing lista"
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing
msgid "Mass Mailing"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing_contact
msgid "Mass Mailing Contact"
msgstr "Kontakti za masovno slanje"
#. module: mass_mailing_list_dynamic
#: selection:mail.mass_mailing.list,sync_method:0
msgid "Only add new records"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_dynamic
msgid ""
"Set this list as dynamic, to make it autosynchronized with partners from a "
"given criteria."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_method
msgid "Sync method"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid "Sync now"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_domain
msgid "Synchronization critera"
msgstr ""

View File

@ -0,0 +1,110 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mass_mailing_list_dynamic
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-01 02:19+0000\n"
"PO-Revision-Date: 2017-12-01 02:19+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid ""
"<i class=\"fa fa-info-circle\"/> If you want to remove contacts from a "
"dynamic list, just <b>set them as <i>Opt Out</i></b>."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid ""
"<i class=\"fa fa-info-circle\"/> You cannot make manual editions of contacts"
" in fully synchronized lists."
msgstr ""
#. module: mass_mailing_list_dynamic
#: selection:mail.mass_mailing.list,sync_method:0
msgid "Add and remove records as needed"
msgstr ""
#. module: mass_mailing_list_dynamic
#: code:addons/mass_mailing_list_dynamic/models/mail_mass_mailing_contact.py:18
#, python-format
msgid ""
"Cannot edit manually contacts in a fully synchronized list. Change its sync "
"method or execute a manual sync instead."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_method
msgid ""
"Choose the syncronization method for this list if you want to make it "
"dynamic"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_dynamic
msgid "Dynamic"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid "Dynamic list"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_domain
msgid "Filter partners to sync in this list"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing_list
msgid "Mailing List"
msgstr "Mailing List"
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing
msgid "Mass Mailing"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing_contact
msgid "Mass Mailing Contact"
msgstr "Contatto Mass Mailing"
#. module: mass_mailing_list_dynamic
#: selection:mail.mass_mailing.list,sync_method:0
msgid "Only add new records"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_dynamic
msgid ""
"Set this list as dynamic, to make it autosynchronized with partners from a "
"given criteria."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_method
msgid "Sync method"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid "Sync now"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_domain
msgid "Synchronization critera"
msgstr ""

View File

@ -0,0 +1,110 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mass_mailing_list_dynamic
#
# Translators:
# Pedro Castro Silva <pedrocs@exo.pt>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-02 13:18+0000\n"
"PO-Revision-Date: 2017-12-02 13:18+0000\n"
"Last-Translator: Pedro Castro Silva <pedrocs@exo.pt>, 2017\n"
"Language-Team: Portuguese (https://www.transifex.com/oca/teams/23907/pt/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: pt\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid ""
"<i class=\"fa fa-info-circle\"/> If you want to remove contacts from a "
"dynamic list, just <b>set them as <i>Opt Out</i></b>."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid ""
"<i class=\"fa fa-info-circle\"/> You cannot make manual editions of contacts"
" in fully synchronized lists."
msgstr ""
#. module: mass_mailing_list_dynamic
#: selection:mail.mass_mailing.list,sync_method:0
msgid "Add and remove records as needed"
msgstr ""
#. module: mass_mailing_list_dynamic
#: code:addons/mass_mailing_list_dynamic/models/mail_mass_mailing_contact.py:18
#, python-format
msgid ""
"Cannot edit manually contacts in a fully synchronized list. Change its sync "
"method or execute a manual sync instead."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_method
msgid ""
"Choose the syncronization method for this list if you want to make it "
"dynamic"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_dynamic
msgid "Dynamic"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid "Dynamic list"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_domain
msgid "Filter partners to sync in this list"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing_list
msgid "Mailing List"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing
msgid "Mass Mailing"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing_contact
msgid "Mass Mailing Contact"
msgstr "Contacto do email em massa"
#. module: mass_mailing_list_dynamic
#: selection:mail.mass_mailing.list,sync_method:0
msgid "Only add new records"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_dynamic
msgid ""
"Set this list as dynamic, to make it autosynchronized with partners from a "
"given criteria."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_method
msgid "Sync method"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid "Sync now"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_domain
msgid "Synchronization critera"
msgstr ""

View File

@ -0,0 +1,110 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mass_mailing_list_dynamic
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-01 02:19+0000\n"
"PO-Revision-Date: 2017-12-01 02:19+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: sl\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid ""
"<i class=\"fa fa-info-circle\"/> If you want to remove contacts from a "
"dynamic list, just <b>set them as <i>Opt Out</i></b>."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid ""
"<i class=\"fa fa-info-circle\"/> You cannot make manual editions of contacts"
" in fully synchronized lists."
msgstr ""
#. module: mass_mailing_list_dynamic
#: selection:mail.mass_mailing.list,sync_method:0
msgid "Add and remove records as needed"
msgstr ""
#. module: mass_mailing_list_dynamic
#: code:addons/mass_mailing_list_dynamic/models/mail_mass_mailing_contact.py:18
#, python-format
msgid ""
"Cannot edit manually contacts in a fully synchronized list. Change its sync "
"method or execute a manual sync instead."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_method
msgid ""
"Choose the syncronization method for this list if you want to make it "
"dynamic"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_dynamic
msgid "Dynamic"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid "Dynamic list"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_domain
msgid "Filter partners to sync in this list"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing_list
msgid "Mailing List"
msgstr "Poštni seznam"
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing
msgid "Mass Mailing"
msgstr "Masovno razpošiljanje"
#. module: mass_mailing_list_dynamic
#: model:ir.model,name:mass_mailing_list_dynamic.model_mail_mass_mailing_contact
msgid "Mass Mailing Contact"
msgstr "Stik masovne pošte"
#. module: mass_mailing_list_dynamic
#: selection:mail.mass_mailing.list,sync_method:0
msgid "Only add new records"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,help:mass_mailing_list_dynamic.field_mail_mass_mailing_list_dynamic
msgid ""
"Set this list as dynamic, to make it autosynchronized with partners from a "
"given criteria."
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_method
msgid "Sync method"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.ui.view,arch_db:mass_mailing_list_dynamic.view_mail_mass_mailing_list_form
msgid "Sync now"
msgstr ""
#. module: mass_mailing_list_dynamic
#: model:ir.model.fields,field_description:mass_mailing_list_dynamic.field_mail_mass_mailing_list_sync_domain
msgid "Synchronization critera"
msgstr ""

View File

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import mail_mass_mailing
from . import mail_mass_mailing_contact
from . import mail_mass_mailing_list

View File

@ -0,0 +1,14 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import models
class MassMailing(models.Model):
_inherit = "mail.mass_mailing"
def send_mail(self):
"""Sync dynamic lists before sending mailings to them."""
self.contact_list_ids.action_sync()
return super(MassMailing, self).send_mail()

View File

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import _, api, models
from odoo.exceptions import ValidationError
class MassMailingContact(models.Model):
_inherit = "mail.mass_mailing.contact"
@api.constrains("partner_id", "list_id", "name", "email")
def _check_no_manual_edits_on_fully_synced_lists(self):
if self.env.context.get("syncing"):
return
if any(one.list_id.sync_method == "full" for one in self):
raise ValidationError(
_("Cannot edit manually contacts in a fully "
"synchronized list. Change its sync method or execute "
"a manual sync instead."))

View File

@ -0,0 +1,57 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import fields, models
from odoo.tools import safe_eval
class MassMailingList(models.Model):
_inherit = "mail.mass_mailing.list"
dynamic = fields.Boolean(
help="Set this list as dynamic, to make it autosynchronized with "
"partners from a given criteria.",
)
sync_method = fields.Selection(
[
("add", "Only add new records"),
("full", "Add and remove records as needed"),
],
default="add",
required=True,
help="Choose the syncronization method for this list if you want to "
"make it dynamic",
)
sync_domain = fields.Char(
string="Synchronization critera",
default="[('opt_out', '=', False), ('email', '!=', False)]",
required=True,
help="Filter partners to sync in this list",
)
def action_sync(self):
"""Sync contacts in dynamic lists."""
Contact = self.env["mail.mass_mailing.contact"]
Partner = self.env["res.partner"]
# Skip non-dynamic lists
dynamic = self.filtered("dynamic").with_context(syncing=True)
for one in dynamic:
sync_domain = safe_eval(one.sync_domain) + [("email", "!=", False)]
desired_partners = Partner.search(sync_domain)
# Remove undesired contacts when synchronization is full
if one.sync_method == "full":
Contact.search([
("list_id", "=", one.id),
("partner_id", "not in", desired_partners.ids),
]).unlink()
current_contacts = Contact.search([("list_id", "=", one.id)])
current_partners = current_contacts.mapped("partner_id")
# Add new contacts
for partner in desired_partners - current_partners:
Contact.create({
"list_id": one.id,
"partner_id": partner.id,
})
# Invalidate cached contact count
self.invalidate_cache(["contact_nbr"], dynamic.ids)

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import test_dynamic_lists

View File

@ -0,0 +1,90 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from mock import patch
from odoo.exceptions import ValidationError
from odoo.tests.common import TransactionCase
class DynamicListCase(TransactionCase):
def setUp(self):
super(DynamicListCase, self).setUp()
self.tag = self.env["res.partner.category"].create({
"name": "testing tag",
})
self.partners = self.env["res.partner"]
for number in range(5):
self.partners |= self.partners.create({
"name": "partner %d" % number,
"category_id": [(4, self.tag.id, False)],
"email": "%d@example.com" % number,
})
self.list = self.env["mail.mass_mailing.list"].create({
"name": "test list",
"dynamic": True,
"sync_domain": repr([("category_id", "in", self.tag.ids)]),
})
self.mail = self.env["mail.mass_mailing"].create({
"name": "test mass mailing",
"contact_list_ids": [(4, self.list.id, False)],
})
self.mail._onchange_model_and_list()
def test_list_sync(self):
"""List is synced correctly."""
Contact = self.env["mail.mass_mailing.contact"]
# Partner 0 is not categorized
self.partners[0].category_id = False
# Partner 1 has no email
self.partners[1].email = False
# Set list as unsynced
self.list.dynamic = False
# Create contact for partner 0 in unsynced list
contact0 = Contact.create({
"list_id": self.list.id,
"partner_id": self.partners[0].id,
})
self.assertEqual(self.list.contact_nbr, 1)
# Set list as add-synced
self.list.dynamic = True
self.list.action_sync()
self.assertEqual(self.list.contact_nbr, 4)
self.assertTrue(contact0.exists())
# Set list as full-synced
self.list.sync_method = "full"
self.list.action_sync()
self.assertEqual(self.list.contact_nbr, 3)
self.assertFalse(contact0.exists())
# Cannot add or edit contacts in fully synced lists
with self.assertRaises(ValidationError):
Contact.create({
"list_id": self.list.id,
"partner_id": self.partners[0].id,
})
contact1 = Contact.search([
("list_id", "=", self.list.id),
], limit=1)
with self.assertRaises(ValidationError):
contact1.name = "other"
with self.assertRaises(ValidationError):
contact1.email = "other@example.com"
with self.assertRaises(ValidationError):
contact1.partner_id = self.partners[0]
def test_sync_when_sending_mail(self):
"""Dynamic list is synced before mailing to it."""
self.list.action_sync()
self.assertEqual(self.list.contact_nbr, 5)
# Create a new partner
self.partners.create({
"name": "extra partner",
"category_id": [(4, self.tag.id, False)],
"email": "extra@example.com",
})
# Before sending the mail, the list is updated
with patch("odoo.addons.base.ir.ir_mail_server"
".IrMailServer.send_email") as send_email:
self.mail.send_mail()
self.assertEqual(6, send_email.call_count)
self.assertEqual(6, self.list.contact_nbr)

View File

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2017 Tecnativa - Jairo Llopis
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="view_mail_mass_mailing_list_form" model="ir.ui.view">
<field name="name">Add sync stuff</field>
<field name="model">mail.mass_mailing.list</field>
<field name="inherit_id" ref="mass_mailing.view_mail_mass_mailing_list_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@class='oe_title']" position="after">
<group name="dynamic" string="Dynamic list">
<group colspan="4">
<field
name="dynamic"
/>
</group>
<group attrs="{'invisible': [('dynamic', '=', False)]}">
<label for="sync_method"/>
<div>
<field
name="sync_method"
/>
<button
name="action_sync"
type="object"
string="Sync now"
icon="fa-refresh"
/>
</div>
</group>
<group attrs="{'invisible': [('dynamic', '=', False)]}">
<div
class="alert alert-info"
role="alert"
>
<i class="fa fa-info-circle"/> If you want to remove contacts from a dynamic list, just <b>set them as <i>Opt Out</i></b>.
</div>
<div
class="alert alert-warning"
role="alert"
>
<i class="fa fa-info-circle"/> You cannot make manual editions of contacts in fully synchronized lists.
</div>
</group>
<group colspan="4"
attrs="{'invisible': [('dynamic', '=', False)]}">
<field
name="sync_domain"
widget="char_domain"
options='{"model": "res.partner"}'
/>
</group>
</group>
</xpath>
</field>
</record>
</odoo>