[IMP] website_membership: added country management in website view
authorThibault Delavallée <tde@openerp.com>
Fri, 11 Oct 2013 16:13:10 +0000 (18:13 +0200)
committerThibault Delavallée <tde@openerp.com>
Fri, 11 Oct 2013 16:13:10 +0000 (18:13 +0200)
- controllers: added management of country_id from post
- views: added option to display country list
- + various cleaning in display and controllers

bzr revid: tde@openerp.com-20131011161310-5dfz6vf4y5nc9mj9

addons/website_membership/controllers/main.py
addons/website_membership/views/website_membership.xml

index b94071d..f51677b 100644 (file)
@@ -4,6 +4,9 @@ import openerp
 from openerp.addons.web import http
 from openerp.addons.web.http import request
 from openerp.addons.website.models import website
+from openerp.tools.translate import _
+
+import urllib
 
 
 class WebsiteMembership(http.Controller):
@@ -19,21 +22,43 @@ class WebsiteMembership(http.Controller):
         cr, uid, context = request.cr, request.uid, request.context
         product_obj = request.registry['product.product']
         membership_line_obj = request.registry['membership.membership_line']
-        post_name = post.get('search', '')
+        partner_obj = request.registry['res.partner']
+        post_name = post.get('name', '')
+        post_country_id = int(post.get('country_id', '0'))
 
-        # format displayed membership lines domain
+        # base domain for groupby / searches
         if request.context['is_public_user']:
-            line_domain = [('partner.website_published', '=', True)]
+            base_line_domain = [('partner.website_published', '=', True)]
         else:
-            line_domain = [(1, '=', 1)]
+            base_line_domain = [(1, '=', 1)]
         if membership_id:
-            line_domain += [('membership_id', '=', membership_id)]
+            base_line_domain += [('membership_id', '=', membership_id)]
+            membership = product_obj.browse(cr, openerp.SUPERUSER_ID, membership_id, context=context)
+        else:
+            membership = ''
         if post_name:
-            line_domain += ['|', ('partner.name', 'ilike', "%%%s%%" % post_name), ('partner.website_description', 'ilike', "%%%s%%" % post_name)]
+            base_line_domain += ['|', ('partner.name', 'ilike', "%%%s%%" % post_name), ('partner.website_description', 'ilike', "%%%s%%" % post_name)]
+
+        # group by country, based on all customers (base domain)
+        membership_line_ids = membership_line_obj.search(cr, uid, base_line_domain, context=context)
+        countries = partner_obj.read_group(
+            cr, uid, [('member_lines', 'in', membership_line_ids)], ["id", "country_id"],
+            groupby="country_id", orderby="country_id", context=request.context)
+        countries_total = sum([country_dict['country_id_count'] for country_dict in countries])
+        countries.insert(0, {
+            'country_id_count': countries_total,
+            'country_id': (0, _("All Countries"))
+        })
+
+        # displayed membership lines
+        line_domain = list(base_line_domain)
+        if post_country_id:
+            line_domain += [('partner.country_id', '=', post_country_id)]
 
         membership_line_ids = membership_line_obj.search(cr, uid, line_domain, context=context)
         membership_lines = membership_line_obj.browse(cr, uid, membership_line_ids, context=context)
-        google_map_partner_ids = ",".join([str(m.partner.id) for m in membership_lines])
+        partner_ids = [m.partner and m.partner.id for m in membership_lines]
+        google_map_partner_ids = ",".join([str(pid) for pid in partner_ids])
 
         # format domain for group_by and memberships
         membership_domain = [('membership', '=', True)]
@@ -44,11 +69,14 @@ class WebsiteMembership(http.Controller):
         pager = request.website.pager(url="/members/", total=len(membership_line_ids), page=page, step=self._references_per_page, scope=7, url_args=post)
 
         values = {
-            'membership_line_ids': membership_lines,
-            'membership_ids': memberships,
+            'membership_lines': membership_lines,
+            'memberships': memberships,
+            'membership': membership,
+            'countries': countries,
             'google_map_partner_ids': google_map_partner_ids,
             'pager': pager,
-            'name_search': post_name,
+            'post': post,
+            'search': "?%s" % urllib.urlencode(post),
         }
         return request.website.render("website_membership.index", values)
 
index b3ebf77..89cebe0 100644 (file)
                     Looking for a partner ?<br/>
                     <small>Find an association member</small>
                 </h1>
-                <div class="col-md-4" id="membership_left">
-                    <h3>Associations</h3>
-                    <ul class="nav">
-                        <t t-foreach="membership_ids" t-as="membership_id">
-                            <li><a t-href="/members/association/#{ membership_id.id }"><t t-esc="membership_id.name"/></a></li>
+                <div class="col-md-4" id="left_column">
+                    <ul class="nav nav-pills nav-stacked mt16">
+                        <li class="nav-header"><h3>Associations</h3></li>
+                        <li t-att-class="membership and '' or 'active'"><a t-href="/members/">All</a></li>
+                        <t t-foreach="memberships" t-as="membership_id">
+                            <li t-att-class="membership and membership_id.id == membership.id and 'active' or ''">
+                                <a t-href="/members/association/#{ membership_id.id }"><t t-esc="membership_id.name"/></a>
+                            </li>
                         </t>
                     </ul>
                 </div>
                 <div class="col-md-8" id="ref_content">
                     <div class='navbar'>
