[IMP] mail, email_template, mass_mailing: improvev mass mailing management in mail.compose.message + form view cleanings + some fixes in mail_mail about set_opened/replied/bounced, now checking that ids effectively exist
bzr revid: tde@openerp.com-20130910151901-nhuwvtrkbwekyh7x
This commit is contained in:
parent
2982257521
commit
ce8c987089
|
@ -11,7 +11,7 @@
|
|||
<label string="Template Recipients" for="partner_to"
|
||||
groups="base.group_no_one"
|
||||
attrs="{'invisible':[('composition_mode', '!=', 'mass_mail')]}"/>
|
||||
<div groups="base.group_no_one"
|
||||
<div groups="base.group_no_one" name="template_recipients"
|
||||
attrs="{'invisible':[('composition_mode', '!=', 'mass_mail')]}">
|
||||
<group class="oe_grey">
|
||||
<!-- <label string="Partners" for="partner_to"/> -->
|
||||
|
|
|
@ -108,21 +108,24 @@ class mail_mail(osv.Model):
|
|||
|
||||
def set_opened(self, cr, uid, ids, context=None):
|
||||
""" Set as opened """
|
||||
for mail in self.browse(cr, uid, ids, context=context):
|
||||
existing_ids = self.exists(cr, uid, ids, context=context)
|
||||
for mail in self.browse(cr, uid, existing_ids, context=context):
|
||||
if not mail.opened:
|
||||
self.write(cr, uid, [mail.id], {'opened': fields.datetime.now()}, context=context)
|
||||
return True
|
||||
|
||||
def set_replied(self, cr, uid, ids, context=None):
|
||||
""" Set as replied """
|
||||
for mail in self.browse(cr, uid, ids, context=context):
|
||||
existing_ids = self.exists(cr, uid, ids, context=context)
|
||||
for mail in self.browse(cr, uid, existing_ids, context=context):
|
||||
if not mail.replied:
|
||||
self.write(cr, uid, [mail.id], {'replied': fields.datetime.now()}, context=context)
|
||||
return True
|
||||
|
||||
def set_bounced(self, cr, uid, ids, context=None):
|
||||
""" Set as bounced """
|
||||
for mail in self.browse(cr, uid, ids, context=context):
|
||||
existing_ids = self.exists(cr, uid, ids, context=context)
|
||||
for mail in self.browse(cr, uid, existing_ids, context=context):
|
||||
if not mail.bounced:
|
||||
self.write(cr, uid, [mail.id], {'bounced': fields.datetime.now()}, context=context)
|
||||
return True
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
<group string="Tracking">
|
||||
<field name="opened"/>
|
||||
<field name="replied"/>
|
||||
<field name="bounced"/>
|
||||
</group>
|
||||
</div>
|
||||
<div>
|
||||
|
|
|
@ -792,6 +792,7 @@ class mail_thread(osv.AbstractModel):
|
|||
bounce_match = tools.bounce_re.search(email_to)
|
||||
if bounce_match:
|
||||
bounced_mail_id = bounce_match.group(1)
|
||||
self.pool['mail.mail'].set_bounced(cr, uid, [bounced_mail_id], context=context)
|
||||
if self.pool['mail.mail'].exists(cr, uid, bounced_mail_id):
|
||||
mail = self.pool['mail.mail'].browse(cr, uid, bounced_mail_id, context=context)
|
||||
bounced_model = mail.model
|
||||
|
@ -1426,7 +1427,8 @@ class mail_thread(osv.AbstractModel):
|
|||
# update original mail_mail if exists
|
||||
if type == 'email':
|
||||
mail_mail_ids = self.pool['mail.mail'].search(cr, SUPERUSER_ID, [('mail_message_id', '=', parent_id)], context=context)
|
||||
self.pool['mail.mail'].set_replied(cr, SUPERUSER_ID, mail_mail_ids, context=context)
|
||||
if mail_mail_ids:
|
||||
self.pool['mail.mail'].set_replied(cr, SUPERUSER_ID, mail_mail_ids, context=context)
|
||||
|
||||
message_ids = mail_message.search(cr, SUPERUSER_ID, [('id', '=', parent_id), ('parent_id', '!=', False)], context=context)
|
||||
# avoid loops when finding ancestors
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
<field name="parent_id" invisible="1"/>
|
||||
<field name="mail_server_id" invisible="1"/>
|
||||
<field name="use_active_domain" invisible="1"/>
|
||||
<field name="active_domain" invisible="1"/>
|
||||
<!-- visible wizard -->
|
||||
<field name="email_from"
|
||||
attrs="{'invisible':[('composition_mode', '!=', 'mass_mail')]}"/>
|
||||
|
@ -32,9 +33,6 @@
|
|||
context="{'force_email':True, 'show_email':True}"/>
|
||||
</div>
|
||||
<!-- mass post / mass mailing -->
|
||||
<field name="active_domain"
|
||||
attrs="{'invisible': [('composition_mode', '!=', 'mass_mail')],
|
||||
'readonly': True}"/>
|
||||
<field name="post"
|
||||
attrs="{'invisible':[('composition_mode', '!=', 'mass_mail')]}"/>
|
||||
<field name="notify"
|
||||
|
|
|
@ -36,6 +36,14 @@ class MailMail(osv.Model):
|
|||
'mass_mailing_segment_id', 'mass_mailing_campaign_id',
|
||||
type='many2one', ondelete='set null',
|
||||
relation='mail.mass_mailing.campaign',
|
||||
string='Mass Mailing Campaign',
|
||||
store=True, readonly=True,
|
||||
),
|
||||
'template_id': fields.related(
|
||||
'mass_mailing_segment_id', 'template_id',
|
||||
type='many2one', ondelete='set null',
|
||||
relation='email.template',
|
||||
string='Email Template',
|
||||
store=True, readonly=True,
|
||||
),
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
<xpath expr="//field[@name='opened']" position="before">
|
||||
<field name="mass_mailing_campaign_id"/>
|
||||
<field name="mass_mailing_segment_id"/>
|
||||
<field name="template_id"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
|
|
@ -184,7 +184,7 @@ class MassMailingSegment(osv.Model):
|
|||
'name': fields.char('Name', required=True),
|
||||
'mass_mailing_campaign_id': fields.many2one(
|
||||
'mail.mass_mailing.campaign', 'Mass Mailing Campaign',
|
||||
ondelete='cascade',
|
||||
ondelete='cascade', required=True,
|
||||
),
|
||||
'template_id': fields.many2one(
|
||||
'email.template', 'Email Template',
|
||||
|
@ -192,6 +192,10 @@ class MassMailingSegment(osv.Model):
|
|||
),
|
||||
'domain': fields.char('Domain'),
|
||||
'date': fields.datetime('Date'),
|
||||
'color': fields.related(
|
||||
'mass_mailing_campaign_id', 'color',
|
||||
type='integer', string='Color Index',
|
||||
),
|
||||
# mail_mail data
|
||||
'mail_ids': fields.one2many(
|
||||
'mail.mail', 'mass_mailing_segment_id',
|
||||
|
@ -234,3 +238,7 @@ class MassMailingSegment(osv.Model):
|
|||
type='char', multi='_get_monthly_statistics',
|
||||
),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
'date': fields.datetime.now(),
|
||||
}
|
||||
|
|
|
@ -122,7 +122,7 @@
|
|||
<field name="name">mail.mass_mailing.segment.form</field>
|
||||
<field name="model">mail.mass_mailing.segment</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Mass Mailing Campaign" version="7.0">
|
||||
<form string="Mass Mailing Segment" version="7.0">
|
||||
<sheet>
|
||||
<group>
|
||||
<group>
|
||||
|
@ -140,14 +140,38 @@
|
|||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_mail_mass_mailing_segment_form_readonly">
|
||||
<field name="name">mail.mass_mailing.segment.form</field>
|
||||
<field name="model">mail.mass_mailing.segment</field>
|
||||
<field name="priority">18</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Mass Mailing Segment" version="7.0">
|
||||
<sheet>
|
||||
<group>
|
||||
<group>
|
||||
<field name="name"/>
|
||||
<field name="date" readonly="True"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="mass_mailing_campaign_id" readonly="True"/>
|
||||
<field name="template_id" readonly="True"/>
|
||||
<field name="domain" readonly="True"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_mail_mass_mailing_segment_kanban">
|
||||
<field name="name">mail.mass_mailing.segment.kanban</field>
|
||||
<field name="model">mail.mass_mailing.segment</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban>
|
||||
<field name='color'/>
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div t-attf-class="oe_kanban_card oe_kanban_global_click oe_kanban_mass_mailing oe_kanban_mass_mailing_segment">
|
||||
<div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click oe_kanban_mass_mailing oe_kanban_mass_mailing_segment">
|
||||
<div class="oe_kanban_content">
|
||||
<div>
|
||||
<h3>
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
border: 1px solid rgba(0, 0, 0, 0.16);
|
||||
-webkit-border-radius: 2px;
|
||||
border-radius: 2px;
|
||||
background-color: #FFFFFF;
|
||||
}
|
||||
|
||||
.openerp .oe_kanban_view .oe_kanban_mass_mailing .oe_mail_result {
|
||||
|
|
|
@ -28,24 +28,30 @@ class MailComposeMessage(osv.TransientModel):
|
|||
_inherit = 'mail.compose.message'
|
||||
|
||||
_columns = {
|
||||
'mass_mail_campaign_id': fields.many2one(
|
||||
'mail.mass_mailing.campaign', 'Mass mailing campaign'
|
||||
'use_mass_mailing_campaign': fields.boolean(
|
||||
'Use mass mailing campaigns',
|
||||
),
|
||||
'mass_mailing_campaign_id': fields.many2one(
|
||||
'mail.mass_mailing.campaign', 'Mass mailing campaign',
|
||||
),
|
||||
'mass_mailing_segment_id': fields.many2one(
|
||||
'mail.mass_mailing.segment', 'Mass mailing segment',
|
||||
domain="[('mass_mailing_campaign_id', '=', mass_mailing_campaign_id)]",
|
||||
),
|
||||
}
|
||||
|
||||
def onchange_mass_mail_campaign_id(self, cr, uid, ids, mass_mail_campaign_id, context=None):
|
||||
values = {}
|
||||
if mass_mail_campaign_id:
|
||||
campaign = self.pool['mail.mass_mailing.campaign'].browse(cr, uid, mass_mail_campaign_id, context=context)
|
||||
if campaign and campaign.template_id:
|
||||
values['template_id'] = campaign.template_id.id
|
||||
return {'value': values}
|
||||
_defaults = {
|
||||
'use_mass_mailing_campaign': True,
|
||||
}
|
||||
|
||||
def render_message(self, cr, uid, wizard, res_id, context=None):
|
||||
def onchange_mass_mail_campaign_id(self, cr, uid, ids, mass_mail_campaign_id, context=None):
|
||||
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(cr, uid, wizard, res_id, context=context)
|
||||
print res, wizard.mass_mail_campaign_id
|
||||
if wizard.composition_mode == 'mass_mail' and wizard.mass_mail_campaign_id: # TODO: which kind of mass mailing ?
|
||||
res['mass_mailing_campaign_id'] = wizard.mass_mail_campaign_id.id
|
||||
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 ?
|
||||
for res_id in res_ids:
|
||||
res[res_id]['mass_mailing_segment_id'] = wizard.mass_mailing_segment_id.id
|
||||
return res
|
||||
|
|
|
@ -8,10 +8,25 @@
|
|||
<field name="model">mail.compose.message</field>
|
||||
<field name="inherit_id" ref="mail.email_compose_message_wizard_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='subject']" position="after">
|
||||
<field name="mass_mail_campaign_id"
|
||||
on_change="onchange_mass_mail_campaign_id(mass_mail_campaign_id)"
|
||||
attrs="{'invisible': [('composition_mode', '!=', 'mass_mail')]}"/>
|
||||
<xpath expr="//field[@name='notify']" position="after">
|
||||
<field name="use_mass_mailing_campaign"
|
||||
attrs="{'invisible': [('composition_mode', '!=', 'mass_mail')]}"/>
|
||||
<label for="mass_mailing_campaign_id" string=" "/>
|
||||
<div>
|
||||
<group>
|
||||
<field name="mass_mailing_campaign_id"
|
||||
on_change="onchange_mass_mail_campaign_id(mass_mailing_campaign_id)"
|
||||
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"
|
||||
attrs="{'invisible': ['|', ('composition_mode', '!=', 'mass_mail'), ('use_mass_mailing_campaign', '=', False)],
|
||||
'required': [('composition_mode', '=', 'mass_mail'), ('use_mass_mailing_campaign', '=', True)]}"
|
||||
context="{'default_mass_mailing_campaign_id': mass_mailing_campaign_id,
|
||||
'default_template_id': template_id,
|
||||
'default_domain': active_domain,
|
||||
'form_view_ref': 'mass_mailing.view_mail_mass_mailing_segment_form_readonly'}"/>
|
||||
</group>
|
||||
</div>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
|
Loading…
Reference in New Issue