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 ##############################################################################
22 from openerp import SUPERUSER_ID
23 from openerp.addons.web import http
24 from openerp.addons.web.http import request
25 from openerp.tools.translate import _
26 from openerp.addons.website.controllers.main import Website as controllers
27 controllers = controllers()
30 _logger = logging.getLogger(__name__)
32 from datetime import datetime, timedelta
34 from dateutil.relativedelta import relativedelta
35 from openerp import tools
42 _logger.warn("Please install GeoIP python module to use events localisation.")
44 class website_event(http.Controller):
45 @http.route(['/event', '/event/page/<int:page>'], type='http', auth="public", website=True, multilang=True)
46 def events(self, page=1, **searches):
47 cr, uid, context = request.cr, request.uid, request.context
48 event_obj = request.registry['event.event']
49 type_obj = request.registry['event.type']
50 country_obj = request.registry['res.country']
52 searches.setdefault('date', 'all')
53 searches.setdefault('type', 'all')
54 searches.setdefault('country', 'all')
59 return date.strftime('%Y-%m-%d 23:59:59')
61 return date.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)
62 today = datetime.today()
64 ['all', _('Next Events'), [("date_end", ">", sd(today))], 0],
65 ['today', _('Today'), [
66 ("date_end", ">", sd(today)),
67 ("date_begin", "<", sdn(today))],
69 ['week', _('This Week'), [
70 ("date_end", ">=", sd(today + relativedelta(days=-today.weekday()))),
71 ("date_begin", "<", sdn(today + relativedelta(days=6-today.weekday())))],
73 ['nextweek', _('Next Week'), [
74 ("date_end", ">=", sd(today + relativedelta(days=7-today.weekday()))),
75 ("date_begin", "<", sdn(today + relativedelta(days=13-today.weekday())))],
77 ['month', _('This month'), [
78 ("date_end", ">=", sd(today.replace(day=1))),
79 ("date_begin", "<", (today.replace(day=1) + relativedelta(months=1)).strftime('%Y-%m-%d 00:00:00'))],
81 ['nextmonth', _('Next month'), [
82 ("date_end", ">=", sd(today.replace(day=1) + relativedelta(months=1))),
83 ("date_begin", "<", (today.replace(day=1) + relativedelta(months=2)).strftime('%Y-%m-%d 00:00:00'))],
85 ['old', _('Old Events'), [
86 ("date_end", "<", today.strftime('%Y-%m-%d 00:00:00'))],
93 current_country = None
95 if searches["date"] == date[0]:
96 domain_search["date"] = date[2]
98 current_date = date[1]
99 if searches["type"] != 'all':
100 current_type = type_obj.browse(cr, uid, int(searches['type']), context=context)
101 domain_search["type"] = [("type", "=", int(searches["type"]))]
102 if searches["country"] != 'all':
103 current_country = country_obj.browse(cr, uid, int(searches['country']), context=context)
104 domain_search["country"] = [("country_id", "=", int(searches["country"]))]
106 def dom_without(without):
107 domain = [('state', "in", ['draft','confirm','done'])]
108 for key, search in domain_search.items():
113 # count by domains without self search
116 date[3] = event_obj.search(
117 request.cr, request.uid, dom_without('date') + date[2],
118 count=True, context=request.context)
120 domain = dom_without('type')
121 types = event_obj.read_group(
122 request.cr, request.uid, domain, ["id", "type"], groupby="type",
123 orderby="type", context=request.context)
124 type_count = event_obj.search(request.cr, request.uid, domain,
125 count=True, context=request.context)
127 'type_count': type_count,
128 'type': ("all", _("All Categories"))
131 domain = dom_without('country')
132 countries = event_obj.read_group(
133 request.cr, request.uid, domain, ["id", "country_id"],
134 groupby="country_id", orderby="country_id", context=request.context)
135 country_id_count = event_obj.search(request.cr, request.uid, domain,
136 count=True, context=request.context)
137 countries.insert(0, {
138 'country_id_count': country_id_count,
139 'country_id': ("all", _("All Countries"))
143 event_count = event_obj.search(
144 request.cr, request.uid, dom_without("none"), count=True,
145 context=request.context)
146 pager = request.website.pager(url="/event", total=event_count, page=page, step=step, scope=5)
148 order = 'website_published desc, date_begin'
149 if searches.get('date','all') == 'old':
150 order = 'website_published desc, date_begin desc'
151 obj_ids = event_obj.search(
152 request.cr, request.uid, dom_without("none"), limit=step,
153 offset=pager['offset'], order=order, context=request.context)
154 events_ids = event_obj.browse(request.cr, request.uid, obj_ids,
155 context=request.context)
158 'current_date': current_date,
159 'current_country': current_country,
160 'current_type': current_type,
161 'event_ids': events_ids,
164 'countries': countries,
166 'searches': searches,
167 'search_path': "?%s" % werkzeug.url_encode(searches),
170 return request.website.render("website_event.index", values)
172 @http.route(['/event/<model("event.event"):event>/page/<page:page>'], type='http', auth="public", website=True, multilang=True)
173 def event_page(self, event, page, **post):
178 return request.website.render(page, values)
180 @http.route(['/event/<model("event.event"):event>'], type='http', auth="public", website=True, multilang=True)
181 def event(self, event, **post):
182 if event.menu_id and event.menu_id.child_id:
183 target_url = event.menu_id.child_id[0].url
185 target_url = '/event/%s/register' % str(event.id)
186 if post.get('enable_editor') == '1':
187 target_url += '?enable_editor=1'
188 return request.redirect(target_url);
190 @http.route(['/event/<model("event.event"):event>/register'], type='http', auth="public", website=True, multilang=True)
191 def event_register(self, event, **post):
194 'main_object': event,
197 return request.website.render("website_event.event_description_full", values)
199 @http.route('/event/add_event', type='http', auth="user", multilang=True, methods=['POST'], website=True)
200 def add_event(self, event_name="New Event", **kwargs):
201 return self._add_event(event_name, request.context, **kwargs)
203 def _add_event(self, event_name=None, context={}, **kwargs):
205 event_name = _("New Event")
206 Event = request.registry.get('event.event')
207 date_begin = datetime.today() + timedelta(days=(14))
210 'date_begin': date_begin.strftime('%Y-%m-%d'),
211 'date_end': (date_begin + timedelta(days=(1))).strftime('%Y-%m-%d'),
213 event_id = Event.create(request.cr, request.uid, vals, context=context)
214 return request.redirect("/event/%s?enable_editor=1" % event_id)
216 def get_visitors_country(self):
217 GI = GeoIP.open('/usr/share/GeoIP/GeoIP.dat', 0)
218 return {'country_code': GI.country_code_by_addr(request.httprequest.remote_addr), 'country_name': GI.country_name_by_addr(request.httprequest.remote_addr)}
220 def get_formated_date(self, event):
221 start_date = datetime.strptime(event.date_begin, tools.DEFAULT_SERVER_DATETIME_FORMAT).date()
222 end_date = datetime.strptime(event.date_end, tools.DEFAULT_SERVER_DATETIME_FORMAT).date()
223 return ('%s %s%s') % (start_date.strftime("%b"), start_date.strftime("%e"), (end_date != start_date and ("-"+end_date.strftime("%e")) or ""))
225 @http.route('/event/get_country_event_list', type='http', auth='public', website=True)
226 def get_country_events(self ,**post):
229 country_obj = request.registry['res.country']
230 event_obj = request.registry['event.event']
231 cr, uid, context,event_ids = request.cr, request.uid, request.context,[]
232 country_code = self.get_visitors_country()['country_code']
233 result = {'events':[],'country':False}
235 country_ids = country_obj.search(request.cr, request.uid, [('code', '=', country_code)], context=request.context)
236 event_ids = event_obj.search(request.cr, request.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=request.context)
238 event_ids = event_obj.search(request.cr, request.uid, [('date_begin','>=', time.strftime('%Y-%m-%d 00:00:00')),('state', '=', 'confirm')], order="date_begin", context=request.context)
239 for event in event_obj.browse(request.cr, request.uid, event_ids, context=request.context)[:6]:
240 if country_code and event.country_id.code == country_code:
241 result['country'] = country_obj.browse(request.cr, request.uid, country_ids[0], context=request.context)
242 result['events'].append({
243 "date": self.get_formated_date(event),
245 "url": event.website_url})
246 return request.website.render("website_event.country_events_list",result)