From 69df7d3d8aed916ad62a67dbbb399d8a62c98cbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Debauche=20St=C3=A9phane?= Date: Fri, 10 Jan 2020 15:01:19 +0000 Subject: [PATCH] [IMP] event: improve event mail state display Purpose ======= Show an icon representing the state of the event mail and number of contacted registrations instead of the simple checkbox "sent". Specifications ============== Instead of the checkbox "sent", an event mail can have 3 values 1. Sent, if all the mails has been sent; 2. Scheduled, if scheduled but no attendee have been contacted; 3. Running, if not all attendees have been contacted; Note that communication targeting "after registration" are always considered as being "running" as any new registration triggers a new communication. A new widget is added that displays an icon depending on the state. A new field holding contact count is added. When scheduler send emails it is updated to keep a count of sent communications. LINKS Task ID-2414658 COM PR odoo/odoo#63093 UPG PR odoo/upgrade#2014 --- addons/event/__manifest__.py | 5 +++- addons/event/models/event_mail.py | 21 ++++++++++++++ .../static/src/js/field_icon_selection.js | 29 +++++++++++++++++++ .../static/src/xml/field_icon_selection.xml | 6 ++++ addons/event/views/event_templates.xml | 1 + addons/event/views/event_views.xml | 12 +++++--- addons/event_sms/models/event_mail.py | 3 ++ 7 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 addons/event/static/src/js/field_icon_selection.js create mode 100644 addons/event/static/src/xml/field_icon_selection.xml diff --git a/addons/event/__manifest__.py b/addons/event/__manifest__.py index 3dc6be1a116..bd221a9962d 100644 --- a/addons/event/__manifest__.py +++ b/addons/event/__manifest__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- { 'name': 'Events Organization', - 'version': '1.4', + 'version': '1.5', 'website': 'https://www.odoo.com/page/events', 'category': 'Marketing/Events', 'summary': 'Trainings, Conferences, Meetings, Exhibitions, Registrations', @@ -44,4 +44,7 @@ Key Features ], 'installable': True, 'auto_install': False, + 'qweb': [ + 'static/src/xml/field_icon_selection.xml', + ], } diff --git a/addons/event/models/event_mail.py b/addons/event/models/event_mail.py index 11ff8fbff64..57ac14ff55b 100644 --- a/addons/event/models/event_mail.py +++ b/addons/event/models/event_mail.py @@ -86,6 +86,10 @@ class EventMailScheduler(models.Model): mail_registration_ids = fields.One2many('event.mail.registration', 'scheduler_id') mail_sent = fields.Boolean('Mail Sent on Event', copy=False) done = fields.Boolean('Sent', compute='_compute_done', store=True, copy=False) + mail_state = fields.Selection( + [('running', 'Running'), ('scheduled', 'Scheduled'), ('sent', 'Sent')], + string='Global communication Status', compute='_compute_mail_state') + mail_count_done = fields.Integer('# Sent', copy=False, readonly=True) @api.depends('mail_sent', 'interval_type', 'event_id.registration_ids', 'mail_registration_ids.mail_sent') def _compute_done(self): @@ -107,6 +111,20 @@ class EventMailScheduler(models.Model): scheduler.scheduled_date = date + _INTERVALS[scheduler.interval_unit](sign * scheduler.interval_nbr) if date else False + @api.depends('interval_type', 'scheduled_date', 'event_mail_sent') + def _compute_mail_state(self): + for scheduler in self: + # registrations based + if scheduler.interval_type == 'after_sub': + scheduler.mail_state = 'running' + # global event based + elif scheduler.event_mail_sent: + scheduler.mail_state = 'sent' + elif scheduler.scheduled_date: + scheduler.mail_state = 'scheduled' + else: + scheduler.mail_state = 'running' + def execute(self): for mail in self: now = fields.Datetime.now() @@ -120,12 +138,15 @@ class EventMailScheduler(models.Model): mail.write({'mail_registration_ids': lines}) # execute scheduler on registrations mail.mail_registration_ids.execute() + mail.mail_count_done = len(mail.mail_registration_ids.filtered(lambda reg: reg.mail_sent)) else: # Do not send emails if the mailing was scheduled before the event but the event is over if not mail.mail_sent and mail.scheduled_date <= now and mail.notification_type == 'mail' and \ (mail.interval_type != 'before_event' or mail.event_id.date_end > now): mail.event_id.mail_attendees(mail.template_id.id) mail.write({'mail_sent': True}) + mail.mail_count_done = len(mail.event_id.registration_ids.filtered(lambda reg: reg.state != 'cancel')) + return True @api.model diff --git a/addons/event/static/src/js/field_icon_selection.js b/addons/event/static/src/js/field_icon_selection.js new file mode 100644 index 00000000000..95740ea62d9 --- /dev/null +++ b/addons/event/static/src/js/field_icon_selection.js @@ -0,0 +1,29 @@ +odoo.define('event.field_icon_selection', function (require) { +"use strict"; + +var core = require('web.core'); +var registry = require('web.field_registry'); +var AbstractField = require('web.AbstractField'); +var QWeb = core.qweb; + +var IconSelection = AbstractField.extend({ + supportedFieldTypes: ['char', 'text', 'selection'], + + /** + * @override + * @private + */ + _render: function () { + this._super.apply(this, arguments); + this.icon = this.nodeOptions[this.value]; + this.title = this.value.charAt(0).toUpperCase() + this.value.slice(1); + this.$el.empty().append(QWeb.render('event.IconSelection', {'widget': this})); + }, + +}); + +registry.add('icon_selection', IconSelection); + +return IconSelection; + +}); diff --git a/addons/event/static/src/xml/field_icon_selection.xml b/addons/event/static/src/xml/field_icon_selection.xml new file mode 100644 index 00000000000..399be360311 --- /dev/null +++ b/addons/event/static/src/xml/field_icon_selection.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/addons/event/views/event_templates.xml b/addons/event/views/event_templates.xml index c8e320e5515..54cbdb0b684 100644 --- a/addons/event/views/event_templates.xml +++ b/addons/event/views/event_templates.xml @@ -4,6 +4,7 @@ diff --git a/addons/event/views/event_views.xml b/addons/event/views/event_views.xml index da2acc446e6..eaa9c2bba50 100644 --- a/addons/event/views/event_views.xml +++ b/addons/event/views/event_views.xml @@ -266,7 +266,10 @@ - + + + @@ -750,7 +753,7 @@ - +