[MERGE] website_event(_track/_exhibitor): allow to have sponsors and exhibitors without tracks

RATIONALE

Events often have sponsors displayed on their front page. This should be
a real standalone feature of Online Event application. However currently it
cannot be used without tracks managements

PURPOSE

Purpose of this task is to allow to use and display sponsors on an Event front
page without using tracks. Moreover online and chat capabilities should be
part of a sponsor feature, located within website_event_exhibitor module.

SPECIFICATIONS

Move everything related to event.sponsor model from website_event_track
to website_event_exhibitor. Functionally feature should be the same as
before except that we should be able to configure and display sponsors
directly with website_event_exhibitor application without using tracks.

Website_event_exhibitor should also define the sponsor template used to
display sponsors below an event.

Merge website_event_track_exhibitor into website_event_exhibitor and remove
dependency on website_event_track. That way all features related to sponsors
are now located within website_event_exhibitor

SPECIFICATIONS: CSS

Purpose of this commit is simply to try to reorganize css currently split across
two files without any real clear difference between those files. We now
have 3 files: a common for all event-related webpages, a file for event list
view (displaying events in frontend) and event page view (display a specific
event details in frontend).

Sponsor specific CSS is moved into website_event_exhibitor so that it contains
its own specific CSS

SPECIFICATIONS: SPONSOR MANAGEMENT

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.

SPECIFICATIONS: FIXES

Apply various fixes

  * fix unpublished badge on exhibitor cards;
  * fix display of sponsor content when image overflows;
  * improve display sidebar flag / description columns in page view;
  * show opening hours in exhibitor frontend page;

LINKS

