[IMP] mail, website_mail_group: discussion group improvements
authorThibault Delavallée <tde@openerp.com>
Thu, 12 Jun 2014 11:45:21 +0000 (13:45 +0200)
committerThibault Delavallée <tde@openerp.com>
Thu, 12 Jun 2014 11:45:21 +0000 (13:45 +0200)
- added possibility in mail to have a model adding custom headers in emails sent for notifications for new messages
- mail.group now add list-id and precedence: list in the headers to inform mailing systems that those mails are to be considered as mailing lists
- website_mail_group adds some further data in the headers (subscribe, unsubscribe, archives)
- groups page now display the number of message in the last month
- notification emails are now queued after 50 recipients

addons/mail/mail_followers.py
addons/mail/mail_group.py
addons/mail/mail_mail.py
addons/mail/mail_thread.py
addons/website_mail_group/__init__.py
addons/website_mail_group/controllers/main.py
addons/website_mail_group/models/__init__.py [new file with mode: 0644]
addons/website_mail_group/models/mail_group.py [new file with mode: 0644]
addons/website_mail_group/views/website_mail_group.xml

index ffc4941..e402811 100644 (file)
@@ -176,7 +176,7 @@ class mail_notification(osv.Model):
         references = message.parent_id.message_id if message.parent_id else False
 
         # create email values
-        max_recipients = 100
+        max_recipients = 50
         chunks = [email_pids[x:x + max_recipients] for x in xrange(0, len(email_pids), max_recipients)]
         email_ids = []
         for chunk in chunks:
@@ -188,7 +188,7 @@ class mail_notification(osv.Model):
                 'references': references,
             }
             email_ids.append(self.pool.get('mail.mail').create(cr, uid, mail_values, context=context))
-        if force_send and len(chunks) < 6:  # for more than 500 followers, use the queue system
+        if force_send and len(chunks) < 2:  # for more than 50 followers, use the queue system
             self.pool.get('mail.mail').send(cr, uid, email_ids, context=context)
         return True
 
index 4ae47a9..186787c 100644 (file)
@@ -211,3 +211,16 @@ class mail_group(osv.Model):
             return []
         else:
             return super(mail_group, self).get_suggested_thread(cr, uid, removed_suggested_threads, context)
+
+    def message_get_email_values(self, cr, uid, id, notif_mail=None, context=None):
+        res = super(mail_group, self).message_get_email_values(cr, uid, id, notif_mail=notif_mail, context=context)
+        group = self.browse(cr, uid, id, context=context)
+        res.update({
+            'headers': {
+                'Precedence': 'list',
+            }
+        })
+        if group.alias_domain:
+            res['headers']['List-Id'] = '%s.%s' % (group.alias_name, group.alias_domain)
+            res['headers']['List-Post'] = '<mailto:%s@%s>' % (group.alias_name, group.alias_domain)
+        return res
index a481414..cc12bde 100644 (file)
@@ -204,12 +204,15 @@ class mail_mail(osv.Model):
         """
         body = self.send_get_mail_body(cr, uid, mail, partner=partner, context=context)
         body_alternative = tools.html2plaintext(body)
-        return {
+        res = {
             'body': body,
             'body_alternative': body_alternative,
             'subject': self.send_get_mail_subject(cr, uid, mail, partner=partner, context=context),
             'email_to': self.send_get_mail_to(cr, uid, mail, partner=partner, context=context),
         }
+        if mail.model and mail.res_id and self.pool.get(mail.model) and hasattr(self.pool[mail.model], 'message_get_email_values'):
+            res.update(self.pool[mail.model].message_get_email_values(cr, uid, mail.res_id, mail, context=context))
+        return res
 
     def send(self, cr, uid, ids, auto_commit=False, raise_exception=False, context=None):
         """ Sends the selected emails immediately, ignoring their current
@@ -268,6 +271,9 @@ class mail_mail(osv.Model):
                 # build an RFC2822 email.message.Message object and send it without queuing
                 res = None
                 for email in email_list:
+                    email_headers = dict(headers)
+                    if email.get('headers'):
+                        email_headers.update(email['headers'])
                     msg = ir_mail_server.build_email(
                         email_from=mail.email_from,
                         email_to=email.get('email_to'),
@@ -282,7 +288,7 @@ class mail_mail(osv.Model):
                         object_id=mail.res_id and ('%s-%s' % (mail.res_id, mail.model)),
                         subtype='html',
                         subtype_alternative='plain',
-                        headers=headers)
+                        headers=email_headers)
                     res = ir_mail_server.send_email(cr, uid, msg,
                                                     mail_server_id=mail.mail_server_id.id,
                                                     context=context)