-                        <div>
-                            <t t-call="website.pager">
-                               <t t-set="classname">pull-left</t>
-                            </t>
-                            <form t-action="/members/" method="get" class="navbar-search pull-right pagination form-inline">
-                                <div class="form-group">
-                                    <input type="text" name="search" class="search-query col-md-2 mt4 form-control" placeholder="Search" t-att-value="name_search"/>
-                                </div>
-                            </form>
-                        </div>
+                        <t t-call="website.pager">
+                           <t t-set="classname">pull-left</t>
+                        </t>
+                        <form t-action="/members/" method="get" class="navbar-search pull-right pagination form-inline">
+                            <div class="form-group">
+                                <input type="text" name="name" class="search-query col-md-2 mt4 form-control" placeholder="Search" t-att-value="post.get('name', '')"/>
+                            </div>
+                        </form>
                     </div>
                     <div>
-                        <t t-if="not membership_line_ids">
+                        <t t-if="not membership_lines">
                             <p>No result found.</p>
                         </t>
-                        <t t-foreach="membership_line_ids" t-as="membership_line_id">
-                            <t t-if="membership_id != membership_line_id.membership_id.id">
-                                <t t-set="membership_id" t-value="membership_line_id.membership_id.id"/>
+                        <t t-foreach="membership_lines" t-as="membership_line_id">
+                            <t t-if="current_membership_id != membership_line_id.membership_id.id">
+                                <t t-set="current_membership_id" t-value="membership_line_id.membership_id.id"/>
                                 <h3 class="text-center"><span t-field="membership_line_id.membership_id"/></h3>
                             </t>
                             <t t-set="partner" t-value="membership_line_id.partner"/>
-                            <div class="media thumbnail" data-publish="">
-                                <t t-call="website.publish_management"><t t-set="object" t-value="partner"/></t>
+                            <div class="media" data-publish="">
+                                <t t-call="website.publish_management">
+                                    <t t-set="object" t-value="partner"/>
+                                </t>
                                 <a class="pull-left" t-href="/members/#{ partner.id }/">
                                     <img class="media-object" t-att-src="partner.img('image_small')"/>
                                 </a>
                                 <div class="media-body" style="min-height: 64px;">
-                                    <a class="media-heading" t-href="/members/#{ partner.id }/"><span t-field="partner.parent_id"/> <span t-field="partner.name"/></a> - <span t-field="membership_line_id.membership_id"/>
+                                    <a class="media-heading" t-href="/members/#{ partner.id }/"><span t-field="partner.parent_id"/> <span t-field="partner.name"/></a>
                                     <div t-field="partner.website_short_description"/>
                                 </div>
                             </div>
         </t>
     </template>
 
-    <template id="ref_country" inherit_id="website_membership.index" inherit_option_id="website_membership.index" name="Left World Map">
-        <xpath expr="//div[@id='membership_left']/ul" position="after">
-            <div>
-                <h3>World Map</h3>
+    <!-- Option: index: Left Google Map -->
+    <template id="opt_index_country" name="Location"
+            inherit_option_id="website_membership.index" inherit_id="website_membership.index">
+        <xpath expr="//div[@id='left_column']/ul[last()]" position="after">
+            <ul class="nav nav-pills nav-stacked mt16">
+                <li class="nav-header"><h3>Location</h3></li>
+                <t t-foreach="countries">
+                    <li t-if="country_id" t-att-class="post.get('country_id', '0') == str(country_id and country_id[0]) and 'active' or ''">
+                        <a t-href="/members/#{ search }&amp;country_id=#{ country_id[0] }"><t t-esc="country_id[1]"/>
+                            <span class="badge pull-right"><t t-esc="country_id_count"/></span>
+                        </a>
+                    </li>
+                </t>
+            </ul>
+        </xpath>
+    </template>
+
+    <!-- Option: index: Left Google Map -->
+    <template id="opt_index_google_map" name="Left World Map"
+            inherit_option_id="website_membership.index" inherit_id="website_membership.index">
+        <xpath expr="//div[@id='left_column']/ul[last()]" position="after">
+            <ul class="nav nav-pills nav-stacked mt16">
+                <li class="nav-header"><h3>World Map</h3></li>
                 <ul class="nav">
                     <iframe t-attf-src="/google_map/?width=320&amp;height=240&amp;partner_ids=#{ google_map_partner_ids }&amp;partner_url=/members/"
                         style="width:320px; height:260px; border:0; padding:0; margin:0;"></iframe>
                 </ul>
-            </div>
+            </ul>
         </xpath>
     </template>