[IMP] mass_mailing: graph view for mailing list contacts, customer filters. Added...
authorqdc <qdc@openerp.com>
Mon, 1 Sep 2014 11:59:45 +0000 (13:59 +0200)
committerThibault Delavallée <tde@openerp.com>
Fri, 12 Sep 2014 11:35:34 +0000 (13:35 +0200)
addons/event/event_view.xml
addons/marketing/marketing_view.xml
addons/mass_mailing/models/mass_mailing.py
addons/mass_mailing/views/mass_mailing.xml
addons/survey/views/survey_views.xml

index 910922f..3626cbe 100644 (file)
@@ -46,7 +46,6 @@
             <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"/>
 
index f2cab59..a5fe0af 100644 (file)
@@ -8,7 +8,11 @@
 
         <!-- 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>
index bee3e85..4912c1e 100644 (file)
@@ -44,6 +44,8 @@ class MassMailingContact(osv.Model):
             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={}):
@@ -54,6 +56,21 @@ class MassMailingContact(osv.Model):
         '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:
@@ -78,6 +95,14 @@ class MassMailingContact(osv.Model):
             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. """
index 0be156c..3a4938b 100644 (file)
             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', '&lt;', 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"
index 50ecaea..c6bbe7b 100644 (file)
 
         <!-- 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"/>