summaryrefslogtreecommitdiff
path: root/addons/website_jitsi/models
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/website_jitsi/models
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/website_jitsi/models')
-rw-r--r--addons/website_jitsi/models/__init__.py6
-rw-r--r--addons/website_jitsi/models/chat_room.py61
-rw-r--r--addons/website_jitsi/models/chat_room_mixin.py77
-rw-r--r--addons/website_jitsi/models/res_config_settings.py12
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"')