TIP: You can type at any time to perform a new search.
Email Marketing
mass_mailing · odoo/odoo
🛠 Migration considerations
- Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `INSERT INTO mailing_subscription (contact_id, list_id) SELECT st.contact_id AS contact_id, %s AS list_id FROM ( SELECT contact.id AS contact_id, contact.email AS email, list.id AS list_id, row_number() OVER (PARTITION BY email ORDER BY email) AS rn FROM mailing_contact contact, mailing_subscription contact_list_rel, mailing_list list WHERE contact.id=contact_list_rel.contact_id AND COALESCE(contact_list_rel.opt_out,FALSE) = FALSE AND contact.email_normalized NOT IN (select email from mail_blacklist where active = TRUE) AND list.id=contact_list_rel.list_id AND list.id IN %s AND NOT EXISTS ( SELECT 1 FROM mailing_contact contact2, mailing_subscription contact_list_rel2 WHERE contact2.email = contact.email AND contact_list_rel2.contact_id = contact2.id AND contact_list_rel2.list_id = %s ) ) st WHERE st.rn = 1;` - re-check the table/column names still match after upgrading. migration-raw-sql-write · source
Found by automated static analysis: patterns worth a look before/after upgrading this module to a newer Odoo version.
- Repository
- odoo/odoo · module folder
- Module version
- 2.7
- Category
- Marketing/Email Marketing
- Folder size
- 17.23 MB
- License
- LGPL-3
- Application
- Yes
- Auto-installable
- No
- Website
- https://www.odoo.com/app/email-marketing
- Last tracking update
- 2026-08-15 22:44:14
- Authors
- Odoo S.A.
- Maintainers
- Odoo S.A.
- Committers
- Xavier Morel, Raphael Collet, Thibault Delavallée, Odoo Translation Bot, David Monjoie, Aaron Bohy, Lucas Perais (lpe), qsm-odoo, Jorge Pinna Puissant, Julien Castiaux, Xavier-Do, Romeo Fragomeli, Victor Feyens, Andrea Grazioso (agr-odoo), Sébastien Theys, std-odoo, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, abd-msyukyu-odoo, William Braeckman, Benjamin Vray, Benoit Socias, Florian Vranckx, Nicolas Bayet, luvi, Renaud Thiry, Louis Wicket (wil), alsh-odoo, Maximilien (malb), Victor Piryns (pivi), Julien (jula), amdi-odoo, Pierre-Yves Dufays, Robin Lejeune (role), Dylan Kiss (dyki), Mayurrajsinh Rathod, Mahdi Cheikh Rouhou (macr), omra-odoo, Walid (wasa), Deependra Solanki, visp-odoo, jorv-odoo, aath-odoo, Rodolpho Lima, mano-odoo, guce, Rémi - Le Filament, yagp-odoo, Pierre Pulinckx (PIPU), Ezzuldin Zaky (ezza), Pierre Pulinckx, Anton Romanova (roan), Bastien PIERRE, Michaël Mattiello, Panagiotis Kyriakou, Thomas Josse (THJO), Krzysztof Magusiak (krma), Ajit Singh, mojem, pajo, bhna-odoo, Brett Cutler, defl, bikh-odoo, agbr-odoo, Alice Gaudon, Augustin (duau), Alessandro Lupo, saurabh, sbbh-odoo, Séna Nshimiyimana, Kadam Darji, h4818 (ayh), ELCO, chpa-odoo, shmn-odoo
- Odoo dependencies
- Python dependencies
- None
- System dependencies
- None
- Required by
- mail_tracking_mass_mailing, marketing_card, mass_mailing_crm, mass_mailing_event, mass_mailing_event_sms, mass_mailing_event_track, mass_mailing_event_track_sms, mass_mailing_partner, mass_mailing_resend, mass_mailing_sale, mass_mailing_slides, mass_mailing_sms, mass_mailing_themes, test_mail_full, test_mass_mailing, website_mass_mailing
- Description
Code Analysis ⓘ
Views touched (172)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
ab_testing_description |
Mass Mailing: A/B Test Description | ir.ui.view | qweb | New |
digest_mail_main |
digest_mail_main | ir.ui.view | qweb | Inherits digest.digest_mail_main |
email_compose_form_mass_mailing |
mail.compose.message.form.mass_mailing | mail.compose.message | form | Inherits mail.email_compose_message_wizard_form |
email_designer_snippets |
email_designer_snippets | ir.ui.view | qweb | New |
email_designer_themes |
email_designer_themes | ir.ui.view | qweb | New |
link_tracker_click_view_form |
link.tracker.click.view.form.inherit.mass_mailing | link.tracker.click | form | Inherits link_tracker.link_tracker_click_view_form |
link_tracker_click_view_graph |
link.tracker.click.view.graph.inherit.mass_mailing | link.tracker.click | graph | Inherits link_tracker.link_tracker_click_view_graph |
link_tracker_click_view_search |
link.tracker.click.view.search.inherit.mass_mailing | link.tracker.click | search | Inherits link_tracker.link_tracker_click_view_search |
link_tracker_click_view_tree |
link.tracker.click.view.list.inherit.mass_mailing | link.tracker.click | list | Inherits link_tracker.link_tracker_click_view_tree |
link_tracker_view_form |
link.tracker.view.form.inherit.mass.mail | link.tracker | form | Inherits link_tracker.link_tracker_view_form |
link_tracker_view_search |
link.tracker.view.search.inherit.mass.mail | link.tracker | search | Inherits link_tracker.link_tracker_view_search |
link_tracker_view_tree |
link.tracker.view.list.inherit.mass.mail | link.tracker | list | Inherits link_tracker.link_tracker_view_tree |
mail_blacklist_view_form |
mail.blacklist.view.form.inherit.mailing | mail.blacklist | form | Inherits mail.mail_blacklist_view_form |
mail_blacklist_view_search |
mail.blacklist.view.search | mail.blacklist | search | Inherits mail.mail_blacklist_view_search |
mail_blacklist_view_tree |
mail.blacklist.view.list.inherit.mailing | mail.blacklist | list | Inherits mail.mail_blacklist_view_tree |
mailing_contact_import_view_form |
mailing.contact.import.view.form | mailing.contact.import | form | New |
mailing_contact_to_list_view_form |
mailing.contact.to.list.view.form | mailing.contact.to.list | form | New |
mailing_contact_view_form |
mailing.contact.view.form | mailing.contact | form | New |
mailing_contact_view_form_split_name |
mailing.contact.view.form.split.name | mailing.contact | form | Inherits mass_mailing.mailing_contact_view_form |
mailing_contact_view_graph |
mailing.contact.view.graph | mailing.contact | graph | New |
mailing_contact_view_kanban |
mailing.contact.view.kanban | mailing.contact | kanban | New |
mailing_contact_view_pivot |
mailing.contact.pivot | mailing.contact | pivot | New |
mailing_contact_view_search |
mailing.contact.view.search | mailing.contact | search | New |
mailing_contact_view_tree |
mailing.contact.view.list | mailing.contact | list | New |
mailing_contact_view_tree_split_name |
mailing.contact.view.list.split.name | mailing.contact | list | Inherits mass_mailing.mailing_contact_view_tree |
mailing_filter_view_form |
mailing.filter.view.form | mailing.filter | form | New |
mailing_filter_view_search |
mailing.filter.view.search | mailing.filter | search | New |
mailing_filter_view_tree |
mailing.filter.view.list | mailing.filter | list | New |
mailing_list_merge_view_form |
mailing.list.merge.form | mailing.list.merge | form | New |
mailing_list_view_form |
mailing.list.form | mailing.list | form | New |
mailing_list_view_form_simplified |
mailing.list.form.simplified | mailing.list | form | New |
mailing_list_view_kanban |
mailing.list.view.kanban | mailing.list | kanban | New |
mailing_list_view_search |
mailing.list.view.search | mailing.list | search | New |
mailing_list_view_tree |
mailing.list.view.list | mailing.list | list | New |
mailing_mailing_schedule_date_view_form |
mailing.mailing.schedule.date.view.form | mailing.mailing.schedule.date | form | New |
mailing_mailing_view_calendar |
mailing.mailing.view.calendar | mailing.mailing | calendar | New |
mailing_report_deactivated |
Report Unsubscribed | ir.ui.view | qweb | New |
mailing_subscription_optout_view_form |
mailing.subscription.optout.view.form | mailing.subscription.optout | form | New |
mailing_subscription_optout_view_search |
mailing.subscription.optout.view.search | mailing.subscription.optout | search | New |
mailing_subscription_optout_view_tree |
mailing.subscription.optout.view.list | mailing.subscription.optout | list | New |
mailing_subscription_view_form |
mailing.subscription.view.form | mailing.subscription | form | New |
mailing_subscription_view_graph |
mailing.subscription.view.graph | mailing.subscription | graph | New |
mailing_subscription_view_pivot |
mailing.subscription.view.pivot | mailing.subscription | pivot | New |
mailing_subscription_view_search |
mailing.subscription.view.search | mailing.subscription | search | New |
mailing_subscription_view_tree |
mailing.subscription.view.list | mailing.subscription | list | New |
mailing_trace_report_view_graph |
mailing.trace.report.view.graph | mailing.trace.report | graph | New |
mailing_trace_report_view_pivot |
mailing.trace.report.view.pivot | mailing.trace.report | pivot | New |
mailing_trace_report_view_search |
mailing.trace.report.view.search | mailing.trace.report | search | New |
mailing_trace_report_view_tree |
mailing.trace.report.view.list | mailing.trace.report | list | New |
mailing_trace_view_form |
mailing.trace.view.form | mailing.trace | form | New |
mailing_trace_view_search |
mailing.trace.view.search | mailing.trace | search | New |
mailing_trace_view_tree |
mailing.trace.view.list | mailing.trace | list | New |
mailing_trace_view_tree_mail |
mailing.trace.view.list.mail | mailing.trace | list | New |
mailing_view |
Browser View | ir.ui.view | qweb | New |
mailing_view_generic |
View in Browser | ir.ui.view | qweb | New |
mass_mailing.layout |
Mass Mailing Layout | ir.ui.view | qweb | New |
mass_mailing.mass_mailing_kpi_link_trackers |
Marketing: mailing link trackers statistic | ir.ui.view | qweb | New |
mass_mailing.preview_content_mobile |
mass_mailing.preview_content_mobile | ir.ui.view | qweb | New |
mass_mailing.s_content_card_1 |
Content card | ir.ui.view | qweb | New |
mass_mailing.s_content_card_2 |
Content card | ir.ui.view | qweb | New |
mass_mailing.s_content_card_3 |
Content card | ir.ui.view | qweb | New |
mass_mailing.s_content_card_4 |
Content card | ir.ui.view | qweb | New |
mass_mailing.s_content_card_5 |
Content card | ir.ui.view | qweb | New |
mass_mailing.s_content_card_6 |
Content card | ir.ui.view | qweb | New |
mass_mailing.s_content_card_7 |
Content card | ir.ui.view | qweb | New |
mass_mailing.s_mailing_list_advertisement |
Mailing List | ir.ui.view | qweb | New |
mass_mailing.s_snippet_group |
Snippet Group | ir.ui.view | qweb | New |
mass_mailing_mail_layout |
mass_mailing_mail_layout | ir.ui.view | qweb | New |
page_mailing_confirm_unsubscribe |
page_mailing_confirm_unsubscribe | ir.ui.view | qweb | New |
page_mailing_has_unsubscribed |
page_mailing_has_unsubscribed | ir.ui.view | qweb | New |
page_mailing_unsubscribe |
Unsubscribe | ir.ui.view | qweb | New |
res_config_settings_view_form |
res.config.settings.view.form.inherit.mass.mailing | res.config.settings | form | Inherits base.res_config_settings_view_form |
s_alert |
Alert | ir.ui.view | qweb | New |
s_attributes_horizontal |
Horizontal Attributes | ir.ui.view | qweb | New |
s_author |
Author | ir.ui.view | qweb | New |
s_badge |
Badge | ir.ui.view | qweb | New |
s_blockquote |
Blockquote | ir.ui.view | qweb | New |
s_blog_post_card |
Blog Post | ir.ui.view | qweb | New |
s_blog_title |
Blog Title | ir.ui.view | qweb | New |
s_button |
Button | ir.ui.view | qweb | New |
s_call_to_action |
Call to Action | ir.ui.view | qweb | New |
s_centered_cta_badge |
Alert Info CTA | ir.ui.view | qweb | New |
s_color_blocks_2 |
Big Boxes | ir.ui.view | qweb | New |
s_company_team |
Team | ir.ui.view | qweb | New |
s_company_team_shapes |
Team Shapes | ir.ui.view | qweb | New |
s_comparisons |
Comparisons | ir.ui.view | qweb | New |
s_coupon_code |
Promo Code | ir.ui.view | qweb | New |
s_cover |
Cover | ir.ui.view | qweb | New |
s_cta_badge |
CTA Badge | ir.ui.view | qweb | New |
s_customer_quote |
Customer Quote | ir.ui.view | qweb | New |
s_event |
Event | ir.ui.view | qweb | New |
s_features_column |
Features Column | ir.ui.view | qweb | New |
s_features_grid |
Features Grid | ir.ui.view | qweb | New |
s_features_showcase |
Feature Showcase with Image | ir.ui.view | qweb | New |
s_hr |
Separator | ir.ui.view | qweb | New |
s_hr_title |
Separator Title | ir.ui.view | qweb | New |
s_icon |
Icon | ir.ui.view | qweb | New |
s_image |
Image | ir.ui.view | qweb | New |
s_image_text |
Image - Text | ir.ui.view | qweb | New |
s_inline_text |
Text | ir.ui.view | qweb | New |
s_link_list |
Link List | ir.ui.view | qweb | New |
s_mail_block_footer_one_liner |
Social + Footer + Separator | ir.ui.view | qweb | New |
s_mail_block_footer_social |
Social + Footer | ir.ui.view | qweb | New |
s_mail_block_footer_social_and_logo |
Social + Logo | ir.ui.view | qweb | New |
s_mail_block_footer_social_left |
Social + Footer | ir.ui.view | qweb | New |
s_mail_block_header_logo |
Centered Logo | ir.ui.view | qweb | New |
s_mail_block_header_logo_and_button |
s_mail_block_header_logo_and_button | ir.ui.view | qweb | New |
s_mail_block_header_logo_and_inline_menu |
Logo + Inline Menu | ir.ui.view | qweb | New |
s_mail_block_header_logo_and_stacked_menu |
Logo + Stacked Menu | ir.ui.view | qweb | New |
s_mail_block_header_logo_col |
Company Logo with Dates and Issues | ir.ui.view | qweb | New |
s_mail_block_header_menu |
s_mail_block_header_menu | ir.ui.view | qweb | New |
s_mail_block_header_name_and_button |
Company Name and Log In Button | ir.ui.view | qweb | New |
s_mail_block_header_name_and_inline_menu |
Company Name and Menu | ir.ui.view | qweb | New |
s_mail_block_header_social |
Left Logo | ir.ui.view | qweb | New |
s_mail_block_header_text_social |
Left Text | ir.ui.view | qweb | New |
s_mail_block_header_view |
View Online | ir.ui.view | qweb | New |
s_masonry_block |
Masonry | ir.ui.view | qweb | New |
s_masonry_block_alternation_image_text_template |
s_masonry_block_alternation_image_text_template | ir.ui.view | qweb | New |
s_masonry_block_alternation_text_image_template |
s_masonry_block_alternation_text_image_template | ir.ui.view | qweb | New |
s_masonry_block_alternation_text_image_text_template |
s_masonry_block_alternation_text_image_text_template | ir.ui.view | qweb | New |
s_masonry_block_alternation_text_template |
s_masonry_block_alternation_text_template | ir.ui.view | qweb | New |
s_masonry_block_default_template |
s_masonry_block_default_template | ir.ui.view | qweb | New |
s_masonry_block_image_texts_image_template |
s_masonry_block_image_texts_image_template | ir.ui.view | qweb | New |
s_masonry_block_images_template |
s_masonry_block_images_template | ir.ui.view | qweb | New |
s_masonry_block_mosaic_template |
s_masonry_block_mosaic_template | ir.ui.view | qweb | New |
s_masonry_block_reversed_template |
s_masonry_block_reversed_template | ir.ui.view | qweb | New |
s_masonry_block_texts_image_texts_template |
s_masonry_block_texts_image_texts_template | ir.ui.view | qweb | New |
s_media_list |
Media List | ir.ui.view | qweb | New |
s_membership_advertisement |
Membership Advertisement | ir.ui.view | qweb | New |
s_numbers |
Numbers | ir.ui.view | qweb | New |
s_picture |
Picture | ir.ui.view | qweb | New |
s_pricelist_boxed |
Pricelist Boxed | ir.ui.view | qweb | New |
s_pricelist_boxed_item |
s_pricelist_boxed_item | ir.ui.view | qweb | New |
s_product_list |
Items | ir.ui.view | qweb | New |
s_rating |
Rating | ir.ui.view | qweb | New |
s_references |
References | ir.ui.view | qweb | New |
s_reviews_wall |
Customers Testimonials | ir.ui.view | qweb | New |
s_schedule |
Schedule | ir.ui.view | qweb | New |
s_section_mobile |
App Advertising Block | ir.ui.view | qweb | New |
s_showcase |
Showcase | ir.ui.view | qweb | New |
s_special_offer_cta |
Special Offer CTA | ir.ui.view | qweb | New |
s_subtitle |
Subtitle | ir.ui.view | qweb | New |
s_text_block |
Text | ir.ui.view | qweb | New |
s_text_card |
Card with Text | ir.ui.view | qweb | New |
s_text_center_cta |
Call To Action with Centered Text | ir.ui.view | qweb | New |
s_text_contact |
Contact and Schedule | ir.ui.view | qweb | New |
s_text_cta_card |
Call To Action Card | ir.ui.view | qweb | New |
s_text_describing_benefits |
Benefits | ir.ui.view | qweb | New |
s_text_highlight |
Text Highlight | ir.ui.view | qweb | New |
s_text_image |
Text - Image | ir.ui.view | qweb | New |
s_text_left_cta |
Call To Action with Text | ir.ui.view | qweb | New |
s_text_need_help |
Need Help? | ir.ui.view | qweb | New |
s_text_product_description |
Product Description | ir.ui.view | qweb | New |
s_text_product_showcase |
Product Showcase | ir.ui.view | qweb | New |
s_text_signature |
Mail Structure | ir.ui.view | qweb | New |
s_three_columns |
Columns | ir.ui.view | qweb | New |
s_title |
Title | ir.ui.view | qweb | New |
s_title_with_side_text |
Title with Side Text | ir.ui.view | qweb | New |
s_video |
Video | ir.ui.view | qweb | New |
social_links |
social_links | ir.ui.view | qweb | New |
theme_basic_template |
theme_basic_template | ir.ui.view | qweb | New |
theme_default_template |
theme_default_template | ir.ui.view | qweb | New |
theme_empty_template |
theme_empty_template | ir.ui.view | qweb | New |
unsubscribe_form |
unsubscribe_form | ir.ui.view | qweb | New |
utm_campaign_view_form |
utm.campaign.view.form | utm.campaign | form | Inherits utm.utm_campaign_view_form |
utm_campaign_view_kanban |
utm.campaign.view.kanban | utm.campaign | kanban | Inherits utm.utm_campaign_view_kanban |
view_mail_mail_statistics_graph |
Mail Statistics Graph | mailing.trace | graph | New |
view_mail_mass_mailing_form |
mailing.mailing.form | mailing.mailing | form | New |
view_mail_mass_mailing_kanban |
mailing.mailing.kanban | mailing.mailing | kanban | New |
view_mail_mass_mailing_search |
mailing.mailing.search | mailing.mailing | search | New |
view_mail_mass_mailing_test_form |
mailing.mailing.test.form | mailing.mailing.test | form | New |
view_mail_mass_mailing_tree |
mailing.mailing.list | mailing.mailing | list | New |
HTTP endpoints (17)
| Route(s) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/mail/mailing/<int:mailing_id>/unsubscribe |
MailingLegacy.mailing_unsubscribe |
public | http | ALL | website |
/r/<string:code>/m/<int:mailing_trace_id> |
MassMailController.full_url_redirect |
public | http | ALL | sudo |
/mailing/blocklist/add |
MassMailController.mail_blocklist_add |
public | jsonrpc | ALL | sudo |
/mailing/blocklist/remove |
MassMailController.mail_blocklist_remove |
public | jsonrpc | ALL | sudo |
/mailing/<int:mailing_id>/confirm_unsubscribe |
MassMailController.mailing_confirm_unsubscribe |
public | http | ALL | sudo website |
/mailing/confirm_unsubscribe |
MassMailController.mailing_confirm_unsubscribe_post |
public | http | POST | website |
/mailing/my |
MassMailController.mailing_my |
user | http | ALL | website |
/mailing/report/unsubscribe |
MassMailController.mailing_report_deactivate |
public | http | ALL | sudo website |
/mailing/feedback |
MassMailController.mailing_send_feedback |
public | jsonrpc | ALL | sudo |
/mailing/<int:mailing_id>/unsubscribe |
MassMailController.mailing_unsubscribe |
public | http | ALL | website |
/mailing/<int:mailing_id>/unsubscribe_oneclick |
MassMailController.mailing_unsubscribe_oneclick |
public | http | POST | csrf off website |
/unsubscribe_from_list |
MassMailController.mailing_unsubscribe_placeholder_link |
public | http | ALL | website |
/mailing/list/update |
MassMailController.mailing_update_list_subscription |
public | jsonrpc | ALL | sudo |
/mailing/<int:mailing_id>/view |
MassMailController.mailing_view_in_browser |
public | http | ALL | sudo website |
/view |
MassMailController.mailing_view_in_browser_placeholder_link |
user | http | ALL | website |
/mailing/mobile/preview |
MassMailController.mass_mailing_preview_mobile_content |
user | http | GET | website |
/mail/track/<int:mail_id>/<string:token>/blank.gif |
MassMailController.track_mail_open |
public | http | ALL | sudo |
Models touched (30)
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (1)
-
active_mailing_idsOne2many → mailing.mailingcomodel_name='mailing.mailing'domain=[('state', '!=', 'done'), ('active', '=', True)]inverse_name='mail_server_id'readonly=Truestring='Active mailing using this mail server'
No public methods.
New fields (1)
-
is_mailing_enabledBooleancompute='_compute_is_mailing_enabled'help='Whether this model supports marketing mailing capabilities (notably email and SMS).'search='_search_is_mailing_enabled'string='Mailing Enabled'
No public methods.
New fields (1)
-
mass_mailing_idMany2one → mailing.mailingstring='Mass Mailing' args: 'mailing.mailing'
No public methods.
New fields (2)
-
mailing_trace_idMany2one → mailing.traceindex='btree_not_null'string='Mail Statistics' args: 'mailing.trace' -
mass_mailing_idMany2one → mailing.mailingindex='btree_not_null'string='Mass Mailing' args: 'mailing.mailing'
-
add_click(self, code, **route_values)@api.model
New fields (1)
-
opt_out_reason_idMany2one → mailing.subscription.optoutondelete='restrict'string='Opt-out Reason'tracking=10 args: 'mailing.subscription.optout'
No public methods.
New fields (4)
-
campaign_idMany2one → utm.campaignondelete='set null'string='Mass Mailing Campaign' args: 'utm.campaign' -
mailing_list_idsMany2many → mailing.liststring='Mailing List' args: 'mailing.list' -
mass_mailing_idMany2one → mailing.mailingondelete='cascade'string='Mass Mailing' args: 'mailing.mailing' -
mass_mailing_nameCharhelp='If set, a mass mailing will be created so that you can track its results in the Email Marketing app.'string='Mass Mailing Name'
No public methods.
New fields (2)
-
mailing_idMany2one → mailing.mailingstring='Mass Mailing' args: 'mailing.mailing' -
mailing_trace_idsOne2many → mailing.tracestring='Statistics' args: 'mailing.trace', 'mail_mail_id'
No public methods.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (0)
No new fields.
Public methods (3)-
message_mail_with_source(self, source_ref, **kwargs) -
message_new(self, msg_dict, custom_values=None)@api.model -
message_post_with_source(self, source_ref, **kwargs)
New fields (10)
-
company_nameCharstring='Company Name' -
country_idMany2one → res.countrystring='Country' args: 'res.country' -
emailCharargs: 'Email' -
first_nameCharargs: 'First Name' -
last_nameCharargs: 'Last Name' -
list_idsMany2many → mailing.liststring='Mailing Lists' args: 'mailing.list', 'mailing_subscription', 'contact_id', 'list_id' -
nameCharcompute='_compute_name'readonly=Falsestore=Truetracking=True args: 'Name' -
opt_outBooleancompute='_compute_opt_out'help='Opt out flag for a specific mailing list. This field should not be used in a view without a unique and active mailing list context.'search='_search_opt_out' args: 'Opt Out' -
subscription_idsOne2many → mailing.subscriptionstring='Subscription Information' args: 'mailing.subscription', 'contact_id' -
tag_idsMany2many → res.partner.categorystring='Tags' args: 'res.partner.category'
-
action_add_to_mailing_list(self) -
action_import(self) -
add_to_list(self, name, list_id)@api.model -
copy(self, default=None)Cleans the default_list_ids while duplicating mailing contact in context of a mailing list because we already have subscription lists copied over for newly created contact, no need to add the ones from default_list_ids again -
create(self, vals_list)@api.model_create_multiSynchronize default_list_ids (currently used notably for computed fields) default key with subscription_ids given by user when creating contacts. Those two values have the same purpose, adding a list to to the contact either through a direct write on m2m, either through a write on middle model subscription. This is a bit hackish but is due to default_list_ids key being used to compute oupt_out field. This should be cleaned in master but here we simply try to limit issues while keeping current behavior. -
default_get(self, fields)@api.modelWhen coming from a mailing list we may have a default_list_ids context key. We should use it to create subscription_ids default value that are displayed to the user as list_ids is not displayed on form view. -
fields_get(self, allfields=None, attributes=None)@api.modelHide first and last name field if the split name feature is not enabled. -
get_import_templates(self)@api.model -
name_create(self, name)@api.model
New fields (2)
-
contact_listTexthelp='Contact list that will be imported, one contact per line' args: 'Contact List' -
mailing_list_idsMany2many → mailing.liststring='Lists' args: 'mailing.list'
-
action_import(self)Import each lines of "contact_list" as a new contact. -
action_open_base_import(self)Open the base import wizard to import mailing list contacts with a xlsx file.
New fields (2)
-
contact_idsMany2many → mailing.contactstring='Contacts' args: 'mailing.contact' -
mailing_list_idMany2one → mailing.listrequired=Truestring='Mailing List' args: 'mailing.list'
-
action_add_contacts(self)Simply add contacts to the mailing list and close wizard. -
action_add_contacts_and_send_mailing(self)Add contacts to the mailing list and redirect to a new mailing on this list.
New fields (5)
-
create_uidMany2one → res.usersdefault=<expr>index=Truereadonly=True args: 'res.users', 'Saved by' -
mailing_domainCharrequired=Truestring='Filter Domain' -
mailing_model_idMany2one → ir.modelondelete='cascade'required=Truestring='Recipients Model' args: 'ir.model' -
mailing_model_nameCharrelated='mailing_model_id.model'string='Recipients Model Name' -
nameCharrequired=Truestring='Filter Name'
No public methods.
New fields (14)
-
activeBooleandefault=True -
contact_countIntegercompute='_compute_mailing_list_statistics'string='Number of Contacts' -
contact_count_blacklistedIntegercompute='_compute_mailing_list_statistics'string='Number of Blacklisted' -
contact_count_emailIntegercompute='_compute_mailing_list_statistics'string='Number of Emails' -
contact_count_opt_outIntegercompute='_compute_mailing_list_statistics'string='Number of Opted-out' -
contact_idsMany2many → mailing.contactcopy=Falsestring='Mailing Lists' args: 'mailing.contact', 'mailing_subscription', 'list_id', 'contact_id' -
contact_pct_blacklistedFloatcompute='_compute_mailing_list_statistics'string='Percentage of Blacklisted' -
contact_pct_bounceFloatcompute='_compute_mailing_list_statistics'string='Percentage of Bouncing' -
contact_pct_opt_outFloatcompute='_compute_mailing_list_statistics'string='Percentage of Opted-out' -
is_publicBooleandefault=Falsehelp='The mailing list can be accessible by recipients in the subscription management page to allow them to update their preferences.'string='Show In Preferences' -
mailing_countIntegercompute='_compute_mailing_count'string='Number of Mailing' -
mailing_idsMany2many → mailing.mailingcopy=Falsestring='Mass Mailings' args: 'mailing.mailing', 'mail_mass_mailing_list_rel' -
nameCharrequired=Truestring='Mailing List' -
subscription_idsOne2many → mailing.subscriptioncopy=Truedepends=['contact_ids']string='Subscription Information' args: 'mailing.subscription', 'list_id'
-
action_merge(self, src_lists, archive)Insert all the contact from the mailing lists 'src_lists' to the mailing list in 'self'. Possibility to archive the mailing lists 'src_lists' after the merge except the destination mailing list 'self'. -
action_open_import(self)Open the mailing list contact import wizard. -
action_send_mailing(self)Open the mailing form view, with the current lists set as recipients. -
action_view_contacts(self) -
action_view_contacts_blacklisted(self) -
action_view_contacts_bouncing(self) -
action_view_contacts_email(self) -
action_view_contacts_opt_out(self) -
action_view_mailings(self) -
copy_data(self, default=None) -
write(self, vals)
New fields (5)
-
archive_src_listsBooleandefault=True args: 'Archive source mailing lists' -
dest_list_idMany2one → mailing.liststring='Destination Mailing List' args: 'mailing.list' -
merge_optionsSelectiondefault='new'required=True args: [('new', 'Merge into a new mailing list'), ('existing', 'Merge into an existing mailing list')], 'Merge Option' -
new_list_nameCharargs: 'New Mailing List Name' -
src_list_idsMany2many → mailing.liststring='Mailing Lists' args: 'mailing.list'
-
action_mailing_lists_merge(self) -
default_get(self, fields)@api.model
New fields (69)
-
ab_testing_completedBooleanrelated='campaign_id.ab_testing_completed' -
ab_testing_descriptionHtmlcompute='_compute_ab_testing_description' args: 'A/B Testing Description' -
ab_testing_enabledBooleandefault=Falsehelp='If checked, recipients will be mailed only once for the whole campaign. This lets you send different mailings to randomly selected recipients and test the effectiveness of the mailings, without causing duplicate messages.'string='Allow A/B Testing' -
ab_testing_is_winner_mailingBooleancompute='_compute_ab_testing_is_winner_mailing' args: 'Is the Winner of its Campaign' -
ab_testing_mailings_countIntegerrelated='campaign_id.ab_testing_mailings_count' -
ab_testing_pcIntegerdefault=10help='Percentage of the contacts that will be mailed. Recipients will be chosen randomly.'string='A/B Testing percentage' -
ab_testing_schedule_datetimeDatetimedefault=<expr>readonly=Falserelated='campaign_id.ab_testing_schedule_datetime' -
ab_testing_winner_selectionSelectioncopy=Truedefault='opened_ratio'readonly=Falserelated='campaign_id.ab_testing_winner_selection' -
activeBooleandefault=Truetracking=True -
attachment_idsMany2many → ir.attachmentbypass_search_access=Truestring='Attachments' args: 'ir.attachment', 'mass_mailing_ir_attachments_rel', 'mass_mailing_id', 'attachment_id' -
body_archHtmlsanitize='email_outgoing'sanitize_output_method='html'string='Body'translate=False -
body_htmlHtmlrender_engine='qweb'render_options={'post_process': True}sanitize='email_outgoing'string='Body converted to be sent by mail' -
bouncedIntegercompute='_compute_statistics' -
bounced_ratioFloatcompute='_compute_statistics'string='Bounced Ratio' -
calendar_dateDatetimecompute='_compute_calendar_date'copy=Falsehelp='Date at which the mailing was or will be sent.'store=True args: 'Calendar Date' -
campaign_idMany2one → utm.campaignindex=Trueondelete='set null'string='UTM Campaign' args: 'utm.campaign' -
canceledIntegercompute='_compute_statistics' -
clickedIntegercompute='_compute_statistics' -
clicks_ratioFloatcompute='_compute_clicks_ratio'string='Number of Clicks' -
colorIntegerstring='Color Index' -
contact_list_idsMany2many → mailing.liststring='Mailing Lists' args: 'mailing.list', 'mail_mass_mailing_list_rel' -
deliveredIntegercompute='_compute_statistics' -
email_fromCharcompute='_compute_email_from'precompute=Truereadonly=Falsestore=Truestring='Send From' -
expectedIntegercompute='_compute_statistics' -
failedIntegercompute='_compute_statistics' -
favoriteBooleancopy=Falsetracking=True args: 'Favorite' -
favorite_dateDatetimecompute='_compute_favorite_date'copy=Falsehelp='When this mailing was added in the favorites'store=True args: 'Favorite Date' -
is_ab_test_sentBooleancompute='_compute_is_ab_test_sent' -
is_body_emptyBooleancompute='_compute_is_body_empty' -
keep_archivesBooleanstring='Keep Archives' -
kpi_mail_requiredBooleancopy=False args: 'KPI mail required' -
link_trackers_countIntegercompute='_compute_link_trackers_count'string='Link Trackers Count' -
mail_server_availableBooleancompute='_compute_mail_server_available'help='Technical field used to know if the user has activated the outgoing mail server option in the settings' -
mail_server_idMany2one → ir.mail_serverdefault=_get_default_mail_server_idhelp='Use a specific mail server in priority. Otherwise Odoo relies on the first outgoing mail server available (based on their sequencing) as it does for normal mails.'index='btree_not_null'string='Mail Server' args: 'ir.mail_server' -
mailing_domainCharcompute='_compute_mailing_domain'compute_sudo=Falsereadonly=Falsestore=Truestring='Domain' -
mailing_filter_countIntegercompute='_compute_mailing_filter_count' args: '# Favorite Filters' -
mailing_filter_domainCharrelated='mailing_filter_id.mailing_domain' args: 'Favorite filter domain' -
mailing_filter_idMany2one → mailing.filtercompute='_compute_mailing_filter_id'domain="[('mailing_model_name', '=', mailing_model_name)]"readonly=Falsestore=Truestring='Favorite Filter' args: 'mailing.filter' -
mailing_model_idMany2one → ir.modeldefault=<expr>domain=[('is_mailing_enabled', '=', True)]ondelete='cascade'required=Truestring='Recipients Model' args: 'ir.model' -
mailing_model_nameCharreadonly=Truerelated='mailing_model_id.model'related_sudo=Truestring='Recipients Model Name' -
mailing_model_realCharcompute='_compute_mailing_model_real'string='Recipients Real Model' -
mailing_on_mailing_listBooleancompute='_compute_mailing_on_mailing_list'string='Based on Mailing Lists' -
mailing_trace_idsOne2many → mailing.tracestring='Emails Statistics' args: 'mailing.trace', 'mass_mailing_id' -
mailing_typeSelectiondefault='mail'required=Truestring='Mailing Type' args: [('mail', 'Email')] -
mailing_type_descriptionCharcompute='_compute_mailing_type_description' args: 'Mailing Type Description' -
medium_idMany2one → utm.mediumcompute='_compute_medium_id'help='UTM Medium: delivery method (email, sms, ...)'ondelete='restrict'readonly=Falsestore=Truestring='Medium' args: 'utm.medium' -
next_departureDatetimecompute='_compute_next_departure'string='Scheduled date' -
next_departure_is_pastBooleancompute='_compute_next_departure' -
openedIntegercompute='_compute_statistics' -
opened_ratioFloatcompute='_compute_statistics'string='Opened Ratio' -
pendingIntegercompute='_compute_statistics' -
previewCharhelp='Catchy preview sentence that encourages recipients to open this email.\nIn most inboxes, this is displayed next to the subject.\nKeep it empty if you prefer the first characters of your email content to appear instead.'render_engine='inline_template'render_options={'post_process': True}translate=False args: 'Preview' -
processIntegercompute='_compute_statistics' -
received_ratioFloatcompute='_compute_statistics'string='Received Ratio' -
repliedIntegercompute='_compute_statistics' -
replied_ratioFloatcompute='_compute_statistics'string='Replied Ratio' -
reply_toCharcompute='_compute_reply_to'help='Preferred Reply-To Address'readonly=Falsestore=Truestring='Reply To' -
reply_to_modeSelectioncompute='_compute_reply_to_mode'help='Thread: replies go to target document. Email: replies are routed to a given email.'readonly=Falsestore=Truestring='Reply-To Mode' args: [('update', 'Recipient Followers'), ('new', 'Specified Email Address')] -
schedule_dateDatetimecompute='_compute_schedule_date'copy=Truereadonly=Falsestore=Truestring='Scheduled for'tracking=True -
schedule_typeSelectiondefault='now'readonly=Falserequired=Truestring='Schedule' args: [('now', 'Send now'), ('scheduled', 'Send on')] -
scheduledIntegercompute='_compute_statistics' -
sentIntegercompute='_compute_statistics' -
sent_dateDatetimecopy=Falsestring='Sent Date' -
stateSelectioncopy=Falsedefault='draft'group_expand=Truerequired=Truestring='Status'tracking=True args: [('draft', 'Draft'), ('in_queue', 'In Queue'), ('sending', 'Sending'), ('done', 'Sent')] -
subjectCharrequired=Truetranslate=False args: 'Subject' -
totalIntegercompute='_compute_total' -
use_exclusion_listBooleancopy=Falsedefault=Truehelp='Prevent sending messages to blacklisted contacts. Disable only when absolutely necessary.' args: 'Use Exclusion List' -
user_idMany2one → res.usersdefault=<expr>string='Responsible'tracking=True args: 'res.users' -
warning_messageCharcompute='_compute_warning_message'help='Warning message displayed in the mailing form view' args: 'Warning Message'
-
action_cancel(self) -
action_compare_versions(self) -
action_duplicate(self) -
action_fetch_favorites(self, extra_domain=None)@api.modelReturn all mailings set as favorite and skip mailings with empty body. Return archived mailing templates as well, so the user can archive the templates while keeping using it, without cluttering the Kanban view if they're a lot of templates. -
action_launch(self) -
action_put_in_queue(self) -
action_reload(self) -
action_remove_favorite(self)Remove the current mailing from the favorites list. -
action_retry_failed(self)Remove all failed emails and their traces, and try sending them again. -
action_schedule(self) -
action_select_as_winner(self) -
action_send_mail(self, res_ids=None) -
action_send_winner_mailing(self)Send the winner mailing based on the winner selection field. This action is used in 2 cases: - When the user clicks on a button to send the winner mailing. There is only one mailing in self - When the cron is executed to send winner mailing based on the A/B testing schedule datetime. In this case 'self' contains all the mailing for the campaigns so we just need to take the first to determine the winner. If the winner mailing is computed automatically, we sudo the mailings of the campaign in order to sort correctly the mailings based on the selection that can be used with sub-modules like CRM and Sales -
action_set_favorite(self)Add the current mailing in the favorites list. -
action_test(self) -
action_view_bounced(self) -
action_view_clicked(self) -
action_view_delivered(self) -
action_view_link_trackers(self) -
action_view_mailing_contacts(self)Show the mailing contacts who are in a mailing list selected for this mailing. -
action_view_opened(self) -
action_view_replied(self) -
action_view_traces_canceled(self) -
action_view_traces_failed(self) -
action_view_traces_process(self) -
action_view_traces_scheduled(self) -
action_view_traces_sent(self) -
convert_links(self) -
copy_data(self, default=None) -
create(self, vals_list)@api.model_create_multi -
default_get(self, fields)@api.model -
write(self, vals)
New fields (2)
-
mass_mailing_idMany2one → mailing.mailingrequired=True args: 'mailing.mailing' -
schedule_dateDatetimestring='Scheduled for'
-
action_schedule_date(self)
New fields (2)
-
email_toTextdefault=_default_email_tohelp='Carriage-return-separated list of email addresses.'required=Truestring='Recipients' -
mass_mailing_idMany2one → mailing.mailingondelete='cascade'required=Truestring='Mailing' args: 'mailing.mailing'
-
send_mail_test(self)
New fields (7)
-
contact_idMany2one → mailing.contactondelete='cascade'required=Truestring='Contact' args: 'mailing.contact' -
is_blacklistedBooleanreadonly=Falserelated='contact_id.is_blacklisted'store=False -
list_idMany2one → mailing.listindex=Trueondelete='cascade'required=Truestring='Mailing List' args: 'mailing.list' -
message_bounceIntegerreadonly=Falserelated='contact_id.message_bounce'store=False -
opt_outBooleandefault=Falsehelp='The contact has chosen not to receive mails anymore from this list'string='Opt Out' -
opt_out_datetimeDatetimecompute='_compute_opt_out_datetime'readonly=Falsestore=Truestring='Unsubscription Date' -
opt_out_reason_idMany2one → mailing.subscription.optoutondelete='restrict'string='Reason' args: 'mailing.subscription.optout'
-
create(self, vals_list)@api.model_create_multi -
open_mailing_contact(self) -
write(self, vals)
New fields (3)
-
is_feedbackBooleanstring='Ask For Feedback' -
nameCharstring='Reason'translate=True -
sequenceIntegerdefault=10string='Sequence'
No public methods.
New fields (20)
-
campaign_idMany2oneindex='btree_not_null'readonly=Truerelated='mass_mailing_id.campaign_id'store=Truestring='Campaign' -
emailCharhelp='Normalized email address'string='Email' -
failure_reasonTextcopy=Falsereadonly=True args: 'Failure reason' -
failure_typeSelectionselection=[('unknown', 'Unknown error'), ('mail_bounce', 'Bounce'), ('mail_spam', 'Detected As Spam'), ('mail_email_invalid', 'Invalid email address'), ('mail_email_missing', 'Missing email address'), ('mail_from_invalid', 'Invalid from address'), ('mail_from_missing', 'Missing from address'), ('mail_smtp', 'Connection failed (outgoing mail server problem)'), ('mail_bl', 'Blacklisted Address'), ('mail_dup', 'Duplicated Email'), ('mail_optout', 'Opted Out')]string='Failure type' -
is_test_traceBooleanargs: 'Generated for testing' -
links_click_datetimeDatetimehelp='Stores last click datetime in case of multi clicks.' args: 'Clicked On' -
links_click_idsOne2many → link.tracker.clickstring='Links click' args: 'link.tracker.click', 'mailing_trace_id' -
mail_mail_idMany2one → mail.mailindex='btree_not_null'string='Mail' args: 'mail.mail' -
mail_mail_id_intIntegerhelp='ID of the related mail_mail. This field is an integer field because the related mail_mail can be deleted separately from its statistics. However the ID is needed for several action and controllers.'index='btree_not_null'string='Mail ID (tech)' -
mass_mailing_idMany2one → mailing.mailingindex=Trueondelete='cascade'string='Mailing' args: 'mailing.mailing' -
medium_idMany2onerelated='mass_mailing_id.medium_id' -
message_idCharstring='Message-ID' -
modelCharrequired=Truestring='Document model' -
open_datetimeDatetimeargs: 'Opened On' -
reply_datetimeDatetimeargs: 'Replied On' -
res_idMany2oneReferencemodel_field='model'string='Document ID' -
sent_datetimeDatetimeargs: 'Sent On' -
source_idMany2onerelated='mass_mailing_id.source_id' -
trace_statusSelectiondefault='outgoing'selection=[('outgoing', 'Outgoing'), ('process', 'Processing'), ('pending', 'Sent'), ('sent', 'Delivered'), ('open', 'Opened'), ('reply', 'Replied'), ('bounce', 'Bounced'), ('error', 'Exception'), ('cancel', 'Cancelled')]string='Status' -
trace_typeSelectiondefault='mail'required=Truestring='Type' args: [('mail', 'Email')]
-
action_view_contact(self) -
create(self, vals_list)@api.model_create_multi -
set_bounced(self, domain=None, bounce_message=False) -
set_canceled(self, domain=None) -
set_clicked(self, domain=None) -
set_failed(self, domain=None, failure_type=False) -
set_opened(self, domain=None)Reply / Open are a bit shared in various processes: reply implies open, click implies open. Let us avoid status override by skipping traces that are not already opened or replied. -
set_replied(self, domain=None) -
set_sent(self, domain=None)
New fields (17)
-
bouncedIntegerreadonly=True -
campaignCharreadonly=Truestring='Mailing Campaign' -
canceledIntegerreadonly=True -
clickedIntegerreadonly=True -
deliveredIntegerreadonly=True -
email_fromCharreadonly=True args: 'From' -
errorIntegerreadonly=True -
mailing_typeSelectiondefault='mail'required=Truestring='Type' args: [('mail', 'Mail')] -
nameCharreadonly=Truestring='Mass Mail' -
openedIntegerreadonly=True -
pendingIntegerreadonly=True -
processingIntegerreadonly=True -
repliedIntegerreadonly=True -
scheduledIntegerreadonly=True -
scheduled_dateDatetimereadonly=Truestring='Scheduled Date' -
sentIntegerreadonly=True -
stateSelectionreadonly=Truestring='Status' args: [('draft', 'Draft'), ('test', 'Tested'), ('done', 'Sent')]
-
init(self)Mass Mail Statistical Report: based on mailing.trace that models the various statistics collected for each mailing, and mailing.mailing model that models the various mailing performed.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (6)
-
group_mass_mailing_campaignBooleanhelp='This is useful if your marketing campaigns are composed of several emails'implied_group='mass_mailing.group_mass_mailing_campaign'string='Mailing Campaigns' -
mass_mailing_mail_server_idMany2one → ir.mail_serverconfig_parameter='mass_mailing.mail_server_id'string='Mail Server' args: 'ir.mail_server' -
mass_mailing_outgoing_mail_serverBooleanconfig_parameter='mass_mailing.outgoing_mail_server'help='Use a specific mail server in priority. Otherwise Odoo relies on the first outgoing mail server available (based on their sequencing) as it does for normal mails.'string='Dedicated Server' -
mass_mailing_reportsBooleanconfig_parameter='mass_mailing.mass_mailing_reports'help='Check how well your mailing is doing a day after it has been sent.'string='24H Stat Mailing Reports' -
mass_mailing_split_contact_nameBooleanhelp='Separate Mailing Contact Names into two fields'string='Split First and Last Name' -
show_blacklist_buttonsBooleanconfig_parameter='mass_mailing.show_blacklist_buttons'help='Allow the recipient to manage themselves their state in the blacklist via the unsubscription page.'string='Blacklist Option when Unsubscribing'
-
get_values(self)@api.model -
set_values(self)
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (12)
-
ab_testing_completedBooleancompute='_compute_ab_testing_completed'copy=Falsereadonly=Truestore=True args: 'A/B Testing Campaign Finished' -
ab_testing_mailings_countIntegercompute='_compute_mailing_mail_count' args: 'A/B Test Mailings #' -
ab_testing_schedule_datetimeDatetimedefault=<expr>help='Date that will be used to know when to determine and send the winner mailing' args: 'Send Final On' -
ab_testing_winner_mailing_idMany2one → mailing.mailingcopy=False args: 'mailing.mailing', 'A/B Campaign Winner Mailing' -
ab_testing_winner_selectionSelectiondefault='opened_ratio'help='Selection to determine the winner mailing that will be sent.'string='Winner Selection' args: [('manual', 'Manual'), ('opened_ratio', 'Highest Open Rate'), ('clicks_ratio', 'Highest Click Rate'), ('replied_ratio', 'Highest Reply Rate')] -
bounced_ratioFloatcompute='_compute_statistics'string='Bounced Ratio' -
is_mailing_campaign_activatedBooleancompute='_compute_is_mailing_campaign_activated' -
mailing_mail_countIntegercompute='_compute_mailing_mail_count'groups='mass_mailing.group_mass_mailing_user' args: 'Number of Mass Mailing' -
mailing_mail_idsOne2many → mailing.mailingdomain=[('mailing_type', '=', 'mail')]groups='mass_mailing.group_mass_mailing_user'string='Mass Mailings' args: 'mailing.mailing', 'campaign_id' -
opened_ratioFloatcompute='_compute_statistics'string='Opened Ratio' -
received_ratioFloatcompute='_compute_statistics'string='Received Ratio' -
replied_ratioFloatcompute='_compute_statistics'string='Replied Ratio'
No public methods.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (0)
No new fields.
Public methods (0)No public methods.
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…