summaryrefslogtreecommitdiff
path: root/addons/website_event_track_exhibitor/controllers
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_event_track_exhibitor/controllers
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/website_event_track_exhibitor/controllers')
-rw-r--r--addons/website_event_track_exhibitor/controllers/__init__.py5
-rw-r--r--addons/website_event_track_exhibitor/controllers/exhibitor.py231
-rw-r--r--addons/website_event_track_exhibitor/controllers/website_event_main.py25
3 files changed, 261 insertions, 0 deletions
diff --git a/addons/website_event_track_exhibitor/controllers/__init__.py b/addons/website_event_track_exhibitor/controllers/__init__.py
new file mode 100644
index 00000000..5a5d5a97
--- /dev/null
+++ b/addons/website_event_track_exhibitor/controllers/__init__.py
@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import exhibitor
+from . import website_event_main
diff --git a/addons/website_event_track_exhibitor/controllers/exhibitor.py b/addons/website_event_track_exhibitor/controllers/exhibitor.py
new file mode 100644
index 00000000..2418b785
--- /dev/null
+++ b/addons/website_event_track_exhibitor/controllers/exhibitor.py
@@ -0,0 +1,231 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from ast import literal_eval
+from random import randint, sample
+from werkzeug.exceptions import NotFound, Forbidden
+
+from odoo import exceptions, http
+from odoo.addons.website_event_track.controllers.event_track import EventTrackController
+from odoo.http import request
+from odoo.osv import expression
+from odoo.tools import format_duration
+
+
+class ExhibitorController(EventTrackController):
+
+ def _get_event_sponsors_base_domain(self, event):
+ search_domain_base = [
+ ('event_id', '=', event.id),
+ ('is_exhibitor', '=', True),
+ ]
+ if not request.env.user.has_group('event.group_event_user'):
+ search_domain_base = expression.AND([search_domain_base, [('is_published', '=', True)]])
+ return search_domain_base
+
+ # ------------------------------------------------------------
+ # MAIN PAGE
+ # ------------------------------------------------------------
+
+ @http.route(['/event/<model("event.event"):event>/exhibitors'], type='http', auth="public", website=True, sitemap=False)
+ def event_exhibitors(self, event, **searches):
+ if not event.can_access_from_current_website():
+ raise NotFound()
+
+ return request.render(
+ "website_event_track_exhibitor.event_exhibitors",
+ self._event_exhibitors_get_values(event, **searches)
+ )
+
+ def _event_exhibitors_get_values(self, event, **searches):
+ # init and process search terms
+ searches.setdefault('search', '')
+ searches.setdefault('countries', '')
+ searches.setdefault('sponsorships', '')
+ search_domain_base = self._get_event_sponsors_base_domain(event)
+ search_domain = search_domain_base
+
+ # search on content
+ if searches.get('search'):
+ search_domain = expression.AND([
+ search_domain,
+ ['|', ('name', 'ilike', searches['search']), ('website_description', 'ilike', searches['search'])]
+ ])
+
+ # search on countries
+ search_countries = self._get_search_countries(searches['countries'])
+ if search_countries:
+ search_domain = expression.AND([
+ search_domain,
+ [('partner_id.country_id', 'in', search_countries.ids)]
+ ])
+
+ # search on sponsor types
+ search_sponsorships = self._get_search_sponsorships(searches['sponsorships'])
+ if search_sponsorships:
+ search_domain = expression.AND([
+ search_domain,
+ [('sponsor_type_id', 'in', search_sponsorships.ids)]
+ ])
+
+ # fetch data to display; use sudo to allow reading partner info, be sure domain is correct
+ event = event.with_context(tz=event.date_tz or 'UTC')
+ sponsors = request.env['event.sponsor'].sudo().search(search_domain)
+ sponsors_all = request.env['event.sponsor'].sudo().search(search_domain_base)
+ sponsor_types = sponsors_all.mapped('sponsor_type_id')
+ sponsor_countries = sponsors_all.mapped('partner_id.country_id').sorted('name')
+ # organize sponsors into categories to help display
+ sponsor_categories = dict()
+ for sponsor in sponsors:
+ if not sponsor_categories.get(sponsor.sponsor_type_id):
+ sponsor_categories[sponsor.sponsor_type_id] = request.env['event.sponsor'].sudo()
+ sponsor_categories[sponsor.sponsor_type_id] |= sponsor
+ sponsor_categories = [
+ dict({
+ 'sponsorship': sponsor_category,
+ 'sponsors': sample(sponsors, len(sponsors)),
+ }) for sponsor_category, sponsors in sponsor_categories.items()]
+
+ # return rendering values
+ return {
+ # event information
+ 'event': event,
+ 'main_object': event,
+ 'sponsor_categories': sponsor_categories,
+ 'hide_sponsors': True,
+ # search information
+ 'searches': searches,
+ 'search_key': searches['search'],
+ 'search_countries': search_countries,
+ 'search_sponsorships': search_sponsorships,
+ 'sponsor_types': sponsor_types,
+ 'sponsor_countries': sponsor_countries,
+ # environment
+ 'hostname': request.httprequest.host.split(':')[0],
+ 'user_event_manager': request.env.user.has_group('event.group_event_manager'),
+ }
+
+ # ------------------------------------------------------------
+ # FRONTEND FORM
+ # ------------------------------------------------------------
+
+ @http.route(['''/event/<model("event.event", "[('exhibitor_menu', '=', True)]"):event>/exhibitor/<model("event.sponsor", "[('event_id', '=', event.id)]"):sponsor>'''],
+ type='http', auth="public", website=True, sitemap=True)
+ def event_exhibitor(self, event, sponsor, **options):
+ if not event.can_access_from_current_website():
+ raise NotFound()
+
+ try:
+ sponsor.check_access_rule('read')
+ except exceptions.AccessError:
+ raise Forbidden()
+ sponsor = sponsor.sudo()
+
+ if 'widescreen' not in options and sponsor.chat_room_id and sponsor.is_in_opening_hours:
+ options['widescreen'] = True
+
+ return request.render(
+ "website_event_track_exhibitor.event_exhibitor_main",
+ self._event_exhibitor_get_values(event, sponsor, **options)
+ )
+
+ def _event_exhibitor_get_values(self, event, sponsor, **options):
+ # search for exhibitor list
+ search_domain_base = self._get_event_sponsors_base_domain(event)
+ search_domain_base = expression.AND([
+ search_domain_base,
+ [('id', '!=', sponsor.id)]
+ ])
+ sponsors_other = request.env['event.sponsor'].sudo().search(search_domain_base)
+ current_country = sponsor.partner_id.country_id
+
+ sponsors_other = sponsors_other.sorted(key=lambda sponsor: (
+ sponsor.is_in_opening_hours,
+ sponsor.partner_id.country_id == current_country,
+ -1 * sponsor.sponsor_type_id.sequence,
+ randint(0, 20)
+ ), reverse=True)
+
+ option_widescreen = options.get('widescreen', False)
+ option_widescreen = bool(option_widescreen) if option_widescreen != '0' else False
+
+ return {
+ # event information
+ 'event': event,
+ 'main_object': sponsor,
+ 'sponsor': sponsor,
+ 'hide_sponsors': True,
+ # sidebar
+ 'sponsors_other': sponsors_other[:30],
+ # options
+ 'option_widescreen': option_widescreen,
+ 'option_can_edit': request.env.user.has_group('event.group_event_manager'),
+ # environment
+ 'hostname': request.httprequest.host.split(':')[0],
+ 'user_event_manager': request.env.user.has_group('event.group_event_manager'),
+ }
+
+ # ------------------------------------------------------------
+ # BUSINESS / MISC
+ # ------------------------------------------------------------
+
+ @http.route('/event_sponsor/<int:sponsor_id>/read', type='json', auth='public', website=True)
+ def event_sponsor_read(self, sponsor_id):
+ """ Marshmalling data for "event not started / sponsor not available" modal """
+ sponsor = request.env['event.sponsor'].browse(sponsor_id)
+ sponsor_data = sponsor.read([
+ 'name', 'subtitle',
+ 'url', 'email', 'phone',
+ 'website_description', 'website_image_url',
+ 'hour_from', 'hour_to', 'is_in_opening_hours',
+ 'event_date_tz', 'country_flag_url',
+ ])[0]
+ if sponsor.country_id:
+ sponsor_data['country_name'] = sponsor.country_id.name
+ sponsor_data['country_id'] = sponsor.country_id.id
+ else:
+ sponsor_data['country_name'] = False
+ sponsor_data['country_id'] = False
+ if sponsor.sponsor_type_id:
+ sponsor_data['sponsor_type_name'] = sponsor.sponsor_type_id.name
+ sponsor_data['sponsor_type_id'] = sponsor.sponsor_type_id.id
+ else:
+ sponsor_data['sponsor_type_name'] = False
+ sponsor_data['sponsor_type_id'] = False
+ sponsor_data['event_name'] = sponsor.event_id.name
+ sponsor_data['event_is_ongoing'] = sponsor.event_id.is_ongoing
+ sponsor_data['event_is_done'] = sponsor.event_id.is_done
+ sponsor_data['event_start_today'] = sponsor.event_id.start_today
+ sponsor_data['event_start_remaining'] = sponsor.event_id.start_remaining
+ sponsor_data['event_date_begin_located'] = sponsor.event_id.date_begin_located
+ sponsor_data['event_date_end_located'] = sponsor.event_id.date_end_located
+ sponsor_data['hour_from_str'] = format_duration(sponsor_data['hour_from'])
+ sponsor_data['hour_to_str'] = format_duration(sponsor_data['hour_to'])
+
+ return sponsor_data
+
+ # ------------------------------------------------------------
+ # TOOLS
+ # ------------------------------------------------------------
+
+ def _get_search_countries(self, country_search):
+ # TDE FIXME: make me generic (slides, event, ...)
+ try:
+ country_ids = literal_eval(country_search)
+ except Exception:
+ countries = request.env['res.country'].sudo()
+ else:
+ # perform a search to filter on existing / valid tags implicitly
+ countries = request.env['res.country'].sudo().search([('id', 'in', country_ids)])
+ return countries
+
+ def _get_search_sponsorships(self, sponsorship_search):
+ # TDE FIXME: make me generic (slides, event, ...)
+ try:
+ sponsorship_ids = literal_eval(sponsorship_search)
+ except Exception:
+ sponsorships = request.env['event.sponsor.type'].sudo()
+ else:
+ # perform a search to filter on existing / valid tags implicitly
+ sponsorships = request.env['event.sponsor.type'].sudo().search([('id', 'in', sponsorship_ids)])
+ return sponsorships
diff --git a/addons/website_event_track_exhibitor/controllers/website_event_main.py b/addons/website_event_track_exhibitor/controllers/website_event_main.py
new file mode 100644
index 00000000..ebb194cf
--- /dev/null
+++ b/addons/website_event_track_exhibitor/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_sponsor_id" in post and not event.is_ongoing:
+ sponsor = request.env["event.sponsor"].browse(int(post["from_sponsor_id"])).exists()
+ if sponsor:
+ 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 meet %s !')
+ % (event.name, date_begin, event.date_tz, sponsor.partner_name)
+ )
+
+ return values