[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:
@@ -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',
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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',
|
||||
],
|
||||
|
||||
+46
-2
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
+7
-4
@@ -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',
|
||||
+11
-6
@@ -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>
|
||||
+46
@@ -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>
|
||||
+1
@@ -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
|
||||
+10
@@ -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:
|
||||
+106
-18
@@ -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
|
||||
+2
-2
@@ -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
|
||||
|
+3
-3
@@ -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 |
+2
-2
@@ -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
|
||||
+1
-1
@@ -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;
|
||||
}
|
||||
}
|
||||
+3
-2
@@ -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,
|
||||
+3
-3
@@ -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>
|
||||
+22
-19
@@ -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"/>
|
||||
+21
-11
@@ -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>
|
||||
+78
-19
@@ -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>
|
||||
-18
@@ -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>
|
||||
@@ -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,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,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>
|
||||
Reference in New Issue
Block a user