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_event_meet/controllers | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/website_event_meet/controllers')
| -rw-r--r-- | addons/website_event_meet/controllers/__init__.py | 5 | ||||
| -rw-r--r-- | addons/website_event_meet/controllers/community.py | 162 | ||||
| -rw-r--r-- | addons/website_event_meet/controllers/website_event_main.py | 25 |
3 files changed, 192 insertions, 0 deletions
diff --git a/addons/website_event_meet/controllers/__init__.py b/addons/website_event_meet/controllers/__init__.py new file mode 100644 index 00000000..e6526380 --- /dev/null +++ b/addons/website_event_meet/controllers/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import community +from . import website_event_main diff --git a/addons/website_event_meet/controllers/community.py b/addons/website_event_meet/controllers/community.py new file mode 100644 index 00000000..5e7191a7 --- /dev/null +++ b/addons/website_event_meet/controllers/community.py @@ -0,0 +1,162 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import logging +from werkzeug.exceptions import Forbidden, NotFound +from werkzeug.utils import redirect + +from odoo import exceptions, http +from odoo.http import request +from odoo.addons.http_routing.models.ir_http import slug +from odoo.addons.website_event.controllers.community import EventCommunityController +from odoo.osv import expression + +_logger = logging.getLogger(__name__) + + +class WebsiteEventMeetController(EventCommunityController): + + def _get_event_rooms_base_domain(self, event): + search_domain_base = [('event_id', '=', event.id), ('is_published', '=', True)] + return search_domain_base + + def _sort_event_rooms(self, room): + return (room.is_pinned, room.room_last_activity, room.id) + + # ------------------------------------------------------------ + # MAIN PAGE + # ------------------------------------------------------------ + + @http.route(["/event/<model('event.event'):event>/community"], type="http", + auth="public", website=True, sitemap=True) + def community(self, event, page=1, lang=None, **kwargs): + """Display the meeting rooms of the event on the frontend side. + + :param event: event for which we display the meeting rooms + :param lang: lang id used to perform a search + """ + if not event.can_access_from_current_website(): + raise Forbidden() + + return request.render( + "website_event_meet.event_meet", + self._event_meeting_rooms_get_values(event, lang=lang) + ) + + def _event_meeting_rooms_get_values(self, event, lang=None): + search_domain = self._get_event_rooms_base_domain(event) + meeting_rooms_all = request.env['event.meeting.room'].sudo().search(search_domain) + if lang: + search_domain = expression.AND([ + search_domain, + [('room_lang_id', '=', int(lang))] + ]) + meeting_rooms = request.env['event.meeting.room'].sudo().search(search_domain) + meeting_rooms = meeting_rooms.sorted(self._sort_event_rooms, reverse=True) + + is_event_manager = request.env.user.has_group("event.group_event_manager") + if not is_event_manager: + meeting_rooms = meeting_rooms.filtered(lambda m: not m.room_is_full) + + visitor = request.env['website.visitor']._get_visitor_from_request() + + return { + # event information + "event": event.sudo(), + 'main_object': event, + # rooms + "meeting_rooms": meeting_rooms, + "current_lang": request.env["res.lang"].browse(int(lang)) if lang else False, + "available_languages": meeting_rooms_all.mapped("room_lang_id"), + "default_lang_code": request.context.get('lang', request.env.user.lang), + "default_username": visitor.display_name if visitor else None, + # environment + "is_event_manager": is_event_manager, + } + + @http.route("/event/<model('event.event'):event>/meeting_room_create", + type="http", auth="public", methods=["POST"], website=True) + def create_meeting_room(self, event, **post): + if not event or not event.can_access_from_current_website() or (not event.is_published and not request.env.user.user_has_groups('base.group_user')) or not event.meeting_room_allow_creation: + raise Forbidden() + + name = post.get("name") + summary = post.get("summary") + target_audience = post.get("audience") + lang_code = post.get("lang_code") + max_capacity = post.get("capacity") + + # get the record to be sure they really exist + lang = request.env["res.lang"].search([("code", "=", lang_code)], limit=1) + + if not lang or max_capacity == "no_limit": + raise Forbidden() + + meeting_room = request.env["event.meeting.room"].sudo().create({ + "name": name, + "summary": summary, + "target_audience": target_audience, + "is_pinned": False, + "event_id": event.id, + "room_lang_id": lang.id, + "room_max_capacity": max_capacity, + "is_published": True, + }) + _logger.info("New meeting room (%s) created by %s (uid %s)" % (name, request.httprequest.remote_addr, request.env.uid)) + + return redirect(f"/event/{slug(event)}/meeting_room/{slug(meeting_room)}") + + @http.route(["/event/active_langs"], type="json", auth="public") + def active_langs(self): + return request.env["res.lang"].sudo().get_installed() + + # ------------------------------------------------------------ + # ROOM PAGE VIEW + # ------------------------------------------------------------ + + @http.route('''/event/<model('event.event', "[('community_menu', '=', True)]"):event>/meeting_room/<model("event.meeting.room","[('event_id','=',event.id)]"):meeting_room>''', + type="http", auth="public", website=True, sitemap=True) + def event_meeting_room_page(self, event, meeting_room, **post): + """Display the meeting room frontend view. + + :param event: Event for which we display the meeting rooms + :param meeting_room: Meeting Room to display + """ + if not event.can_access_from_current_website() or meeting_room not in event.sudo().meeting_room_ids: + raise NotFound() + + try: + meeting_room.check_access_rule('read') + except exceptions.AccessError: + raise Forbidden() + + meeting_room = meeting_room.sudo() + + return request.render( + "website_event_meet.event_meet_main", + self._event_meeting_room_page_get_values(event, meeting_room), + ) + + def _event_meeting_room_page_get_values(self, event, meeting_room): + # search for meeting room list + meeting_rooms_other = request.env['event.meeting.room'].sudo().search([ + ('event_id', '=', event.id), ('id', '!=', meeting_room.id), ('is_published', '=', True), + ]) + + if not request.env.user.has_group("event.group_event_manager"): + # only the event manager can see meeting rooms which are full + meeting_rooms_other = meeting_rooms_other.filtered(lambda m: not m.room_is_full) + + meeting_rooms_other = meeting_rooms_other.sorted(self._sort_event_rooms, reverse=True) + + return { + # event information + 'event': event, + 'main_object': meeting_room, + 'meeting_room': meeting_room, + # sidebar + 'meeting_rooms_other': meeting_rooms_other, + # options + 'option_widescreen': True, + 'is_event_manager': request.env.user.has_group('event.group_event_manager'), + } diff --git a/addons/website_event_meet/controllers/website_event_main.py b/addons/website_event_meet/controllers/website_event_main.py new file mode 100644 index 00000000..991b15f7 --- /dev/null +++ b/addons/website_event_meet/controllers/website_event_main.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from babel.dates import format_datetime + +from odoo import _ +from odoo.http import request +from odoo.addons.website_event.controllers.main import WebsiteEventController + + +class WebsiteEventController(WebsiteEventController): + def _prepare_event_register_values(self, event, **post): + values = super(WebsiteEventController, self)._prepare_event_register_values(event, **post) + + if "from_room_id" in post and not event.is_ongoing: + meeting_room = request.env["event.meeting.room"].browse(int(post["from_room_id"])).sudo().exists() + if meeting_room and meeting_room.is_published: + date_begin = format_datetime(event.with_context(tz=event.date_tz).date_begin, format="medium") + + values["toast_message"] = ( + _('The event %s starts on %s (%s). \nJoin us there to chat about "%s" !') + % (event.name, date_begin, event.date_tz, meeting_room.name) + ) + + return values |