Task ID-2326433
COM PR odoo/odoo#61781
ENT PR odoo/enterprise#14752
UPG PR odoo/upgrade#1931

Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
This commit is contained in:
Odoo's Mergebot
2020-12-04 17:01:23 +01:00
committed by GitHub
64 changed files with 863 additions and 881 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
{
'name': 'Events Organization',
'version': '1.3',
'version': '1.4',
'website': 'https://www.odoo.com/page/events',
'category': 'Marketing/Events',
'summary': 'Trainings, Conferences, Meetings, Exhibitions, Registrations',
+3 -2
View File
@@ -1,7 +1,9 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
@@ -10,7 +12,7 @@ class ResConfigSettings(models.TransientModel):
module_website_event_track = fields.Boolean("Tracks and Agenda")
module_website_event_track_live = fields.Boolean("Live Mode")
module_website_event_track_quiz = fields.Boolean("Quiz on Tracks")
module_website_event_track_exhibitor = fields.Boolean("Advanced Sponsors")
module_website_event_exhibitor = fields.Boolean("Advanced Sponsors")
module_website_event_questions = fields.Boolean("Registration Survey")
module_event_barcode = fields.Boolean("Barcode")
module_website_event_sale = fields.Boolean("Online Ticketing")
@@ -24,4 +26,3 @@ class ResConfigSettings(models.TransientModel):
if not config.module_website_event_track:
config.module_website_event_track_live = False
config.module_website_event_track_quiz = False
config.module_website_event_track_exhibitor = False
@@ -52,12 +52,12 @@
</div>
<div class="mt-3">
<div class="o_setting_left_pane">
<field name="module_website_event_track_exhibitor"/>
<field name="module_website_event_exhibitor"/>
</div>
<div class="o_setting_right_pane">
<label string="Online Exhibitors" for="module_website_event_track_exhibitor"/>
<label string="Online Exhibitors" for="module_website_event_exhibitor"/>
<div class="text-muted">
Upgrade Sponsors into Exhibitors with virtual conference booths
Display Sponsors and Exhibitors on your event pages
</div>
</div>
</div>
+2 -1
View File
@@ -15,12 +15,13 @@ automatic lead generation, full Online support, ...
'event_crm',
'event_sale',
'website_event_crm_questions',
'website_event_exhibitor',
'website_event_questions',
'website_event_questions',
'website_event_meet',
'website_event_sale',
'website_event_track',
'website_event_track_exhibitor',
'website_event_exhibitor',
'website_event_track_live',
'website_event_track_quiz',
],
@@ -1,5 +1,3 @@
// Color tags according to assigned background color.
.o_wevent_index, .o_wevent_event {
// Simple colored tags according to assigned background color
@@ -49,6 +47,40 @@
}
}
/*
* COMMON MENU STYLING
*/
.o_wevent_index_topbar_filters {
.dropdown-toggle {
border: $border-width solid gray('400');
@include o-bg-color(gray('white'), $with-extras: false);
@include border-radius($dropdown-border-radius);
@include hover-focus {
border-color: theme-color('primary');
color: theme-color('primary');
text-decoration: none;
}
&:after {
margin-left: 1.2em;
}
.fa {
margin-right: .4em;
color: theme-color('primary');
}
}
.dropdown-menu {
margin-top: $navbar-padding-y;
min-width: 12rem;
}
.dropdown-item {
&.active .badge { // Invert badge display when the item is active
background-color: color-yiq(theme-color('primary'));
color: theme-color('primary');
}
}
}
/*
* COMMON TO ALL ONLINE-* PAGES
*/
@@ -159,3 +191,15 @@
}
}
}
.o_wevent_badge {
padding: ($spacer * .5) $spacer;
border-radius: 10rem;
font-weight: $font-weight-normal;
}
.modal-open {
> .modal-backdrop {
z-index: $zindex-dropdown - 1;
}
}
@@ -0,0 +1,112 @@
.o_wevent_social_link {
$o_link_size: 3em;
display: inline-block;
@include size($o_link_size);
margin: 0 ($spacer * .25) ($spacer * .5) ($spacer * .25);
line-height: $o_link_size;
background-color: gray('100');
border: $border-width solid $border-color;
border-radius: 50%;
text-align: center;
@include hover-focus {
background-color: gray('300');
}
}
// Index
.o_wevent_index {
// Events List
.o_wevent_events_list {
header {
a {
transition: all .25s ease-in-out;
@include hover-focus {
transform: scale(1.05);
}
}
}
&.opt_event_list_cards_bg {
@if (color('body') == $o-portal-default-body-bg) {
@extend .bg-200;
}
}
.opt_events_list_columns {
header {
height: 200px;
}
}
.opt_events_list_rows {
@include media-breakpoint-down(sm) {
header {
height: 200px;
}
}
}
.o_wevent_badge_event {
@include o-position-absolute($top: 0, $left: 0);
@include border-left-radius(0);
padding: ($spacer * .5) $card-spacer-x;
transform: translateY(-50%);
}
.o_wevent_event_date {
top: $card-spacer-x;
right: $card-spacer-x;
display: flex;
flex-direction: column;
justify-content: center;
@include size(4rem);
border-radius: 50%;
text-align: center;
.o_wevent_event_day {
font-size: 1.125rem;
font-weight: 300;
line-height: 1;
}
.o_wevent_event_month {
font-size: 0.75rem;
font-weight: $font-weight-bold;
text-transform: uppercase;
}
}
.o_wevent_participating,
.o_wevent_unpublished {
position: absolute;
bottom: 0;
width: 100%;
padding: $card-spacer-y $card-spacer-x;
text-align: right;
}
.card-title {
color: $body-color;
}
}
.o_wevent_sidebar_title {
margin: 0 0 ($spacer * 1.5) 0;
border-bottom: $border-width solid $border-color;
padding: 0 0 ($spacer * .5) 0;
font-weight: $font-weight-bold;
text-transform: uppercase;
}
.o_wevent_sidebar_block {
margin: 0 0 ($spacer * 2.5) 0;
}
.o_wevent_sidebar_figure {
position: relative;
.figure-img {
margin-bottom: 0;
}
.figure-caption {
@include o-position-absolute($left: 0, $bottom: 0);
width: 100%;
padding: $spacer;
background-color: rgba($color: #000, $alpha: 0.5);
@include border-bottom-radius($border-radius);
color: #fff;
}
}
#o_wevent_index_main_col .form-inline {
width: 100%;
}
}
@@ -0,0 +1,152 @@
.o_wevent_event {
// Multi-line event title, even in mobile mode
nav > div > a.navbar-brand {
text-overflow: revert;
white-space: normal;
overflow: hidden;
max-width: calc(100% - 80px);
}
// Ensure menu labels are not split
#o_wevent_event_submenu {
li.nav-item {
white-space: nowrap;
}
}
.o_wevent_event_title {
margin: 3rem 0;
.o_wevent_event_name {
font-weight: $display4-weight;
line-height: $display-line-height;
@include font-size($display4-size);
}
.o_wevent_event_subtitle {
font-weight: $lead-font-weight;
@include font-size($lead-font-size);
}
}
.o_wevent_registration_single {
.o_wevent_nowrap {
white-space: nowrap;
}
}
.o_wevent_registration_btn {
flex: 0 0 100%;
&.collapsed {
flex: 0 0 33%;
.close {
display: none;
}
}
.close {
display: block;
}
&:not(.collapsed) {
box-shadow: none;
font-weight: $font-weight-bold;
text-transform: uppercase;
transition: none;
}
}
.o_wevent_sidebar_title {
margin-bottom: $spacer;
opacity: .5;
text-transform: uppercase;
}
.o_wevent_sidebar_block {
padding: $spacer * 3;
border-bottom: $border-width solid $border-color;
&:last-child {
border-bottom: 0;
}
}
}
.o_wevent_event {
.o_record_cover_container {
overflow: hidden;
z-index: 0;
.o_record_cover_component {
z-index: -1;
}
&.o_record_has_cover {
.o_record_cover_image {
background-attachment: fixed;
&::after {
content: "";
display: block;
@include o-position-absolute(0,0,50%,0);
}
}
.o_wevent_event_title {
color: white;
}
}
}
}
/*
* EVENT PAGE VIEW
*/
.o_wevent_event .event_color_0 {
background-color: white;
color: #5a5a5a;
}
.o_wevent_event .event_color_1 {
background-color: #cccccc;
color: #424242;
}
.o_wevent_event .event_color_2 {
background-color: #ffc7c7;
color: #7a3737;
}
.o_wevent_event .event_color_3 {
background-color: #fff1c7;
color: #756832;
}
.o_wevent_event .event_color_4 {
background-color: #e3ffc7;
color: #5d6937;
}
.o_wevent_event .event_color_5 {
background-color: #c7ffd5;
color: #1a7759;
}
.o_wevent_event .event_color_6 {
background-color: #c7ffff;
color: #1a5d83;
}
.o_wevent_event .event_color_7 {
background-color: #c7d5ff;
color: #3b3e75;
}
.o_wevent_event .event_color_8 {
background-color: #e3c7ff;
color: #4c3668;
}
.o_wevent_event .event_color_9 {
background-color: #ffc7f1;
color: #6d2c70;
}
/*
* SPONSORS
*/
// small hack to hide sponsors on specific views
.o_wevent_hide_sponsors .container.mt32.mb16.d-none.d-md-block.d-print-none {
// Not a very accurate way to target the 'sponsors' block -> improve in master
display: none !important;
}
@@ -1,252 +0,0 @@
.o_wevent_index_topbar_filters {
.dropdown-toggle {
border: $border-width solid gray('400');
@include o-bg-color(gray('white'), $with-extras: false);
@include border-radius($dropdown-border-radius);
@include hover-focus {
border-color: theme-color('primary');
color: theme-color('primary');
text-decoration: none;
}
&:after {
margin-left: 1.2em;
}
.fa {
margin-right: .4em;
color: theme-color('primary');
}
}
.dropdown-menu {
margin-top: $navbar-padding-y;
min-width: 12rem;
}
.dropdown-item {
&.active .badge { // Invert badge display when the item is active
background-color: color-yiq(theme-color('primary'));
color: theme-color('primary');
}
}
}
.o_wevent_social_link {
$o_link_size: 3em;
display: inline-block;
@include size($o_link_size);
margin: 0 ($spacer * .25) ($spacer * .5) ($spacer * .25);
line-height: $o_link_size;
background-color: gray('100');
border: $border-width solid $border-color;
border-radius: 50%;
text-align: center;
@include hover-focus {
background-color: gray('300');
}
}
.o_wevent_badge {
padding: ($spacer * .5) $spacer;
border-radius: 10rem;
font-weight: $font-weight-normal;
}
// Index
.o_wevent_index {
// Events List
.o_wevent_events_list {
header {
a {
transition: all .25s ease-in-out;
@include hover-focus {
transform: scale(1.05);
}
}
}
&.opt_event_list_cards_bg {
@if (color('body') == $o-portal-default-body-bg) {
@extend .bg-200;
}
}
.opt_events_list_columns {
header {
height: 200px;
}
}
.opt_events_list_rows {
@include media-breakpoint-down(sm) {
header {
height: 200px;
}
}
}
.o_wevent_badge_event {
@include o-position-absolute($top: 0, $left: 0);
@include border-left-radius(0);
padding: ($spacer * .5) $card-spacer-x;
transform: translateY(-50%);
}
.o_wevent_event_date {
top: $card-spacer-x;
right: $card-spacer-x;
display: flex;
flex-direction: column;
justify-content: center;
@include size(4rem);
border-radius: 50%;
text-align: center;
.o_wevent_event_day {
font-size: 1.125rem;
font-weight: 300;
line-height: 1;
}
.o_wevent_event_month {
font-size: 0.75rem;
font-weight: $font-weight-bold;
text-transform: uppercase;
}
}
.o_wevent_participating,
.o_wevent_unpublished {
position: absolute;
bottom: 0;
width: 100%;
padding: $card-spacer-y $card-spacer-x;
text-align: right;
}
.card-title {
color: $body-color;
}
}
.o_wevent_sidebar_title {
margin: 0 0 ($spacer * 1.5) 0;
border-bottom: $border-width solid $border-color;
padding: 0 0 ($spacer * .5) 0;
font-weight: $font-weight-bold;
text-transform: uppercase;
}
.o_wevent_sidebar_block {
margin: 0 0 ($spacer * 2.5) 0;
}
.o_wevent_sidebar_figure {
position: relative;
.figure-img {
margin-bottom: 0;
}
.figure-caption {
@include o-position-absolute($left: 0, $bottom: 0);
width: 100%;
padding: $spacer;
background-color: rgba($color: #000, $alpha: 0.5);
@include border-bottom-radius($border-radius);
color: #fff;
}
}
#o_wevent_index_main_col .form-inline {
width: 100%;
}
}
.o_wevent_event {
// Multi-line event title, even in mobile mode
nav > div > a.navbar-brand {
text-overflow: revert;
white-space: normal;
overflow: hidden;
max-width: calc(100% - 80px);
}
// Ensure menu labels are not split
#o_wevent_event_submenu {
li.nav-item {
white-space: nowrap;
}
}
.o_wevent_event_title {
margin: 3rem 0;
.o_wevent_event_name {
font-weight: $display4-weight;
line-height: $display-line-height;
@include font-size($display4-size);
}
.o_wevent_event_subtitle {
font-weight: $lead-font-weight;
@include font-size($lead-font-size);
}
}
.o_wevent_registration_single {
.o_wevent_nowrap {
white-space: nowrap;
}
}
.o_wevent_registration_btn {
flex: 0 0 100%;
&.collapsed {
flex: 0 0 33%;
.close {
display: none;
}
}
.close {
display: block;
}
&:not(.collapsed) {
box-shadow: none;
font-weight: $font-weight-bold;
text-transform: uppercase;
transition: none;
}
}
.o_wevent_sidebar_title {
margin-bottom: $spacer;
opacity: .5;
text-transform: uppercase;
}
.o_wevent_sidebar_block {
padding: $spacer * 3;
border-bottom: $border-width solid $border-color;
&:last-child {
border-bottom: 0;
}
}
}
.o_wevent_event {
.o_record_cover_container {
overflow: hidden;
z-index: 0;
.o_record_cover_component {
z-index: -1;
}
&.o_record_has_cover {
.o_record_cover_image {
background-attachment: fixed;
&::after {
content: "";
display: block;
@include o-position-absolute(0,0,50%,0);
}
}
.o_wevent_event_title {
color: white;
}
}
}
}
.modal-open {
> .modal-backdrop {
z-index: $zindex-dropdown - 1;
}
}
+1
View File
@@ -16,6 +16,7 @@ class EventDtPatcher(TransactionCase):
def setUpClass(cls):
super(EventDtPatcher, cls).setUpClass()
# Mock dates to have reproducible computed fields based on time
cls.reference_now = datetime(2020, 7, 6, 10, 0, 0)
cls.reference_today = datetime(2020, 7, 6)
+3 -2
View File
@@ -9,8 +9,9 @@
<template id="assets_frontend" inherit_id="website.assets_frontend" name="Event Assets Frontend">
<xpath expr="//link[last()]" position="after">
<link rel="stylesheet" type="text/scss" href="/website_event/static/src/scss/website_event.scss"/>
<link rel="stylesheet" type="text/scss" href="/website_event/static/src/scss/website_event_templates.scss"/>
<link rel="stylesheet" type="text/scss" href="/website_event/static/src/scss/event_templates_common.scss"/>
<link rel="stylesheet" type="text/scss" href="/website_event/static/src/scss/event_templates_list.scss"/>
<link rel="stylesheet" type="text/scss" href="/website_event/static/src/scss/event_templates_page.scss"/>
</xpath>
<xpath expr="//script[last()]" position="after">
<script type="text/javascript" src="/website_event/static/src/js/display_timer_widget.js"></script>
@@ -6,7 +6,7 @@
<t t-call="website.layout">
<!-- Options -->
<t t-set="opt_events_list_categories" t-value="is_view_active('website_event.opt_events_list_categories')"/>
<div id="wrap" class="o_wevent_event js_event">
<div id="wrap" t-attf-class="o_wevent_event js_event #{'o_wevent_hide_sponsors' if hide_sponsors else ''}">
<t t-if="not event.menu_id">
<nav class="navbar navbar-light border-top shadow-sm d-print-none">
<div class="container align-items-baseline justify-content-start">
@@ -6,23 +6,26 @@
'name': 'Event Exhibitors',
'category': 'Marketing/Events',
'sequence': 1004,
'version': '1.0',
'summary': 'Event: upgrade sponsors to exhibitors',
'version': '1.1',
'summary': 'Event: manage sponsors and exhibitors',
'website': 'https://www.odoo.com/page/events',
'description': "",
'depends': [
'website_event_track',
'website_event',
'website_jitsi',
],
'data': [
'security/ir.model.access.csv',
'security/security.xml',
'security/ir.model.access.csv',
'data/event_sponsor_data.xml',
'views/assets.xml',
'views/event_templates_sponsor.xml',
'views/event_sponsor_views.xml',
'views/event_event_views.xml',
'views/event_exhibitor_templates_list.xml',
'views/event_exhibitor_templates_page.xml',
'views/event_type_views.xml',
'views/event_menus.xml',
],
'demo': [
'data/event_demo.xml',
@@ -6,18 +6,18 @@ 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.addons.website_event.controllers.main import WebsiteEventController
from odoo.http import request
from odoo.osv import expression
from odoo.tools import format_duration
class ExhibitorController(EventTrackController):
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)]])
@@ -27,13 +27,18 @@ class ExhibitorController(EventTrackController):
# MAIN PAGE
# ------------------------------------------------------------
@http.route(['/event/<model("event.event"):event>/exhibitors'], type='http', auth="public", website=True, sitemap=False)
@http.route([
# TDE BACKWARD: exhibitors is actually a typo
'/event/<model("event.event"):event>/exhibitors',
# TDE BACKWARD: matches event/event-1/exhibitor/exhib-1 sub domain
'/event/<model("event.event"):event>/exhibitor'
], 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",
"website_event_exhibitor.event_exhibitors",
self._event_exhibitors_get_values(event, **searches)
)
@@ -125,7 +130,7 @@ class ExhibitorController(EventTrackController):
options['widescreen'] = True
return request.render(
"website_event_track_exhibitor.event_exhibitor_main",
"website_event_exhibitor.event_exhibitor_main",
self._event_exhibitor_get_values(event, sponsor, **options)
)
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="event_sponsor_type1" model="event.sponsor.type">
<field name="name">Bronze</field>
<field name="sequence">3</field>
<field name="display_ribbon_style">Bronze</field>
</record>
<record id="event_sponsor_type2" model="event.sponsor.type">
<field name="name">Silver</field>
<field name="sequence">2</field>
<field name="display_ribbon_style">Silver</field>
</record>
<record id="event_sponsor_type3" model="event.sponsor.type">
<field name="name">Gold</field>
<field name="sequence">1</field>
<field name="display_ribbon_style">Gold</field>
</record>
</odoo>
@@ -29,56 +29,102 @@
<field name="sponsor_type_id" ref="event_sponsor_type3"/>
<field name="partner_id" ref="base.res_partner_1"/>
<field name="url">http://www.wood-corner.example.com</field>
<field name="is_published" eval="True"/>
<field name="subtitle">Catchy sentence !</field>
<field name="exhibitor_type">sponsor</field>
</record>
<record id="event_7_sponsor_1" model="event.sponsor">
<field name="event_id" ref="event.event_7"/>
<field name="sponsor_type_id" ref="event_sponsor_type3"/>
<field name="partner_id" ref="base.res_partner_2"/>
<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="exhibitor_type">sponsor</field>
</record>
<record id="event_7_sponsor_2" model="event.sponsor">
<field name="event_id" ref="event.event_7"/>
<field name="sponsor_type_id" ref="event_sponsor_type1"/>
<field name="partner_id" ref="base.res_partner_3"/>
<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="exhibitor_type">exhibitor</field>
<field name="room_name">gemini-furniture</field>
<field name="room_max_capacity">12</field>
</record>
<record id="event_7_sponsor_3" model="event.sponsor">
<field name="event_id" ref="event.event_7"/>
<field name="sponsor_type_id" ref="event_sponsor_type2"/>
<field name="partner_id" ref="base.res_partner_4"/>
<field name="url">http://www.ready-mat.example.com</field>
<field name="is_published" eval="True"/>
<field name="subtitle">Catchy sentence !</field>
<field name="exhibitor_type">exhibitor</field>
<field name="room_name">ready-mat</field>
<field name="room_max_capacity">12</field>
</record>
<record id="event_7_sponsor_4" model="event.sponsor">
<field name="event_id" ref="event.event_7"/>
<field name="sponsor_type_id" ref="event_sponsor_type1"/>
<field name="partner_id" ref="base.res_partner_10"/>
<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="exhibitor_type">online</field>
<field name="room_name">the-jackson-group</field>
<field name="room_max_capacity">12</field>
</record>
<record id="event_7_sponsor_5" model="event.sponsor">
<field name="event_id" ref="event.event_7"/>
<field name="sponsor_type_id" ref="event_sponsor_type1"/>
<field name="partner_id" ref="base.res_partner_12"/>
<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="exhibitor_type">online</field>
<field name="room_name">azure-interior</field>
<field name="room_max_capacity">12</field>
</record>
<record id="event_7_sponsor_6" model="event.sponsor">
<field name="event_id" ref="event.event_7"/>
<field name="sponsor_type_id" ref="event_sponsor_type3"/>
<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="exhibitor_type">online</field>
<field name="room_name">bloem-flower</field>
<field name="room_max_capacity">12</field>
</record>
<record id="event_7_sponsor_7" model="event.sponsor">
<field name="event_id" ref="event.event_7"/>
<field name="sponsor_type_id" ref="event_sponsor_type2"/>
<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="exhibitor_type">online</field>
<field name="room_name">open-wood</field>
<field name="room_max_capacity">12</field>
</record>
<record id="event_7_sponsor_8" model="event.sponsor">
<field name="event_id" ref="event.event_7"/>
<field name="sponsor_type_id" ref="event_sponsor_type3"/>
<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="exhibitor_type">online</field>
<field name="room_name">tree-dealers</field>
<field name="room_max_capacity">12</field>
</record>
<record id="event_7_sponsor_9" model="event.sponsor">
<field name="event_id" ref="event.event_7"/>
<field name="sponsor_type_id" ref="event_sponsor_type2"/>
<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="exhibitor_type">online</field>
<field name="room_name">pterocarpus</field>
<field name="room_max_capacity">12</field>
</record>
</odoo>
@@ -3,5 +3,6 @@
from . import event_event
from . import event_sponsor
from . import event_sponsor_type
from . import event_type
from . import website_event_menu
@@ -8,6 +8,10 @@ from odoo.addons.http_routing.models.ir_http import slug
class EventEvent(models.Model):
_inherit = "event.event"
# sponsors
sponsor_ids = fields.One2many('event.sponsor', 'event_id', 'Sponsors')
sponsor_count = fields.Integer('Sponsor Count', compute='_compute_sponsor_count')
# frontend menu management
exhibitor_menu = fields.Boolean(
string='Showcase Exhibitors', compute='_compute_exhibitor_menu',
readonly=False, store=True)
@@ -15,6 +19,12 @@ class EventEvent(models.Model):
'website.event.menu', 'event_id', string='Exhibitors Menus',
domain=[('menu_type', '=', 'exhibitor')])
def _compute_sponsor_count(self):
data = self.env['event.sponsor'].read_group([], ['event_id'], ['event_id'])
result = dict((data['event_id'][0], data['event_id_count']) for data in data)
for event in self:
event.sponsor_count = result.get(event.id, 0)
@api.depends('event_type_id', 'website_menu', 'exhibitor_menu')
def _compute_exhibitor_menu(self):
for event in self:
@@ -4,30 +4,60 @@
from datetime import datetime
from pytz import timezone, utc
from odoo import api, fields, models
from odoo import api, fields, models, _
from odoo.addons.http_routing.models.ir_http import slug
from odoo.addons.resource.models.resource import float_to_time
from odoo.modules.module import get_resource_path
from odoo.tools import is_html_empty
from odoo.tools.translate import html_translate
class EventSponsor(models.Model):
_name = 'event.sponsor'
_inherit = [
'event.sponsor',
'website.published.mixin',
'chat.room.mixin',
]
class Sponsor(models.Model):
_name = "event.sponsor"
_description = 'Event Sponsor'
_order = "sequence, sponsor_type_id"
# _order = 'sponsor_type_id, sequence' TDE FIXME
_rec_name = 'name'
_order = 'sponsor_type_id, sequence'
_inherit = [
'mail.thread',
'mail.activity.mixin',
'website.published.mixin',
'chat.room.mixin'
]
event_id = fields.Many2one('event.event', 'Event', 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', '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')
partner_mobile = fields.Char('Mobile', related='partner_id.mobile')
name = fields.Char('Sponsor Name', compute='_compute_name', readonly=False, store=True)
email = fields.Char('Sponsor Email', compute='_compute_email', readonly=False, store=True)
phone = fields.Char('Sponsor Phone', compute='_compute_phone', readonly=False, store=True)
mobile = fields.Char('Sponsor Mobile', compute='_compute_mobile', readonly=False, store=True)
# image
image_512 = fields.Image(
string="Logo", max_width=512, max_height=512,
compute='_compute_image_512', readonly=False, store=True)
image_256 = fields.Image("Image 256", related="image_512", max_width=256, max_height=256, store=False)
image_128 = fields.Image("Image 128", related="image_512", max_width=128, max_height=128, store=False)
website_image_url = fields.Char(
string='Image URL',
compute='_compute_website_image_url', compute_sudo=True, store=False)
# live mode
hour_from = fields.Float('Opening hour', default=8.0)
hour_to = fields.Float('End hour', default=18.0)
@@ -45,19 +75,62 @@ class EventSponsor(models.Model):
string='Country Flag',
compute='_compute_country_flag_url', compute_sudo=True)
@api.onchange('is_exhibitor')
def _onchange_is_exhibitor(self):
@api.depends('partner_id')
def _compute_url(self):
for sponsor in self:
if sponsor.partner_id.website or not sponsor.url:
sponsor.url = sponsor.partner_id.website
@api.depends('partner_id')
def _compute_name(self):
self._synchronize_with_partner('name')
@api.depends('partner_id')
def _compute_email(self):
self._synchronize_with_partner('email')
@api.depends('partner_id')
def _compute_phone(self):
self._synchronize_with_partner('phone')
@api.depends('partner_id')
def _compute_mobile(self):
self._synchronize_with_partner('mobile')
@api.depends('partner_id')
def _compute_image_512(self):
self._synchronize_with_partner('image_512')
@api.depends('image_256', 'partner_id.image_256')
def _compute_website_image_url(self):
for sponsor in self:
if sponsor.image_256:
sponsor.website_image_url = self.env['website'].image_url(sponsor, 'image_256', size=256)
elif sponsor.partner_id.image_256:
sponsor.website_image_url = self.env['website'].image_url(sponsor.partner_id, 'image_256', size=256)
else:
sponsor.website_image_url = get_resource_path('website_event_exhibitor', 'static/src/img', 'event_sponsor_default_%d.png' % (sponsor.id % 1))
def _synchronize_with_partner(self, fname):
""" Synchronize with partner if not set. Setting a value does not write
on partner as this may be event-specific information. """
for sponsor in self:
if not sponsor[fname]:
sponsor[fname] = sponsor.partner_id[fname]
@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')
@@ -106,7 +179,7 @@ class EventSponsor(models.Model):
@api.depends('name', 'event_id.name')
def _compute_website_url(self):
super(EventSponsor, self)._compute_website_url()
super(Sponsor, self)._compute_website_url()
for sponsor in self:
if sponsor.id: # avoid to perform a slug on a not yet saved record in case of an onchange.
base_url = sponsor.event_id.get_base_url()
@@ -123,7 +196,7 @@ class EventSponsor(models.Model):
exhibitor_name = values['name'] if values.get('name') else self.env['res.partner'].browse(values['partner_id']).name
name = 'odoo-exhibitor-%s' % exhibitor_name or 'sponsor'
values['room_name'] = name
return super(EventSponsor, self).create(values_list)
return super(Sponsor, self).create(values_list)
def write(self, values):
toupdate = self.env['event.sponsor']
@@ -132,8 +205,8 @@ class EventSponsor(models.Model):
# go into sequential update in order to create a custom room name for each sponsor
for exhibitor in toupdate:
values['room_name'] = 'odoo-exhibitor-%s' % exhibitor.name
super(EventSponsor, exhibitor).write(values)
return super(EventSponsor, self - toupdate).write(values)
super(Sponsor, exhibitor).write(values)
return super(Sponsor, self - toupdate).write(values)
# ------------------------------------------------------------
# ACTIONS
@@ -141,3 +214,18 @@ class EventSponsor(models.Model):
def get_backend_menu_id(self):
return self.env.ref('event.event_main_menu').id
# ------------------------------------------------------------
# MESSAGING
# ------------------------------------------------------------
def _message_get_suggested_recipients(self):
recipients = super(Sponsor, self)._message_get_suggested_recipients()
for sponsor in self:
if sponsor.partner_id:
sponsor._message_add_suggested_recipient(
recipients,
partner=sponsor.partner_id,
reason=_('Sponsor')
)
return recipients
@@ -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'),
@@ -0,0 +1,6 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_event_sponsor_type_manager,access.event.sponsor.type.manager,model_event_sponsor_type,event.group_event_manager,1,1,1,1
access_event_sponsor_type_public,access.event.sponsor.type.public,model_event_sponsor_type,,1,0,0,0
access_event_sponsor_manager,access.event.sponsor.manager,model_event_sponsor,event.group_event_manager,1,1,1,1
access_event_sponsor_public,access.event.sponsor.public,model_event_sponsor,,1,0,0,0
chat_room_access_event_manager,chat.room.access.event.manager,website_jitsi.model_chat_room,event.group_event_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_event_sponsor_type_manager access.event.sponsor.type.manager model_event_sponsor_type event.group_event_manager 1 1 1 1
3 access_event_sponsor_type_public access.event.sponsor.type.public model_event_sponsor_type 1 0 0 0
4 access_event_sponsor_manager access.event.sponsor.manager model_event_sponsor event.group_event_manager 1 1 1 1
5 access_event_sponsor_public access.event.sponsor.public model_event_sponsor 1 0 0 0
6 chat_room_access_event_manager chat.room.access.event.manager website_jitsi.model_chat_room event.group_event_manager 1 1 1 1
@@ -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="model_id" ref="website_event_track.model_event_sponsor"/>
<field name="domain_force">[('website_published', '=', True)]</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">['|', ('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"/>

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