index 36d6ecb..4ad9ca6 100644 (file)
@@ -694,6 +694,16 @@ class mail_thread(osv.AbstractModel):
                 if record.alias_domain and record.alias_name else False
                 for record in self.browse(cr, SUPERUSER_ID, ids, context=context)]
 
+    def message_get_email_values(self, cr, uid, id, notif_mail=None, context=None):
+        """ Temporary method to create custom notification email values for a given
+        model and document. This should be better to have a headers field on
+        the mail.mail model, computed when creating the notification email, but
+        this cannot be done in a stable version.
+
+        TDE FIXME: rethink this ulgy thing. """
+        res = dict()
+        return res
+
     #------------------------------------------------------
     # Mail gateway
     #------------------------------------------------------
index a28b808..59478b3 100644 (file)
@@ -1,8 +1,9 @@
 # -*- coding: utf-8 -*-
 
 import datetime
+from dateutil import relativedelta
 
-from openerp import tools
+from openerp import tools, SUPERUSER_ID
 from openerp.addons.web import http
 from openerp.addons.website.models.website import slug
 from openerp.addons.web.http import request
@@ -28,12 +29,23 @@ class MailGroup(http.Controller):
     def view(self, **post):
         cr, uid, context = request.cr, request.uid, request.context
         group_obj = request.registry.get('mail.group')
+        mail_message_obj = request.registry.get('mail.message')
         group_ids = group_obj.search(cr, uid, [('alias_id', '!=', False), ('alias_id.alias_name', '!=', False)], context=context)
-        values = {'groups': group_obj.browse(cr, uid, group_ids, context)}
+        groups = group_obj.browse(cr, uid, group_ids, context)
+        # compute statistics
+        month_date = datetime.datetime.today() - relativedelta.relativedelta(months=1)
+        group_data = dict.fromkeys(group_ids, dict())
+        for group in groups:
+            group_data[group.id]['monthly_message_nbr'] = mail_message_obj.search(
+                cr, SUPERUSER_ID,
+                [('model', '=', 'mail.group'), ('res_id', '=', group.id), ('date', '>=', month_date.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT))],
+                count=True, context=context)
+        values = {'groups': groups, 'group_data': group_data}
         return request.website.render('website_mail_group.mail_groups', values)
 
     @http.route(["/groups/subscription/"], type='json', auth="user")
     def subscription(self, group_id=0, action=False, **post):
+        """ TDE FIXME: seems dead code """
         cr, uid, context = request.cr, request.uid, request.context
         group_obj = request.registry.get('mail.group')
         if action:
diff --git a/addons/website_mail_group/models/__init__.py b/addons/website_mail_group/models/__init__.py
new file mode 100644 (file)
index 0000000..ea8be51
--- /dev/null
@@ -0,0 +1 @@
+import mail_group
diff --git a/addons/website_mail_group/models/mail_group.py b/addons/website_mail_group/models/mail_group.py
new file mode 100644 (file)
index 0000000..804785b
--- /dev/null
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+
+from openerp.osv import osv
+
+
+class MailGroup(osv.Model):
+    _inherit = 'mail.group'
+
+    def message_get_email_values(self, cr, uid, id, notif_mail=None, context=None):
+        res = super(MailGroup, self).message_get_email_values(cr, uid, id, notif_mail=notif_mail, context=context)
+        group = self.browse(cr, uid, id, context=context)
+        base_url = self.pool['ir.config_parameter'].get_param(cr, uid, 'web.base.url')
+        res['headers'].update({
+            'List-Archive': '<%s/groups/%s>' % (base_url, group.id),
+            'List-Subscribe': '<%s/groups>' % (base_url),
+            'List-Unsubscribe': '<%s/groups>' % (base_url),
+        })
+        return res
index d52c345..332c6e7 100644 (file)
@@ -45,7 +45,7 @@
                 </div>
                 <div class="col-md-2">
                     <i class='fa fa-user'/> <t t-esc="len(group.message_follower_ids)"/> participants<br />
-                    <i class='fa fa-envelope-o'/> <t t-esc="len(group.message_ids)"/> messages
+                    <i class='fa fa-envelope-o'/> <t t-raw="group_data[group.id]['monthly_message_nbr']"/> messages / month
                 </div>
                 <div class="col-md-3">
                     <t t-call="website_mail.follow"><t t-set="object" t-value="group"/></t>