123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- # -*- coding: utf-8 -*-
- # Part of Odoo. See LICENSE file for full copyright and licensing details.
- from werkzeug.exceptions import NotFound
- from odoo import http
- from odoo.http import request
- class WebsiteJitsiController(http.Controller):
- @http.route(["/jitsi/update_status"], type="json", auth="public")
- def jitsi_update_status(self, room_name, participant_count, joined):
- """ Update room status: participant count, max reached
- Use the SQL keywords "FOR UPDATE SKIP LOCKED" in order to skip if the row
- is locked (instead of raising an exception, wait for a moment and retry).
- This endpoint may be called multiple times and we don't care having small
- errors in participant count compared to performance issues.
- :raise ValueError: wrong participant count
- :raise NotFound: wrong room name
- """
- if participant_count < 0:
- raise ValueError()
- chat_room = self._chat_room_exists(room_name)
- if not chat_room:
- raise NotFound()
- request.env.cr.execute(
- """
- WITH req AS (
- SELECT id
- FROM chat_room
- -- Can not update the chat room if we do not have its name
- WHERE name = %s
- FOR UPDATE SKIP LOCKED
- )
- UPDATE chat_room AS wcr
- SET participant_count = %s,
- last_activity = NOW(),
- max_participant_reached = GREATEST(max_participant_reached, %s)
- FROM req
- WHERE wcr.id = req.id;
- """,
- [room_name, participant_count, participant_count]
- )
- @http.route(["/jitsi/is_full"], type="json", auth="public")
- def jitsi_is_full(self, room_name):
- return self._chat_room_exists(room_name).is_full
- # ------------------------------------------------------------
- # TOOLS
- # ------------------------------------------------------------
- def _chat_room_exists(self, room_name):
- return request.env["chat.room"].sudo().search([("name", "=", room_name)], limit=1)
|