diff --git a/addons/website_event_booth_exhibitor/__init__.py b/addons/website_event_booth_exhibitor/__init__.py
new file mode 100644
index 00000000000..7d34c7c054a
--- /dev/null
+++ b/addons/website_event_booth_exhibitor/__init__.py
@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import controllers
+from . import models
diff --git a/addons/website_event_booth_exhibitor/__manifest__.py b/addons/website_event_booth_exhibitor/__manifest__.py
new file mode 100644
index 00000000000..52ce1a08f43
--- /dev/null
+++ b/addons/website_event_booth_exhibitor/__manifest__.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+
+{
+ 'name': 'Booths/Exhibitors Bridge',
+ 'category': 'Marketing/Events',
+ 'version': '1.0',
+ 'summary': 'Event Booths, automatically create a sponsor.',
+ 'description': """
+Automatically create a sponsor when renting a booth.
+ """,
+ 'depends': ['website_event_exhibitor', 'website_event_booth'],
+ 'data': [
+ 'data/event_booth_category_data.xml',
+
+ 'views/event_booth_category_views.xml',
+ 'views/event_booth_views.xml',
+
+ 'views/event_booth_registration_templates.xml',
+ 'views/event_booth_templates.xml',
+ 'views/mail_templates.xml'
+ ],
+ 'auto_install': True,
+ 'assets': {
+ 'web.assets_frontend': [
+ '/website_event_booth_exhibitor/static/src/js/booth_sponsor_details.js',
+ ],
+ 'web.assets_tests': [
+ 'website_event_booth_exhibitor/static/tests/tours/website_event_booth_exhibitor.js',
+ ],
+ },
+ 'license': 'LGPL-3',
+}
diff --git a/addons/website_event_booth_exhibitor/controllers/__init__.py b/addons/website_event_booth_exhibitor/controllers/__init__.py
new file mode 100644
index 00000000000..1e9f6c7c1c1
--- /dev/null
+++ b/addons/website_event_booth_exhibitor/controllers/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import event_booth
diff --git a/addons/website_event_booth_exhibitor/controllers/event_booth.py b/addons/website_event_booth_exhibitor/controllers/event_booth.py
new file mode 100644
index 00000000000..e43b53aa8b2
--- /dev/null
+++ b/addons/website_event_booth_exhibitor/controllers/event_booth.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+import base64
+
+from odoo.addons.website_event.controllers.main import WebsiteEventController
+from odoo.tools import plaintext2html
+
+
+class WebsiteEventBoothController(WebsiteEventController):
+
+ def _prepare_booth_registration_values(self, event, kwargs):
+ booth_values = super(WebsiteEventBoothController, self)._prepare_booth_registration_values(event, kwargs)
+ if not booth_values.get('contact_email'):
+ booth_values['contact_email'] = kwargs.get('sponsor_email')
+ if not booth_values.get('contact_name'):
+ booth_values['contact_name'] = kwargs.get('sponsor_name')
+ if not booth_values.get('contact_mobile'):
+ booth_values['contact_mobile'] = kwargs.get('sponsor_mobile')
+ if not booth_values.get('contact_phone'):
+ booth_values['contact_phone'] = kwargs.get('sponsor_phone')
+
+ booth_values.update(**self._prepare_booth_registration_sponsor_values(event, booth_values, kwargs))
+ return booth_values
+
+ def _prepare_booth_registration_partner_values(self, event, kwargs):
+ if not kwargs.get('contact_email') and kwargs.get('sponsor_email'):
+ kwargs['contact_email'] = kwargs['sponsor_email']
+ return super(WebsiteEventBoothController, self)._prepare_booth_registration_partner_values(event, kwargs)
+
+ def _prepare_booth_registration_sponsor_values(self, event, booth_values, kwargs):
+ sponsor_values = {
+ 'sponsor_name': kwargs.get('sponsor_name') or booth_values.get('contact_name'),
+ 'sponsor_email': kwargs.get('sponsor_email') or booth_values.get('contact_email'),
+ 'sponsor_mobile': kwargs.get('sponsor_mobile') or booth_values.get('contact_mobile'),
+ 'sponsor_phone': kwargs.get('sponsor_phone') or booth_values.get('contact_phone'),
+ 'sponsor_subtitle': kwargs.get('sponsor_slogan'),
+ 'sponsor_website_description': plaintext2html(kwargs.get('sponsor_description')) if kwargs.get('sponsor_description') else '',
+ 'sponsor_image_512': base64.b64encode(kwargs['sponsor_image'].read()) if kwargs.get('sponsor_image') else False,
+ }
+ return sponsor_values
diff --git a/addons/website_event_booth_exhibitor/data/event_booth_category_data.xml b/addons/website_event_booth_exhibitor/data/event_booth_category_data.xml
new file mode 100644
index 00000000000..01deefe94d7
--- /dev/null
+++ b/addons/website_event_booth_exhibitor/data/event_booth_category_data.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ exhibitor
+
+
+
+
+
+ online
+
+
+
diff --git a/addons/website_event_booth_exhibitor/models/__init__.py b/addons/website_event_booth_exhibitor/models/__init__.py
new file mode 100644
index 00000000000..81b1903ec93
--- /dev/null
+++ b/addons/website_event_booth_exhibitor/models/__init__.py
@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import event_booth
+from . import event_booth_category
diff --git a/addons/website_event_booth_exhibitor/models/event_booth.py b/addons/website_event_booth_exhibitor/models/event_booth.py
new file mode 100644
index 00000000000..8e9d7f99381
--- /dev/null
+++ b/addons/website_event_booth_exhibitor/models/event_booth.py
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import fields, models
+
+
+class EventBooth(models.Model):
+ _inherit = 'event.booth'
+
+ use_sponsor = fields.Boolean(related='booth_category_id.use_sponsor')
+ sponsor_type_id = fields.Many2one(related='booth_category_id.sponsor_type_id')
+ sponsor_id = fields.Many2one('event.sponsor', string='Sponsor', copy=False)
+ sponsor_name = fields.Char(string='Sponsor Name', related='sponsor_id.name')
+ sponsor_email = fields.Char(string='Sponsor Email', related='sponsor_id.email')
+ sponsor_mobile = fields.Char(string='Sponsor Mobile', related='sponsor_id.mobile')
+ sponsor_phone = fields.Char(string='Sponsor Phone', related='sponsor_id.phone')
+ sponsor_subtitle = fields.Char(string='Sponsor Slogan', related='sponsor_id.subtitle')
+ sponsor_website_description = fields.Html(string='Sponsor Description', related='sponsor_id.website_description')
+ sponsor_image_512 = fields.Image(string='Sponsor Logo', related='sponsor_id.image_512')
+
+ def action_view_sponsor(self):
+ action = self.env['ir.actions.act_window']._for_xml_id('website_event_exhibitor.event_sponsor_action')
+ action['views'] = [(False, 'form')]
+ action['res_id'] = self.sponsor_id.id
+ return action
+
+ def _get_or_create_sponsor(self, vals):
+ self.ensure_one()
+ sponsor_id = self.env['event.sponsor'].sudo().search([
+ ('partner_id', '=', self.partner_id.id),
+ ('sponsor_type_id', '=', self.sponsor_type_id.id),
+ ('exhibitor_type', '=', self.booth_category_id.exhibitor_type),
+ ('event_id', '=', self.event_id.id),
+ ], limit=1)
+ if not sponsor_id:
+ values = {
+ 'event_id': self.event_id.id,
+ 'sponsor_type_id': self.sponsor_type_id.id,
+ 'exhibitor_type': self.booth_category_id.exhibitor_type,
+ 'partner_id': self.partner_id.id,
+ **{key.partition('sponsor_')[2]: value for key, value in vals.items() if key.startswith('sponsor_')},
+ }
+ if self.booth_category_id.exhibitor_type == 'online':
+ values.update({
+ 'room_name': 'odoo-exhibitor-%s' % self.partner_id.name,
+ })
+ sponsor_id = self.env['event.sponsor'].sudo().create(values)
+ return sponsor_id.id
+
+ def _action_post_confirm(self, write_vals):
+ for booth in self:
+ if booth.use_sponsor and booth.partner_id:
+ booth.sponsor_id = booth._get_or_create_sponsor(write_vals)
+ super(EventBooth, self)._action_post_confirm(write_vals)
diff --git a/addons/website_event_booth_exhibitor/models/event_booth_category.py b/addons/website_event_booth_exhibitor/models/event_booth_category.py
new file mode 100644
index 00000000000..e7e818f4d27
--- /dev/null
+++ b/addons/website_event_booth_exhibitor/models/event_booth_category.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, fields, models
+
+
+class EventBoothCategory(models.Model):
+ _inherit = 'event.booth.category'
+
+ @api.model
+ def _get_exhibitor_type(self):
+ return self.env['event.sponsor']._fields['exhibitor_type'].selection
+
+ use_sponsor = fields.Boolean(string='Create Sponsor', help="If set, when booking a booth a sponsor will be created for the user")
+ sponsor_type_id = fields.Many2one('event.sponsor.type', string='Sponsor Level')
+ exhibitor_type = fields.Selection(_get_exhibitor_type, string='Sponsor Type')
+
+ @api.onchange('use_sponsor')
+ def _onchange_use_sponsor(self):
+ if self.use_sponsor:
+ if not self.sponsor_type_id:
+ self.sponsor_type_id = self.env['event.sponsor.type'].search([], order="sequence desc", limit=1).id
+ if not self.exhibitor_type:
+ self.exhibitor_type = self._get_exhibitor_type()[0][0]
diff --git a/addons/website_event_booth_exhibitor/static/src/js/booth_sponsor_details.js b/addons/website_event_booth_exhibitor/static/src/js/booth_sponsor_details.js
new file mode 100644
index 00000000000..df5d359a68f
--- /dev/null
+++ b/addons/website_event_booth_exhibitor/static/src/js/booth_sponsor_details.js
@@ -0,0 +1,29 @@
+odoo.define('website_event_booth_exhibitor.booth_sponsor_details', function (require) {
+'use strict';
+
+var publicWidget = require('web.public.widget');
+
+publicWidget.registry.boothSponsorDetails = publicWidget.Widget.extend({
+ selector: '#o_wbooth_contact_details_form',
+ events: {
+ 'click input[id="contact_details"]': '_onClickContactDetails',
+ },
+
+ //--------------------------------------------------------------------------
+ // Handler
+ //--------------------------------------------------------------------------
+
+ _onClickContactDetails(ev) {
+ this.useContactDetails = ev.currentTarget.checked;
+ this.$('#o_wbooth_contact_details').toggleClass('d-none', !this.useContactDetails);
+ this.$('label[for="sponsor_name"] > .mandatory_mark, label[for="sponsor_email"] > .mandatory_mark').toggleClass('d-none', this.useContactDetails);
+ this.$('input[name="contact_name"], input[name="contact_email"]').attr('required', this.useContactDetails);
+ },
+
+});
+
+ return {
+ boothSponsorDetails: publicWidget.registry.boothSponsorDetails,
+ };
+
+});
diff --git a/addons/website_event_booth_exhibitor/static/tests/tours/website_event_booth_exhibitor.js b/addons/website_event_booth_exhibitor/static/tests/tours/website_event_booth_exhibitor.js
new file mode 100644
index 00000000000..4b46b399976
--- /dev/null
+++ b/addons/website_event_booth_exhibitor/static/tests/tours/website_event_booth_exhibitor.js
@@ -0,0 +1,62 @@
+odoo.define("website_event_booth_exhibitor.tour_steps", function (require) {
+ "use strict";
+
+ var core = require('web.core');
+
+ var FinalSteps = core.Class.extend({
+
+ _getSteps: function () {
+ return [{
+ trigger: 'h3:contains("Booth Registration completed!")',
+ run: function() {},
+ }];
+ },
+
+ });
+
+ return FinalSteps;
+
+});
+odoo.define("website_event_booth_exhibitor.tour", function (require) {
+ "use strict";
+
+ var tour = require("web_tour.tour");
+ var FinalSteps = require('website_event_booth_exhibitor.tour_steps');
+
+
+ tour.register("webooth_exhibitor_register", {
+ test: true,
+ url: "/event",
+ }, [{
+ content: 'Go on "Online Reveal" page',
+ trigger: 'a[href*="/event"]:contains("Online Reveal"):first',
+ }, {
+ content: 'Browse Booths',
+ trigger: 'a:contains("Get A Booth")',
+ }, {
+ content: 'Choose Premium Booths',
+ trigger: 'img[title="Premium Booth"]',
+ }, {
+ content: 'Choose Booth',
+ trigger: 'div:contains("OpenWood Demonstrator 2") input',
+ }, {
+ content: "Validate attendees details",
+ trigger: 'button:contains("Book my Booths")',
+ run: 'click',
+ }, {
+ content: "Fill booth details",
+ trigger: 'form[id="o_wbooth_contact_details_form"]',
+ run: function () {
+ $("input[name='sponsor_name']").val("Patrick Sponsor");
+ $("input[name='sponsor_email']").val("patrick.sponssor@test.example.com");
+ $("input[name='sponsor_phone']").val("+32456001122");
+ $("input[name='sponsor_slogan']").val("Patrick is Your Sponsor");
+ $("textarea[name='sponsor_description']").text("Really eager to meet you !");
+ },
+ }, {
+ content: "Validate booth details",
+ extra_trigger: "input[name='sponsor_name'], input[name='sponsor_email'], input[name='sponsor_phone']",
+ trigger: 'button:contains("Book my Booths")',
+ run: 'click',
+ }, ...new FinalSteps()._getSteps()].filter(Boolean));
+});
diff --git a/addons/website_event_booth_exhibitor/tests/__init__.py b/addons/website_event_booth_exhibitor/tests/__init__.py
new file mode 100644
index 00000000000..7358a417c50
--- /dev/null
+++ b/addons/website_event_booth_exhibitor/tests/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import test_wevent_booth_exhibitor
diff --git a/addons/website_event_booth_exhibitor/tests/test_wevent_booth_exhibitor.py b/addons/website_event_booth_exhibitor/tests/test_wevent_booth_exhibitor.py
new file mode 100644
index 00000000000..49729e762be
--- /dev/null
+++ b/addons/website_event_booth_exhibitor/tests/test_wevent_booth_exhibitor.py
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo.addons.base.tests.common import HttpCaseWithUserDemo, HttpCaseWithUserPortal
+from odoo.tests import tagged
+
+
+@tagged('post_install', '-at_install')
+class TestWEventBoothExhibitorCommon(HttpCaseWithUserDemo, HttpCaseWithUserPortal):
+
+ def test_register(self):
+ self.browser_js(
+ '/event',
+ 'odoo.__DEBUG__.services["web_tour.tour"].run("webooth_exhibitor_register")',
+ 'odoo.__DEBUG__.services["web_tour.tour"].tours.webooth_exhibitor_register.ready',
+ login='admin'
+ )
diff --git a/addons/website_event_booth_exhibitor/views/event_booth_category_views.xml b/addons/website_event_booth_exhibitor/views/event_booth_category_views.xml
new file mode 100644
index 00000000000..e33cda8a57f
--- /dev/null
+++ b/addons/website_event_booth_exhibitor/views/event_booth_category_views.xml
@@ -0,0 +1,51 @@
+
+
+
+
+ event.booth.category.view.form.inherit.website.event.booth.exhibitor
+ event.booth.category
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ event.booth.category.view.tree.inherit.website.event.booth.exhibitor
+ event.booth.category
+
+ 5
+
+
+
+
+
+
+
+
+
+
+ event.booth.category.view.search.inherit.website.event.booth.exhibitor
+ event.booth.category
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/website_event_booth_exhibitor/views/event_booth_registration_templates.xml b/addons/website_event_booth_exhibitor/views/event_booth_registration_templates.xml
new file mode 100644
index 00000000000..a39eafe0b00
--- /dev/null
+++ b/addons/website_event_booth_exhibitor/views/event_booth_registration_templates.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+ 'd-none' if booth_category.use_sponsor else ''
+
+
+ False if booth_category.use_sponsor else True
+
+
+ False if booth_category.use_sponsor else True
+
+
+
+
diff --git a/addons/website_event_booth_exhibitor/views/event_booth_templates.xml b/addons/website_event_booth_exhibitor/views/event_booth_templates.xml
new file mode 100644
index 00000000000..000703198fb
--- /dev/null
+++ b/addons/website_event_booth_exhibitor/views/event_booth_templates.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+ 'true' if booth_category.use_sponsor else 'false'
+
+
+
+
diff --git a/addons/website_event_booth_exhibitor/views/event_booth_views.xml b/addons/website_event_booth_exhibitor/views/event_booth_views.xml
new file mode 100644
index 00000000000..61fb201f174
--- /dev/null
+++ b/addons/website_event_booth_exhibitor/views/event_booth_views.xml
@@ -0,0 +1,30 @@
+
+
+
+
+ event.booth.view.form.inherit.website.event.booth.exhibitor
+ event.booth
+
+ 5
+
+
+
+
+
+
+
+
+
+ event.booth.view.search.inherit.website.event.booth.exhibitor
+ event.booth
+
+
+
+
+
+
+
+
+
diff --git a/addons/website_event_booth_exhibitor/views/mail_templates.xml b/addons/website_event_booth_exhibitor/views/mail_templates.xml
new file mode 100644
index 00000000000..22aa160b3a2
--- /dev/null
+++ b/addons/website_event_booth_exhibitor/views/mail_templates.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+