190016c9a7689d5e2c7a92ce333b4249ab4d202e
[odoo/odoo.git] / addons / website_crm_partner_assign / controllers / main.py
1 # -*- coding: utf-8 -*-
2 import werkzeug
3 from openerp import SUPERUSER_ID
4 from openerp.addons.web import http
5 from openerp.addons.web.http import request
6 from openerp.addons.website.models.website import slug, unslug
7 from openerp.tools.translate import _
8
9
10 class WebsiteCrmPartnerAssign(http.Controller):
11     _references_per_page = 40
12
13     @http.route([
14         '/partners',
15         '/partners/page/<int:page>',
16
17         '/partners/grade/<model("res.partner.grade"):grade>',
18         '/partners/grade/<model("res.partner.grade"):grade>/page/<int:page>',
19
20         '/partners/country/<model("res.country"):country>',
21         '/partners/country/<model("res.country"):country>/page/<int:page>',
22
23         '/partners/grade/<model("res.partner.grade"):grade>/country/<model("res.country"):country>',
24         '/partners/grade/<model("res.partner.grade"):grade>/country/<model("res.country"):country>/page/<int:page>',
25     ], type='http', auth="public", website=True)
26     def partners(self, country=None, grade=None, page=0, **post):
27         country_all = post.pop('country_all', False)
28         partner_obj = request.registry['res.partner']
29         country_obj = request.registry['res.country']
30         search = post.get('search', '')
31
32         base_partner_domain = [('is_company', '=', True), ('grade_id.website_published', '=', True), ('website_published', '=', True)]
33         if search:
34             base_partner_domain += ['|', ('name', 'ilike', search), ('website_description', 'ilike', search)]
35
36         # group by grade
37         grade_domain = list(base_partner_domain)
38         if not country and not country_all:
39             country_code = request.session['geoip'].get('country_code')
40             if country_code:
41                 country_ids = country_obj.search(request.cr, request.uid, [('code', '=', country_code)], context=request.context)
42                 if country_ids:
43                     country = country_obj.browse(request.cr, request.uid, country_ids[0], context=request.context)
44         if country:
45             grade_domain += [('country_id', '=', country.id)]
46         grades = partner_obj.read_group(
47             request.cr, SUPERUSER_ID, grade_domain, ["id", "grade_id"],
48             groupby="grade_id", orderby="grade_id DESC", context=request.context)
49         grades_partners = partner_obj.search(
50             request.cr, SUPERUSER_ID, grade_domain,
51             context=request.context, count=True)
52         # flag active grade
53         for grade_dict in grades:
54             grade_dict['active'] = grade and grade_dict['grade_id'][0] == grade.id
55         grades.insert(0, {
56             'grade_id_count': grades_partners,
57             'grade_id': (0, _("All Categories")),
58             'active': bool(grade is None),
59         })
60
61         # group by country
62         country_domain = list(base_partner_domain)
63         if grade:
64             country_domain += [('grade_id', '=', grade.id)]
65         countries = partner_obj.read_group(
66             request.cr, SUPERUSER_ID, country_domain, ["id", "country_id"],
67             groupby="country_id", orderby="country_id", context=request.context)
68         countries_partners = partner_obj.search(
69             request.cr, SUPERUSER_ID, country_domain,
70             context=request.context, count=True)
71         # flag active country
72         for country_dict in countries:
73             country_dict['active'] = country and country_dict['country_id'] and country_dict['country_id'][0] == country.id
74         countries.insert(0, {
75             'country_id_count': countries_partners,
76             'country_id': (0, _("All Countries")),
77             'active': bool(country is None),
78         })
79
80         # current search
81         if grade:
82             base_partner_domain += [('grade_id', '=', grade.id)]
83         if country:
84             base_partner_domain += [('country_id', '=', country.id)]
85
86         # format pager
87         if grade and not country:
88             url = '/partners/grade/' + slug(grade)
89         elif country and not grade:
90             url = '/partners/country/' + slug(country)
91         elif country and grade:
92             url = '/partners/grade/' + slug(grade) + '/country/' + slug(country)
93         else:
94             url = '/partners'
95         url_args = {}
96         if search:
97             url_args['search'] = search
98         if country_all:
99             url_args['country_all'] = True
100
101         partner_count = partner_obj.search_count(
102             request.cr, SUPERUSER_ID, base_partner_domain,
103             context=request.context)
104         pager = request.website.pager(
105             url=url, total=partner_count, page=page, step=self._references_per_page, scope=7,
106             url_args=url_args)
107
108         # search partners matching current search parameters
109         partner_ids = partner_obj.search(
110             request.cr, SUPERUSER_ID, base_partner_domain,
111             order="grade_id DESC",
112             context=request.context)  # todo in trunk: order="grade_id DESC, implemented_count DESC", offset=pager['offset'], limit=self._references_per_page
113         partners = partner_obj.browse(request.cr, SUPERUSER_ID, partner_ids, request.context)
114         # remove me in trunk
115         partners = sorted(partners, key=lambda x: (x.grade_id.sequence if x.grade_id else 0, len([i for i in x.implemented_partner_ids if i.website_published])), reverse=True)
116         partners = partners[pager['offset']:pager['offset'] + self._references_per_page]
117
118         google_map_partner_ids = ','.join(map(str, [p.id for p in partners]))
119
120         values = {
121             'countries': countries,
122             'current_country': country,
123             'grades': grades,
124             'current_grade': grade,
125             'partners': partners,
126             'google_map_partner_ids': google_map_partner_ids,
127             'pager': pager,
128             'searches': post,
129             'search_path': "%s" % werkzeug.url_encode(post),
130         }
131         return request.website.render("website_crm_partner_assign.index", values)
132
133     # Do not use semantic controller due to SUPERUSER_ID
134     @http.route(['/partners/<partner_id>'], type='http', auth="public", website=True)
135     def partners_detail(self, partner_id, partner_name='', **post):
136         _, partner_id = unslug(partner_id)
137         current_grade, current_country = None, None
138         grade_id = post.get('grade_id')
139         country_id = post.get('country_id')
140         if grade_id:
141             grade_ids = request.registry['res.partner.grade'].exists(request.cr, request.uid, int(grade_id), context=request.context)
142             if grade_ids:
143                 current_grade = request.registry['res.partner.grade'].browse(request.cr, request.uid, grade_ids[0], context=request.context)
144         if country_id:
145             country_ids = request.registry['res.country'].exists(request.cr, request.uid, int(country_id), context=request.context)
146             if country_ids:
147                 current_country = request.registry['res.country'].browse(request.cr, request.uid, country_ids[0], context=request.context)
148         if partner_id:
149             partner = request.registry['res.partner'].browse(request.cr, SUPERUSER_ID, partner_id, context=request.context)
150             if partner.exists() and partner.website_published:
151                 values = {
152                     'main_object': partner,
153                     'partner': partner,
154                     'current_grade': current_grade,
155                     'current_country': current_country
156                 }
157                 return request.website.render("website_crm_partner_assign.partner", values)
158         return self.partners(**post)