[REF] website_event_exhibitor: improve upgrade of sponsors to (online) exhibitors and back2basics them
PURPOSE
Improve sponsor management, especially when dealing with publication at
sponsor level, exhibitor level, or exhibitor using chat (jitsi).
SPECIFICATIONS
Introduce a new category field containing sponsor, exhibitor or online
exhibitor. Meaning is
* sponsor: display as a sponsor (sponsor cards at the bottom of events).
No publish management is done at sponsor level: a sponsor is always
displayed in the sponsor widget;
* exhibitor: display as a sponsor in sponsor cards. An exhibitor is also
displayed in /exhibitors page and allow publish management. Also allow
to edit description as it is used in front-end page view of exhibitor;
* online exhibitor: same as exhibitor and allow to configure jitsi (online)
capabilities. It also activates display of jitsi in frontend;
An exhibitor would be a sponsor that has a physical stand but no online
support. Online exhibitors hold a jitsi room to chat with online visitors.
Also add field in kanban view.
In frontend rename "Connect" to "More info" when exhibitor has no online
capabilities. That way we don't connect with an exhibitor that has only
a published description.
SPECIFIATIONS: B2B
Clearly separate sponsorship levels (gold, silver) from exhibitor type
(sponsor, exhibitor, online). Propagate this new naming through views and
menus as well as frontend filters.
Reword sponsor form view, notably to have a clean 2 column display. Left
column holds customer related information. Right column holds event and
sponsorship information.
LINKS
Task ID-2326433
COM PR odoo/odoo#61781
ENT pr odoo/enterprise#14752
UPG PR odoo/upgrade#1931
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
'name': 'Event Exhibitors',
|
||||
'category': 'Marketing/Events',
|
||||
'sequence': 1004,
|
||||
'version': '1.0',
|
||||
'version': '1.1',
|
||||
'summary': 'Event: manage sponsors and exhibitors',
|
||||
'website': 'https://www.odoo.com/page/events',
|
||||
'description': "",
|
||||
|
||||
@@ -17,7 +17,7 @@ class ExhibitorController(WebsiteEventController):
|
||||
def _get_event_sponsors_base_domain(self, event):
|
||||
search_domain_base = [
|
||||
('event_id', '=', event.id),
|
||||
('is_exhibitor', '=', True),
|
||||
('exhibitor_type', 'in', ['exhibitor', 'online']),
|
||||
]
|
||||
if not request.env.user.has_group('event.group_event_user'):
|
||||
search_domain_base = expression.AND([search_domain_base, [('is_published', '=', True)]])
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
<field name="url">http://www.wood-corner.example.com</field>
|
||||
<field name="is_published" eval="True"/>
|
||||
<field name="subtitle">Catchy sentence !</field>
|
||||
<field name="is_exhibitor" eval="False"/>
|
||||
<field name="exhibitor_type">sponsor</field>
|
||||
</record>
|
||||
<record id="event_7_sponsor_1" model="event.sponsor">
|
||||
<field name="event_id" ref="event.event_7"/>
|
||||
@@ -40,7 +40,7 @@
|
||||
<field name="url">http://www.deco-addict.example.com</field>
|
||||
<field name="is_published" eval="True"/>
|
||||
<field name="subtitle">You won't believe this sponsor</field>
|
||||
<field name="is_exhibitor" eval="False"/>
|
||||
<field name="exhibitor_type">sponsor</field>
|
||||
</record>
|
||||
<record id="event_7_sponsor_2" model="event.sponsor">
|
||||
<field name="event_id" ref="event.event_7"/>
|
||||
@@ -49,7 +49,7 @@
|
||||
<field name="url">http://www.gemini-furniture.example.com</field>
|
||||
<field name="is_published" eval="True"/>
|
||||
<field name="subtitle">Honestly we are good</field>
|
||||
<field name="is_exhibitor" eval="True"/>
|
||||
<field name="exhibitor_type">exhibitor</field>
|
||||
<field name="room_name">gemini-furniture</field>
|
||||
<field name="room_max_capacity">12</field>
|
||||
</record>
|
||||
@@ -60,7 +60,7 @@
|
||||
<field name="url">http://www.ready-mat.example.com</field>
|
||||
<field name="is_published" eval="True"/>
|
||||
<field name="subtitle">Catchy sentence !</field>
|
||||
<field name="is_exhibitor" eval="True"/>
|
||||
<field name="exhibitor_type">exhibitor</field>
|
||||
<field name="room_name">ready-mat</field>
|
||||
<field name="room_max_capacity">12</field>
|
||||
</record>
|
||||
@@ -71,7 +71,7 @@
|
||||
<field name="url">http://www.the-jackson-group.example.com</field>
|
||||
<field name="is_published" eval="True"/>
|
||||
<field name="subtitle">You won't believe this sponsor</field>
|
||||
<field name="is_exhibitor" eval="True"/>
|
||||
<field name="exhibitor_type">online</field>
|
||||
<field name="room_name">the-jackson-group</field>
|
||||
<field name="room_max_capacity">12</field>
|
||||
</record>
|
||||
@@ -82,7 +82,7 @@
|
||||
<field name="url">http://www.azure-interior.example.com</field>
|
||||
<field name="is_published" eval="True"/>
|
||||
<field name="subtitle">Honestly we are good</field>
|
||||
<field name="is_exhibitor" eval="True"/>
|
||||
<field name="exhibitor_type">online</field>
|
||||
<field name="room_name">azure-interior</field>
|
||||
<field name="room_max_capacity">12</field>
|
||||
</record>
|
||||
@@ -92,7 +92,7 @@
|
||||
<field name="partner_id" ref="event.res_partner_event_1"/>
|
||||
<field name="is_published" eval="True"/>
|
||||
<field name="subtitle">You won't believe this sponsor</field>
|
||||
<field name="is_exhibitor" eval="True"/>
|
||||
<field name="exhibitor_type">online</field>
|
||||
<field name="room_name">bloem-flower</field>
|
||||
<field name="room_max_capacity">12</field>
|
||||
</record>
|
||||
@@ -102,7 +102,7 @@
|
||||
<field name="partner_id" ref="event.res_partner_event_2"/>
|
||||
<field name="is_published" eval="True"/>
|
||||
<field name="subtitle">Honestly we are good</field>
|
||||
<field name="is_exhibitor" eval="True"/>
|
||||
<field name="exhibitor_type">online</field>
|
||||
<field name="room_name">open-wood</field>
|
||||
<field name="room_max_capacity">12</field>
|
||||
</record>
|
||||
@@ -112,7 +112,7 @@
|
||||
<field name="partner_id" ref="event.res_partner_event_3"/>
|
||||
<field name="is_published" eval="True"/>
|
||||
<field name="subtitle">You won't believe this sponsor</field>
|
||||
<field name="is_exhibitor" eval="True"/>
|
||||
<field name="exhibitor_type">online</field>
|
||||
<field name="room_name">tree-dealers</field>
|
||||
<field name="room_max_capacity">12</field>
|
||||
</record>
|
||||
@@ -122,7 +122,7 @@
|
||||
<field name="partner_id" ref="event.res_partner_event_4"/>
|
||||
<field name="is_published" eval="True"/>
|
||||
<field name="subtitle">Honestly we are good</field>
|
||||
<field name="is_exhibitor" eval="True"/>
|
||||
<field name="exhibitor_type">online</field>
|
||||
<field name="room_name">pterocarpus</field>
|
||||
<field name="room_max_capacity">12</field>
|
||||
</record>
|
||||
|
||||
@@ -26,19 +26,21 @@ class Sponsor(models.Model):
|
||||
]
|
||||
|
||||
event_id = fields.Many2one('event.event', 'Event', required=True)
|
||||
sponsor_type_id = fields.Many2one('event.sponsor.type', 'Sponsoring Type', required=True)
|
||||
sponsor_type_id = fields.Many2one('event.sponsor.type', 'Sponsoring Level', required=True)
|
||||
url = fields.Char('Sponsor Website', compute='_compute_url', readonly=False, store=True)
|
||||
sequence = fields.Integer('Sequence')
|
||||
active = fields.Boolean(default=True)
|
||||
# description
|
||||
subtitle = fields.Char('Slogan', help='Catchy marketing sentence for promote')
|
||||
is_exhibitor = fields.Boolean("Exhibitor's Chat")
|
||||
exhibitor_type = fields.Selection(
|
||||
[('sponsor', 'Sponsor'), ('exhibitor', 'Exhibitor'), ('online', 'Online Exhibitor')],
|
||||
string="Sponsor Type", default="sponsor")
|
||||
website_description = fields.Html(
|
||||
'Description', compute='_compute_website_description',
|
||||
sanitize_attributes=False, sanitize_form=True, translate=html_translate,
|
||||
readonly=False, store=True)
|
||||
# contact information
|
||||
partner_id = fields.Many2one('res.partner', 'Sponsor/Customer', required=True)
|
||||
partner_id = fields.Many2one('res.partner', 'Partner', required=True)
|
||||
partner_name = fields.Char('Name', related='partner_id.name')
|
||||
partner_email = fields.Char('Email', related='partner_id.email')
|
||||
partner_phone = fields.Char('Phone', related='partner_id.phone')
|
||||
@@ -116,20 +118,19 @@ class Sponsor(models.Model):
|
||||
if not sponsor[fname]:
|
||||
sponsor[fname] = sponsor.partner_id[fname]
|
||||
|
||||
|
||||
@api.onchange('is_exhibitor')
|
||||
def _onchange_is_exhibitor(self):
|
||||
@api.onchange('exhibitor_type')
|
||||
def _onchange_exhibitor_type(self):
|
||||
""" Keep an explicit onchange to allow configuration of room names, even
|
||||
if this field is normally a related on chat_room_id.name. It is not a real
|
||||
computed field, an onchange used in form view is sufficient. """
|
||||
for sponsor in self:
|
||||
if sponsor.is_exhibitor and not sponsor.room_name:
|
||||
if sponsor.exhibitor_type == 'online' and not sponsor.room_name:
|
||||
if sponsor.name:
|
||||
room_name = "odoo-exhibitor-%s" % sponsor.name
|
||||
else:
|
||||
room_name = self.env['chat.room']._default_name(objname='exhibitor')
|
||||
sponsor.room_name = self._jitsi_sanitize_name(room_name)
|
||||
if sponsor.is_exhibitor and not sponsor.room_max_capacity:
|
||||
if sponsor.exhibitor_type == 'online' and not sponsor.room_max_capacity:
|
||||
sponsor.room_max_capacity = '8'
|
||||
|
||||
@api.depends('partner_id')
|
||||
|
||||
@@ -6,10 +6,10 @@ from odoo import fields, models
|
||||
|
||||
class SponsorType(models.Model):
|
||||
_name = "event.sponsor.type"
|
||||
_description = 'Event Sponsor Type'
|
||||
_description = 'Event Sponsor Level'
|
||||
_order = "sequence"
|
||||
|
||||
name = fields.Char('Sponsor Type', required=True, translate=True)
|
||||
name = fields.Char('Sponsor Level', required=True, translate=True)
|
||||
sequence = fields.Integer('Sequence')
|
||||
display_ribbon_style = fields.Selection([
|
||||
('no_ribbon', 'No Ribbon'),
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
<odoo noupdate="1">
|
||||
|
||||
<record id="event_sponsor_rule_share" model="ir.rule">
|
||||
<field name="name">Event Sponsor: public/portal published only</field>
|
||||
<field name="name">Event Sponsor: public/portal sponsor or published only</field>
|
||||
<field name="model_id" ref="website_event_exhibitor.model_event_sponsor"/>
|
||||
<field name="domain_force">[('website_published', '=', True)]</field>
|
||||
<field name="domain_force">['|', ('exhibitor_type', '=', 'sponsor'), ('website_published', '=', True)]</field>
|
||||
<field name="groups" eval="[(4, ref('base.group_public')), (4, ref('base.group_portal'))]"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="False"/>
|
||||
|
||||
@@ -89,12 +89,12 @@
|
||||
<li class="nav-item dropdown mr-2 my-1">
|
||||
<a href="#" role="button" class="btn dropdown-toggle" data-toggle="dropdown">
|
||||
<i class="fa fa-folder-open"/>
|
||||
By Sponsorship
|
||||
By Level
|
||||
</a>
|
||||
<div class="dropdown-menu">
|
||||
<a t-att-href="'/event/%s/exhibitors?%s' % (slug(event), keep_query('*', sponsorships=''))"
|
||||
t-attf-class="dropdown-item d-flex align-items-center justify-content-between #{'active' if not search_sponsorships else ''}">
|
||||
All Sponsorships
|
||||
All Levels
|
||||
</a>
|
||||
<t t-foreach="sponsor_types" t-as="sponsor_type">
|
||||
<a t-att-href="'/event/%s/exhibitors?%s' % (
|
||||
@@ -174,7 +174,8 @@
|
||||
<t t-if="not user_event_manager and not sponsor.event_id.is_ongoing and not event.is_participating">
|
||||
Register
|
||||
</t>
|
||||
<t t-else="">Connect</t>
|
||||
<t t-elif="sponsor.exhibitor_type == 'online'">Connect</t>
|
||||
<t t-else="">More info</t>
|
||||
</a>
|
||||
</div>
|
||||
<img class="position-absolute mr-2 mt-2"
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
</div>
|
||||
</t>
|
||||
<!-- SPONSOR JITSI + CLOSED/FULL ALERTS -->
|
||||
<div t-if="sponsor.event_id.is_ongoing and sponsor.chat_room_id" class="d-flex flex-column">
|
||||
<div t-if="sponsor.exhibitor_type == 'online' and sponsor.event_id.is_ongoing and sponsor.chat_room_id" class="d-flex flex-column">
|
||||
<t t-if="not sponsor.is_in_opening_hours">
|
||||
<div class="col-12 alert alert-warning rounded-0 text-center" role="alert">
|
||||
<span>Oops! This room is currently closed</span><br />
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<odoo><data>
|
||||
|
||||
<menuitem id="menu_event_sponsor_type"
|
||||
name="Sponsor Types"
|
||||
name="Sponsor Levels"
|
||||
action="event_sponsor_type_action"
|
||||
parent="event.menu_event_configuration"
|
||||
groups="base.group_no_one"
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<?xml version="1.0"?>
|
||||
<odoo>
|
||||
<data>
|
||||
<!-- EVENTS/CONFIGURATION/EVENT Sponsor Types -->
|
||||
<!-- EVENTS/CONFIGURATION/EVENT Sponsor Levels -->
|
||||
<record id="event_sponsor_type_view_form" model="ir.ui.view">
|
||||
<field name="name">Sponsor Types</field>
|
||||
<field name="name">Sponsor Levels</field>
|
||||
<field name="model">event.sponsor.type</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Event Sponsor Types">
|
||||
<form string="Event Sponsor Levels">
|
||||
<sheet>
|
||||
<group>
|
||||
<field name="name"/>
|
||||
@@ -19,10 +19,10 @@
|
||||
</record>
|
||||
|
||||
<record id="event_sponsor_type_view_tree" model="ir.ui.view">
|
||||
<field name="name">Sponsor Types</field>
|
||||
<field name="name">Sponsor Levels</field>
|
||||
<field name="model">event.sponsor.type</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree editable="bottom" string="Event Sponsor Type">
|
||||
<tree editable="bottom" string="Event Sponsor Level">
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="name"/>
|
||||
<field name="display_ribbon_style"/>
|
||||
@@ -31,7 +31,7 @@
|
||||
</record>
|
||||
|
||||
<record id="event_sponsor_type_action" model="ir.actions.act_window">
|
||||
<field name="name">Sponsor Types</field>
|
||||
<field name="name">Sponsor Levels</field>
|
||||
<field name="res_model">event.sponsor.type</field>
|
||||
</record>
|
||||
|
||||
@@ -47,10 +47,11 @@
|
||||
<field name="phone"/>
|
||||
<filter string="Archived" name="archived" domain="[('active', '=', False)]"/>
|
||||
<separator/>
|
||||
<filter string="Exhibitor" name="filter_is_exhibitor" domain="[('is_exhibitor', '=', True)]"/>
|
||||
<filter string="Exhibitors" name="filter_is_exhibitor" domain="[('exhibitor_type', 'in', ['exhibitor', 'online'])]"/>
|
||||
<filter string="Online" name="filter_is_exhibitor" domain="[('exhibitor_type', '=', 'online')]"/>
|
||||
<group string="Group By" expand="0">
|
||||
<filter string="Event" name="group_by_event_id" domain="[]" context="{'group_by': 'event_id'}"/>
|
||||
<filter string="Sponsorship" name="group_by_sponsor_type_id" domain="[]" context="{'group_by': 'sponsor_type_id'}"/>
|
||||
<filter string="Level" name="group_by_sponsor_type_id" domain="[]" context="{'group_by': 'sponsor_type_id'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
@@ -64,7 +65,8 @@
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<field name="website_url" invisible="1"/>
|
||||
<field name="is_published" widget="website_redirect_button"/>
|
||||
<field name="is_published" widget="website_redirect_button"
|
||||
attrs="{'invisible': [('exhibitor_type', '=', 'sponsor')]}"/>
|
||||
</div>
|
||||
<widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
|
||||
<field name="active" invisible="1"/>
|
||||
@@ -79,18 +81,18 @@
|
||||
</div>
|
||||
<group>
|
||||
<group>
|
||||
<field name="event_id"/>
|
||||
<field name="partner_id" string="Partner"/>
|
||||
<field name="email" widget="email" string="Email"
|
||||
placeholder="e.g. : open.wood.decoration@example.com"/>
|
||||
<field name="url" widget="url" string="Website"
|
||||
placeholder=">e.g. : https://www.odoo.com"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="sponsor_type_id"/>
|
||||
<field name="is_exhibitor"/>
|
||||
<field name="phone" widget="phone" string="Phone" options="{'enable_sms': True}"/>
|
||||
<field name="mobile" widget="phone" string="Mobile" options="{'enable_sms': True}"/>
|
||||
<field name="url" widget="url" string="Website"
|
||||
placeholder="e.g. : https://www.odoo.com"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="event_id"/>
|
||||
<field name="sponsor_type_id"/>
|
||||
<field name="exhibitor_type" required="1"/>
|
||||
<label for="hour_from" string="Opening Hours"/>
|
||||
<div class="o_row">
|
||||
<field name="hour_from" widget="float_time" nolabel="1" class="oe_inline"/>
|
||||
@@ -101,17 +103,19 @@
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Description">
|
||||
<page string="Description"
|
||||
attrs="{'invisible': [('exhibitor_type', '=', 'sponsor')]}">
|
||||
<group>
|
||||
<field name="website_description" nolabel="1"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Exhibitor" attrs="{'invisible': [('is_exhibitor', '=', False)]}">
|
||||
<page string="Online"
|
||||
attrs="{'invisible': [('exhibitor_type', '!=', 'online')]}">
|
||||
<group>
|
||||
<group>
|
||||
<field name="room_name" attrs="{'required': [('is_exhibitor', '=', True)]}" string="Jitsi Name"/>
|
||||
<field name="room_name" attrs="{'required': [('exhibitor_type', '=', 'online')]}" string="Jitsi Name"/>
|
||||
<field name="room_lang_id"/>
|
||||
<field name="room_max_capacity" attrs="{'required': [('is_exhibitor', '=', True)]}"/>
|
||||
<field name="room_max_capacity" attrs="{'required': [('exhibitor_type', '=', 'online')]}"/>
|
||||
<field name="chat_room_id" groups="base.group_no_one"/>
|
||||
</group>
|
||||
</group>
|
||||
@@ -131,7 +135,7 @@
|
||||
<field name="name">event.sponsor.view.tree</field>
|
||||
<field name="model">event.sponsor</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree multi_edit="1">
|
||||
<tree multi_edit="1" sample="1">
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="partner_id" readonly="1"/>
|
||||
<field name="name"/>
|
||||
@@ -141,7 +145,7 @@
|
||||
<field name="url" string="Website"/>
|
||||
<field name="sponsor_type_id"/>
|
||||
<field name="is_published" optional="show"/>
|
||||
<field name="is_exhibitor"/>
|
||||
<field name="exhibitor_type"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
@@ -150,7 +154,7 @@
|
||||
<field name="name">event.sponsor.view.kanban</field>
|
||||
<field name="model">event.sponsor</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban>
|
||||
<kanban sample="1">
|
||||
<field name="id"/>
|
||||
<field name="url"/>
|
||||
<field name="partner_email"/>
|
||||
@@ -160,9 +164,10 @@
|
||||
<div class="oe_kanban_global_click overflow-hidden">
|
||||
<div class="row my-auto">
|
||||
<img t-att-src="kanban_image('event.sponsor', 'image_128', record.id.raw_value)" alt="Sponsor image" class="col-4"/>
|
||||
<div class="col-8">
|
||||
<div class="col-8 d-flex flex-column">
|
||||
<h1 class="o_kanban_record_title"><field name="name"/></h1>
|
||||
<div>Level: <field name="sponsor_type_id"/></div>
|
||||
<strong>Level: <field name="sponsor_type_id"/></strong>
|
||||
<span class="text-muted"><field name="exhibitor_type"/></span>
|
||||
<span class="o_text_overflow" t-esc="record.partner_email.value"/>
|
||||
<span class="o_text_overflow" t-esc="record.url.value"/>
|
||||
</div>
|
||||
@@ -182,8 +187,8 @@
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
Create a Sponsor / Exhibitor
|
||||
</p><p>
|
||||
Sponsors might be advertised on your event pages footer.<br />
|
||||
Exhibitors might have a dedicated page with chat room for people to connect with them.
|
||||
Sponsors are advertised on your event pages.<br />
|
||||
Exhibitors have a dedicated page a with chat room for people to connect with them.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
@@ -197,8 +202,8 @@
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
Create a Sponsor / Exhibitor
|
||||
</p><p>
|
||||
Sponsors might be advertised on your event pages footer.<br />
|
||||
Exhibitors might have a dedicated page with chat room for people to connect with them.
|
||||
Sponsors are advertised on your event pages.<br />
|
||||
Exhibitors have a dedicated page a with chat room for people to connect with them.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
Reference in New Issue
Block a user