[IMP] [ADD] mass_mailing: added a wizard to create new segments.
It can be called directly from within the campaign form view, using a button. It allows to easily create new segments and launch the composer. bzr revid: tde@openerp.com-20130912100909-ofalececxn64a389
This commit is contained in:
parent
f5639479db
commit
f8922d6b16
|
@ -75,7 +75,7 @@ class mail_compose_message(osv.TransientModel):
|
|||
if 'active_domain' in context: # not context.get() because we want to keep global [] domains
|
||||
result['use_active_domain'] = True
|
||||
result['active_domain'] = '%s' % context.get('active_domain')
|
||||
else:
|
||||
elif not result.get('active_domain'):
|
||||
result['active_domain'] = ''
|
||||
# get default values according to the composition mode
|
||||
if composition_mode == 'reply':
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2013-today OpenERP SA (<http://www.openerp.com>)
|
||||
# Copyright (C) 2013-Today OpenERP SA (<http://www.openerp.com>)
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
|
@ -37,6 +37,7 @@
|
|||
'mass_mailing_demo.xml',
|
||||
'mail_mail_view.xml',
|
||||
'wizard/mail_compose_message_view.xml',
|
||||
'wizard/mail_mass_mailing_create_segment.xml',
|
||||
'security/ir.model.access.csv',
|
||||
],
|
||||
'js': [],
|
||||
|
|
|
@ -23,6 +23,7 @@ from datetime import datetime
|
|||
from dateutil import relativedelta
|
||||
|
||||
from openerp import tools
|
||||
from openerp.tools.translate import _
|
||||
from openerp.osv import osv, fields
|
||||
|
||||
|
||||
|
@ -104,6 +105,23 @@ class MassMailingCampaign(osv.Model):
|
|||
),
|
||||
}
|
||||
|
||||
def launch_segment_create_wizard(self, cr, uid, ids, context=None):
|
||||
ctx = dict(context)
|
||||
ctx.update({
|
||||
'default_mass_mailing_campaign_id': ids[0],
|
||||
})
|
||||
return {
|
||||
'name': _('Create a Segment for the Campaign'),
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form',
|
||||
'res_model': 'mail.mass_mailing.segment.create',
|
||||
'views': [(False, 'form')],
|
||||
'view_id': False,
|
||||
'target': 'new',
|
||||
'context': ctx,
|
||||
}
|
||||
|
||||
|
||||
class MassMailingSegment(osv.Model):
|
||||
""" MassMailingSegment models a segment for a mass mailign campaign. A segment
|
||||
|
|
|
@ -19,6 +19,10 @@
|
|||
<field name="model">mail.mass_mailing.campaign</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Mass Mailing Campaign" version="7.0">
|
||||
<header>
|
||||
<button name="launch_segment_create_wizard" type="object"
|
||||
class="oe_highlight" string="Create a New Segment"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<group>
|
||||
<field name="name"/>
|
||||
|
@ -28,6 +32,8 @@
|
|||
<field name="replied"/>
|
||||
<field name="bounced"/>
|
||||
</group>
|
||||
<label for="segment_ids"/>
|
||||
<field name="segment_ids"/>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
|
@ -114,6 +120,10 @@
|
|||
<field name="arch" type="xml">
|
||||
<tree string="Mass Mailing Segments">
|
||||
<field name="name"/>
|
||||
<field name="sent"/>
|
||||
<field name="delivered"/>
|
||||
<field name="opened"/>
|
||||
<field name="replied"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
|
|
@ -20,3 +20,4 @@
|
|||
##############################################################################
|
||||
|
||||
import mail_compose_message
|
||||
import mail_mass_mailing_create_segment
|
||||
|
|
|
@ -41,17 +41,21 @@ class MailComposeMessage(osv.TransientModel):
|
|||
}
|
||||
|
||||
_defaults = {
|
||||
'use_mass_mailing_campaign': True,
|
||||
'use_mass_mailing_campaign': False,
|
||||
}
|
||||
|
||||
def onchange_mass_mail_campaign_id(self, cr, uid, ids, mass_mail_campaign_id, context=None):
|
||||
def onchange_mass_mail_campaign_id(self, cr, uid, ids, mass_mailing_campaign_id, mass_mail_segment_id, context=None):
|
||||
if mass_mail_segment_id:
|
||||
segment = self.pool['mail.mass_mailing.segment'].browse(cr, uid, mass_mail_segment_id, context=context)
|
||||
if segment.mass_mailing_campaign_id.id == mass_mailing_campaign_id:
|
||||
return {}
|
||||
return {'value': {'mass_mailing_segment_id': False}}
|
||||
|
||||
def render_message_batch(self, cr, uid, wizard, res_ids, context=None):
|
||||
""" Override method that generated the mail content by adding the mass
|
||||
mailing campaign, when doing pure email mass mailing. """
|
||||
res = super(MailComposeMessage, self).render_message_batch(cr, uid, wizard, res_ids, context=context)
|
||||
if wizard.composition_mode == 'mass_mail' and wizard.mass_mailing_segment_id: # TODO: which kind of mass mailing ?
|
||||
if wizard.composition_mode == 'mass_mail' and wizard.use_mass_mailing_campaign and wizard.mass_mailing_segment_id: # TODO: which kind of mass mailing ?
|
||||
for res_id in res_ids:
|
||||
res[res_id]['mass_mailing_segment_id'] = wizard.mass_mailing_segment_id.id
|
||||
return res
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
<div>
|
||||
<group>
|
||||
<field name="mass_mailing_campaign_id"
|
||||
on_change="onchange_mass_mail_campaign_id(mass_mailing_campaign_id)"
|
||||
on_change="onchange_mass_mail_campaign_id(mass_mailing_campaign_id, mass_mailing_segment_id, context)"
|
||||
attrs="{'invisible': ['|', ('composition_mode', '!=', 'mass_mail'), ('use_mass_mailing_campaign', '=', False)],
|
||||
'required': [('composition_mode', '=', 'mass_mail'), ('use_mass_mailing_campaign', '=', True)]}"/>
|
||||
<field name="mass_mailing_segment_id"
|
||||
|
|
|
@ -0,0 +1,122 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2013-Today OpenERP SA (<http://www.openerp.com>)
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from openerp.osv import osv, fields
|
||||
|
||||
from openerp.tools.translate import _
|
||||
|
||||
|
||||
class MailMassMailingSegmentCreate(osv.TransientModel):
|
||||
"""Wizard to help creating mass mailing segments for a campaign. """
|
||||
|
||||
_name = 'mail.mass_mailing.segment.create'
|
||||
_description = 'Mass mailing segment creation'
|
||||
|
||||
_columns = {
|
||||
'mass_mailing_campaign_id': fields.many2one(
|
||||
'mail.mass_mailing.campaign', 'Mass mailing campaign',
|
||||
required=True,
|
||||
),
|
||||
'model_id': fields.many2one(
|
||||
'ir.model', 'Model',
|
||||
required=True,
|
||||
),
|
||||
'model_model': fields.related(
|
||||
'model_id', 'name',
|
||||
type='char', string='Model Name'
|
||||
),
|
||||
'filter_id': fields.many2one(
|
||||
'ir.filters', 'Filter',
|
||||
domain="[('model_id', '=', model_model)]",
|
||||
),
|
||||
'domain': fields.related(
|
||||
'filter_id', 'domain',
|
||||
type='char', string='Domain',
|
||||
),
|
||||
'template_id': fields.many2one(
|
||||
'email.template', 'Template', required=True,
|
||||
domain="[('model_id', '=', model_id)]",
|
||||
),
|
||||
'segment_name': fields.char(
|
||||
'Segment name', required=True,
|
||||
),
|
||||
'mass_mailing_segment_id': fields.many2one(
|
||||
'mail.mass_mailing.segment', 'Mass Mailing Segment',
|
||||
),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
}
|
||||
|
||||
def on_change_model_id(self, cr, uid, ids, model_id, context=None):
|
||||
if model_id:
|
||||
model_model = self.pool['ir.model'].browse(cr, uid, model_id, context=context).model
|
||||
else:
|
||||
model_model = False
|
||||
return {'value': {'model_model': model_model}}
|
||||
|
||||
def on_change_filter_id(self, cr, uid, ids, filter_id, context=None):
|
||||
if filter_id:
|
||||
domain = self.pool['ir.filters'].browse(cr, uid, filter_id, context=context).domain
|
||||
else:
|
||||
domain = False
|
||||
return {'value': {'domain': domain}}
|
||||
|
||||
def create_segment(self, cr, uid, ids, context=None):
|
||||
""" Create a segment based on wizard data, and update the wizard """
|
||||
for wizard in self.browse(cr, uid, ids, context=context):
|
||||
segment_values = {
|
||||
'name': wizard.segment_name,
|
||||
'mass_mailing_campaign_id': wizard.mass_mailing_campaign_id.id,
|
||||
'domain': wizard.domain,
|
||||
'template_id': wizard.template_id.id,
|
||||
}
|
||||
segment_id = self.pool['mail.mass_mailing.segment'].create(cr, uid, segment_values, context=context)
|
||||
self.write(cr, uid, [wizard.id], {'mass_mailing_segment_id': segment_id}, context=context)
|
||||
return True
|
||||
|
||||
def launch_composer(self, cr, uid, ids, context=None):
|
||||
""" Main wizard action: create a new segment and launch the mail.compose.message
|
||||
email composer with wizard data. """
|
||||
self.create_segment(cr, uid, ids, context=context)
|
||||
|
||||
wizard = self.browse(cr, uid, ids[0], context=context)
|
||||
ctx = dict(context)
|
||||
ctx.update({
|
||||
'default_composition_mode': 'mass_mail',
|
||||
'default_template_id': wizard.template_id.id,
|
||||
'default_use_mass_mailing_campaign': True,
|
||||
'default_use_active_domain': True,
|
||||
'default_active_domain': wizard.domain,
|
||||
'default_mass_mailing_campaign_id': wizard.mass_mailing_campaign_id.id,
|
||||
'default_mass_mailing_segment_id': wizard.mass_mailing_segment_id.id,
|
||||
})
|
||||
return {
|
||||
'name': _('Compose Email for Mass Mailing'),
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form',
|
||||
'res_model': 'mail.compose.message',
|
||||
'views': [(False, 'form')],
|
||||
'view_id': False,
|
||||
'target': 'new',
|
||||
'context': ctx,
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<!-- Wizard form view -->
|
||||
<record model="ir.ui.view" id="view_mail_mass_mailing_segment_create_form">
|
||||
<field name="name">mail.mass_mailing.segment.create.form</field>
|
||||
<field name="model">mail.mass_mailing.segment.create</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Create a Mass Mailing Segment" version="7.0">
|
||||
<group>
|
||||
<field name="model_model" invisible="1"/>
|
||||
<field name="domain" invisible="1"/>
|
||||
<p class="oe_grey" colspan="2"
|
||||
attrs="{'invisible': [('mass_mailing_campaign_id', '!=', False)]}">
|
||||
Please choose a mass mailing campaign that will hold the new segment.
|
||||
</p>
|
||||
<field name="mass_mailing_campaign_id"/>
|
||||
|
||||
<p class="oe_grey" colspan="2"
|
||||
attrs="{'invisible': ['|', ('model_id', '!=', False), ('mass_mailing_campaign_id', '=', False)]}">
|
||||
Please choose a model on which you will run the mass mailing.
|
||||
</p>
|
||||
<field name="model_id"
|
||||
on_change="on_change_model_id(model_id, context)"
|
||||
attrs="{'invisible': [('mass_mailing_campaign_id', '=', False)]}"/>
|
||||
|
||||
<p class="oe_grey" colspan="2"
|
||||
attrs="{'invisible': ['|', ('filter_id', '!=', False), ('model_id', '=', False)]}">
|
||||
Please choose a filter that will be applied on the model
|
||||
to find the records on which you will run the mass mailing.
|
||||
</p>
|
||||
<field name="filter_id"
|
||||
on_change="on_change_filter_id(filter_id, context)"
|
||||
attrs="{'invisible': [('model_id', '=', False)]}"/>
|
||||
|
||||
<p class="oe_grey" colspan="2"
|
||||
attrs="{'invisible': ['|', ('template_id', '!=', False), ('filter_id', '=', False)]}">
|
||||
Please choose the template to use to render the emails
|
||||
to send.
|
||||
</p>
|
||||
<field name="template_id"
|
||||
attrs="{'invisible': [('filter_id', '=', False)]}"/>
|
||||
|
||||
<p class="oe_grey" colspan="2"
|
||||
attrs="{'invisible': ['|', ('segment_name', '!=', False), ('template_id', '=', False)]}">
|
||||
Please choose the name of the campaign segment.
|
||||
</p>
|
||||
<field name="segment_name"
|
||||
attrs="{'invisible': [('template_id', '=', False)]}"/>
|
||||
|
||||
<button name="launch_composer" type="object"
|
||||
string="Create segment and launch email composer"
|
||||
attrs="{'invisible': [('segment_name', '=', False)]}"/>
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="action_mail_mass_mailing_segment_create">
|
||||
<field name="name">Create Mass Mailing Segment</field>
|
||||
<field name="res_model">mail.mass_mailing.segment.create</field>
|
||||
<field name="src_model">mail.mass_mailing.campaign</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
Loading…
Reference in New Issue