[ADD] mass_mailing: new wizard to better handle list creatoin

and better managemetn from the mass mailing form view (still WIP).

Also integrated basic statbutton, but they have to be improved.

bzr revid: tde@openerp.com-20140403152329-u81p60c7f8rgypaz
This commit is contained in:
Thibault Delavallée 2014-04-03 17:23:29 +02:00
parent 03071cacf0
commit 28fe375aac
10 changed files with 188 additions and 110 deletions

View File

@ -43,8 +43,8 @@ professional emails and reuse templates in a few clicks.
'data/mass_mailing_data.xml',
'wizard/mail_compose_message_view.xml',
'wizard/create_template_view.xml',
'wizard/create_list_view.xml',
'wizard/test_mailing.xml',
'wizard/mailing_list_confirm.xml',
'views/mass_mailing.xml',
'views/res_config.xml',
'views/res_partner.xml',

View File

@ -143,7 +143,7 @@ class MassMailingList(osv.Model):
def create(self, cr, uid, values, context=None):
new_id = super(MassMailingList, self).create(cr, uid, values, context=context)
if values.get('model') == 'mail.mass_mailing.contact':
if values.get('model') == 'mail.mass_mailing.contact' and (not context or not context.get('no_contact_to_list')):
domain = values.get('domain')
if domain is None or domain is False:
return new_id
@ -175,7 +175,7 @@ class MassMailingList(osv.Model):
return False
self.pool['mail.mass_mailing'].write(cr, uid, [mass_mailing_id], {'contact_list_ids': [(4, list_id) for list_id in ids]}, context=context)
return {
'name': _('New Mass Mailing'),
'name': _('Mass Mailing'),
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'form',
@ -185,12 +185,9 @@ class MassMailingList(osv.Model):
}
def _get_domain(self, cr, uid, ids, context=None):
# todo: model-based method + check opt_out field exists
domains = {}
for contact_list in self.browse(cr, uid, ids, context=context):
if contact_list.model == 'mail.mass_mailing.contact':
domain = [('list_id', '=', contact_list.id)]
elif contact_list.domain is False or contact_list.domain is None: # domain is a string like False or None -> void list
if contact_list.domain is False or contact_list.domain is None: # domain is a string like False or None -> void list
domain = [('id', '=', '0')]
else:
domain = eval(contact_list.domain)
@ -495,6 +492,10 @@ class MassMailing(osv.Model):
'email_from': fields.char('From'),
'reply_to': fields.char('Reply To'),
'mailing_model': fields.selection(_mailing_model, string='Type', required=True),
'contact_list_choice': fields.selection(
[('existing', 'Use existing lists'), ('new', 'Create a new list')],
string='Contact List Choice', required=True
),
'contact_list_ids': fields.many2many(
'mail.mass_mailing.list', 'mail_mass_mailing_list_rel',
string='Mailing Lists',
@ -579,6 +580,7 @@ class MassMailing(osv.Model):
'date': fields.datetime.now,
'email_from': lambda self, cr, uid, ctx=None: self.pool['mail.message']._get_default_from(cr, uid, context=ctx),
'mailing_model': 'res.partner',
'contact_list_choice': 'existing',
'contact_ab_pc': 100,
}
@ -586,6 +588,18 @@ class MassMailing(osv.Model):
# Technical stuff
#------------------------------------------------------
def copy_data(self, cr, uid, id, default=None, context=None):
if default is None:
default = {}
mailing = self.browse(cr, uid, id, context=context)
default.update({
'state': 'draft',
'statistics_ids': [],
'state': 'draft',
'name': _('%s (duplicate)') % mailing.name,
})
return super(MassMailing, self).copy_data(cr, uid, id, default, context=context)
def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None, orderby=False):
""" Override read_group to always display all states. """
if groupby and groupby[0] == "state":
@ -635,13 +649,8 @@ class MassMailing(osv.Model):
def action_duplicate(self, cr, uid, ids, context=None):
copy_id = None
for mailing in self.browse(cr, uid, ids, context=context):
copy_id = self.copy(
cr, uid, mailing.id, default={
'statistics_ids': [],
'state': 'draft',
'name': _('%s (duplicate)') % mailing.name,
}, context=context)
for mid in ids:
copy_id = self.copy(cr, uid, mid, context=context)
if copy_id:
return {
'type': 'ir.actions.act_window',
@ -660,15 +669,20 @@ class MassMailing(osv.Model):
return self.pool['ir.model.data'].xmlid_to_res_id(cr, uid, 'mass_mailing.action_contact_to_mailing_list')
def action_new_list(self, cr, uid, ids, context=None):
wizard = self.browse(cr, uid, ids[0], context=context)
action_id = self._get_model_to_list_action_id(cr, uid, wizard.mailing_model, context=context)
ctx = dict(context, search_default_not_opt_out=True, view_manager_highlight=[action_id], default_mass_mailing_id=ids[0], default_model=wizard.mailing_model)
mailing = self.browse(cr, uid, ids[0], context=context)
action_id = self._get_model_to_list_action_id(cr, uid, mailing.mailing_model, context=context)
ctx = dict(context,
search_default_not_opt_out=True,
view_manager_highlight=[action_id],
default_name=mailing.name,
default_mass_mailing_id=ids[0],
default_model=mailing.mailing_model)
return {
'name': _('Choose Recipients'),
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': wizard.mailing_model,
'res_model': mailing.mailing_model,
'context': ctx,
}
@ -676,7 +690,7 @@ class MassMailing(osv.Model):
mailing = self.browse(cr, uid, ids[0], context=context)
domain = self.pool['mail.mass_mailing.list'].get_global_domain(cr, uid, [c.id for c in mailing.contact_list_ids], context=context)[mailing.mailing_model]
return {
'name': _('Mailing Recipients'),
'name': _('See Recipients'),
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'tree,form',

View File

@ -74,11 +74,11 @@
<!-- Create a Mailing List from Contacts -->
<act_window name="Create Mailing List"
res_model="mail.mass_mailing.list"
res_model="mail.mass_mailing.list.confirm"
src_model="mail.mass_mailing.contact"
view_mode="form"
multi="True"
target="current"
target="new"
key2="client_action_multi"
id="action_contact_to_mailing_list"
context="{
@ -222,6 +222,8 @@
<field name="name"/>
<field name="date" readonly="True" groups="mass_mailing.group_mass_mailing_campaign"/>
<field name="mass_mailing_campaign_id" groups="mass_mailing.group_mass_mailing_campaign"/>
<field name="mailing_model" string="Perform Mailing on" class="oe_inline" widget="radio"
on_change='on_change_mailing_model(mailing_model, context)'/>
<label for="template_id"/>
<div style="max-height: 200px; overflow: hidden !important;">
<field name="template_id" string="Select Template" nolabel="1"
@ -244,11 +246,24 @@
<field name="reply_to"/>
</group>
<group>
<!-- <p colspan="2">Here be some pie charts</p> -->
<field name="total"/>
<field name="received_ratio" attrs="{'invisible': [('total', '=', 0)]}"/>
<field name="opened_ratio" attrs="{'invisible': [('total', '=', 0)]}"/>
<field name="replied_ratio" attrs="{'invisible': [('total', '=', 0)]}"/>
<div class="oe_right oe_button_box" name="buttons">
<button name="%(action_mail_mass_mailing_report_graph)d"
type="action" class="oe_stat_button oe_inline">
<field name="received_ratio" widget="percentpie"/>
<span>Received</span>
</button>
<button name="%(action_mail_mass_mailing_report_graph)d"
type="action" class="oe_stat_button oe_inline">
<field name="opened_ratio" widget="percentpie"/>
<span>Opened</span>
</button>
<button name="%(action_mail_mass_mailing_report_graph)d"
type="action" class="oe_stat_button oe_inline">
<field name="replied_ratio" widget="percentpie"/>
<span>Replied</span>
</button>
</div>
<!-- <p colspan="2">Here be some bar charts</p> -->
<!-- <field name="opened_dayly" attrs="{'invisible': [('total', '=', 0)]}"/>
<field name="replied_dayly" attrs="{'invisible': [('total', '=', 0)]}"/> -->
@ -258,12 +273,13 @@
<label for="contact_list_ids" string="Recipients"/>
<div>
<group>
<field name="mailing_model" string="Perform Mailing on" class="oe_inline" widget="radio"
on_change='on_change_mailing_model(mailing_model, context)'/>
<label for="contact_list_ids" string="Selected Lists"/>
<label for="contact_list_choice" string="Mailing List"/>
<div>
<field name="contact_list_ids" widget="many2many_tags" nolabel="1" options="{'no_create': True}"/>
<button string='Create a New List' class="oe_inline oe_link" type='object' name='action_new_list'/>
<field name="contact_list_choice" widget="radio"/>
<field name="contact_list_ids" widget="many2many_tags" options="{'no_create': True}"
attrs="{'invisible': [('contact_list_choice', '=', 'new')]}"/>
<button string='Create a New List' class="oe_inline oe_link" type='object' name='action_new_list'
attrs="{'invisible': [('contact_list_choice', '=', 'existing')]}"/>
</div>
<label for="contact_nbr" string="Contacts"/>
<div>

View File

@ -4,11 +4,11 @@
<!-- Create a Mailing List from Partners -->
<act_window name="Create Mailing List"
res_model="mail.mass_mailing.list"
res_model="mail.mass_mailing.list.confirm"
src_model="res.partner"
view_mode="form"
multi="True"
target="current"
target="new"
key2="client_action_multi"
id="action_partner_to_mailing_list"
context="{

View File

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
import create_list
import create_template
import test_mailing
import mail_compose_message
import mailing_list_confirm

View File

@ -1,43 +0,0 @@
# -*- coding: utf-8 -*-
from openerp.osv import osv, fields
from openerp.tools.translate import _
class MailingListWizard(osv.TransientModel):
"""A wizard allowing to create an email.template from a mass mailing. This wizard
allows to simplify and direct the user in the creation of its template without
having to tune or hack the email.template model. """
_name = 'mail.mass_mailing.list.create'
def _get_model_list(self, cr, uid, context=None):
return self.pool['mail.mass_mailing']._get_mailing_model(cr, uid, context=context)
# indirections for inheritance
_model_list = lambda self, *args, **kwargs: self._get_model_list(*args, **kwargs)
_columns = {
'name': fields.char('Name', required=True),
'model': fields.selection(
_model_list, type='char', required=True,
string='Applies To'
),
}
def action_new_list(self, cr, uid, ids, context=None):
wizard = self.browse(cr, uid, ids[0], context=context)
action_id = self.pool['mail.mass_mailing']._get_model_to_list_action_id(cr, uid, wizard.model, context=context)
if wizard.model == 'mail.mass_mailing.contact':
domain = [('list_id', '=', False)]
else:
domain = []
ctx = dict(context, search_default_not_opt_out=True, view_manager_highlight=[action_id], default_name=wizard.name, default_model=wizard.model)
return {
'name': _('Choose Recipients'),
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': wizard.model,
'context': ctx,
'domain': domain,
}

View File

@ -1,33 +0,0 @@
<?xml version="1.0"?>
<openerp>
<data>
<record model="ir.ui.view" id="view_mail_mass_mailing_list_create_form">
<field name="name">mail.mass_mailing.list.create.form</field>
<field name="model">mail.mass_mailing.list.create</field>
<field name="arch" type="xml">
<form string="Create a Mailing List" version="7.0">
<header>
<button string='Create a New List' class="oe_highlight"
type='object' name='action_new_list'/>
</header>
<sheet>
<group>
<field name="name"/>
<field name="model" widget="radio"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_mail_mass_mailing_create" model="ir.actions.act_window">
<field name="name">Create a Mailing List</field>
<field name="res_model">mail.mass_mailing.list.create</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</data>
</openerp>

View File

@ -0,0 +1,57 @@
# -*- coding: utf-8 -*-
from openerp.osv import osv, fields
from openerp.tools.translate import _
class MailingListConfirm(osv.TransientModel):
"""A wizard that acts as a confirmation when creating a new mailing list coming
from a list view. This allows to have a lightweight flow to create mailing
lists without having to go through multiple screens."""
_inherit = 'mail.mass_mailing.list'
_name = 'mail.mass_mailing.list.confirm'
_columns = {
'mass_mailing_id': fields.many2one('mail.mass_mailing', 'Mailing'),
}
def create(self, cr, uid, values, context=None):
if context is None:
context = {}
context.update(no_contact_to_list=True)
return super(MailingListConfirm, self).create(cr, uid, values, context=context)
def action_confirm(self, cr, uid, ids, context=None):
wizard = self.browse(cr, uid, ids[0], context=context)
mailing_list_id = self.pool['mail.mass_mailing.list'].create(
cr, uid, {'name': wizard.name, 'model': wizard.model}, context=context)
res = self.pool['mail.mass_mailing.list'].action_add_to_mailing(cr, uid, [mailing_list_id], context=context)
if not res:
return {
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'form',
'res_model': 'mail.mass_mailing.list',
'res_id': mailing_list_id,
'context': context,
}
return res
def action_new_list(self, cr, uid, ids, context=None):
wizard = self.browse(cr, uid, ids[0], context=context)
action_id = self.pool['mail.mass_mailing']._get_model_to_list_action_id(cr, uid, wizard.model, context=context)
if wizard.model == 'mail.mass_mailing.contact':
domain = [('list_id', '=', False)]
else:
domain = []
ctx = dict(context, search_default_not_opt_out=True, view_manager_highlight=[action_id], default_name=wizard.name, default_model=wizard.model)
return {
'name': _('Choose Recipients'),
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': wizard.model,
'context': ctx,
'domain': domain,
}

View File

@ -0,0 +1,67 @@
<?xml version="1.0"?>
<openerp>
<data>
<record model="ir.ui.view" id="view_mail_mass_mailing_list_confirm_form">
<field name="name">mail.mass_mailing.list.confirm.form</field>
<field name="model">mail.mass_mailing.list.confirm</field>
<field name="arch" type="xml">
<form string="Confirm Mailing List" version="7.0">
<group>
<field name="model" invisible="1"/>
<field name="domain" invisible="1"
on_change="on_change_domain(domain, model, context)"/>
<div attrs="{'invisible': [('mass_mailing_id', '=', False)]}" colspan="2">
Adding <field name="contact_nbr" class="oe_inline"/> contacts
to the mailing <field name="mass_mailing_id" class="oe_inline" readonly="1"/>.
</div>
<field name="name" attrs="{'invisible': [('mass_mailing_id', '!=', False)]}"/>
</group>
<footer>
<button string="Confirm" name="action_confirm" type="object" class="oe_highlight"/>
or
<button string="Cancel" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
<record model="ir.ui.view" id="view_mail_mass_mailing_list_create_form">
<field name="name">mail.mass_mailing.list.confirm.form</field>
<field name="model">mail.mass_mailing.list.confirm</field>
<field name="priority">32</field>
<field name="arch" type="xml">
<form string="Create a Mailing List" version="7.0">
<header>
<button string='Create a New List' class="oe_highlight"
type='object' name='action_new_list'/>
</header>
<sheet>
<group>
<field name="name"/>
<field name="model" widget="radio"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_mail_mass_mailing_list_confirm" model="ir.actions.act_window">
<field name="name">Create a Mailing List</field>
<field name="res_model">mail.mass_mailing.list.confirm</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record id="action_mail_mass_mailing_create" model="ir.actions.act_window">
<field name="name">Create a Mailing List</field>
<field name="res_model">mail.mass_mailing.list.confirm</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="view_mail_mass_mailing_list_create_form"/>
<field name="target">new</field>
</record>
</data>
</openerp>

View File

@ -19,7 +19,7 @@
</field>
</record>
<record id="action_mail_mass_mailing_test_form" model="ir.actions.act_window">
<record id="action_mail_mass_mailing_test" model="ir.actions.act_window">
<field name="name">Mailing Test</field>
<field name="res_model">mail.mass_mailing.test</field>
<field name="view_type">form</field>