[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:
Thibault Delavallée
2020-12-04 07:49:30 +00:00
parent cf98a525b7
commit 433304ae15
10 changed files with 65 additions and 58 deletions
@@ -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>