Depending on the location, on the website different timezone were used to display tracks: - in `Agenda` day date (as of saas-14): the current user timezone - in `Agenda` track times: the event timezone - in `Talks` subtitle: the event timezone - in `Talks` tracks: the current user timezone - in a track page: the first user (admin) timezone With this change in all those instance the event timezone is used. There is still a usability hindrance in the backend: the timezone used when encoding track or event datetime is the browser timezone. So if the browser is GMT+2 and the event is GMT+6, encoding a 4h00 time would save it as 2h00 (in UTC) and display it on the website as 8h00. This would make sense to encode these datetime in user timezone but currently there is no framework option to do it. opw-805358 closes #22427
138 lines
6.2 KiB
Python
138 lines
6.2 KiB
Python
# -*- coding: utf-8 -*-
|
||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||
|
||
import collections
|
||
import datetime
|
||
import pytz
|
||
|
||
from odoo import fields, http
|
||
from odoo.http import request
|
||
from odoo.tools import html_escape as escape, html2plaintext
|
||
|
||
|
||
class WebsiteEventTrackController(http.Controller):
|
||
|
||
@http.route(['''/event/<model("event.event"):event>/track/<model("event.track", "[('event_id','=',event[0])]"):track>'''], type='http', auth="public", website=True)
|
||
def event_track_view(self, event, track, **post):
|
||
track = track.sudo().with_context(tz=event.date_tz or 'UTC')
|
||
values = {'track': track, 'event': track.event_id, 'main_object': track}
|
||
return request.render("website_event_track.track_view", values)
|
||
|
||
def _prepare_calendar(self, event, event_track_ids):
|
||
local_tz = pytz.timezone(event.date_tz or 'UTC')
|
||
locations = {} # { location: [track, start_date, end_date, rowspan]}
|
||
dates = [] # [ (date, {}) ]
|
||
for track in event_track_ids:
|
||
locations.setdefault(track.location_id or False, [])
|
||
|
||
forcetr = True
|
||
for track in event_track_ids:
|
||
start_date = fields.Datetime.from_string(track.date).replace(tzinfo=pytz.utc).astimezone(local_tz)
|
||
end_date = start_date + datetime.timedelta(hours=(track.duration or 0.5))
|
||
location = track.location_id or False
|
||
locations.setdefault(location, [])
|
||
|
||
# New TR, align all events
|
||
if forcetr or (start_date>dates[-1][0]) or not location:
|
||
dates.append((start_date, {}, bool(location)))
|
||
for loc in locations.keys():
|
||
if locations[loc] and (locations[loc][-1][2] > start_date):
|
||
locations[loc][-1][3] += 1
|
||
elif not locations[loc] or locations[loc][-1][2] <= start_date:
|
||
locations[loc].append([False, locations[loc] and locations[loc][-1][2] or dates[0][0], start_date, 1])
|
||
dates[-1][1][loc] = locations[loc][-1]
|
||
forcetr = not bool(location)
|
||
|
||
# Add event
|
||
if locations[location] and locations[location][-1][1] > start_date:
|
||
locations[location][-1][3] -= 1
|
||
locations[location].append([track, start_date, end_date, 1])
|
||
dates[-1][1][location] = locations[location][-1]
|
||
return {
|
||
'locations': locations,
|
||
'dates': dates
|
||
}
|
||
|
||
@http.route(['''/event/<model("event.event", "[('show_tracks','=',1)]"):event>/agenda'''], type='http', auth="public", website=True)
|
||
def event_agenda(self, event, tag=None, **post):
|
||
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: (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)
|
||
days_tracks[str(date)[:10]].append(track)
|
||
|
||
days = {}
|
||
days_tracks_count = {}
|
||
for day, tracks in days_tracks.iteritems():
|
||
days_tracks_count[day] = len(tracks)
|
||
days[day] = self._prepare_calendar(event, tracks)
|
||
|
||
speakers = {}
|
||
for track in event.sudo().track_ids:
|
||
speakers_name = u" – ".join(track.speaker_ids.mapped('name'))
|
||
speakers[track.id] = speakers_name
|
||
|
||
return request.render("website_event_track.agenda", {
|
||
'event': event,
|
||
'days': days,
|
||
'days_nbr': days_tracks_count,
|
||
'speakers': speakers,
|
||
'tag': tag
|
||
})
|
||
|
||
@http.route([
|
||
'''/event/<model("event.event", "[('show_tracks','=',1)]"):event>/track''',
|
||
'''/event/<model("event.event", "[('show_tracks','=',1)]"):event>/track/tag/<model("event.track.tag"):tag>'''
|
||
], type='http', auth="public", website=True)
|
||
def event_tracks(self, event, tag=None, **post):
|
||
event = event.with_context(tz=event.date_tz or 'UTC')
|
||
searches = {}
|
||
if tag:
|
||
searches.update(tag=tag.id)
|
||
tracks = event.track_ids.filtered(lambda track: tag in track.tag_ids)
|
||
else:
|
||
tracks = event.track_ids
|
||
|
||
values = {
|
||
'event': event,
|
||
'main_object': event,
|
||
'tracks': tracks,
|
||
'tags': event.tracks_tag_ids,
|
||
'searches': searches,
|
||
'html2plaintext': html2plaintext
|
||
}
|
||
return request.render("website_event_track.tracks", values)
|
||
|
||
@http.route(['''/event/<model("event.event", "[('show_track_proposal','=',1)]"):event>/track_proposal'''], type='http', auth="public", website=True)
|
||
def event_track_proposal(self, event, **post):
|
||
return request.render("website_event_track.event_track_proposal", {'event': event})
|
||
|
||
@http.route(['/event/<model("event.event"):event>/track_proposal/post'], type='http', auth="public", methods=['POST'], website=True)
|
||
def event_track_proposal_post(self, event, **post):
|
||
tags = []
|
||
for tag in event.allowed_track_tag_ids:
|
||
if post.get('tag_' + str(tag.id)):
|
||
tags.append(tag.id)
|
||
|
||
track = request.env['event.track'].sudo().create({
|
||
'name': post['track_name'],
|
||
'partner_name': post['partner_name'],
|
||
'partner_email': post['email_from'],
|
||
'partner_phone': post['phone'],
|
||
'partner_biography': escape(post['biography']),
|
||
'event_id': event.id,
|
||
'tag_ids': [(6, 0, tags)],
|
||
'user_id': False,
|
||
'description': escape(post['description'])
|
||
})
|
||
if request.env.user != request.website.user_id:
|
||
track.sudo().message_subscribe_users(user_ids=request.env.user.ids)
|
||
else:
|
||
partner = request.env['res.partner'].sudo().search([('email', '=', post['email_from'])])
|
||
if partner:
|
||
track.sudo().message_subscribe(partner_ids=partner.ids)
|
||
return request.render("website_event_track.event_track_proposal_success", {'track': track, 'event': event})
|