@@ -1,4 +1,4 @@
odoo.define('website_event_track_exhibitor.event_exhibitor_connect', function (require) {
odoo.define('website_event_exhibitor.event_exhibitor_connect', function (require) {
'use strict';
var Dialog = require('web.Dialog');
@@ -62,7 +62,7 @@ var ExhibitorConnectClosedDialog = Dialog.extend({
publicWidget.registry.eventExhibitorConnect = publicWidget.Widget.extend({
selector: '.o_wesponsor_js_connect',
xmlDependencies: ['/website_event_track_exhibitor/static/src/xml/event_exhibitor_connect.xml'],
xmlDependencies: ['/website_event_exhibitor/static/src/xml/event_exhibitor_connect.xml'],
/**
* @override
@@ -27,7 +27,7 @@
position: absolute;
bottom: 0;
width: 100%;
padding: $card-spacer-y $card-spacer-x;
padding: 0.25rem 1.25rem;
text-align: right;
}
&.o_wesponsor_card_unpublished {
@@ -0,0 +1,99 @@
/*
* SPONSORS
*/
.o_wevent_event .o_wevent_sponsor {
position: relative;
display: inline-block;
overflow: hidden;
}
.o_wevent_event .o_ribbon {
font: 12px Sans-Serif;
color: #404040;
padding-top: 2px;
padding-bottom: 2px;
-webkit-box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.3);
-moz-box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.3);
box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.3);
}
.o_wevent_event .ribbon_Gold {
background-color: #FDE21B;
background-image: -webkit-gradient(linear, left top, left bottom, from(#E9CE0C), to(#FDE21B));
background-image: -webkit-linear-gradient(top, #E9CE0C, #FDE21B);
background-image: -moz-linear-gradient(top, #E9CE0C, #FDE21B);
background-image: -ms-linear-gradient(top, #E9CE0C, #FDE21B);
background-image: -o-linear-gradient(top, #E9CE0C, #FDE21B);
}
.o_wevent_event .ribbon_Silver {
background-color: #CCCCCC;
background-image: -webkit-gradient(linear, left top, left bottom, from(#BBBBBB), to(#CCCCCC));
background-image: -webkit-linear-gradient(top, #BBBBBB, #CCCCCC);
background-image: -moz-linear-gradient(top, #BBBBBB, #CCCCCC);
background-image: -ms-linear-gradient(top, #BBBBBB, #CCCCCC);
background-image: -o-linear-gradient(top, #BBBBBB, #CCCCCC);
}
.o_wevent_event .ribbon_Bronze {
background-color: #DB9141;
background-image: -webkit-gradient(linear, left top, left bottom, from(#C2792A), to(#DB9141));
background-image: -webkit-linear-gradient(top, #C2792A, #DB9141);
background-image: -moz-linear-gradient(top, #C2792A, #DB9141);
background-image: -ms-linear-gradient(top, #C2792A, #DB9141);
background-image: -o-linear-gradient(top, #C2792A, #DB9141);
}
/*
* EVENT TOOL: SPONSOR WIDGET
*/
.o_wevent_event .o_wevent_sponsor_card {
position: relative;
width: 100px;
height: 100px;
border: 1px solid $gray-200;
background-color: $white;
margin: 0 -1px -1px 0;
.ribbon-wrapper {
width: 50px;
height: 50px;
}
.ribbon {
font: bold 10px Sans-Serif;
padding: 2px 0;
top: 10px;
width: 70px;
background-image: none; // not needed if colors for ribbons (Gold,Silver,Bronze) is removed in website_event_track.css
&.ribbon_Gold {
background-color: #e3aa24;
color:$white;
}
&.ribbon_Silver {
background-color: #adb5bd;
color: $white;
}
&.ribbon_Bronze {
background-color: #c7632a;
color: $white;
}
}
&:before {
content: "";
display: block;
@include o-position-absolute(0,0,0,0);
background-color: $black;
opacity: 0;
transition: opacity .3s;
}
&:hover:before {
opacity:.1;
}
}
@@ -4,12 +4,13 @@
from odoo.addons.website_event.tests.common import TestEventOnlineCommon
class TestEventTrackOnlineCommon(TestEventOnlineCommon):
class TestEventExhibitorCommon(TestEventOnlineCommon):
@classmethod
def setUpClass(cls):
super(TestEventTrackOnlineCommon, cls).setUpClass()
super(TestEventExhibitorCommon, cls).setUpClass()
# Sponsorship data
cls.sponsor_type_0 = cls.env['event.sponsor.type'].create({
'name': 'GigaTop',
'sequence': 1,
@@ -4,12 +4,12 @@
from datetime import datetime
from unittest.mock import patch
from odoo.addons.website_event_track.tests.common import TestEventTrackOnlineCommon
from odoo.addons.website_event_exhibitor.tests.common import TestEventExhibitorCommon
from odoo.fields import Datetime as FieldsDatetime
from odoo.tests.common import users
class TestSponsorData(TestEventTrackOnlineCommon):
class TestSponsorData(TestEventExhibitorCommon):
@classmethod
def setUpClass(cls):
@@ -21,7 +21,7 @@ class TestSponsorData(TestEventTrackOnlineCommon):
})
cls.wevent_exhib_dt = patch(
'odoo.addons.website_event_track_exhibitor.models.event_sponsor.fields.Datetime',
'odoo.addons.website_event_exhibitor.models.event_sponsor.fields.Datetime',
wraps=FieldsDatetime
)
cls.mock_wevent_exhib_dt = cls.wevent_exhib_dt.start()
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="assets_frontend" inherit_id="website.assets_frontend" name="Online Exhibitor Frontend Assets">
<xpath expr="//link[last()]" position="after">
<link rel="stylesheet" type="text/scss" href="/website_event_exhibitor/static/src/scss/event_templates_sponsor.scss"/>
<link rel="stylesheet" type="text/scss" href="/website_event_exhibitor/static/src/scss/event_exhibitor_templates.scss"/>
</xpath>
<xpath expr="//script[last()]" position="after">
<script type="text/javascript" src="/website_event_exhibitor/static/src/js/event_exhibitor_connect.js"></script>
</xpath>
</template>
</odoo>
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="event_event_view_form" model="ir.ui.view">
<field name="name">event.event.view.form.inherit.exhibitor</field>
<field name="model">event.event</field>
<field name="priority" eval="5"/>
<field name="inherit_id" ref="website_event.event_event_view_form"/>
<field name="arch" type="xml">
<field name="is_published" position="before">
<button name="%(event_sponsor_action_from_event)d"
type="action"
class="oe_stat_button"
icon="fa-black-tie">
<field name="sponsor_count" string="Sponsors" widget="statinfo"/>
</button>
</field>
<xpath expr="//field[@name='website_menu']" position="after">
<label for="exhibitor_menu"/>
<field name="exhibitor_menu"/>
</xpath>
</field>
</record>
<record id="event_event_view_list" model="ir.ui.view">
<field name="name">event.event.view.list.inherit.exhibitor</field>
<field name="model">event.event</field>
<field name="inherit_id" ref="event.view_event_tree"/>
<field name="arch" type="xml">
<field name="stage_id" position="after">
<field name="sponsor_count" readonly="1" optional="hide"/>
</field>
</field>
</record>
</odoo>
@@ -5,16 +5,16 @@
<t t-call="website_event.layout">
<div class="o_wevent_online o_wevent_online_bg o_wesponsor_index">
<!-- Topbar -->
<t t-call="website_event_track_exhibitor.exhibitors_topbar"/>
<t t-call="website_event_exhibitor.exhibitors_topbar"/>
<!-- Drag/Drop Area -->
<div id="oe_structure_wesponsor_index_1" class="oe_structure"/>
<!-- Content -->
<div class="o_wesponsor_container container">
<div class="row">
<t t-call="website_event_track_exhibitor.exhibitors_search"/>
<t t-call="website_event_exhibitor.exhibitors_search"/>
</div>
<div class="row">
<t t-call="website_event_track_exhibitor.exhibitors_main"/>
<t t-call="website_event_exhibitor.exhibitors_main"/>
</div>
</div>
<!-- Drag/Drop Area -->
@@ -50,7 +50,7 @@
<!-- Topbar: optional country filters -->
<template id="exhibitors_topbar_country"
inherit_id="website_event_track_exhibitor.exhibitors_topbar"
inherit_id="website_event_exhibitor.exhibitors_topbar"
name="Filter by Country"
active="True"
customize_show="True">
@@ -81,7 +81,7 @@
<!-- Topbar: optional sponsorship filters -->
<template id="exhibitors_topbar_sponsorship"
inherit_id="website_event_track_exhibitor.exhibitors_topbar"
inherit_id="website_event_exhibitor.exhibitors_topbar"
name="Filter by Sponsorship"
active="True"
customize_show="True">
@@ -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' % (
@@ -129,7 +129,7 @@
</div>
</t>
<!-- Cards -->
<div class="col-12" t-call="website_event_track_exhibitor.exhibitors_display_cards"/>
<div class="col-12" t-call="website_event_exhibitor.exhibitors_display_cards"/>
</template>
<!-- Exhibitors: Cards-based display -->
@@ -140,7 +140,7 @@
<hr class="mt-2 pb-1 mb-1"/>
</div>
<div t-foreach="sponsor_category['sponsors']" t-as="sponsor" class="col-md-6 col-lg-3 mb-4">
<t t-call="website_event_track_exhibitor.exhibitor_card"/>
<t t-call="website_event_exhibitor.exhibitor_card"/>
</div>
</div>
</template>
@@ -154,13 +154,9 @@
itemscope="itemscope" itemtype="http://schema.org/Event">
<div class="h-100 row no-gutters">
<t t-set="sponsor_image_url" t-value="sponsor.website_image_url"/>
<header t-att-class="'overflow-hidden col-12 rounded-top position-static %s' % ('bg-secondary' if not sponsor_image_url else '')">
<small t-if="not sponsor.is_published" class="o_wesponsor_card_header_badge bg-danger">
<i class="fa fa-ban mr-2"/>Unpublished
</small>
<div t-att-data-sponsor-url="sponsor.website_url" class="o_wesponsor_js_connect"
<header t-att-class="'overflow-hidden col-12 rounded-top %s' % ('bg-secondary' if not sponsor_image_url else '')">
<div class="d-block h-100 w-100 o_wesponsor_js_connect"
t-att-data-sponsor-url="sponsor.website_url"
t-attf-data-register-url="/event/#{slug(event)}/register?from_sponsor_id=#{sponsor.id}"
t-att-data-is-participating="event.is_participating"
t-att-data-sponsor-id="sponsor.id"
@@ -169,12 +165,16 @@
t-att-data-user-event-manager="user_event_manager">
<div t-if="sponsor_image_url" class="card-img-top position-static o_wesponsor_bg_image"
t-attf-style="padding-top: 50%; background-image: url(#{sponsor_image_url});">
<small t-if="not sponsor.is_published" class="o_wesponsor_card_header_badge bg-danger">
<i class="fa fa-ban mr-2"/>Unpublished
</small>
<div class="o_wesponsor_connect_button">
<a href="#" class="btn btn-primary h3">
<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"
@@ -185,6 +185,9 @@
</div>
<div t-else="" class="o_wesponsor_gradient card-img-top position-relative"
style="padding-top: 50%">
<small t-if="not sponsor.is_published" class="o_wesponsor_card_header_badge bg-danger">
<i class="fa fa-ban mr-2"/>Unpublished
</small>
<div class="o_wesponsor_connect_button">
<a href="#" class="btn btn-primary h3">
<t t-if="not user_event_manager and not sponsor.event_id.is_ongoing and not event.is_participating">
@@ -196,8 +199,8 @@
</div>
</div>
</header>
<div class="col-12">
<main class="card-body h-100">
<div class="col-12 h-100">
<main class="card-body">
<!-- Title -->
<h5 class="card-title mt-0 mb-0 text-truncate d-flex align-items-top">
<span t-field="sponsor.name" itemprop="name"/>
@@ -13,8 +13,8 @@
<!-- Content -->
<div t-att-class="'o_wevent_online_page_container %s' % ('container pb-3' if not option_widescreen else 'pb-3')">
<div class="row mb-5 mx-0">
<t t-call="website_event_track_exhibitor.exhibitor_aside"/>
<t t-call="website_event_track_exhibitor.exhibitor_main"/>
<t t-call="website_event_exhibitor.exhibitor_aside"/>
<t t-call="website_event_exhibitor.exhibitor_main"/>
</div>
</div>
<!-- Drag/Drop Area -->
@@ -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 />
@@ -88,9 +88,11 @@
</t>
</div>
<!-- SPONSOR DESCRIPTION -->
<span class="h5 d-inline-block mx-3 mt-3 mb-0">About <t t-esc="sponsor.name"/></span>
<span class="h5 d-inline-block mx-3 mt-3 mb-0">
About <t t-esc="sponsor.name"/>
</span>
<hr class="mt-2 mb-0"/>
<div class="ml-3">
<div class="ml-3 clearfix">
<div class="float-left pt-3">
<span t-if="sponsor.image_512" t-field="sponsor.image_512" class="o_wevent_online_page_avatar"
t-options="{'widget': 'image', 'max-width': '96'}"/>
@@ -104,7 +106,16 @@
<span t-if="sponsor.sponsor_type_id.display_ribbon_style and sponsor.sponsor_type_id.display_ribbon_style != 'no_ribbon'"
t-field="sponsor.sponsor_type_id" t-attf-class="o_ribbon o_ribbon_right ribbon_#{sponsor.sponsor_type_id.display_ribbon_style}"/>
</div>
<span t-field="sponsor.subtitle" class="text-muted mb-3"/>
<span t-field="sponsor.subtitle"
t-att-class="'text-muted %s' % '' if sponsor.hour_from and sponsor.hour_to else 'mb-3'"/>
<div t-if="sponsor.hour_from and sponsor.hour_to"
t-att-class="'%s' % 'mb-3' if sponsor.hour_from and sponsor.hour_to else ''">
Available from
<t t-esc="sponsor.hour_from" t-options="{'widget': 'float_time'}"/>
-
<t t-esc="sponsor.hour_to" t-options="{'widget': 'float_time'}"/>
<span t-esc="sponsor.event_date_tz"/>
</div>
<div t-if="sponsor.url" class="d-flex text-break align-items-baseline">
<i class="fa fa-home mr-2"/><a t-att-href="sponsor.url"><span t-field="sponsor.url"/></a>
</div>
@@ -148,9 +159,9 @@
</div>
<ul id="collapse_exhibitor_aside" class="list-unstyled collapse d-lg-block mb-0">
<li t-foreach="sponsors_other" t-as="sponsor_other">
<a class="d-flex w-100 h-100 px-2 pt-2 pb-1 text-decoration-none"
<a class="row no-gutters px-2 pt-2 pb-1 text-decoration-none"
t-att-href="sponsor_other.website_url">
<div class="d-flex flex-column align-items-center">
<div class="col-3 d-flex flex-column align-items-center">
<img t-if="sponsor_other.partner_id.country_id"
class="mr-2 mb-1 o_wesponsor_aside_logo"
t-att-src="sponsor_other.partner_id.country_id.image_url"
@@ -161,12 +172,11 @@
<span t-else="" class="badge badge-light mr-2"
t-esc="sponsor_other.sponsor_type_id.name"/>
</div>
<div class="flex-grow-1 overflow-auto">
<div class="col flex-grow-1 overflow-auto">
<span class="d-flex align-items-baseline o_wesponsor_sponsor_name">
<span class="d-inline-block text-truncate" t-esc="sponsor_other.name"/>
</span>
<small class="text-muted" t-esc="sponsor_other.subtitle"/>
</div>
</a>
@@ -184,7 +194,7 @@
<template id="event_sponsor_edit_options" inherit_id="website.user_navbar" name="Edit Event Sponsor Options">
<xpath expr="//li[@id='edit-page-menu']" position="after">
<t t-if="main_object._name == 'event.sponsor'"
t-set="action" t-value="'website_event_track_exhibitor.event_sponsor_action'"/>
t-set="action" t-value="'website_event_exhibitor.event_sponsor_action'"/>
</xpath>
</template>
@@ -0,0 +1,11 @@
<?xml version="1.0"?>
<odoo><data>
<menuitem id="menu_event_sponsor_type"
name="Sponsor Levels"
action="event_sponsor_type_action"
parent="event.menu_event_configuration"
groups="base.group_no_one"
sequence="40"/>
</data></odoo>
@@ -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>
@@ -46,9 +46,12 @@
<field name="email"/>
<field name="phone"/>
<filter string="Archived" name="archived" domain="[('active', '=', False)]"/>
<separator/>
<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>
@@ -60,28 +63,64 @@
<field name="arch" type="xml">
<form>
<sheet>
<div class="oe_button_box" name="button_box">
<field name="website_url" invisible="1"/>
<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"/>
<field name="image_512" widget="image" class="oe_avatar"/>
<div class="oe_title">
<label for="name" class="oe_edit_only" string="Sponsor Name"/>
<h1><field name="name" placeholder="e.g. : OpenWood Decoration"/></h1>
<div class="oe_title">
<label for="subtitle" class="oe_edit_only"/>
<field name="subtitle" placeholder="e.g. : Your best choice for your home"/>
</div>
</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="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"/>
<i class="fa fa-long-arrow-right mx-2" aria-label="Arrow icon" title="Arrow"/>
<field name="hour_to" widget="float_time" nolabel="1" class="oe_inline"/>
<field name="event_date_tz" nolabel="1" class="oe_inline"/>
</div>
</group>
</group>
<notebook>
<page string="Description"
attrs="{'invisible': [('exhibitor_type', '=', 'sponsor')]}">
<group>
<field name="website_description" nolabel="1"/>
</group>
</page>
<page string="Online"
attrs="{'invisible': [('exhibitor_type', '!=', 'online')]}">
<group>
<group>
<field name="room_name" attrs="{'required': [('exhibitor_type', '=', 'online')]}" string="Jitsi Name"/>
<field name="room_lang_id"/>
<field name="room_max_capacity" attrs="{'required': [('exhibitor_type', '=', 'online')]}"/>
<field name="chat_room_id" groups="base.group_no_one"/>
</group>
</group>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" groups="base.group_user"/>
@@ -96,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"/>
@@ -105,6 +144,8 @@
<field name="mobile"/>
<field name="url" string="Website"/>
<field name="sponsor_type_id"/>
<field name="is_published" optional="show"/>
<field name="exhibitor_type"/>
</tree>
</field>
</record>
@@ -113,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"/>
@@ -123,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">
<h1 class="o_kanban_record_title"><field name="partner_id"/></h1>
<div>Level: <field name="sponsor_type_id"/></div>
<div class="col-8 d-flex flex-column">
<h1 class="o_kanban_record_title"><field name="name"/></h1>
<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>
@@ -137,6 +179,20 @@
</field>
</record>
<record id="event_sponsor_action" model="ir.actions.act_window">
<field name="name">Event Sponsors</field>
<field name="res_model">event.sponsor</field>
<field name="view_mode">kanban,tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a Sponsor / Exhibitor
</p><p>
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>
<record id="event_sponsor_action_from_event" model="ir.actions.act_window">
<field name="name">Event Sponsors</field>
<field name="res_model">event.sponsor</field>
@@ -144,7 +200,10 @@
<field name="context">{'search_default_event_id': active_id, 'default_event_id': active_id}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a Sponsor
Create a Sponsor / Exhibitor
</p><p>
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>
@@ -1,12 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="event_layout" inherit_id="website_event.layout">
<xpath expr="//div[@id='wrap']" position="attributes">
<attribute name="t-attf-class">o_wevent_event js_event #{'o_wevent_hide_sponsors' if hide_sponsors else ''}</attribute>
</xpath>
</template>
<template name="Sponsors" id="event_sponsor" customize_show="True" inherit_id="website_event.layout">
<xpath expr="//div[@id='wrap']" position="inside">
<div class="container mt32 mb16 d-none d-md-block d-print-none" t-if="event.sponsor_ids">
@@ -38,16 +32,4 @@
</xpath>
</template>
<!-- Chatter templates -->
<template id="event_track_template_new">
<p>New track proposal <a href="#" t-att-data-oe-model="track._name" t-att-data-oe-id="track.id"> <t t-esc="track.name"/></a></p>
<ul>
<li><b>Proposed By</b>: <t t-esc="track.partner_name or track.partner_email"/></li>
<li><b>Mail</b>: <a t-attf-href="mailto:#{track.partner_email}"><t t-esc="track.partner_email"/></a></li>
<li><b>Phone</b>: <t t-esc="track.partner_phone"/></li>
<li><b>Speakers Biography</b>: <div t-field="track.partner_biography"/></li>
<li><b>Talk Introduction</b>: <div t-field="track.description"/></li>
</ul>
</template>
</odoo>
+1 -3
View File
@@ -16,10 +16,10 @@
'data/mail_template_data.xml',
'data/event_track_data.xml',
'views/assets.xml',
'views/mail_templates.xml',
'views/event_templates.xml',
'views/event_track_templates_agenda.xml',
'views/event_track_templates_list.xml',
'views/event_track_templates_misc.xml',
'views/event_track_templates_reminder.xml',
'views/event_track_templates_page.xml',
'views/event_track_templates_proposal.xml',
@@ -29,7 +29,6 @@
'views/event_track_tag_views.xml',
'views/event_track_stage_views.xml',
'views/event_track_visitor_views.xml',
'views/event_sponsor_views.xml',
'views/event_event_views.xml',
'views/event_type_views.xml',
'views/res_config_settings_view.xml',
@@ -38,7 +37,6 @@
],
'demo': [
'data/event_demo.xml',
'data/event_sponsor_demo.xml',
'data/event_track_location_demo.xml',
'data/event_track_tag_demo.xml',
'data/event_track_demo.xml',
@@ -1,22 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="event_sponsor_type1" model="event.sponsor.type">
<field name="name">Bronze</field>
<field name="sequence">3</field>
<field name="display_ribbon_style">Bronze</field>
</record>
<record id="event_sponsor_type2" model="event.sponsor.type">
<field name="name">Silver</field>
<field name="sequence">2</field>
<field name="display_ribbon_style">Silver</field>
</record>
<record id="event_sponsor_type3" model="event.sponsor.type">
<field name="name">Gold</field>
<field name="sequence">1</field>
<field name="display_ribbon_style">Gold</field>
</record>
<record id="event_track_stage0" model="event.track.stage">
<field name="name">Proposal</field>
<field name="sequence">1</field>
@@ -2,8 +2,6 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import event_event
from . import event_sponsor
from . import event_sponsor_type
from . import event_track
from . import event_track_location
from . import event_track_stage
@@ -10,8 +10,6 @@ class Event(models.Model):
track_ids = fields.One2many('event.track', 'event_id', 'Tracks')
track_count = fields.Integer('Track Count', compute='_compute_track_count')
sponsor_ids = fields.One2many('event.sponsor', 'event_id', 'Sponsors')
sponsor_count = fields.Integer('Sponsor Count', compute='_compute_sponsor_count')
website_track = fields.Boolean(
'Tracks on Website', compute='_compute_website_track',
readonly=False, store=True)
@@ -31,12 +29,6 @@ class Event(models.Model):
for event in self:
event.track_count = result.get(event.id, 0)
def _compute_sponsor_count(self):
data = self.env['event.sponsor'].read_group([], ['event_id'], ['event_id'])
result = dict((data['event_id'][0], data['event_id_count']) for data in data)
for event in self:
event.sponsor_count = result.get(event.id, 0)
@api.depends('event_type_id', 'website_menu')
def _compute_website_track(self):
""" Propagate event_type configuration (only at change); otherwise propagate
@@ -1,96 +0,0 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
from odoo.modules.module import get_resource_path
class Sponsor(models.Model):
_name = "event.sponsor"
_description = 'Event Sponsor'
_order = "sequence, sponsor_type_id"
_rec_name = 'name'
_inherit = ['mail.thread', 'mail.activity.mixin']
event_id = fields.Many2one('event.event', 'Event', required=True)
sponsor_type_id = fields.Many2one('event.sponsor.type', 'Sponsoring Type', required=True)
url = fields.Char('Sponsor Website', compute='_compute_url', readonly=False, store=True)
sequence = fields.Integer('Sequence')
active = fields.Boolean(default=True)
# contact information
partner_id = fields.Many2one('res.partner', 'Sponsor/Customer', 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')
partner_mobile = fields.Char('Mobile', related='partner_id.mobile')
name = fields.Char('Sponsor Name', compute='_compute_name', readonly=False, store=True)
email = fields.Char('Sponsor Email', compute='_compute_email', readonly=False, store=True)
phone = fields.Char('Sponsor Phone', compute='_compute_phone', readonly=False, store=True)
mobile = fields.Char('Sponsor Mobile', compute='_compute_mobile', readonly=False, store=True)
# image
image_512 = fields.Image(
string="Logo", max_width=512, max_height=512,
compute='_compute_image_512', readonly=False, store=True)
image_256 = fields.Image("Image 256", related="image_512", max_width=256, max_height=256, store=False)
image_128 = fields.Image("Image 128", related="image_512", max_width=128, max_height=128, store=False)
website_image_url = fields.Char(
string='Image URL',
compute='_compute_website_image_url', compute_sudo=True, store=False)
@api.depends('partner_id')
def _compute_url(self):
for sponsor in self:
if sponsor.partner_id.website or not sponsor.url:
sponsor.url = sponsor.partner_id.website
@api.depends('partner_id')
def _compute_name(self):
self._synchronize_with_partner('name')
@api.depends('partner_id')
def _compute_email(self):
self._synchronize_with_partner('email')
@api.depends('partner_id')
def _compute_phone(self):
self._synchronize_with_partner('phone')
@api.depends('partner_id')
def _compute_mobile(self):
self._synchronize_with_partner('mobile')
@api.depends('partner_id')
def _compute_image_512(self):
self._synchronize_with_partner('image_512')
@api.depends('image_256', 'partner_id.image_256')
def _compute_website_image_url(self):
for sponsor in self:
if sponsor.image_256:
sponsor.website_image_url = self.env['website'].image_url(sponsor, 'image_256', size=256)
elif sponsor.partner_id.image_256:
sponsor.website_image_url = self.env['website'].image_url(sponsor.partner_id, 'image_256', size=256)
else:
sponsor.website_image_url = get_resource_path('website_event_track', 'static/src/img', 'event_sponsor_default_%d.png' % (sponsor.id % 1))
def _synchronize_with_partner(self, fname):
""" Synchronize with partner if not set. Setting a value does not write
on partner as this may be event-specific information. """
for sponsor in self:
if not sponsor[fname]:
sponsor[fname] = sponsor.partner_id[fname]
# ------------------------------------------------------------
# MESSAGING
# ------------------------------------------------------------
def _message_get_suggested_recipients(self):
recipients = super(Sponsor, self)._message_get_suggested_recipients()
for sponsor in self:
if sponsor.partner_id:
sponsor._message_add_suggested_recipient(
recipients,
partner=sponsor.partner_id,
reason=_('Sponsor')
)
return recipients
@@ -6,10 +6,6 @@ access_event_track_tag_manager,event.track.tag manager,model_event_track_tag,eve
access_event_track_location_public,event.track.location public,model_event_track_location,,1,0,0,0
access_event_track_location_manager,event.track.location manager,model_event_track_location,event.group_event_manager,1,1,1,1
access_event_track__public,event.track.public,model_event_track,,1,0,0,0
access_event_track_sponsor_type_manager,event.track.sponsor.type.public,model_event_sponsor_type,event.group_event_manager,1,1,1,1
access_event_track_sponsor_type_public,event.track.sponsor.type.public,model_event_sponsor_type,,1,0,0,0
access_event_track_sponsor_manager,event.track.sponsor.type.public,model_event_sponsor,event.group_event_manager,1,1,1,1
access_event_track_sponsor_public,event.track.sponsor.public,model_event_sponsor,,1,0,0,0
access_event_track_stage_all,event.track.stage.all,model_event_track_stage,,1,0,0,0
access_event_track_stage_event_manager,event.track.stage.event.manager,model_event_track_stage,event.group_event_manager,1,1,1,1
event_track_visitor_access_all,event.track.visitor.access.all,model_event_track_visitor,,0,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
6 access_event_track_location_public event.track.location public model_event_track_location 1 0 0 0
7 access_event_track_location_manager event.track.location manager model_event_track_location event.group_event_manager 1 1 1 1
8 access_event_track__public event.track.public model_event_track 1 0 0 0
access_event_track_sponsor_type_manager event.track.sponsor.type.public model_event_sponsor_type event.group_event_manager 1 1 1 1
access_event_track_sponsor_type_public event.track.sponsor.type.public model_event_sponsor_type 1 0 0 0
access_event_track_sponsor_manager event.track.sponsor.type.public model_event_sponsor event.group_event_manager 1 1 1 1
access_event_track_sponsor_public event.track.sponsor.public model_event_sponsor 1 0 0 0
9 access_event_track_stage_all event.track.stage.all model_event_track_stage 1 0 0 0
10 access_event_track_stage_event_manager event.track.stage.event.manager model_event_track_stage event.group_event_manager 1 1 1 1
11 event_track_visitor_access_all event.track.visitor.access.all model_event_track_visitor 0 0 0 0
@@ -1,82 +0,0 @@
.o_wevent_event .o_wevent_sponsor {
position: relative;
display: inline-block;
overflow: hidden;
}
.o_wevent_event .o_ribbon {
font: 12px Sans-Serif;
color: #404040;
padding-top: 2px;
padding-bottom: 2px;
-webkit-box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.3);
-moz-box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.3);
box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.3);
}
.o_wevent_event .ribbon_Gold {
background-color: #FDE21B;
background-image: -webkit-gradient(linear, left top, left bottom, from(#E9CE0C), to(#FDE21B));
background-image: -webkit-linear-gradient(top, #E9CE0C, #FDE21B);
background-image: -moz-linear-gradient(top, #E9CE0C, #FDE21B);
background-image: -ms-linear-gradient(top, #E9CE0C, #FDE21B);
background-image: -o-linear-gradient(top, #E9CE0C, #FDE21B);
}
.o_wevent_event .ribbon_Silver {
background-color: #CCCCCC;
background-image: -webkit-gradient(linear, left top, left bottom, from(#BBBBBB), to(#CCCCCC));
background-image: -webkit-linear-gradient(top, #BBBBBB, #CCCCCC);
background-image: -moz-linear-gradient(top, #BBBBBB, #CCCCCC);
background-image: -ms-linear-gradient(top, #BBBBBB, #CCCCCC);
background-image: -o-linear-gradient(top, #BBBBBB, #CCCCCC);
}
.o_wevent_event .ribbon_Bronze {
background-color: #DB9141;
background-image: -webkit-gradient(linear, left top, left bottom, from(#C2792A), to(#DB9141));
background-image: -webkit-linear-gradient(top, #C2792A, #DB9141);
background-image: -moz-linear-gradient(top, #C2792A, #DB9141);
background-image: -ms-linear-gradient(top, #C2792A, #DB9141);
background-image: -o-linear-gradient(top, #C2792A, #DB9141);
}
.o_wevent_event .event_color_0 {
background-color: white;
color: #5a5a5a;
}
.o_wevent_event .event_color_1 {
background-color: #cccccc;
color: #424242;
}
.o_wevent_event .event_color_2 {
background-color: #ffc7c7;
color: #7a3737;
}
.o_wevent_event .event_color_3 {
background-color: #fff1c7;
color: #756832;
}
.o_wevent_event .event_color_4 {
background-color: #e3ffc7;
color: #5d6937;
}
.o_wevent_event .event_color_5 {
background-color: #c7ffd5;
color: #1a7759;
}
.o_wevent_event .event_color_6 {
background-color: #c7ffff;
color: #1a5d83;
}
.o_wevent_event .event_color_7 {
background-color: #c7d5ff;
color: #3b3e75;
}
.o_wevent_event .event_color_8 {
background-color: #e3c7ff;
color: #4c3668;
}
.o_wevent_event .event_color_9 {
background-color: #ffc7f1;
color: #6d2c70;
}
@@ -1,9 +1,3 @@
// small hack to hide sponsors on specific views
.o_wevent_hide_sponsors .container.mt32.mb16.d-none.d-md-block.d-print-none {
// Not a very accurate way to target the 'sponsors' block -> improve in master
display: none !important;
}
/*
* EVENT TOOL: REMINDER WIDGET
*/
@@ -183,59 +177,6 @@
}
}
/*
* EVENT TOOL: SPONSOR WIDGET
*/
.o_wevent_event .o_wevent_sponsor_card {
position: relative;
width: 100px;
height: 100px;
border: 1px solid $gray-200;
background-color: $white;
margin: 0 -1px -1px 0;
.ribbon-wrapper {
width: 50px;
height: 50px;
}
.ribbon {
font: bold 10px Sans-Serif;
padding: 2px 0;
top: 10px;
width: 70px;
background-image: none; // not needed if colors for ribbons (Gold,Silver,Bronze) is removed in website_event_track.css
&.ribbon_Gold {
background-color: #e3aa24;
color:$white;
}
&.ribbon_Silver {
background-color: #adb5bd;
color: $white;
}
&.ribbon_Bronze {
background-color: #c7632a;
color: $white;
}
}
&:before {
content: "";
display: block;
@include o-position-absolute(0,0,0,0);
background-color: $black;
opacity: 0;
transition: opacity .3s;
}
&:hover:before {
opacity:.1;
}
}
/*
* EVENT TOOL: DATE
*/
@@ -1,7 +1,6 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import common
from . import test_track_internals
from . import test_website
from . import test_website_event
@@ -6,10 +6,10 @@ from unittest.mock import patch
from odoo import fields
from odoo.addons.website.models.website_visitor import WebsiteVisitor
from odoo.addons.website_event_track.tests.common import TestEventTrackOnlineCommon
from odoo.addons.website_event.tests.common import TestEventOnlineCommon
class TestTrackSuggestions(TestEventTrackOnlineCommon):
class TestTrackSuggestions(TestEventOnlineCommon):
def test_track_suggestion(self):
[location_1, location_2] = self.env['event.track.location'].create([
@@ -15,7 +15,7 @@ class TestEventWebsiteTrack(TestWebsiteEventCommon):
@users('user_eventmanager')
def test_create_menu(self):
event = self.env['event.event'].create({
vals = {
'name': 'TestEvent',
'date_begin': fields.Datetime.to_string(datetime.today() + timedelta(days=1)),
'date_end': fields.Datetime.to_string(datetime.today() + timedelta(days=15)),
@@ -27,13 +27,17 @@ class TestEventWebsiteTrack(TestWebsiteEventCommon):
'community_menu': True,
'website_track': True,
'website_track_proposal': True,
})
}
if 'exhibitor_menu' in self.env['event.event']:
vals['exhibitor_menu'] = False
event = self.env['event.event'].create(vals)
self._assert_website_menus(event)
@users('user_event_web_manager')
def test_menu_management_frontend(self):
event = self.env['event.event'].create({
vals = {
'name': 'TestEvent',
'date_begin': fields.Datetime.to_string(datetime.today() + timedelta(days=1)),
'date_end': fields.Datetime.to_string(datetime.today() + timedelta(days=15)),
@@ -41,7 +45,11 @@ class TestEventWebsiteTrack(TestWebsiteEventCommon):
'community_menu': True,
'website_track': True,
'website_track_proposal': True,
})
}
if 'exhibitor_menu' in self.env['event.event']:
vals['exhibitor_menu'] = False
event = self.env['event.event'].create(vals)
self.assertTrue(event.website_track)
self.assertTrue(event.website_track_proposal)
self._assert_website_menus(event)
@@ -81,10 +89,14 @@ class TestEventWebsiteTrack(TestWebsiteEventCommon):
'website_menu': False,
})
self.assertFalse(event.menu_id)
event.write({
vals = {
'website_menu': True,
'community_menu': True,
'website_track': True,
'website_track_proposal': True,
})
}
if 'exhibitor_menu' in self.env['event.event']:
vals['exhibitor_menu'] = False
event.write(vals)
self._assert_website_menus(event)
@@ -3,7 +3,6 @@
<template id="assets_frontend" inherit_id="website.assets_frontend" name="Website Event Track Assets">
<xpath expr="//link[last()]" position="after">
<link rel="stylesheet" href="/website_event_track/static/src/css/website_event_track.css"/>
<link rel="stylesheet" type="text/scss" href="/website_event_track/static/src/scss/event_track_templates.scss"/>
<link rel="stylesheet" type="text/scss" href="/website_event_track/static/src/scss/event_track_templates_online.scss"/>
<link rel="stylesheet" type="text/scss" href="/website_event_track/static/src/scss/pwa_frontend.scss"/>
@@ -15,12 +15,6 @@
context="{'default_date': date_begin}">
<field name="track_count" string="Tracks" widget="statinfo"/>
</button>
<button name="%(event_sponsor_action_from_event)d"
type="action"
class="oe_stat_button"
icon="fa-black-tie">
<field name="sponsor_count" string="Sponsors" widget="statinfo"/>
</button>
</xpath>
<xpath expr="//field[@name='website_menu']" position="after">
<label for="website_track" string="Showcase Tracks"/>
@@ -38,7 +32,6 @@
<field name="arch" type="xml">
<field name="stage_id" position="after">
<field name="track_count" readonly="1" optional="hide"/>
<field name="sponsor_count" readonly="1" optional="hide"/>
</field>
</field>
</record>
@@ -46,11 +46,4 @@
parent="event.menu_event_configuration"
groups="base.group_no_one"/>
<menuitem id="menu_event_sponsor_type"
name="Sponsor Types"
action="event_sponsor_type_action"
parent="event.menu_event_configuration"
groups="base.group_no_one"
sequence="40"/>
</data></odoo>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Chatter templates -->
<template id="event_track_template_new">
<p>New track proposal <a href="#" t-att-data-oe-model="track._name" t-att-data-oe-id="track.id"> <t t-esc="track.name"/></a></p>
<ul>
<li><b>Proposed By</b>: <t t-esc="track.partner_name or track.partner_email"/></li>
<li><b>Mail</b>: <a t-attf-href="mailto:#{track.partner_email}"><t t-esc="track.partner_email"/></a></li>
<li><b>Phone</b>: <t t-esc="track.partner_phone"/></li>
<li><b>Speakers Biography</b>: <div t-field="track.partner_biography"/></li>
<li><b>Talk Introduction</b>: <div t-field="track.description"/></li>
</ul>
</template>
</odoo>
@@ -1,71 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="website_event_track.event_7_sponsor_0" model="event.sponsor">
<field name="is_published" eval="True"/>
<field name="subtitle">Catchy sentence !</field>
<field name="is_exhibitor" eval="False"/>
</record>
<record id="website_event_track.event_7_sponsor_1" model="event.sponsor">
<field name="is_published" eval="True"/>
<field name="subtitle">You won't believe this sponsor</field>
<field name="is_exhibitor" eval="False"/>
</record>
<record id="website_event_track.event_7_sponsor_2" model="event.sponsor">
<field name="is_published" eval="True"/>
<field name="subtitle">Honestly we are good</field>
<field name="is_exhibitor" eval="True"/>
<field name="room_name">gemini-furniture</field>
<field name="room_max_capacity">12</field>
</record>
<record id="website_event_track.event_7_sponsor_3" model="event.sponsor">
<field name="is_published" eval="True"/>
<field name="subtitle">Catchy sentence !</field>
<field name="is_exhibitor" eval="True"/>
<field name="room_name">ready-mat</field>
<field name="room_max_capacity">12</field>
</record>
<record id="website_event_track.event_7_sponsor_4" model="event.sponsor">
<field name="is_published" eval="True"/>
<field name="subtitle">You won't believe this sponsor</field>
<field name="is_exhibitor" eval="True"/>
<field name="room_name">the-jackson-group</field>
<field name="room_max_capacity">12</field>
</record>
<record id="website_event_track.event_7_sponsor_5" model="event.sponsor">
<field name="is_published" eval="True"/>
<field name="subtitle">Honestly we are good</field>
<field name="is_exhibitor" eval="True"/>
<field name="room_name">azure-interior</field>
<field name="room_max_capacity">12</field>
</record>
<record id="website_event_track.event_7_sponsor_6" model="event.sponsor">
<field name="is_published" eval="True"/>
<field name="subtitle">You won't believe this sponsor</field>
<field name="is_exhibitor" eval="True"/>
<field name="room_name">bloem-flower</field>
<field name="room_max_capacity">12</field>
</record>
<record id="website_event_track.event_7_sponsor_7" model="event.sponsor">
<field name="is_published" eval="True"/>
<field name="subtitle">Honestly we are good</field>
<field name="is_exhibitor" eval="True"/>
<field name="room_name">open-wood</field>
<field name="room_max_capacity">12</field>
</record>
<record id="website_event_track.event_7_sponsor_8" model="event.sponsor">
<field name="is_published" eval="True"/>
<field name="subtitle">You won't believe this sponsor</field>
<field name="is_exhibitor" eval="True"/>
<field name="room_name">tree-dealers</field>
<field name="room_max_capacity">12</field>
</record>
<record id="website_event_track.event_7_sponsor_9" model="event.sponsor">
<field name="is_published" eval="True"/>
<field name="subtitle">Honestly we are good</field>
<field name="is_exhibitor" eval="True"/>
<field name="room_name">pterocarpus</field>
<field name="room_max_capacity">12</field>
</record>
</odoo>
@@ -1,2 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
chat_room_access_event_manager,chat.room.access.event.manager,website_jitsi.model_chat_room,event.group_event_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 chat_room_access_event_manager chat.room.access.event.manager website_jitsi.model_chat_room event.group_event_manager 1 1 1 1
@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="assets_frontend" inherit_id="website.assets_frontend" name="Event Exhibitor Assets Frontend">
<xpath expr="//link[last()]" position="after">
<link rel="stylesheet" type="text/scss" href="/website_event_track_exhibitor/static/src/scss/event_exhibitor_templates.scss"/>
</xpath>
<xpath expr="//script[last()]" position="after">
<script type="text/javascript" src="/website_event_track_exhibitor/static/src/js/event_exhibitor_connect.js"></script>
</xpath>
</template>
</odoo>
@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="event_event_view_form" model="ir.ui.view">
<field name="name">event.event.view.form.inherit.exhibitor</field>
<field name="inherit_id" ref="website_event_track.event_event_view_form"/>
<field name="model">event.event</field>
<field name="priority" eval="3"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='website_track_proposal']" position="after">
<label for="exhibitor_menu"/>
<field name="exhibitor_menu"/>
</xpath>
</field>
</record>
</odoo>
@@ -1,114 +0,0 @@
<?xml version="1.0"?>
<odoo>
<record id="event_sponsor_view_search" model="ir.ui.view">
<field name="name">event.sponsor.view.search.inherit.exhibitor</field>
<field name="model">event.sponsor</field>
<field name="inherit_id" ref="website_event_track.event_sponsor_view_search"/>
<field name="arch" type="xml">
<xpath expr="//filter[@name='archived']" position="after">
<separator/>
<filter string="Exhibitor" name="filter_is_exhibitor" domain="[('is_exhibitor', '=', True)]"/>
</xpath>
</field>
</record>
<record id="event_sponsor_view_tree" model="ir.ui.view">
<field name="name">event.sponsor.view.tree.inherit.exhibitor</field>
<field name="model">event.sponsor</field>
<field name="inherit_id" ref="website_event_track.event_sponsor_view_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='sponsor_type_id']" position="after">
<field name="is_published" optional="show"/>
<field name="is_exhibitor"/>
</xpath>
</field>
</record>
<record id="event_sponsor_view_kanban" model="ir.ui.view">
<field name="name">event.sponsor.view.kanban.inherit.kanban</field>
<field name="model">event.sponsor</field>
<field name="inherit_id" ref="website_event_track.event_sponsor_view_kanban"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='partner_id']" position="replace">
<field name="name"/>
</xpath>
</field>
</record>
<record id="event_sponsor_view_form" model="ir.ui.view">
<field name="name">event.sponsor.view.form.inherit.exhibitor</field>
<field name="model">event.sponsor</field>
<field name="inherit_id" ref="website_event_track.event_sponsor_view_form"/>
<field name="arch" type="xml">
<xpath expr="//widget[@name='web_ribbon']" position="before">
<div class="oe_button_box" name="button_box">
<field name="website_url" invisible="1"/>
<field name="is_published" widget="website_redirect_button"/>
</div>
</xpath>
<xpath expr="//h1" position="after">
<div class="oe_title">
<label for="subtitle" class="oe_edit_only"/>
<field name="subtitle" placeholder="e.g. : Your best choice for your home"/>
</div>
</xpath>
<xpath expr="//field[@name='sponsor_type_id']" position="after">
<field name="is_exhibitor"/>
</xpath>
<xpath expr="//field[@name='mobile']" position="after">
<label for="hour_from" string="Opening Hours"/>
<div class="o_row">
<field name="hour_from" widget="float_time" nolabel="1" class="oe_inline"/>
<i class="fa fa-long-arrow-right mx-2" aria-label="Arrow icon" title="Arrow"/>
<field name="hour_to" widget="float_time" nolabel="1" class="oe_inline"/>
<field name="event_date_tz" nolabel="1" class="oe_inline"/>
</div>
</xpath>
<xpath expr="//sheet/group" position="after">
<notebook>
<page string="Description">
<group>
<field name="website_description" nolabel="1"/>
</group>
</page>
<page string="Exhibitor" attrs="{'invisible': [('is_exhibitor', '=', False)]}">
<group>
<group>
<field name="room_name" attrs="{'required': [('is_exhibitor', '=', True)]}" string="Jitsi Name"/>
<field name="room_lang_id"/>
<field name="room_max_capacity" attrs="{'required': [('is_exhibitor', '=', True)]}"/>
<field name="chat_room_id" groups="base.group_no_one"/>
</group>
</group>
</page>
</notebook>
</xpath>
</field>
</record>
<record id="event_sponsor_action" model="ir.actions.act_window">
<field name="name">Event Sponsors</field>
<field name="res_model">event.sponsor</field>
<field name="view_mode">kanban,tree,form</field>
<field name="help" type="html">
<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.
</p>
</field>
</record>
<record id="website_event_track.event_sponsor_action_from_event" model="ir.actions.act_window">
<field name="help" type="html">
<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.
</p>
</field>
</record>
</odoo>