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 datetime import datetime, timedelta
24 from dateutil.relativedelta import relativedelta
27 from werkzeug.exceptions import NotFound
29 from openerp import http
30 from openerp import tools
31 from openerp.http import request
32 from openerp.tools.translate import _
33 from openerp.addons.website.models.website import slug
35 class website_event(http.Controller):
36 @http.route(['/event', '/event/page/<int:page>'], type='http', auth="public", website=True)
37 def events(self, page=1, **searches):
38 cr, uid, context = request.cr, request.uid, request.context
39 event_obj = request.registry['event.event']
40 type_obj = request.registry['event.type']
41 country_obj = request.registry['res.country']
43 searches.setdefault('date', 'all')
44 searches.setdefault('type', 'all')
45 searches.setdefault('country', 'all')
50 return date.strftime('%Y-%m-%d 23:59:59')
52 return date.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)
53 today = datetime.today()
55 ['all', _('Next Events'), [("date_end", ">", sd(today))], 0],
56 ['today', _('Today'), [
57 ("date_end", ">", sd(today)),
58 ("date_begin", "<", sdn(today))],
60 ['week', _('This Week'), [
61 ("date_end", ">=", sd(today + relativedelta(days=-today.weekday()))),
62 ("date_begin", "<", sdn(today + relativedelta(days=6-today.weekday())))],
64 ['nextweek', _('Next Week'), [
65 ("date_end", ">=", sd(today + relativedelta(days=7-today.weekday()))),
66 ("date_begin", "<", sdn(today + relativedelta(days=13-today.weekday())))],
68 ['month', _('This month'), [
69 ("date_end", ">=", sd(today.replace(day=1))),
70 ("date_begin", "<", (today.replace(day=1) + relativedelta(months=1)).strftime('%Y-%m-%d 00:00:00'))],
72 ['nextmonth', _('Next month'), [
73 ("date_end", ">=", sd(today.replace(day=1) + relativedelta(months=1))),
74 ("date_begin", "<", (today.replace(day=1) + relativedelta(months=2)).strftime('%Y-%m-%d 00:00:00'))],
76 ['old', _('Old Events'), [
77 ("date_end", "<", today.strftime('%Y-%m-%d 00:00:00'))],
84 current_country = None
86 if searches["date"] == date[0]:
87 domain_search["date"] = date[2]
89 current_date = date[1]
90 if searches["type"] != 'all':
91 current_type = type_obj.browse(cr, uid, int(searches['type']), context=context)
92 domain_search["type"] = [("type", "=", int(searches["type"]))]
94 if searches["country"] != 'all' and searches["country"] != 'online':
95 current_country = country_obj.browse(cr, uid, int(searches['country']), context=context)
96 domain_search["country"] = ['|', ("country_id", "=", int(searches["country"])), ("country_id", "=", False)]
97 elif searches["country"] == 'online':
98 domain_search["country"] = [("country_id", "=", False)]
100 def dom_without(without):
101 domain = [('state', "in", ['draft','confirm','done'])]
102 for key, search in domain_search.items():
107 # count by domains without self search
110 date[3] = event_obj.search(
111 request.cr, request.uid, dom_without('date') + date[2],
112 count=True, context=request.context)
114 domain = dom_without('type')
115 types = event_obj.read_group(
116 request.cr, request.uid, domain, ["id", "type"], groupby="type",
117 orderby="type", context=request.context)
118 type_count = event_obj.search(request.cr, request.uid, domain,
119 count=True, context=request.context)
121 'type_count': type_count,
122 'type': ("all", _("All Categories"))
125 domain = dom_without('country')
126 countries = event_obj.read_group(
127 request.cr, request.uid, domain, ["id", "country_id"],
128 groupby="country_id", orderby="country_id", context=request.context)
129 country_id_count = event_obj.search(request.cr, request.uid, domain,
130 count=True, context=request.context)
131 countries.insert(0, {
132 'country_id_count': country_id_count,
133 'country_id': ("all", _("All Countries"))
136 step = 10 # Number of events per page
137 event_count = event_obj.search(
138 request.cr, request.uid, dom_without("none"), count=True,
139 context=request.context)
140 pager = request.website.pager(url="/event", total=event_count, page=page, step=step, scope=5)
142 order = 'website_published desc, date_begin'
143 if searches.get('date','all') == 'old':
144 order = 'website_published desc, date_begin desc'
145 obj_ids = event_obj.search(
146 request.cr, request.uid, dom_without("none"), limit=step,
147 offset=pager['offset'], order=order, context=request.context)
148 events_ids = event_obj.browse(request.cr, request.uid, obj_ids,
149 context=request.context)
152 'current_date': current_date,
153 'current_country': current_country,
154 'current_type': current_type,
155 'event_ids': events_ids,
158 'countries': countries,
160 'searches': searches,
161 'search_path': "?%s" % werkzeug.url_encode(searches),
164 return request.website.render("website_event.index", values)
166 @http.route(['/event/<model("event.event"):event>/page/<path:page>'], type='http', auth="public", website=True)
167 def event_page(self, event, page, **post):
174 page = 'website_event.%s' % page
177 request.website.get_template(page)
178 except ValueError, e:
182 return request.website.render(page, values)
184 @http.route(['/event/<model("event.event"):event>'], type='http', auth="public", website=True)
185 def event(self, event, **post):
186 if event.menu_id and event.menu_id.child_id:
187 target_url = event.menu_id.child_id[0].url
189 target_url = '/event/%s/register' % str(event.id)
190 if post.get('enable_editor') == '1':
191 target_url += '?enable_editor=1'
192 return request.redirect(target_url);
194 @http.route(['/event/<model("event.event"):event>/register'], type='http', auth="public", website=True)
195 def event_register(self, event, **post):
198 'main_object': event,
201 return request.website.render("website_event.event_description_full", values)
203 @http.route('/event/add_event', type='http', auth="user", methods=['POST'], website=True)
204 def add_event(self, event_name="New Event", **kwargs):
205 return self._add_event(event_name, request.context, **kwargs)
207 def _add_event(self, event_name=None, context={}, **kwargs):
209 event_name = _("New Event")
210 Event = request.registry.get('event.event')
211 date_begin = datetime.today() + timedelta(days=(14))
214 'date_begin': date_begin.strftime('%Y-%m-%d'),
215 'date_end': (date_begin + timedelta(days=(1))).strftime('%Y-%m-%d'),
217 event_id = Event.create(request.cr, request.uid, vals, context=context)
218 event = Event.browse(request.cr, request.uid, event_id, context=context)
219 return request.redirect("/event/%s/register?enable_editor=1" % slug(event))
221 def get_formated_date(self, event):
222 start_date = datetime.strptime(event.date_begin, tools.DEFAULT_SERVER_DATETIME_FORMAT).date()
223 end_date = datetime.strptime(event.date_end, tools.DEFAULT_SERVER_DATETIME_FORMAT).date()
224 return ('%s %s%s') % (start_date.strftime("%b"), start_date.strftime("%e"), (end_date != start_date and ("-"+end_date.strftime("%e")) or ""))
226 @http.route('/event/get_country_event_list', type='http', auth='public', website=True)
227 def get_country_events(self ,**post):
228 cr, uid, context, event_ids = request.cr, request.uid, request.context,[]
229 country_obj = request.registry['res.country']
230 event_obj = request.registry['event.event']
231 country_code = request.session['geoip'].get('country_code')
232 result = {'events':[],'country':False}
234 country_ids = country_obj.search(cr, uid, [('code', '=', country_code)], context=context)
235 event_ids = event_obj.search(cr, uid, ['|', ('address_id', '=', None),('country_id.code', '=', country_code),('date_begin','>=', time.strftime('%Y-%m-%d 00:00:00')),('state', '=', 'confirm')], order="date_begin", context=context)
237 event_ids = event_obj.search(cr, uid, [('date_begin','>=', time.strftime('%Y-%m-%d 00:00:00')),('state', '=', 'confirm')], order="date_begin", context=context)
238 for event in event_obj.browse(cr, uid, event_ids, context=context)[:6]:
239 if country_code and event.country_id.code == country_code:
240 result['country'] = country_obj.browse(cr, uid, country_ids[0], context=context)
241 result['events'].append({
242 "date": self.get_formated_date(event),
244 "url": event.website_url})
245 return request.website.render("website_event.country_events_list",result)