<field name="res_model">event.type</field>
<field name="view_type">form</field>
</record>
- <menuitem name="Configuration" id="base.menu_marketing_config_root" parent="base.marketing_menu" sequence="30"/>
<menuitem name="Events" id="event_configuration" parent="base.menu_marketing_config_root" sequence="1"/>
<menuitem name="Events Types" id="menu_event_type" action="action_event_type" parent="event.event_configuration" groups="base.group_no_one"/>
<!-- Reporting for Marketing -->
<menuitem name="Marketing" id="base.marketing_reporting_menu" sequence="49"
- parent="base.menu_reporting" />
+ parent="base.menu_reporting"/>
+
+ <!-- Marketing main configuration menu -->
+ <menuitem name="Configuration" id="base.menu_marketing_config_root" sequence="30"
+ parent="base.marketing_menu"/>
</data>
</openerp>
ondelete='cascade', required=True,
),
'opt_out': fields.boolean('Opt Out', help='The contact has chosen not to receive mails anymore from this list'),
+ 'unsubscription_date': fields.datetime('Unsubscription Date'),
+ 'message_bounce': fields.integer('Bounce', help='Counter of the number of bounced emails for this contact.'),
}
def _get_latest_list(self, cr, uid, context={}):
'list_id': _get_latest_list
}
+ def on_change_opt_out(self, cr, uid, id, opt_out, context=None):
+ return {'value': {
+ 'unsubscription_date': opt_out and fields.datetime.now() or False,
+ }}
+
+ def create(self, cr, uid, vals, context=None):
+ if 'opt_out' in vals:
+ vals['unsubscription_date'] = vals['opt_out'] and fields.datetime.now() or False
+ return super(MassMailingContact, self).create(cr, uid, vals, context=context)
+
+ def write(self, cr, uid, ids, vals, context=None):
+ if 'opt_out' in vals:
+ vals['unsubscription_date'] = vals['opt_out'] and fields.datetime.now() or False
+ return super(MassMailingContact, self).write(cr, uid, ids, vals, context=context)
+
def get_name_email(self, name, context):
name, email = self.pool['res.partner']._parse_partner_name(name, context=context)
if name and not email:
res[record.id] = {'partner_ids': [], 'email_to': record.email, 'email_cc': False}
return res
+ def message_receive_bounce(self, cr, uid, ids, mail_id=None, context=None):
+ """Called by ``message_process`` when a bounce email (such as Undelivered
+ Mail Returned to Sender) is received for an existing thread. As contacts
+ do not inherit form mail.thread, we have to define this method to be able
+ to track bounces (see mail.thread for more details). """
+ for obj in self.browse(cr, uid, ids, context=context):
+ self.write(cr, uid, [obj.id], {'message_bounce': obj.message_bounce + 1}, context=context)
+
class MassMailingList(osv.Model):
"""Model of a contact list. """
action="action_view_mail_mail_statistics"/>
<!-- MASS MAILING CONTACT -->
+
+ <!-- Custom reports (aka filters) -->
+ <record id="filter_contact_subscription" model="ir.filters">
+ <field name="name">List Subscription</field>
+ <field name="model_id">mail.mass_mailing.contact</field>
+ <field name="user_id" eval="False"/>
+ <field name="context">{'group_by': ['create_date:month'], 'col_group_by': ['list_id']}</field>
+ </record>
+ <record id="filter_contact_unsubscription" model="ir.filters">
+ <field name="name">List Unsubscription</field>
+ <field name="model_id">mail.mass_mailing.contact</field>
+ <field name="user_id" eval="False"/>
+ <field name="domain">[('opt_out','=',True)]</field>
+ <field name="context">{'group_by': ['unsubscription_date:month'], 'col_group_by': ['list_id']}</field>
+ </record>
+
<record model="ir.ui.view" id="view_mail_mass_mailing_contact_search">
<field name="name">mail.mass_mailing.contact.search</field>
<field name="model">mail.mass_mailing.contact</field>
<field name="list_id"/>
<separator/>
<filter string="Exclude Opt Out" name="not_opt_out" domain="[('opt_out', '=', False)]"/>
+ <separator/>
+ <filter string="Exclude Dead" name="not_bounced" domain="[('message_bounce', '<', 5)]"/>
<group expand="0" string="Group By">
<filter string="Creation Date" name="group_create_date"
context="{'group_by': 'create_date'}"/>
<field name="email"/>
<field name="name"/>
<field name="list_id"/>
- <field name="opt_out"/>
+ <field name="message_bounce"/>
+ <field name="create_date"/>
+ <field name="unsubscription_date"/>
+ <field name="opt_out" on_change="on_change_opt_out(opt_out)"/>
+ <field name="unsubscription_date" invisible="1"/>
</tree>
</field>
</record>
+
+ <record model="ir.ui.view" id="view_mail_mass_mailing_contact_graph">
+ <field name="name">mail.mass_mailing.contact.graph</field>
+ <field name="model">mail.mass_mailing.contact</field>
+ <field name="priority">10</field>
+ <field name="arch" type="xml">
+ <graph string="Mailing Lists Subscriber" type="pivot" stacked="True">
+ <field name="create_date" type="row"/>
+ <field name="list_id" type="col"/>
+ </graph>
+ </field>
+ </record>
<record model="ir.actions.act_window" id="action_view_mass_mailing_contacts">
<field name="name">Mailing List Subscribers</field>
<field name="res_model">mail.mass_mailing.contact</field>
<field name="view_type">form</field>
- <field name="view_mode">tree</field>
+ <field name="view_mode">tree,graph</field>
<field name="context">{'search_default_not_opt_out': 1}</field>
</record>
<field name="view_mode">tree,form</field>
</record>
- <menuitem name= "Mass Mailing" id= "menu_view_mass_mailing_config"
- parent = "base.menu_marketing_config_root" sequence= "4"
- groups="mass_mailing.group_mass_mailing_campaign"/>
+ <menuitem name="Mass Mailing" id= "menu_view_mass_mailing_config"
+ parent="base.menu_marketing_config_root" sequence="4"/>
<menuitem name="Campaign Stages" id="menu_view_mass_mailing_stages"
parent="menu_view_mass_mailing_config" sequence="1"
<!-- Left menu categories-->
<menuitem name="Surveys" id="menu_surveys" parent="base.marketing_menu" sequence="25" groups="base.group_survey_user"/>
- <menuitem name="Configuration" id="base.menu_marketing_config_root" parent="base.marketing_menu" sequence="30" />
<!-- Left menu elements: Survey -->
<menuitem name="Surveys" id="menu_survey_form" action="action_survey_form" parent="menu_surveys" sequence="1"/>