summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThibault Delavallée <tde@odoo.com>2020-07-14 09:41:35 +0000
committerThibault Delavallée <tde@odoo.com>2020-08-04 14:28:29 +0000
commit2f47bcf24b5f2535f15937b5ac63b5c617d6a261 (patch)
tree3f2481175000281ab2d02b44eabe43babcdd161e
parent64f08cc7ab123dc53f9b7bf0e8bd0cd530b74d23 (diff)
[IMP] website_event_track_online: improve track stage management + agenda based on tage
RATIONALE Events are sometimes held online, gathering a community. In this merge we improve Event application to better support full-online events with improved tracks, wishlists, chat rooms, ... PURPOSE Purpose of this commit is to be able to showcase tracks by announcing them before publishing them. People may see them before event managers encode all relevant informations and publish it. SPECIFICATIONS: ACCEPTED ON STAGE Add a is_accepted field on tracks stage model. Accepted tracks should be displayed on frontend (agenda, list view) without being available in complete view (no read access). Customers may see the track name and know what it will be about while event managers finish to encode details of the track itself. No field is added on track model for that. Using the stage itself is sufficient for what it does, aka allowing filtering in frontend. No need to add a column for that as it is not as important as published flag. SPECIFICATIONS: DONE STAGES -> PUBLISH When a track reaches a stage which "is_done" field is set, automatically publish it. It allows to manage agenda creation from backend * accepted -> display track on website for teasing purpose (agenda, track list), but not accessible to non event users; * done -> available to everyone, published; SPECIFIATIONS: AGENDA UPDATE Display accepted tracks even for customers; make them not clickable, only displayed. Manually crafting url for those tracks should still raise an error as they are not accessible. An accepted track is simply a track whose stage has is_accepted boolean flag set. LINKS Community PR #53540 Enterprise PR odoo/enterprise#11384 Task ID-2252655 (Main Online Event task) Task ID-2283796 (Event B2Basics / Registration Flow) Task ID-2299857 (Event Design Review) Task ID-2283735 (Talks -> Session upgrade) Co-Authored-By: Aurélien Warnon <awa@odoo.com> Co-Authored-By: David Beguin <dbe@odoo.com> Co-Authored-By: Thibault Delavallée <tde@odoo.com>
-rw-r--r--addons/website_event_track/controllers/main.py9
-rw-r--r--addons/website_event_track_online/__manifest__.py2
-rw-r--r--addons/website_event_track_online/controllers/event_track.py9
-rw-r--r--addons/website_event_track_online/data/event_track_stage_data.xml11
-rw-r--r--addons/website_event_track_online/models/__init__.py1
-rw-r--r--addons/website_event_track_online/models/event_track.py25
-rw-r--r--addons/website_event_track_online/models/event_track_stage.py13
-rw-r--r--addons/website_event_track_online/views/event_track_stage_views.xml28
-rw-r--r--addons/website_event_track_online/views/event_track_templates.xml22
9 files changed, 117 insertions, 3 deletions
diff --git a/addons/website_event_track/controllers/main.py b/addons/website_event_track/controllers/main.py
index 0fb3d3b6989..7618ecb3998 100644
--- a/addons/website_event_track/controllers/main.py
+++ b/addons/website_event_track/controllers/main.py
@@ -80,7 +80,8 @@ class WebsiteEventTrackController(http.Controller):
event = event.with_context(tz=event.date_tz or 'UTC')
local_tz = pytz.timezone(event.date_tz or 'UTC')
days_tracks = collections.defaultdict(lambda: [])
- for track in event.track_ids.sorted(lambda track: (bool(track.date), track.date, bool(track.location_id))):
+ event_track_ids = self._event_agenda_get_tracks(event)
+ for track in event_track_ids.sorted(lambda track: (bool(track.date), track.date, bool(track.location_id))):
if not track.date:
continue
date = fields.Datetime.from_string(track.date).replace(tzinfo=pytz.utc).astimezone(local_tz)
@@ -97,9 +98,13 @@ class WebsiteEventTrackController(http.Controller):
'main_object': event,
'days': days,
'tracks_by_days': tracks_by_days,
- 'tag': tag
+ 'tag': tag,
+ 'user_event_manager': request.env.user.has_group('event.group_event_manager'),
})
+ def _event_agenda_get_tracks(self, event):
+ return event.track_ids
+
@http.route([
'''/event/<model("event.event"):event>/track''',
'''/event/<model("event.event"):event>/track/tag/<model("event.track.tag"):tag>'''
diff --git a/addons/website_event_track_online/__manifest__.py b/addons/website_event_track_online/__manifest__.py
index c6de6027c8e..7b264ac5f51 100644
--- a/addons/website_event_track_online/__manifest__.py
+++ b/addons/website_event_track_online/__manifest__.py
@@ -16,11 +16,13 @@
'website_event_track',
],
'data': [
+ 'data/event_track_stage_data.xml',
'security/ir.model.access.csv',
'views/assets.xml',
'views/event_event_views.xml',
'views/event_sponsor_views.xml',
'views/event_templates_registration.xml',
+ 'views/event_track_stage_views.xml',
'views/event_track_templates_reminder.xml',
'views/event_track_templates.xml',
'views/event_track_templates_reminder.xml',
diff --git a/addons/website_event_track_online/controllers/event_track.py b/addons/website_event_track_online/controllers/event_track.py
index 5217765f3fc..675908b678f 100644
--- a/addons/website_event_track_online/controllers/event_track.py
+++ b/addons/website_event_track_online/controllers/event_track.py
@@ -4,10 +4,17 @@
from werkzeug.exceptions import Forbidden, NotFound
from odoo import exceptions, http
+from odoo.addons.website_event_track.controllers.main import WebsiteEventTrackController
from odoo.http import request
-class WebsiteEventTrackController(http.Controller):
+class EventTrackOnlineController(WebsiteEventTrackController):
+
+ def _event_agenda_get_tracks(self, event):
+ tracks_sudo = event.sudo().track_ids
+ if not request.env.user.has_group('event.group_event_manager'):
+ tracks_sudo = tracks_sudo.filtered(lambda track: track.is_published or track.stage_id.is_accepted)
+ return tracks_sudo
def _fetch_track(self, track_id, allow_is_accepted=False):
track = request.env['event.track'].browse(track_id).exists()
diff --git a/addons/website_event_track_online/data/event_track_stage_data.xml b/addons/website_event_track_online/data/event_track_stage_data.xml
new file mode 100644
index 00000000000..b9f12bf3b82
--- /dev/null
+++ b/addons/website_event_track_online/data/event_track_stage_data.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo><data noupdate="1">
+
+ <record id="website_event_track.event_track_stage2" model="event.track.stage">
+ <field name="is_accepted" eval="True"/>
+ </record>
+ <record id="website_event_track.event_track_stage3" model="event.track.stage">
+ <field name="is_accepted" eval="True"/>
+ </record>
+
+</data></odoo>
diff --git a/addons/website_event_track_online/models/__init__.py b/addons/website_event_track_online/models/__init__.py
index 7553bc67199..861f8ef1b00 100644
--- a/addons/website_event_track_online/models/__init__.py
+++ b/addons/website_event_track_online/models/__init__.py
@@ -5,5 +5,6 @@ from . import event_event
from . import event_sponsor
from . import event_track_visitor
from . import event_track
+from . import event_track_stage
from . import event_track_tag
from . import website_visitor
diff --git a/addons/website_event_track_online/models/event_track.py b/addons/website_event_track_online/models/event_track.py
index b6d0efbd852..131abf0ee2f 100644
--- a/addons/website_event_track_online/models/event_track.py
+++ b/addons/website_event_track_online/models/event_track.py
@@ -11,6 +11,8 @@ class Track(models.Model):
_name = "event.track"
_inherit = ['event.track']
+ # status management
+ is_accepted = fields.Boolean('Is Accepted', related='stage_id.is_accepted', readonly=True)
# speaker
partner_biography = fields.Html(
string='Biography', compute='_compute_partner_biography',
@@ -134,6 +136,29 @@ class Track(models.Model):
return [('id', 'in', track_visitors.track_id.ids)]
# ------------------------------------------------------------
+ # CRUD
+ # -----------------------------------------------------------
+
+ @api.model_create_multi
+ def create(self, vals_list):
+ tracks = super(Track, self).create(vals_list)
+
+ for track in tracks:
+ track._synchronize_with_stage(track.stage_id)
+
+ return tracks
+
+ def write(self, vals):
+ if vals.get('stage_id'):
+ stage = self.env['event.track.stage'].browse(vals['stage_id'])
+ self._synchronize_with_stage(stage)
+ return super(Track, self).write(vals)
+
+ def _synchronize_with_stage(self, stage):
+ if stage.is_done:
+ self.is_published = True
+
+ # ------------------------------------------------------------
# TOOLS
# ------------------------------------------------------------
diff --git a/addons/website_event_track_online/models/event_track_stage.py b/addons/website_event_track_online/models/event_track_stage.py
new file mode 100644
index 00000000000..c6e300e5b55
--- /dev/null
+++ b/addons/website_event_track_online/models/event_track_stage.py
@@ -0,0 +1,13 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import fields, models
+
+
+class TrackStage(models.Model):
+ _inherit = 'event.track.stage'
+
+ is_accepted = fields.Boolean(
+ string='Accepted Stage',
+ help='Accepted tracks are displayed in agenda views but not accessible.')
+ is_done = fields.Boolean(help='Done tracks are automatically published so that they are available in frontend.') \ No newline at end of file
diff --git a/addons/website_event_track_online/views/event_track_stage_views.xml b/addons/website_event_track_online/views/event_track_stage_views.xml
new file mode 100644
index 00000000000..9840a03cc8d
--- /dev/null
+++ b/addons/website_event_track_online/views/event_track_stage_views.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<odoo><data>
+
+ <record id="event_track_stage_view_form" model="ir.ui.view">
+ <field name="name">event.track.stage.view.form.inherit.online</field>
+ <field name="model">event.track.stage</field>
+ <field name="inherit_id" ref="website_event_track.event_track_stage_view_form"/>
+ <field name="arch" type="xml">
+ <xpath expr="//field[@name='is_done']" position="before">
+ <field name="is_accepted"/>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="event_track_stage_view_tree" model="ir.ui.view">
+ <field name="name">event.track.stage.view.tree.inherit.online</field>
+ <field name="model">event.track.stage</field>
+ <field name="inherit_id" ref="website_event_track.event_track_stage_view_tree"/>
+ <field name="arch" type="xml">
+ <xpath expr="//field[@name='name']" position="after">
+ <field name="is_accepted"/>
+ <field name="is_done"/>
+ <field name="is_cancel"/>
+ </xpath>
+ </field>
+ </record>
+
+</data></odoo>
diff --git a/addons/website_event_track_online/views/event_track_templates.xml b/addons/website_event_track_online/views/event_track_templates.xml
index 1d6c198eda0..4f65344227a 100644
--- a/addons/website_event_track_online/views/event_track_templates.xml
+++ b/addons/website_event_track_online/views/event_track_templates.xml
@@ -37,4 +37,26 @@
</xpath>
</template>
+<!-- Pimp agenda based on accepted / published -->
+<template id="agenda"
+ name="Track Online: Agenda"
+ inherit_id="website_event_track.agenda">
+ <xpath expr="//t[@name='track_agenda_track_cell']" position="replace">
+ <t t-if="track" name="track_agenda_track_cell">
+ <t t-if="user_event_manager or track.is_published">
+ <a t-attf-href="/event/#{ slug(event) }/track/#{ slug(track) }">
+ <span t-esc="track.name"/>
+ </a>
+ </t>
+ <t t-else="">
+ <span t-esc="track.name"/>
+ </t>
+ <div class="d-flex text-muted">
+ <small t-esc="track.partner_name or track.partner_id.name"/>
+ <span t-if="user_event_manager and not track.website_published" class=" ml-auto badge badge-danger">unpublished</span>
+ </div>
+ </t>
+ </xpath>
+</template>
+
</odoo>