# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. import babel import babel.dates import collections import datetime import pytz import base64 from werkzeug.exceptions import NotFound from odoo import fields, http from odoo.http import request from odoo.tools import plaintext2html, 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, 'main_object': 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() or (tag and tag.color == 0): 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, 'main_object': 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': plaintext2html(post['biography']), 'event_id': event.id, 'tag_ids': [(6, 0, tags)], 'user_id': False, 'description': plaintext2html(post['description']), 'image': base64.b64encode(post['image'].read()) if post.get('image') else False }) 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", {'track': track, 'event': event})