[MERGE] Forward-port saas-4 up to 8b15482
[odoo/odoo.git] / addons / website_customer / controllers / main.py
1 # -*- coding: utf-8 -*-
2 import openerp
3 from openerp import SUPERUSER_ID
4 from openerp.addons.web import http
5 from openerp.addons.website.models.website import unslug
6 from openerp.tools.translate import _
7 from openerp.addons.web.http import request
8 import werkzeug.urls
9
10 class WebsiteCustomer(http.Controller):
11     _references_per_page = 20
12
13     @http.route([
14         '/customers',
15         '/customers/page/<int:page>',
16         '/customers/country/<int:country_id>',
17         '/customers/country/<country_name>-<int:country_id>',
18         '/customers/country/<int:country_id>/page/<int:page>',
19         '/customers/country/<country_name>-<int:country_id>/page/<int:page>',
20     ], type='http', auth="public", website=True)
21     def customers(self, country_id=0, page=0, country_name='', **post):
22         cr, uid, context = request.cr, request.uid, request.context
23         country_obj = request.registry['res.country']
24         partner_obj = request.registry['res.partner']
25         partner_name = post.get('search', '')
26
27         domain = [('website_published', '=', True), ('assigned_partner_id', '!=', False)]
28         if partner_name:
29             domain += [
30                 '|',
31                 ('name', 'ilike', post.get("search")),
32                 ('website_description', 'ilike', post.get("search"))
33             ]
34
35         # group by country, based on customers found with the search(domain)
36         countries = partner_obj.read_group(
37             cr, openerp.SUPERUSER_ID, domain, ["id", "country_id"],
38             groupby="country_id", orderby="country_id", context=request.context)
39         country_count = partner_obj.search(
40             cr, openerp.SUPERUSER_ID, domain, count=True, context=request.context)
41
42         if country_id:
43             domain += [('country_id', '=', country_id)]
44             if not any(x['country_id'][0] == country_id for x in countries):
45                 country = country_obj.read(cr, uid, country_id, ['name'], context)
46                 if country:
47                     countries.append({
48                         'country_id_count': 0,
49                         'country_id': (country_id, country['name'])
50                     })
51                 countries.sort(key=lambda d: d['country_id'][1])
52
53         countries.insert(0, {
54             'country_id_count': country_count,
55             'country_id': (0, _("All Countries"))
56         })
57
58         # search customers to display
59         partner_count = partner_obj.search_count(cr, openerp.SUPERUSER_ID, domain, context=request.context)
60
61         # pager
62         pager = request.website.pager(
63             url="/customers", total=partner_count, page=page, step=self._references_per_page,
64             scope=7, url_args=post
65         )
66
67         partner_ids = partner_obj.search(request.cr, openerp.SUPERUSER_ID, domain,
68                                          offset=pager['offset'], limit=self._references_per_page,
69                                          context=request.context)
70         google_map_partner_ids = ','.join(map(str, partner_ids))
71         partners = partner_obj.browse(request.cr, openerp.SUPERUSER_ID, partner_ids, request.context)
72
73         values = {
74             'countries': countries,
75             'current_country_id': country_id or 0,
76             'partners': partners,
77             'google_map_partner_ids': google_map_partner_ids,
78             'pager': pager,
79             'post': post,
80             'search_path': "?%s" % werkzeug.url_encode(post),
81         }
82         return request.website.render("website_customer.index", values)
83
84     # Do not use semantic controller due to SUPERUSER_ID
85     @http.route(['/customers/<partner_id>'], type='http', auth="public", website=True)
86     def partners_detail(self, partner_id, **post):
87         _, partner_id = unslug(partner_id)
88         if partner_id:
89             partner = request.registry['res.partner'].browse(request.cr, SUPERUSER_ID, partner_id, context=request.context)
90             if partner.exists() and partner.website_published:
91                 values = {}
92                 values['main_object'] = values['partner'] = partner
93                 return request.website.render("website_customer.details", values)
94         return self.customers(**post)