Currently, the usability for unpublished exhibitor is not optimum. For example, on `/exhibitors` page, we show the exhibitors in random order where sometimes unpublished ones might come before the published ones. And on the sidebar of the exhibitors, there's no visual indication for unpublished record and they do not always appear after the published ones. Same for the sponsor/exhibitor list that appears at he bottom of almost all event pages. This commit does the following improvements: - For `/exhibitors` page, now first there will be random published exhibitors, and after that, there will be random unpublished exhibitors (class used to lower opacity is now removed as it will be handled by publish management related data attributes). - Clicking on any of this exhibitors, on the left sidebar, now we display unpublished exhibitors at the last, with lower opacity and 'Unpublished' tag. - The 'Connect' button on exhibitors is now positioned absolutely so that the opacity does not apply on it for unpublished exhibitors. - For the sponsors list appearing at the bottom of almost all event pages, now the unpublished sponsors will appear at last with lower opacity and 'Unpublished' tag below them. - In a special case of sponsor list appearing in `/community` page, the unpublished sponsors were displayed to all the users, because the event record was passed with sudo. We remove this sudo attribute, which seems not necessary. taskID-2346612
162 lines
6.7 KiB
Python
162 lines
6.7 KiB
Python
# -*- 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)]
|
|
if not request.env.user.has_group('event.group_event_registration_desk'):
|
|
search_domain_base = expression.AND([search_domain_base, [('is_published', '=', True)]])
|
|
return search_domain_base
|
|
|
|
def _sort_event_rooms(self, room):
|
|
return (room.website_published, 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
|
|
"""
|
|
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_user = request.env.user.has_group("event.group_event_registration_desk")
|
|
if not is_event_user:
|
|
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,
|
|
'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_user": is_event_user,
|
|
}
|
|
|
|
@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.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 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. Set a limit to 6 because it is better than 5 or 7
|
|
meeting_rooms_other = request.env['event.meeting.room'].sudo().search([
|
|
('event_id', '=', event.id), ('id', '!=', meeting_room.id), ('is_published', '=', True),
|
|
], limit=6)
|
|
|
|
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_user': request.env.user.has_group('event.group_event_registration_desk'),
|
|
}
|