-
+
+
diff --git a/addons/test_discuss_full/tests/test_performance.py b/addons/test_discuss_full/tests/test_performance.py
index c46458cf5a3..08f02837d65 100644
--- a/addons/test_discuss_full/tests/test_performance.py
+++ b/addons/test_discuss_full/tests/test_performance.py
@@ -99,7 +99,7 @@ class TestDiscussFullPerformance(TransactionCase):
self.maxDiff = None
self.users[0].flush()
self.users[0].invalidate_cache()
- with self.assertQueryCount(emp=48):
+ with self.assertQueryCount(emp=49):
init_messaging = self.users[0].with_user(self.users[0])._init_messaging()
self.assertEqual(init_messaging, {
@@ -107,6 +107,7 @@ class TestDiscussFullPerformance(TransactionCase):
'starred_counter': 1,
'channels': [
{
+ 'avatarCacheKey': channel_general._get_avatar_cache_key(),
'channel_type': 'channel',
'create_uid': user_root.id,
'custom_channel_name': False,
@@ -127,6 +128,7 @@ class TestDiscussFullPerformance(TransactionCase):
'uuid': channel_general.uuid,
},
{
+ 'avatarCacheKey': channel_channel_public_1._get_avatar_cache_key(),
'channel_type': 'channel',
'create_uid': self.env.user.id,
'custom_channel_name': False,
@@ -147,6 +149,7 @@ class TestDiscussFullPerformance(TransactionCase):
'uuid': channel_channel_public_1.uuid,
},
{
+ 'avatarCacheKey': channel_channel_public_2._get_avatar_cache_key(),
'channel_type': 'channel',
'create_uid': self.env.user.id,
'custom_channel_name': False,
@@ -167,6 +170,7 @@ class TestDiscussFullPerformance(TransactionCase):
'uuid': channel_channel_public_2.uuid,
},
{
+ 'avatarCacheKey': channel_channel_group_1._get_avatar_cache_key(),
'channel_type': 'channel',
'create_uid': self.env.user.id,
'custom_channel_name': False,
@@ -187,6 +191,7 @@ class TestDiscussFullPerformance(TransactionCase):
'uuid': channel_channel_group_1.uuid,
},
{
+ 'avatarCacheKey': channel_channel_group_2._get_avatar_cache_key(),
'channel_type': 'channel',
'create_uid': self.env.user.id,
'custom_channel_name': False,
@@ -207,6 +212,7 @@ class TestDiscussFullPerformance(TransactionCase):
'uuid': channel_channel_group_2.uuid,
},
{
+ 'avatarCacheKey': channel_channel_private_1._get_avatar_cache_key(),
'channel_type': 'channel',
'create_uid': self.env.user.id,
'custom_channel_name': False,
@@ -227,6 +233,7 @@ class TestDiscussFullPerformance(TransactionCase):
'uuid': channel_channel_private_1.uuid,
},
{
+ 'avatarCacheKey': channel_channel_private_2._get_avatar_cache_key(),
'channel_type': 'channel',
'create_uid': self.env.user.id,
'custom_channel_name': False,
@@ -247,6 +254,7 @@ class TestDiscussFullPerformance(TransactionCase):
'uuid': channel_channel_private_2.uuid,
},
{
+ 'avatarCacheKey': channel_group_1._get_avatar_cache_key(),
'channel_type': 'group',
'create_uid': self.env.user.id,
'custom_channel_name': False,
@@ -305,6 +313,7 @@ class TestDiscussFullPerformance(TransactionCase):
'uuid': channel_group_1.uuid,
},
{
+ 'avatarCacheKey': channel_chat_1._get_avatar_cache_key(),
'channel_type': 'chat',
'create_uid': self.env.user.id,
'custom_channel_name': False,
@@ -363,6 +372,7 @@ class TestDiscussFullPerformance(TransactionCase):
'uuid': channel_chat_1.uuid,
},
{
+ 'avatarCacheKey': channel_chat_2._get_avatar_cache_key(),
'channel_type': 'chat',
'create_uid': self.env.user.id,
'custom_channel_name': False,
@@ -421,6 +431,7 @@ class TestDiscussFullPerformance(TransactionCase):
'uuid': channel_chat_2.uuid,
},
{
+ 'avatarCacheKey': channel_chat_3._get_avatar_cache_key(),
'channel_type': 'chat',
'create_uid': self.env.user.id,
'custom_channel_name': False,
@@ -479,6 +490,7 @@ class TestDiscussFullPerformance(TransactionCase):
'uuid': channel_chat_3.uuid,
},
{
+ 'avatarCacheKey': channel_chat_4._get_avatar_cache_key(),
'channel_type': 'chat',
'create_uid': self.env.user.id,
'custom_channel_name': False,
@@ -537,6 +549,7 @@ class TestDiscussFullPerformance(TransactionCase):
'uuid': channel_chat_4.uuid,
},
{
+ 'avatarCacheKey': channel_livechat_1._get_avatar_cache_key(),
'channel_type': 'livechat',
'create_uid': self.env.user.id,
'custom_channel_name': False,
@@ -601,6 +614,7 @@ class TestDiscussFullPerformance(TransactionCase):
'uuid': channel_livechat_1.uuid,
},
{
+ 'avatarCacheKey': channel_livechat_2._get_avatar_cache_key(),
'channel_type': 'livechat',
'create_uid': self.env.ref('base.public_user').id,
'custom_channel_name': False,
diff --git a/odoo/addons/base/models/avatar_mixin.py b/odoo/addons/base/models/avatar_mixin.py
index 99c4d0fbccb..f372a61a8c1 100644
--- a/odoo/addons/base/models/avatar_mixin.py
+++ b/odoo/addons/base/models/avatar_mixin.py
@@ -7,6 +7,17 @@ from odoo import models, fields, api
from odoo.tools import html_escape, file_open
+def get_hsl_from_seed(seed):
+ hashed_seed = sha512(seed.encode()).hexdigest()
+ # full range of colors, in degree
+ hue = int(hashed_seed[0:2], 16) * 360 / 255
+ # colorful result but not too flashy, in percent
+ sat = int(hashed_seed[2:4], 16) * ((70 - 40) / 255) + 40
+ # not too bright and not too dark, in percent
+ lig = 45
+ return f'hsl({hue:.0f}, {sat:.0f}%, {lig:.0f}%)'
+
+
class AvatarMixin(models.AbstractModel):
_name = 'avatar.mixin'
_inherit = ['image.mixin']
@@ -52,12 +63,7 @@ class AvatarMixin(models.AbstractModel):
def _avatar_generate_svg(self):
initial = html_escape(self[self._avatar_name_field][0].upper())
- seed = self[self._avatar_name_field] + str(self.create_date.timestamp())
- hashed_seed = sha512(seed.encode()).hexdigest()
- hue = int(hashed_seed[0:2], 16) * 360 / 255
- sat = int(hashed_seed[2:4], 16) * ((70 - 40) / 255) + 40
- lig = 45
- bgcolor = html_escape(f'hsl({hue}, {sat}%, {lig}%)')
+ bgcolor = get_hsl_from_seed(self[self._avatar_name_field] + str(self.create_date.timestamp()))
return b64encode((
""
"