1 # -*- coding: utf-8 -*-
2 ##############################################################################
4 # OpenERP, Open Source Management Solution
5 # Copyright (C) 2013-Today OpenERP SA (<http://www.openerp.com>).
7 # This program is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as
9 # published by the Free Software Foundation, either version 3 of the
10 # License, or (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
20 ##############################################################################
23 from openerp.addons.web import http
24 from openerp.addons.web.http import request
25 from openerp.addons.website.controllers.main import Website as controllers
31 controllers = controllers()
33 from pytz import timezone
35 class website_event(http.Controller):
36 @http.route(['''/event/<model("event.event"):event>/track/<model("event.track", "[('event_id','=',event[0])]"):track>'''], type='http', auth="public", website=True, multilang=True)
37 def event_track_view(self, event, track, **post):
38 track_obj = request.registry.get('event.track')
39 track = track_obj.browse(request.cr, openerp.SUPERUSER_ID, track.id, context=request.context)
40 values = { 'track': track, 'event': track.event_id, 'main_object': track }
41 return request.website.render("website_event_track.track_view", values)
43 def _prepare_calendar(self, event, event_track_ids):
44 local_tz = pytz.timezone(event.timezone_of_event or 'UTC')
45 locations = {} # { location: [track, start_date, end_date, rowspan]}
46 dates = [] # [ (date, {}) ]
47 for track in event_track_ids:
48 locations.setdefault(track.location_id or False, [])
51 for track in event_track_ids:
52 start_date = (datetime.datetime.strptime(track.date, '%Y-%m-%d %H:%M:%S')).replace(tzinfo=pytz.utc).astimezone(local_tz)
53 end_date = start_date + datetime.timedelta(hours = (track.duration or 30))
54 location = track.location_id or False
55 locations.setdefault(location, [])
57 # New TR, align all events
58 if forcetr or (start_date>dates[-1][0]) or not location:
59 dates.append((start_date, {}, bool(location)))
60 for loc in locations.keys():
61 if locations[loc] and (locations[loc][-1][2] > start_date):
62 locations[loc][-1][3] += 1
63 elif not locations[loc] or locations[loc][-1][2] < start_date:
64 locations[loc].append([False, locations[loc] and locations[loc][-1][2] or dates[0][0], start_date, 1])
65 dates[-1][1][loc] = locations[loc][-1]
66 forcetr = not bool(location)
69 if locations[location] and locations[location][-1][1] > start_date:
70 locations[location][-1][3] -= 1
71 locations[location].append([track, start_date, end_date, 1])
72 dates[-1][1][location] = locations[location][-1]
74 'locations': locations,
79 # TODO: not implemented
80 @http.route(['''/event/<model("event.event", "[('show_tracks','=',1)]"):event>/agenda'''], type='http', auth="public", website=True, multilang=True)
81 def event_agenda(self, event, tag=None, **post):
82 comp = lambda x: (x.date, bool(x.location_id))
83 event.track_ids.sort(lambda x,y: cmp(comp(x), comp(y)))
87 for track in event.track_ids:
88 if not track.date: continue
89 days.setdefault(track.date[:10], [])
90 days[track.date[:10]].append(track)
93 days_nbr[d] = len(days[d])
94 days[d] = self._prepare_calendar(event, days[d])
96 return request.website.render("website_event_track.agenda", {
104 '''/event/<model("event.event", "[('show_tracks','=',1)]"):event>/track''',
105 '''/event/<model("event.event", "[('show_tracks','=',1)]"):event>/track/tag/<model("event.track.tag"):tag>'''
106 ], type='http', auth="public", website=True, multilang=True)
107 def event_tracks(self, event, tag=None, **post):
110 searches.update(tag=tag.id)
111 track_obj = request.registry.get('event.track')
112 track_ids = track_obj.search(request.cr, request.uid,
113 [("id", "in", [track.id for track in event.track_ids]), ("tag_ids", "=", tag.id)], context=request.context)
114 tracks = track_obj.browse(request.cr, request.uid, track_ids, context=request.context)
116 tracks = event.track_ids
119 return re.sub(r'<[^>]+>', "", html)
123 'main_object': event,
125 'tags': event.tracks_tag_ids,
126 'searches': searches,
127 'html2text': html2text
129 return request.website.render("website_event_track.tracks", values)
131 @http.route(['''/event/<model("event.event", "[('show_track_proposal','=',1)]"):event>/track_proposal'''], type='http', auth="public", website=True, multilang=True)
132 def event_track_proposal(self, event, **post):
133 values = { 'event': event }
134 return request.website.render("website_event_track.event_track_proposal", values)
136 @http.route(['/event/<model("event.event"):event>/track_proposal/post'], type='http', auth="public", methods=['POST'], website=True, multilang=True)
137 def event_track_proposal_post(self, event, **post):
138 cr, uid, context = request.cr, request.uid, request.context
140 tobj = request.registry['event.track']
143 for tag in event.allowed_track_tag_ids:
144 if post.get('tag_'+str(tag.id)):
147 e = werkzeug.utils.escape
148 track_description = '''<section data-snippet-id="text-block">
149 <div class="container">
151 <div class="col-md-12 text-center">
154 <div class="col-md-12">
157 <div class="col-md-12">
158 <h3>About The Author</h3>
163 </section>''' % (e(post['track_name']),
164 e(post['description']), e(post['biography']))
166 track_id = tobj.create(cr, openerp.SUPERUSER_ID, {
167 'name': post['track_name'],
168 'event_id': event.id,
169 'tag_ids': [(6, 0, tags)],
171 'description': track_description
174 tobj.message_post(cr, openerp.SUPERUSER_ID, [track_id], body="""Proposed By: %s<br/>
175 Mail: <a href="mailto:%s">%s</a><br/>
176 Phone: %s""" % (e(post['partner_name']), e(post['email_from']),
177 e(post['email_from']), e(post['phone'])), context=context)
179 track = tobj.browse(cr, uid, track_id, context=context)
180 values = {'track': track, 'event':event}
181 return request.website.render("website_event_track.event_track_proposal_success", values)