diff options
| author | Thibault Delavallée <tde@odoo.com> | 2020-07-14 09:41:35 +0000 |
|---|---|---|
| committer | Thibault Delavallée <tde@odoo.com> | 2020-08-04 14:28:29 +0000 |
| commit | 2f47bcf24b5f2535f15937b5ac63b5c617d6a261 (patch) | |
| tree | 3f2481175000281ab2d02b44eabe43babcdd161e | |
| parent | 64f08cc7ab123dc53f9b7bf0e8bd0cd530b74d23 (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>
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> |
