# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. import babel import collections import datetime import pytz from werkzeug.exceptions import NotFound 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//track/dates[-1][0]) or not location: formatted_time = self._get_locale_time(start_date, lang_code) dates.append((start_date, {}, bool(location), formatted_time)) for loc in list(locations): 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] locations = collections.OrderedDict(sorted(locations.items(), key=lambda t: t[0].id if t[0] else 0)) return { 'locations': locations, 'dates': dates } @http.route(['''/event//agenda'''], type='http', auth="public", website=True, sitemap=False) def event_agenda(self, event, tag=None, **post): if not event.can_access_from_current_website(): raise NotFound() 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))): 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 = {} tracks_by_days = {} for day, tracks in days_tracks.items(): tracks_by_days[day] = tracks days[day] = self._prepare_calendar(event, tracks) return request.render("website_event_track.agenda", { 'event': event, 'days': days, 'tracks_by_days': tracks_by_days, 'tag': tag }) @http.route([ '''/event//track''', '''/event//track/tag/''' ], type='http', auth="public", website=True, sitemap=False) def event_tracks(self, event, tag=None, **post): if not event.can_access_from_current_website(): raise NotFound() 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//track_proposal'''], type='http', auth="public", website=True, sitemap=False) def event_track_proposal(self, event, **post): if not event.can_access_from_current_website(): raise NotFound() return request.render("website_event_track.event_track_proposal", {'event': event}) @http.route(['''/event//track_proposal/post'''], type='http', auth="public", methods=['POST'], website=True) def event_track_proposal_post(self, event, **post): if not event.can_access_from_current_website(): raise NotFound() 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(partner_ids=request.env.user.partner_id.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})