From 0b3fbfcb3838f8719aa77f9f0b4270a18484e2d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 13 Aug 2020 13:16:31 +0000 Subject: [PATCH 1/3] [FW][IMP] website_event_track(_session): display speaker function in its bio It allows to better know who the speaker is. This is done through a related on the speaker function and partner_name fields. It allows to display a sentence like "Director at Azure Interior", which gives information on both its position and its company. LINKS Coming from internal feedback while deploying online support Task ID-2314778 PR #558877 X-original-commit 69cf94cec0913db4132ae96d2bc82be4f465d6db --- addons/website_event_track_online/models/event_track.py | 6 ++++++ .../views/event_track_templates_page.xml | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/addons/website_event_track_online/models/event_track.py b/addons/website_event_track_online/models/event_track.py index 131abf0ee2f..511fbf404ff 100644 --- a/addons/website_event_track_online/models/event_track.py +++ b/addons/website_event_track_online/models/event_track.py @@ -17,6 +17,12 @@ class Track(models.Model): partner_biography = fields.Html( string='Biography', compute='_compute_partner_biography', readonly=False, store=True) + partner_function = fields.Char( + 'Job Position', related='partner_id.function', + compute_sudo=True, readonly=True) + partner_company_name = fields.Char( + 'Company Name', related='partner_id.parent_name', + compute_sudo=True, readonly=True) image = fields.Image( string="Speaker Photo", compute="_compute_speaker_image", readonly=False, store=True, diff --git a/addons/website_event_track_session/views/event_track_templates_page.xml b/addons/website_event_track_session/views/event_track_templates_page.xml index 7e8c8d11a28..5056039dede 100644 --- a/addons/website_event_track_session/views/event_track_templates_page.xml +++ b/addons/website_event_track_session/views/event_track_templates_page.xml @@ -100,6 +100,12 @@ t-options="{'widget': 'image', 'class': 'rounded-circle', 'max_width': '96'}"/>
+ + + +  at  + + @@ -183,7 +189,7 @@ diff --git a/addons/website_event_meet/views/event_meet_templates_page.xml b/addons/website_event_meet/views/event_meet_templates_page.xml index ee453fd7682..bd865af704a 100644 --- a/addons/website_event_meet/views/event_meet_templates_page.xml +++ b/addons/website_event_meet/views/event_meet_templates_page.xml @@ -43,7 +43,7 @@ t-options="{'format': 'medium'}"/> ().
- Join us there to chat about " ! + Join us there to chat about !
diff --git a/addons/website_event_meet/views/event_meeting_room_views.xml b/addons/website_event_meet/views/event_meeting_room_views.xml index 9012ee443bd..db7451ba1ed 100644 --- a/addons/website_event_meet/views/event_meeting_room_views.xml +++ b/addons/website_event_meet/views/event_meeting_room_views.xml @@ -58,14 +58,14 @@ event.meeting.room.tree event.meeting.room - + - - + + diff --git a/addons/website_event_track_exhibitor/models/event_sponsor.py b/addons/website_event_track_exhibitor/models/event_sponsor.py index 1f91250377d..4f812034e3e 100644 --- a/addons/website_event_track_exhibitor/models/event_sponsor.py +++ b/addons/website_event_track_exhibitor/models/event_sponsor.py @@ -53,9 +53,12 @@ class EventSponsor(models.Model): for sponsor in self: if sponsor.is_exhibitor and not sponsor.room_name: if sponsor.name: - sponsor.room_name = self.env['chat.room']._jitsi_sanitize_name("odoo-exhibitor-%s" % sponsor.name) + room_name = "odoo-exhibitor-%s" % sponsor.name else: - sponsor.room_name = self.env['chat.room']._default_name() + room_name = self.env['chat.room']._default_name(objname='exhibitor') + sponsor.room_name = self._jitsi_sanitize_name(room_name) + if sponsor.is_exhibitor and not sponsor.room_max_capacity: + sponsor.room_max_capacity = '8' @api.depends('partner_id') def _compute_website_description(self): @@ -97,6 +100,10 @@ class EventSponsor(models.Model): else: sponsor.country_flag_url = False + # ------------------------------------------------------------ + # MIXINS + # --------------------------------------------------------- + @api.depends('name', 'event_id.name') def _compute_website_url(self): super(EventSponsor, self)._compute_website_url() @@ -105,13 +112,32 @@ class EventSponsor(models.Model): base_url = sponsor.event_id.get_base_url() sponsor.website_url = '%s/event/%s/exhibitor/%s' % (base_url, slug(sponsor.event_id), slug(sponsor)) + # ------------------------------------------------------------ + # CRUD + # ------------------------------------------------------------ + @api.model_create_multi def create(self, values_list): for values in values_list: if values.get('is_exhibitor') and not values.get('room_name'): - name = values['name'] if values.get('name') else self.env['res.partner'].browse(values['partner_id']).name or 'sponsor' - values['room_name'] = self.env['chat.room']._jitsi_sanitize_name(name) + exhibitor_name = values['name'] if values.get('name') else self.env['res.partner'].browse(values['partner_id']).name + name = 'odoo-exhibitor-%s' % exhibitor_name or 'sponsor' + values['room_name'] = name return super(EventSponsor, self).create(values_list) + def write(self, values): + toupdate = self.env['event.sponsor'] + if values.get('is_exhibitor') and not values.get('chat_room_id') and not values.get('room_name'): + toupdate = self.filtered(lambda exhibitor: not exhibitor.chat_room_id) + # go into sequential update in order to create a custom room name for each sponsor + for exhibitor in toupdate: + values['room_name'] = 'odoo-exhibitor-%s' % exhibitor.name + super(EventSponsor, exhibitor).write(values) + return super(EventSponsor, self - toupdate).write(values) + + # ------------------------------------------------------------ + # ACTIONS + # --------------------------------------------------------- + def get_backend_menu_id(self): return self.env.ref('event.event_main_menu').id diff --git a/addons/website_event_track_exhibitor/views/event_sponsor_views.xml b/addons/website_event_track_exhibitor/views/event_sponsor_views.xml index 4228c23527d..268342973b7 100644 --- a/addons/website_event_track_exhibitor/views/event_sponsor_views.xml +++ b/addons/website_event_track_exhibitor/views/event_sponsor_views.xml @@ -18,6 +18,7 @@ + diff --git a/addons/website_event_track_online/views/event_sponsor_views.xml b/addons/website_event_track_online/views/event_sponsor_views.xml index 9fd79468f71..6dd681d7fab 100644 --- a/addons/website_event_track_online/views/event_sponsor_views.xml +++ b/addons/website_event_track_online/views/event_sponsor_views.xml @@ -18,6 +18,12 @@ event.sponsor + + 1 + + + 1 + diff --git a/addons/website_jitsi/models/chat_room.py b/addons/website_jitsi/models/chat_room.py index 401ba0d0242..1f7383bc1dd 100644 --- a/addons/website_jitsi/models/chat_room.py +++ b/addons/website_jitsi/models/chat_room.py @@ -1,12 +1,9 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import re - from uuid import uuid4 from odoo import api, fields, models -from odoo.tools import remove_accents class ChatRoom(models.Model): @@ -22,8 +19,8 @@ class ChatRoom(models.Model): _name = "chat.room" _description = "Chat Room" - def _default_name(self): - return "odoo-room-%s" % str(uuid4())[:8] + def _default_name(self, objname='room'): + return "odoo-%s-%s" % (objname, str(uuid4())[:8]) name = fields.Char( "Room Name", required=True, copy=False, @@ -62,6 +59,3 @@ class ChatRoom(models.Model): for room in self: room.jitsi_server_domain = jitsi_server_domain - - def _jitsi_sanitize_name(self, name): - return re.sub(r'[^\w+.]+', '-', remove_accents(name).lower()) diff --git a/addons/website_jitsi/models/chat_room_mixin.py b/addons/website_jitsi/models/chat_room_mixin.py index f5071b13d5e..5ced6599c66 100644 --- a/addons/website_jitsi/models/chat_room_mixin.py +++ b/addons/website_jitsi/models/chat_room_mixin.py @@ -1,8 +1,10 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import api, fields, models +import re +from odoo import api, fields, models +from odoo.tools import remove_accents class ChatRoomMixin(models.AbstractModel): """Add the chat room configuration (`chat.room`) on the needed models. @@ -34,24 +36,42 @@ class ChatRoomMixin(models.AbstractModel): def create(self, values_list): for values in values_list: if any(values.get(fmatch[0]) for fmatch in self.ROOM_CONFIG_FIELDS) and not values.get('chat_room_id'): - room_values = dict((fmatch[1], values[fmatch[0]]) for fmatch in self.ROOM_CONFIG_FIELDS if values.get(fmatch[0])) + if values.get('room_name'): + values['room_name'] = self._jitsi_sanitize_name(values['room_name']) + room_values = dict((fmatch[1], values.pop(fmatch[0])) for fmatch in self.ROOM_CONFIG_FIELDS if values.get(fmatch[0])) values['chat_room_id'] = self.env['chat.room'].create(room_values).id return super(ChatRoomMixin, self).create(values_list) def write(self, values): if any(values.get(fmatch[0]) for fmatch in self.ROOM_CONFIG_FIELDS): + if values.get('room_name'): + values['room_name'] = self._jitsi_sanitize_name(values['room_name']) for document in self.filtered(lambda doc: not doc.chat_room_id): room_values = dict((fmatch[1], values[fmatch[0]]) for fmatch in self.ROOM_CONFIG_FIELDS if values.get(fmatch[0])) document.chat_room_id = self.env['chat.room'].create(room_values).id return super(ChatRoomMixin, self).write(values) - def copy(self, default=None): + def copy_data(self, default=None): + if default is None: + default = {} if self.chat_room_id: - chat_room_id = self.chat_room_id.copy() - default = dict(default or {}, chat_room_id=chat_room_id.id) - return super(ChatRoomMixin, self).copy(default) + chat_room_default = {} + if 'room_name' not in default: + chat_room_default['name'] = self._jitsi_sanitize_name(self.chat_room_id.name) + default['chat_room_id'] = self.chat_room_id.copy(default=chat_room_default).id + return super(ChatRoomMixin, self).copy_data(default=default) def unlink(self): - if self.chat_room_id: - self.chat_room_id.unlink() - return super(ChatRoomMixin, self).unlink() + rooms = self.chat_room_id + res = super(ChatRoomMixin, self).unlink() + rooms.unlink() + return res + + def _jitsi_sanitize_name(self, name): + sanitized = re.sub(r'[^\w+.]+', '-', remove_accents(name).lower()) + counter, sanitized_suffixed = 1, sanitized + existing = self.env['chat.room'].search([('name', '=like', '%s%%' % sanitized)]).mapped('name') + while sanitized_suffixed in existing: + sanitized_suffixed = '%s-%d' % (sanitized, counter) + counter += 1 + return sanitized_suffixed From d8dc8901be7c130ad28e2148ebeb8bb17f8cfeba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 14 Aug 2020 07:00:09 +0000 Subject: [PATCH 3/3] [FW][IMP] website_event_meet: improve meeting room model SPECIFICATIONS Slightly improve meeting room model * set chat room as required. Meeting rooms without chat room make no sense; * allow to translate room summary. As this is displayed in frontend having it translated makes sense; * improve label of reached participants, allowing notably to display it nicely in backend; LINKS Coming from internal feedback while deploying online support Task ID-2314778 PR #55887 X-original-commit 54bd8281cf94ddee77073cf5d6356d847d08d024 --- addons/website_event_meet/models/event_meeting_room.py | 3 ++- addons/website_event_meet/views/event_meeting_room_views.xml | 2 +- addons/website_jitsi/models/chat_room_mixin.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/website_event_meet/models/event_meeting_room.py b/addons/website_event_meet/models/event_meeting_room.py index a7375d141e7..4d88f9aaedd 100644 --- a/addons/website_event_meet/models/event_meeting_room.py +++ b/addons/website_event_meet/models/event_meeting_room.py @@ -19,7 +19,8 @@ class EventMeetingRoom(models.Model): is_published = fields.Boolean(copy=True) # make the inherited field copyable event_id = fields.Many2one("event.event", string="Event", required=True, ondelete="cascade") is_pinned = fields.Boolean("Is Pinned") - summary = fields.Char("Summary") + chat_room_id = fields.Many2one("chat.room", required=True, ondelete="restrict") + summary = fields.Char("Summary", translate=True) target_audience = fields.Char("Audience", translate=True) @api.depends('name', 'event_id.name') diff --git a/addons/website_event_meet/views/event_meeting_room_views.xml b/addons/website_event_meet/views/event_meeting_room_views.xml index db7451ba1ed..c7489ccb355 100644 --- a/addons/website_event_meet/views/event_meeting_room_views.xml +++ b/addons/website_event_meet/views/event_meeting_room_views.xml @@ -36,7 +36,7 @@ - + diff --git a/addons/website_jitsi/models/chat_room_mixin.py b/addons/website_jitsi/models/chat_room_mixin.py index 5ced6599c66..247872be9fc 100644 --- a/addons/website_jitsi/models/chat_room_mixin.py +++ b/addons/website_jitsi/models/chat_room_mixin.py @@ -30,7 +30,7 @@ class ChatRoomMixin(models.AbstractModel): room_max_capacity = fields.Selection(string="Max capacity", related="chat_room_id.max_capacity", readonly=False, required=True) room_participant_count = fields.Integer("Participant count", related="chat_room_id.participant_count", readonly=False) room_last_activity = fields.Datetime("Last activity", related="chat_room_id.last_activity") - room_max_participant_reached = fields.Integer("Max participant reached", related="chat_room_id.max_participant_reached") + room_max_participant_reached = fields.Integer("Peak participants", related="chat_room_id.max_participant_reached") @api.model_create_multi def create(self, values_list):