[IMP] sitemap cleaning: events
[odoo/odoo.git] / addons / website_event_track / controllers / event.py
1 # -*- coding: utf-8 -*-
2 ##############################################################################
3 #
4 #    OpenERP, Open Source Management Solution
5 #    Copyright (C) 2013-Today OpenERP SA (<http://www.openerp.com>).
6 #
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.
11 #
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.
16 #
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/>.
19 #
20 ##############################################################################
21
22 import openerp
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
26 import datetime
27
28 import re
29 import werkzeug.utils
30
31 controllers = controllers()
32 import pytz
33 from pytz import timezone
34
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)
42
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, [])
49
50         forcetr = True
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, [])
56
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)
67
68             # Add event
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]
73         return {
74             'locations': locations,
75             'dates': dates
76         }
77
78
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)))
84
85         days = {}
86         days_nbr = {}
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)
91
92         for d in days:
93             days_nbr[d] = len(days[d])
94             days[d] = self._prepare_calendar(event, days[d])
95
96         return request.website.render("website_event_track.agenda", {
97             'event': event,
98             'days': days,
99             'days_nbr': days_nbr,
100             'tag': tag
101         })
102
103     @http.route([
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):
108         searches = {}
109         if tag:
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)
115         else:
116             tracks = event.track_ids
117
118         def html2text(html):
119             return re.sub(r'<[^>]+>', "", html)
120
121         values = {
122             'event': event,
123             'main_object': event,
124             'tracks': tracks,
125             'tags': event.tracks_tag_ids,
126             'searches': searches,
127             'html2text': html2text
128         }
129         return request.website.render("website_event_track.tracks", values)
130
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)
135
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
139
140         tobj = request.registry['event.track']
141
142         tags = []
143         for tag in event.allowed_track_tag_ids:
144             if post.get('tag_'+str(tag.id)):
145                 tags.append(tag.id)
146
147         e = werkzeug.utils.escape
148         track_description = '''<section data-snippet-id="text-block">
149     <div class="container">
150         <div class="row">
151             <div class="col-md-12 text-center">
152                 <h2>%s</h2>
153             </div>
154             <div class="col-md-12">
155                 <p>%s</p>
156             </div>
157             <div class="col-md-12">
158                 <h3>About The Author</h3>
159                 <p>%s</p>
160             </div>
161         </div>
162     </div>
163 </section>''' % (e(post['track_name']), 
164             e(post['description']), e(post['biography']))
165
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)],
170             'user_id': False,
171             'description': track_description
172         }, context=context)
173
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)
178
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)