diff --git a/addons/event/views/event_event_views.xml b/addons/event/views/event_event_views.xml
index 1b26f398ba2..566bc9a90c7 100644
--- a/addons/event/views/event_event_views.xml
+++ b/addons/event/views/event_event_views.xml
@@ -15,7 +15,7 @@
type="action" class="oe_stat_button" icon="fa-line-chart">
- Registration statistics
+ Registration
@@ -117,7 +117,6 @@
event.event
diff --git a/addons/mass_mailing/models/mailing.py b/addons/mass_mailing/models/mailing.py
index d11ca8bfc0b..2fd89771c74 100644
--- a/addons/mass_mailing/models/mailing.py
+++ b/addons/mass_mailing/models/mailing.py
@@ -22,6 +22,7 @@ from odoo import api, fields, models, tools, _
from odoo.addons.base_import.models.base_import import ImportValidationError
from odoo.exceptions import UserError, ValidationError
from odoo.osv import expression
+from odoo.tools.float_utils import float_round
_logger = logging.getLogger(__name__)
@@ -216,11 +217,11 @@ class MassMailing(models.Model):
replied = fields.Integer(compute="_compute_statistics")
bounced = fields.Integer(compute="_compute_statistics")
failed = fields.Integer(compute="_compute_statistics")
- received_ratio = fields.Integer(compute="_compute_statistics", string='Received Ratio')
- opened_ratio = fields.Integer(compute="_compute_statistics", string='Opened Ratio')
- replied_ratio = fields.Integer(compute="_compute_statistics", string='Replied Ratio')
- bounced_ratio = fields.Integer(compute="_compute_statistics", string='Bounced Ratio')
- clicks_ratio = fields.Integer(compute="_compute_clicks_ratio", string="Number of Clicks")
+ received_ratio = fields.Float(compute="_compute_statistics", string='Received Ratio')
+ opened_ratio = fields.Float(compute="_compute_statistics", string='Opened Ratio')
+ replied_ratio = fields.Float(compute="_compute_statistics", string='Replied Ratio')
+ bounced_ratio = fields.Float(compute="_compute_statistics", string='Bounced Ratio')
+ clicks_ratio = fields.Float(compute="_compute_clicks_ratio", string="Number of Clicks")
next_departure = fields.Datetime(compute="_compute_next_departure", string='Scheduled date')
# UX
warning_message = fields.Char(
@@ -287,7 +288,7 @@ class MassMailing(models.Model):
GROUP BY stats.mass_mailing_id
""", [tuple(self.ids) or (None,)])
mass_mailing_data = self.env.cr.dictfetchall()
- mapped_data = dict([(m['id'], 100 * m['nb_clicks'] / m['nb_mails']) for m in mass_mailing_data])
+ mapped_data = dict([(m['id'], float_round(100 * m['nb_clicks'] / m['nb_mails'], precision_digits=2)) for m in mass_mailing_data])
for mass_mailing in self:
mass_mailing.clicks_ratio = mapped_data.get(mass_mailing.id, 0)
@@ -329,10 +330,10 @@ class MassMailing(models.Model):
""", (tuple(self.ids), ))
for row in self.env.cr.dictfetchall():
total = (row['expected'] - row['canceled']) or 1
- row['received_ratio'] = 100.0 * row['delivered'] / total
- row['opened_ratio'] = 100.0 * row['opened'] / total
- row['replied_ratio'] = 100.0 * row['replied'] / total
- row['bounced_ratio'] = 100.0 * row['bounced'] / total
+ row['received_ratio'] = float_round(100.0 * row['delivered'] / total, precision_digits=2)
+ row['opened_ratio'] = float_round(100.0 * row['opened'] / total, precision_digits=2)
+ row['replied_ratio'] = float_round(100.0 * row['replied'] / total, precision_digits=2)
+ row['bounced_ratio'] = float_round(100.0 * row['bounced'] / total, precision_digits=2)
self.browse(row.pop('mailing_id')).update(row)
def _compute_next_departure(self):
diff --git a/addons/mass_mailing/models/utm_campaign.py b/addons/mass_mailing/models/utm_campaign.py
index 9183b4f36b0..ceb6f20c2d5 100644
--- a/addons/mass_mailing/models/utm_campaign.py
+++ b/addons/mass_mailing/models/utm_campaign.py
@@ -6,6 +6,7 @@ from dateutil.relativedelta import relativedelta
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
+from odoo.tools.float_utils import float_round
class UtmCampaign(models.Model):
@@ -37,10 +38,10 @@ class UtmCampaign(models.Model):
help="Selection to determine the winner mailing that will be sent.")
# stat fields
- received_ratio = fields.Integer(compute="_compute_statistics", string='Received Ratio')
- opened_ratio = fields.Integer(compute="_compute_statistics", string='Opened Ratio')
- replied_ratio = fields.Integer(compute="_compute_statistics", string='Replied Ratio')
- bounced_ratio = fields.Integer(compute="_compute_statistics", string='Bounced Ratio')
+ received_ratio = fields.Float(compute="_compute_statistics", string='Received Ratio')
+ opened_ratio = fields.Float(compute="_compute_statistics", string='Opened Ratio')
+ replied_ratio = fields.Float(compute="_compute_statistics", string='Replied Ratio')
+ bounced_ratio = fields.Float(compute="_compute_statistics", string='Bounced Ratio')
@api.depends('ab_testing_winner_mailing_id')
def _compute_ab_testing_completed(self):
@@ -110,10 +111,10 @@ class UtmCampaign(models.Model):
total = (stats['expected'] - stats['cancel']) or 1
delivered = stats['sent'] - stats['bounce']
vals = {
- 'received_ratio': 100.0 * delivered / total,
- 'opened_ratio': 100.0 * stats['open'] / total,
- 'replied_ratio': 100.0 * stats['reply'] / total,
- 'bounced_ratio': 100.0 * stats['bounce'] / total
+ 'received_ratio': float_round(100.0 * delivered / total, precision_digits=2),
+ 'opened_ratio': float_round(100.0 * stats['open'] / total, precision_digits=2),
+ 'replied_ratio': float_round(100.0 * stats['reply'] / total, precision_digits=2),
+ 'bounced_ratio': float_round(100.0 * stats['bounce'] / total, precision_digits=2)
}
campaign.update(vals)
diff --git a/addons/mass_mailing/tests/test_mailing_ab_testing.py b/addons/mass_mailing/tests/test_mailing_ab_testing.py
index b951cb094d5..02569670535 100644
--- a/addons/mass_mailing/tests/test_mailing_ab_testing.py
+++ b/addons/mass_mailing/tests/test_mailing_ab_testing.py
@@ -50,7 +50,7 @@ class TestMailingABTesting(MassMailCommon):
self.ab_testing_mailing_2.mailing_trace_ids[:15].set_opened()
self.ab_testing_mailing_ids.invalidate_recordset()
- self.assertEqual(self.ab_testing_mailing_1.opened_ratio, 66)
+ self.assertEqual(self.ab_testing_mailing_1.opened_ratio, 66.67)
self.assertEqual(self.ab_testing_mailing_2.opened_ratio, 50)
with self.mock_mail_gateway():
@@ -82,7 +82,7 @@ class TestMailingABTesting(MassMailCommon):
self.ab_testing_mailing_2.mailing_trace_ids[:15].set_opened()
self.ab_testing_mailing_ids.invalidate_recordset()
- self.assertEqual(self.ab_testing_mailing_1.opened_ratio, 66)
+ self.assertEqual(self.ab_testing_mailing_1.opened_ratio, 66.67)
self.assertEqual(self.ab_testing_mailing_2.opened_ratio, 50)
with self.mock_mail_gateway():
@@ -165,7 +165,7 @@ class TestMailingABTesting(MassMailCommon):
self.ab_testing_mailing_2.mailing_trace_ids[:15].set_opened()
self.ab_testing_mailing_ids.invalidate_recordset()
- self.assertEqual(self.ab_testing_mailing_1.opened_ratio, 66)
+ self.assertEqual(self.ab_testing_mailing_1.opened_ratio, 66.67)
self.assertEqual(self.ab_testing_mailing_2.opened_ratio, 50)
with self.mock_mail_gateway():
diff --git a/addons/mass_mailing/views/mailing_mailing_views.xml b/addons/mass_mailing/views/mailing_mailing_views.xml
index 56c706f6af9..ef423c295a7 100644
--- a/addons/mass_mailing/views/mailing_mailing_views.xml
+++ b/addons/mass_mailing/views/mailing_mailing_views.xml
@@ -130,14 +130,6 @@