summaryrefslogtreecommitdiff
path: root/addons/website_event_meet/models
diff options
context:
space:
mode:
authorstd-odoo <std@odoo.com>2020-07-13 10:59:07 +0000
committerThibault Delavallée <tde@odoo.com>2020-08-04 14:28:29 +0000
commitc918c58213e9dd5f3bf6ac0da1cb4f2afdb15d3a (patch)
tree7dd6706558c60bf5f4521d6d7d1278a6a61aa028 /addons/website_event_meet/models
parentb990f71de0b8f2ad3cda07c1d34b01a6e5f1b3d3 (diff)
[ADD] website_event_meet: allow visitors to meet at online events
RATIONALE Events are sometimes held online, gathering a community. In this merge we improve Event application to better support full-online events with improved tracks, wishlists, chat rooms, ... PURPOSE Allow the website visitors to meet at online events using chat rooms. Those are based on jitsi rooms previously added. SPECIFICATIONS Define a new model holding discussion rooms, with their target and a publish management. Inherit from chat.room mixin to enable jitsi-based chat. Any website visitor can create a meeting room based on Jitsi. Using some information (name, summary, room size, languyage) anyone can launch a new discussion topic. This will make a link with a new jitsi room enabling people to chat. Visitor-community rooms creation can be turned off on event itself. Meeting rooms can be pinned by the event managers to choose which rooms are displayed on top. Managers can also duplicate the full meeting rooms if a topic is popular, or publish/unpublish rooms like usual website records. SPECIFICATIONS: LIST VIEW Display a card-based list view of meeting rooms. They can be filtered by language. When a meeting room reach the maximum number of participants it is not visible anymore for standard visitors. The meeting rooms unpinned are cleaned after a certain period of time if there is no activity in it usign the autovacuum cron. That way we keep a clean view on the frontend and we keep the important (pinned) meeting rooms. SPECIFICATIONS: PAGE VIEW Use the same main content / aside panel display as exhibitors / tracks, to display the jitsi in the main content. Left panel proposes suggestions of rooms, based on current one. When a visitor join a meeting room, we fill the jitsi username with the name he entered during his registration. LINKS Task ID-2252655 (Main Online Event task) Task ID-2283742 (Community gathering on chat rooms) Co-Authored-By: Aurélien Warnon <awa@odoo.com> Co-Authored-By: David Beguin <dbe@odoo.com> Co-Authored-By: Stéphane Debauche <std@odoo.com> Co-Authored-By: Thibault Delavallée <tde@odoo.com>
Diffstat (limited to 'addons/website_event_meet/models')
-rw-r--r--addons/website_event_meet/models/__init__.py8
-rw-r--r--addons/website_event_meet/models/event_event.py42
-rw-r--r--addons/website_event_meet/models/event_meeting_room.py60
-rw-r--r--addons/website_event_meet/models/event_type.py18
-rw-r--r--addons/website_event_meet/models/ir_autovacuum.py24
-rw-r--r--addons/website_event_meet/models/website_event_menu.py10
6 files changed, 162 insertions, 0 deletions
diff --git a/addons/website_event_meet/models/__init__.py b/addons/website_event_meet/models/__init__.py
new file mode 100644
index 00000000000..8f975bbef96
--- /dev/null
+++ b/addons/website_event_meet/models/__init__.py
@@ -0,0 +1,8 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import event_event
+from . import event_type
+from . import event_meeting_room
+from . import ir_autovacuum
+from . import website_event_menu
diff --git a/addons/website_event_meet/models/event_event.py b/addons/website_event_meet/models/event_event.py
new file mode 100644
index 00000000000..4b254e91dbb
--- /dev/null
+++ b/addons/website_event_meet/models/event_event.py
@@ -0,0 +1,42 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, fields, models, _
+from odoo.addons.http_routing.models.ir_http import slug
+
+
+class Event(models.Model):
+ _inherit = "event.event"
+
+ meeting_room_ids = fields.One2many("event.meeting.room", "event_id", string="Meeting rooms")
+ meeting_room_count = fields.Integer("Room count", compute="_compute_meeting_room_count")
+ meeting_room_allow_creation = fields.Boolean(
+ "Allow Room Creation", compute="_compute_meeting_room_allow_creation",
+ readonly=False, store=True,
+ help="Let Visitors Create Rooms")
+
+ @api.depends("meeting_room_ids")
+ def _compute_meeting_room_count(self):
+ meeting_room_count = self.env["event.meeting.room"].sudo().read_group(
+ domain=[("event_id", "in", self.ids)],
+ fields=["id:count"],
+ groupby=["event_id"],
+ )
+
+ meeting_room_count = {
+ result["event_id"][0]: result["event_id_count"]
+ for result in meeting_room_count
+ }
+
+ for event in self:
+ event.meeting_room_count = meeting_room_count.get(event.id, 0)
+
+ @api.depends("event_type_id", "community_menu", "meeting_room_allow_creation")
+ def _compute_meeting_room_allow_creation(self):
+ for event in self:
+ if event.event_type_id and event.event_type_id != event._origin.event_type_id:
+ event.meeting_room_allow_creation = event.event_type_id.meeting_room_allow_creation
+ elif event.community_menu and event.community_menu != event._origin.community_menu:
+ event.meeting_room_allow_creation = True
+ elif not event.community_menu or not event.meeting_room_allow_creation:
+ event.meeting_room_allow_creation = False
diff --git a/addons/website_event_meet/models/event_meeting_room.py b/addons/website_event_meet/models/event_meeting_room.py
new file mode 100644
index 00000000000..cad8bc78936
--- /dev/null
+++ b/addons/website_event_meet/models/event_meeting_room.py
@@ -0,0 +1,60 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from werkzeug.urls import url_join
+
+from odoo import api, fields, models, _
+from odoo.addons.http_routing.models.ir_http import slug
+
+
+class EventMeetingRoom(models.Model):
+ _name = "event.meeting.room"
+ _description = "Event Meeting Room"
+ _order = "is_pinned DESC, id"
+ _inherit = [
+ 'chat.room.mixin',
+ 'website.published.mixin',
+ ]
+
+ name = fields.Char("Topic", required=True, translate=True)
+ active = fields.Boolean('Active', default=True)
+ 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")
+ target_audience = fields.Char("Audience", translate=True)
+
+ # TDE FIXME: merge with mixin code
+ ROOM_CONFIG_FIELDS = {
+ 'room_name': 'name',
+ 'room_lang_id': 'lang_id',
+ 'room_max_capacity': 'max_capacity',
+ 'room_participant_count': 'participant_count',
+ }
+
+ @api.depends('name', 'event_id.name')
+ def _compute_website_url(self):
+ super(EventMeetingRoom, self)._compute_website_url()
+ for meeting_room in self:
+ if meeting_room.id:
+ base_url = meeting_room.event_id.get_base_url()
+ meeting_room.website_url = '%s/event/%s/meeting_room/%s' % (base_url, slug(meeting_room.event_id), slug(meeting_room))
+
+ @api.model_create_multi
+ def create(self, values_list):
+ # TDE FIXME: merge with mixin code
+ for values in values_list:
+ if not values.get("chat_room_id"):
+ # be sure to always create a `chat.room` for each `event.meeting.room`
+ chat_room = self.env["chat.room"].create({
+ self.ROOM_CONFIG_FIELDS[field]: value
+ for field, value in dict(values).items()
+ if field in self.ROOM_CONFIG_FIELDS and values.pop(field)
+ })
+
+ values["chat_room_id"] = chat_room.id
+
+ values["name"] = values["name"].capitalize()
+ values["target_audience"] = (values.get("target_audience") or _("Attendee(s)")).capitalize()
+
+ return super(EventMeetingRoom, self).create(values_list)
diff --git a/addons/website_event_meet/models/event_type.py b/addons/website_event_meet/models/event_type.py
new file mode 100644
index 00000000000..4272de467b4
--- /dev/null
+++ b/addons/website_event_meet/models/event_type.py
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, fields, models
+
+
+class EventType(models.Model):
+ _inherit = "event.type"
+
+ meeting_room_allow_creation = fields.Boolean(
+ "Allow Room Creation", compute='_compute_meeting_room_allow_creation',
+ readonly=False, store=True,
+ help="Let Visitors Create Rooms")
+
+ @api.depends('community_menu')
+ def _compute_meeting_room_allow_creation(self):
+ for event_type in self:
+ event_type.meeting_room_allow_creation = event_type.community_menu
diff --git a/addons/website_event_meet/models/ir_autovacuum.py b/addons/website_event_meet/models/ir_autovacuum.py
new file mode 100644
index 00000000000..11907a0d5ac
--- /dev/null
+++ b/addons/website_event_meet/models/ir_autovacuum.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+import datetime
+
+from odoo import api, models, fields
+
+
+class AutoVacuum(models.AbstractModel):
+ _inherit = 'ir.autovacuum'
+
+ _DELAY_CLEAN = datetime.timedelta(hours=4)
+
+ @api.model
+ def power_on(self, *args, **kwargs):
+ """Archive all non-pinned room with 0 participant if nobody has joined it for a moment."""
+ self.env["event.meeting.room"].sudo().search([
+ ("is_pinned", "=", False),
+ ("active", "=", True),
+ ("room_participant_count", "=", 0),
+ ("room_last_activity", "<", fields.Datetime.now() - self._DELAY_CLEAN),
+ ]).active = False
+
+ return super(AutoVacuum, self).power_on(*args, **kwargs)
diff --git a/addons/website_event_meet/models/website_event_menu.py b/addons/website_event_meet/models/website_event_menu.py
new file mode 100644
index 00000000000..827d3bc1fa4
--- /dev/null
+++ b/addons/website_event_meet/models/website_event_menu.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import fields, models
+
+
+class EventMenu(models.Model):
+ _inherit = "website.event.menu"
+
+ menu_type = fields.Selection(selection_add=[("meeting_room", "Event Meeting Room Menus")])