diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/website_jitsi/models | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/website_jitsi/models')
| -rw-r--r-- | addons/website_jitsi/models/__init__.py | 6 | ||||
| -rw-r--r-- | addons/website_jitsi/models/chat_room.py | 61 | ||||
| -rw-r--r-- | addons/website_jitsi/models/chat_room_mixin.py | 77 | ||||
| -rw-r--r-- | addons/website_jitsi/models/res_config_settings.py | 12 |
4 files changed, 156 insertions, 0 deletions
diff --git a/addons/website_jitsi/models/__init__.py b/addons/website_jitsi/models/__init__.py new file mode 100644 index 00000000..a58573d9 --- /dev/null +++ b/addons/website_jitsi/models/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import chat_room +from . import chat_room_mixin +from . import res_config_settings diff --git a/addons/website_jitsi/models/chat_room.py b/addons/website_jitsi/models/chat_room.py new file mode 100644 index 00000000..1f7383bc --- /dev/null +++ b/addons/website_jitsi/models/chat_room.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from uuid import uuid4 + +from odoo import api, fields, models + + +class ChatRoom(models.Model): + """ Store all useful information to manage chat room (currently limited + to Jitsi). This model embeds all information about the chat room. We do not + store them in the related mixin (see chat.room.mixin) to avoid to add too + many fields on the models which want to use the chat room mixin as the + behavior can be optional in those models. + + The participant count is automatically updated thanks to the chat room widget + to avoid having a costly computed field with a members model. + """ + _name = "chat.room" + _description = "Chat Room" + + def _default_name(self, objname='room'): + return "odoo-%s-%s" % (objname, str(uuid4())[:8]) + + name = fields.Char( + "Room Name", required=True, copy=False, + default=lambda self: self._default_name()) + is_full = fields.Boolean("Full", compute="_compute_is_full") + jitsi_server_domain = fields.Char( + 'Jitsi Server Domain', compute='_compute_jitsi_server_domain', + help='The Jitsi server domain can be customized through the settings to use a different server than the default "meet.jit.si"') + lang_id = fields.Many2one( + "res.lang", "Language", + default=lambda self: self.env["res.lang"].search([("code", "=", self.env.user.lang)], limit=1)) + max_capacity = fields.Selection( + [("4", "4"), ("8", "8"), ("12", "12"), ("16", "16"), + ("20", "20"), ("no_limit", "No limit")], string="Max capacity", + default="8", required=True) + participant_count = fields.Integer("Participant count", default=0, copy=False) + # reporting fields + last_activity = fields.Datetime( + "Last Activity", copy=False, readonly=True, + default=lambda self: fields.Datetime.now()) + max_participant_reached = fields.Integer( + "Max participant reached", copy=False, readonly=True, + help="Maximum number of participant reached in the room at the same time") + + @api.depends("max_capacity", "participant_count") + def _compute_is_full(self): + for room in self: + if room.max_capacity == "no_limit": + room.is_full = False + else: + room.is_full = room.participant_count >= int(room.max_capacity) + + def _compute_jitsi_server_domain(self): + jitsi_server_domain = self.env['ir.config_parameter'].sudo().get_param( + 'website_jitsi.jitsi_server_domain', 'meet.jit.si') + + for room in self: + room.jitsi_server_domain = jitsi_server_domain diff --git a/addons/website_jitsi/models/chat_room_mixin.py b/addons/website_jitsi/models/chat_room_mixin.py new file mode 100644 index 00000000..247872be --- /dev/null +++ b/addons/website_jitsi/models/chat_room_mixin.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +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. + + The chat room configuration contains all information about the room. So, we store + all the chat room logic at the same place, for all models. + Embed chat room related fields prefixed with `room_`. + """ + _name = "chat.room.mixin" + _description = "Chat Room Mixin" + ROOM_CONFIG_FIELDS = [ + ('room_name', 'name'), + ('room_lang_id', 'lang_id'), + ('room_max_capacity', 'max_capacity'), + ('room_participant_count', 'participant_count') + ] + + chat_room_id = fields.Many2one("chat.room", "Chat Room", readonly=True, copy=False, ondelete="set null") + # chat room related fields + room_name = fields.Char("Room Name", related="chat_room_id.name") + room_is_full = fields.Boolean("Room Is Full", related="chat_room_id.is_full") + room_lang_id = fields.Many2one("res.lang", "Language", related="chat_room_id.lang_id", readonly=False) + 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("Peak participants", related="chat_room_id.max_participant_reached") + + @api.model_create_multi + 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'): + 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_data(self, default=None): + if default is None: + default = {} + if self.chat_room_id: + 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): + 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 diff --git a/addons/website_jitsi/models/res_config_settings.py b/addons/website_jitsi/models/res_config_settings.py new file mode 100644 index 00000000..28308cad --- /dev/null +++ b/addons/website_jitsi/models/res_config_settings.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + jitsi_server_domain = fields.Char( + 'Jitsi Server Domain', default='meet.jit.si', config_parameter='website_jitsi.jitsi_server_domain', + help='The Jitsi server domain can be customized through the settings to use a different server than the default "meet.jit.si"') |
