Browse Source

[MIG] mass_mailing_list_dynamic: Migration to 12.0

pull/399/head
Victor Martin 5 years ago
parent
commit
e2071402a9
  1. 78
      mass_mailing_list_dynamic/README.rst
  2. 1
      mass_mailing_list_dynamic/__init__.py
  3. 4
      mass_mailing_list_dynamic/__manifest__.py
  4. 1
      mass_mailing_list_dynamic/models/__init__.py
  5. 1
      mass_mailing_list_dynamic/models/mail_mass_mailing.py
  6. 18
      mass_mailing_list_dynamic/models/mail_mass_mailing_contact.py
  7. 11
      mass_mailing_list_dynamic/models/mail_mass_mailing_list.py
  8. 1
      mass_mailing_list_dynamic/models/res_partner.py
  9. 21
      mass_mailing_list_dynamic/readme/CONFIGURE.rst
  10. 5
      mass_mailing_list_dynamic/readme/CONTRIBUTORS.rst
  11. 6
      mass_mailing_list_dynamic/readme/DESCRIPTION.rst
  12. 15
      mass_mailing_list_dynamic/readme/USAGE.rst
  13. 472
      mass_mailing_list_dynamic/static/description/index.html
  14. 1
      mass_mailing_list_dynamic/tests/__init__.py
  15. 11
      mass_mailing_list_dynamic/tests/test_dynamic_lists.py
  16. 1
      mass_mailing_list_dynamic/wizards/__init__.py
  17. 1
      mass_mailing_list_dynamic/wizards/mail_mass_mailing_load_filter.py

78
mass_mailing_list_dynamic/README.rst

@ -1,11 +1,30 @@
.. 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
==========================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! 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/12.0/mass_mailing_list_dynamic
:alt: OCA/social
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/social-12-0/social-12-0-mass_mailing_list_dynamic
: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/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
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.
@ -13,10 +32,15 @@ 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.
**Table of contents**
.. contents::
:local:
Configuration
=============
To create a dynamic mailing list, you need to:
To configure this module, you need to:
#. Go to *Mass Mailing > Mailings > Mailing Lists* and create one.
#. Check the *Dynamic* box.
@ -41,6 +65,8 @@ You can also load an existing filter over contacts:
Usage
=====
To use this module, you need to:
#. Go to *Mass Mailing > Mailings > Mass Mailings*, and create one.
#. Select as recipients a mailing list.
#. On "Select mailing lists:", choose one mailing list with dynamic flag
@ -55,54 +81,46 @@ 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.
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:%20mass_mailing_list_dynamic%0Aversion:%2012.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
=======
Images
------
Authors
~~~~~~~
* Odoo.
* FontAwesome (http://fontawesome.io).
* Tecnativa
Contributors
------------
~~~~~~~~~~~~
* `Tecnativa <https://www.tecnativa.com>`_:
* Jairo Llopis <jairo.llopis@tecnativa.com>
* Pedro M. Baeza <pedro.baeza@tecnativa.com>
* David Vidal <david.vidal@tecnativa.com>
* Victor M.M. Torres <victor.martin@tecnativa.com>
Do not contact contributors directly about support or help with technical issues.
Maintainers
~~~~~~~~~~~
Maintainer
----------
This module is maintained by the OCA.
.. 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.
This module is part of the `OCA/social <https://github.com/OCA/social/tree/12.0/mass_mailing_list_dynamic>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

1
mass_mailing_list_dynamic/__init__.py

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

4
mass_mailing_list_dynamic/__manifest__.py

@ -1,11 +1,11 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Tecnativa - Jairo Llopis
# Copyright 2018 Tecnativa - David Vidal
# Copyright 2019 Tecnativa - Victor Martin
# 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.2.0",
"version": "12.0.1.0.0",
"category": "Marketing",
"website": "https://github.com/OCA/social",
"author": "Tecnativa, Odoo Community Association (OCA)",

1
mass_mailing_list_dynamic/models/__init__.py

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

1
mass_mailing_list_dynamic/models/mail_mass_mailing.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

18
mass_mailing_list_dynamic/models/mail_mass_mailing_contact.py

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Tecnativa - Jairo Llopis
# Copyright 2019 Tecnativa - Victor M.M. Torres
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import _, api, models
@ -9,13 +9,15 @@ from odoo.exceptions import ValidationError
class MassMailingContact(models.Model):
_inherit = "mail.mass_mailing.contact"
@api.constrains("partner_id", "list_id", "name", "email")
@api.constrains("partner_id", "list_ids", "name", "email")
def _check_no_manual_edits_on_fully_synced_lists(self):
if self.env.context.get("syncing"):
return
if any((one.list_id.dynamic and
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."))
for rec in self:
if rec.list_ids:
if any(rec.list_ids.mapped('dynamic')) and (
rec.list_ids.mapped('sync_method').count("full") > 0):
raise ValidationError(
_("""Cannot edit manually contacts in a fully synchronized list.
Change its sync method or execute
a manual sync instead."""))

11
mass_mailing_list_dynamic/models/mail_mass_mailing_list.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
@ -48,17 +47,19 @@ class MassMailingList(models.Model):
# Remove undesired contacts when synchronization is full
if one.sync_method == "full":
Contact.search([
("list_id", "=", one.id),
("list_ids", "in", one.id),
("partner_id", "not in", desired_partners.ids),
]).unlink()
current_contacts = Contact.search([("list_id", "=", one.id)])
current_contacts = Contact.search([("list_ids", "in", one.id)])
current_partners = current_contacts.mapped("partner_id")
# Add new contacts
vals_list = []
for partner in desired_partners - current_partners:
Contact.create({
"list_id": one.id,
vals_list.append({
"list_ids": [(4, one.id)],
"partner_id": partner.id,
})
Contact.create(vals_list)
one.is_synced = True
# Invalidate cached contact count
self.invalidate_cache(["contact_nbr"], dynamic.ids)

1
mass_mailing_list_dynamic/models/res_partner.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

21
mass_mailing_list_dynamic/readme/CONFIGURE.rst

@ -0,0 +1,21 @@
To configure this module, you need to:
#. Go to *Mass Mailing > Mailings > Mailing Lists* and create one.
#. 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 criteria* that will be used to match the partners
that should go into the list as contacts. Only partners with emails will
be selected.
You can also load an existing filter over contacts:
#. Click on "Load filter" button below criteria.
#. Select one of the existing filters.
#. Click on "Load filter" and you will have that filter as criteria.

5
mass_mailing_list_dynamic/readme/CONTRIBUTORS.rst

@ -0,0 +1,5 @@
* `Tecnativa <https://www.tecnativa.com>`_:
* Jairo Llopis <jairo.llopis@tecnativa.com>
* Pedro M. Baeza <pedro.baeza@tecnativa.com>
* David Vidal <david.vidal@tecnativa.com>
* Victor M.M. Torres <victor.martin@tecnativa.com>

6
mass_mailing_list_dynamic/readme/DESCRIPTION.rst

@ -0,0 +1,6 @@
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.

15
mass_mailing_list_dynamic/readme/USAGE.rst

@ -0,0 +1,15 @@
To use this module, you need to:
#. Go to *Mass Mailing > Mailings > Mass Mailings*, and create one.
#. Select as recipients a mailing list.
#. On "Select mailing lists:", choose one mailing list with dynamic flag
checked.
#. Before sending the mass mailing, the list will be synced for having latest
changes.
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.

472
mass_mailing_list_dynamic/static/description/index.html

@ -0,0 +1,472 @@
<?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 0.14: http://docutils.sourceforge.net/" />
<title>Dynamic Mass Mailing Lists</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="dynamic-mass-mailing-lists">
<h1 class="title">Dynamic Mass Mailing Lists</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/12.0/mass_mailing_list_dynamic"><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-12-0/social-12-0-mass_mailing_list_dynamic"><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/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>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.</p>
<p>This addon allows you to create dynamic mailing lists, so you can now benefit
from both things.</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="#usage" id="id2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id7">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:</p>
<ol class="arabic simple">
<li>Go to <em>Mass Mailing &gt; Mailings &gt; Mailing Lists</em> and create one.</li>
<li>Check the <em>Dynamic</em> box.</li>
<li>Choose a <em>Sync method</em>:<ul>
<li>Leave empty to use as a manual mailing list, the normal behavior.</li>
<li><em>Only add new records</em> to make sure no records disappear from the list
when partners stop matching the <em>Synchronization critera</em>.</li>
<li><em>Add and remove records as needed</em> to make the list be fully synchronized
with the <em>Synchronization critera</em>, even if that means removing contacts
from it.</li>
</ul>
</li>
<li>Define a <em>Synchronization criteria</em> that will be used to match the partners
that should go into the list as contacts. Only partners with emails will
be selected.</li>
</ol>
<p>You can also load an existing filter over contacts:</p>
<ol class="arabic simple">
<li>Click on “Load filter” button below criteria.</li>
<li>Select one of the existing filters.</li>
<li>Click on “Load filter” and you will have that filter as criteria.</li>
</ol>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id2">Usage</a></h1>
<p>To use this module, you need to:</p>
<ol class="arabic simple">
<li>Go to <em>Mass Mailing &gt; Mailings &gt; Mass Mailings</em>, and create one.</li>
<li>Select as recipients a mailing list.</li>
<li>On “Select mailing lists:”, choose one mailing list with dynamic flag
checked.</li>
<li>Before sending the mass mailing, the list will be synced for having latest
changes.</li>
</ol>
<p>When you hit the <em>Sync now</em> button or send a mass mailing to this list, its
contacts will be automatically updated.</p>
<p>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.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id3">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:%20mass_mailing_list_dynamic%0Aversion:%2012.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="#id4">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id5">Authors</a></h2>
<ul class="simple">
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id6">Contributors</a></h2>
<ul class="simple">
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:
* Jairo Llopis &lt;<a class="reference external" href="mailto:jairo.llopis&#64;tecnativa.com">jairo.llopis&#64;tecnativa.com</a>&gt;
* Pedro M. Baeza &lt;<a class="reference external" href="mailto:pedro.baeza&#64;tecnativa.com">pedro.baeza&#64;tecnativa.com</a>&gt;
* David Vidal &lt;<a class="reference external" href="mailto:david.vidal&#64;tecnativa.com">david.vidal&#64;tecnativa.com</a>&gt;
* Victor M.M. Torres &lt;<a class="reference external" href="mailto:victor.martin&#64;tecnativa.com">victor.martin&#64;tecnativa.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id7">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/12.0/mass_mailing_list_dynamic">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>

1
mass_mailing_list_dynamic/tests/__init__.py

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

11
mass_mailing_list_dynamic/tests/test_dynamic_lists.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
@ -45,7 +44,7 @@ class DynamicListCase(common.SavepointCase):
self.list.dynamic = False
# Create contact for partner 0 in unsynced list
contact0 = Contact.create({
"list_id": self.list.id,
"list_ids": [(4, self.list.id)],
"partner_id": self.partners[0].id,
})
self.assertEqual(self.list.contact_nbr, 1)
@ -57,7 +56,7 @@ class DynamicListCase(common.SavepointCase):
# Set list as full-synced
self.list.sync_method = "full"
Contact.search([
("list_id", "=", self.list.id),
("list_ids", "in", self.list.id),
("partner_id", "=", self.partners[2].id),
]).unlink()
self.list.action_sync()
@ -66,11 +65,11 @@ class DynamicListCase(common.SavepointCase):
# Cannot add or edit contacts in fully synced lists
with self.assertRaises(ValidationError):
Contact.create({
"list_id": self.list.id,
"list_ids": [(4, self.list.id)],
"partner_id": self.partners[0].id,
})
contact1 = Contact.search([
("list_id", "=", self.list.id),
("list_ids", "in", self.list.id),
], limit=1)
with self.assertRaises(ValidationError):
contact1.name = "other"
@ -82,7 +81,7 @@ class DynamicListCase(common.SavepointCase):
self.list.dynamic = False
# Now the contact is created without exception
Contact.create({
"list_id": self.list.id,
"list_ids": [(4, self.list.id)],
"email": "test@example.com",
})
# Contacts can now be changed

1
mass_mailing_list_dynamic/wizards/__init__.py

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

1
mass_mailing_list_dynamic/wizards/mail_mass_mailing_load_filter.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

Loading…
Cancel
Save