[IMP] website_customer: add tags on partners. That allows to sort/filter the customers on website. Old categories [res.partner.category] (named Tags in UI) was confusing with tags and have been renamed into Categories.

This commit is contained in:
Jeremy Kersten
2015-01-07 18:11:24 +01:00
parent d88c34d11e
commit e5ac65de59
11 changed files with 180 additions and 15 deletions
+1
View File
@@ -20,3 +20,4 @@
##############################################################################
import controllers
import models
+3
View File
@@ -40,6 +40,9 @@ OpenERP Customer References
],
'data': [
'views/website_customer.xml',
'views/website_customer_view.xml',
'security/ir.model.access.csv',
'security/ir_rule.xml',
],
'qweb': [],
'installable': True,
+25 -1
View File
@@ -7,6 +7,7 @@ from openerp.tools.translate import _
from openerp.addons.web.http import request
import werkzeug.urls
class WebsiteCustomer(http.Controller):
_references_per_page = 20
@@ -17,10 +18,17 @@ class WebsiteCustomer(http.Controller):
'/customers/country/<country_name>-<int:country_id>',
'/customers/country/<int:country_id>/page/<int:page>',
'/customers/country/<country_name>-<int:country_id>/page/<int:page>',
'/customers/tag/<tag_id>',
'/customers/tag/<tag_id>/page/<int:page>',
'/customers/tag/<tag_id>/country/<int:country_id>',
'/customers/tag/<tag_id>/country/<country_name>-<int:country_id>',
'/customers/tag/<tag_id>/country/<int:country_id>/page/<int:page>',
'/customers/tag/<tag_id>/country/<country_name>-<int:country_id>/page/<int:page>',
], type='http', auth="public", website=True)
def customers(self, country_id=0, page=0, country_name='', **post):
def customers(self, country_id=0, page=0, country_name='', tag_id=0, **post):
cr, uid, context = request.cr, request.uid, request.context
country_obj = request.registry['res.country']
tag_obj = request.registry['res.partner.tag']
partner_obj = request.registry['res.partner']
partner_name = post.get('search', '')
@@ -32,6 +40,13 @@ class WebsiteCustomer(http.Controller):
('website_description', 'ilike', post.get("search"))
]
if tag_id:
try:
tag_id = int(tag_id.split("-")[-1])
except:
tag_id = 0
domain += [('tag_ids', 'in', tag_id)]
# group by country, based on customers found with the search(domain)
countries = partner_obj.read_group(
cr, openerp.SUPERUSER_ID, domain, ["id", "country_id"],
@@ -49,6 +64,7 @@ class WebsiteCustomer(http.Controller):
'country_id': (country_id, country['name'])
})
countries.sort(key=lambda d: d['country_id'][1])
curr_country = country_obj.browse(cr, uid, country_id, context)
countries.insert(0, {
'country_id_count': country_count,
@@ -73,14 +89,22 @@ class WebsiteCustomer(http.Controller):
google_map_partner_ids = ','.join(map(str, partner_ids))
partners = partner_obj.browse(request.cr, openerp.SUPERUSER_ID, partner_ids, request.context)
tag_obj = request.registry['res.partner.tag']
tag_ids = tag_obj.get_tags_for_partners(cr, uid, partner_ids, context=context)
tags = tag_obj.browse(cr, uid, tag_ids, context=context)
tag = tag_id and tag_obj.browse(cr, uid, tag_id, context=context) or False
values = {
'countries': countries,
'current_country_id': country_id or 0,
'current_country': country_id and curr_country or False,
'partners': partners,
'google_map_partner_ids': google_map_partner_ids,
'pager': pager,
'post': post,
'search_path': "?%s" % werkzeug.url_encode(post),
'tag': tag,
'tags': tags,
}
return request.website.render("website_customer.index", values)
@@ -0,0 +1 @@
import website_customer
@@ -0,0 +1,44 @@
from openerp.osv import osv, fields
class res_partner(osv.Model):
_inherit = 'res.partner'
_columns = {
'tag_ids': fields.many2many('res.partner.tag', id1='partner_id', id2='tag_id', string='Tags'),
}
class res_partner_tags(osv.Model):
_description = 'Partner Tags - These tags can be used on website to find customers by sector, or ... '
_name = 'res.partner.tag'
def getSelectionClass(self, cr, uid, context=None):
classname = ['default', 'primary', 'success', 'warning', 'danger']
return [(x, str.title(x)) for x in classname]
_columns = {
'name': fields.char('Category Name', required=True, translate=True),
'partner_ids': fields.many2many('res.partner', 'res_partner_res_partner_tag_rel', id1='tag_id', id2='partner_id', string='Partners'),
'classname': fields.selection(getSelectionClass, 'Class', help="Bootstrap class to customize the color of the tag", required=True),
'website_published': fields.boolean('Publish', help="The publish field allows you to show the tag on website."),
'active': fields.boolean('Active'),
}
_defaults = {
'active': 1,
'website_published': 1,
'classname': 'default',
}
def get_tags_for_partners(self, cr, uid, partner_ids=[], context=None):
cr.execute("""
SELECT distinct rel.tag_id, t.name
FROM res_partner_res_partner_tag_rel as rel
JOIN res_partner_tag as t on rel.tag_id = t.id
WHERE partner_id = ANY(%s)
GROUP BY t.name, rel.tag_id
ORDER BY t.name ASC
""", (partner_ids,))
tags = cr.dictfetchall()
return [x['tag_id'] for x in tags]
@@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
res_partner_tag,res.partner.tag,model_res_partner_tag,,1,0,0,0
res_partner_tag_edition,res.partner.tag,model_res_partner_tag,base.group_sale_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 res_partner_tag res.partner.tag model_res_partner_tag 1 0 0 0
3 res_partner_tag_edition res.partner.tag model_res_partner_tag base.group_sale_manager 1 1 1 1
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record model="ir.rule" id="website_blog_post_public">
<field name="name">Partner Tag: published only</field>
<field name="model_id" ref="model_res_partner_tag"/>
<field name="domain_force">[('website_published', '=', True)]</field>
<field name="groups" eval="[(4, ref('base.group_public')), (4, ref('base.group_portal'))]"/>
</record>
</data>
</openerp>
@@ -97,7 +97,7 @@
<t t-foreach="countries" t-as="country_dict">
<t t-if="country_dict['country_id']">
<li t-att-class="country_dict['country_id'][0] == current_country_id and 'active' or ''">
<a t-attf-href="/customers/#{ country_dict['country_id'][0] and 'country/%s' % slug(country_dict['country_id']) or '' }#{ search_path }">
<a t-attf-href="/customers/#{ tag and 'tag/%s/' % slug(tag) or '' }#{ country_dict['country_id'][0] and 'country/%s' % slug(country_dict['country_id']) or '' }#{ search_path }">
<span class="badge pull-right" t-esc="country_dict['country_id_count'] or '0'"/>
<t t-esc="country_dict['country_id'][1]"/>
</a>
@@ -109,6 +109,20 @@
</xpath>
</template>
<template id="opt_tag_list" inherit_id="website_customer.index" customize_show="True" name="Filter on Tags">
<xpath expr="//div[@id='ref_left_column']" position="inside">
<h3 t-if="len(tags)">References by Tag</h3>
<ul class="nav nav-pills nav-stacked mt16 mb32" t-if="len(tags)">
<a t-attf-class="" t-attf-href="/customers/#{ current_country and 'country/%s' % slug(current_country) or '' }#{ search_path }"> <span class="fa fa-1x fa-tags"/> All </a>&amp;nbsp;
<t t-foreach="tags" t-as="oTag">
<a t-attf-class="label label-#{oTag.classname}" t-esc="oTag.name" t-att-style="tag and tag.id==oTag.id and 'text-decoration: underline'"
t-attf-href="/customers/#{ 'tag/%s/' % slug(oTag) }#{ current_country and 'country/%s' % slug(current_country) or '' }#{ search_path }"/>
</t>
</ul>
</xpath>
</template>
<template id="details" name="Customer Detail">
<t t-call="website.layout">
<div id="wrap">
@@ -0,0 +1,62 @@
<?xml version="1.0"?>
<openerp>
<data>
<record id="view_partners_form_website" model="ir.ui.view">
<field name="name">view.res.partner.form.website.tags</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="website_partner.view_partners_form_website" />
<field name="arch" type="xml">
<data>
<xpath expr="//group[@name='website']" position="inside">
<field name="tag_ids" widget="many2many_tags"/>
</xpath>
</data>
</field>
</record>
<record id="view_partner_tag_form" model="ir.ui.view">
<field name="name">Partner Tags</field>
<field name="model">res.partner.tag</field>
<field name="arch" type="xml">
<form string="Partner Tag">
<group col="4">
<field name="name"/>
<field name="classname"/>
<field name="website_published"/>
<field name="active"/>
</group>
</form>
</field>
</record>
<record id="view_partner_tag_list" model="ir.ui.view">
<field name="name">Partner Tags</field>
<field name="model">res.partner.tag</field>
<field eval="6" name="priority"/>
<field name="arch" type="xml">
<tree string="Partner Tags">
<field name="name"/>
<field name="classname"/>
<field name="website_published"/>
<field name="active"/>
</tree>
</field>
</record>
<record id="action_partner_tag_form" model="ir.actions.act_window">
<field name="name">Partner Tags</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.partner.tag</field>
<field name="view_type">form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to create a new partner tags.
</p><p>
Manage the partner tags to better classify them on your website.
You can add the filter by tag on your website in the "Customize" menu.
</p>
</field>
</record>
<menuitem action="action_partner_tag_form" id="menu_partner_tag_form" name="Tags" sequence="2" parent="base.menu_config_address_book" groups="base.group_no_one"/>
</data>
</openerp>
+2 -2
View File
@@ -121,7 +121,7 @@ class res_partner_category(osv.Model):
def _name_get_fnc(self, field_name, arg):
return dict(self.name_get())
_description = 'Partner Tags'
_description = 'Partner Categories'
_name = 'res.partner.category'
_columns = {
'name': fields.char('Category Name', required=True, translate=True),
@@ -248,7 +248,7 @@ class res_partner(osv.Model, format_address):
'bank_ids': fields.one2many('res.partner.bank', 'partner_id', 'Banks'),
'website': fields.char('Website', help="Website of Partner or Company"),
'comment': fields.text('Notes'),
'category_id': fields.many2many('res.partner.category', id1='partner_id', id2='category_id', string='Tags'),
'category_id': fields.many2many('res.partner.category', id1='partner_id', id2='category_id', string='Categories'),
'credit_limit': fields.float(string='Credit Limit'),
'barcode': fields.char('Barcode', oldname='ean13'),
'active': fields.boolean('Active'),
+11 -11
View File
@@ -514,10 +514,10 @@
<!-- Categories -->
<record id="view_partner_category_form" model="ir.ui.view">
<field name="name">Partner Tags</field>
<field name="name">Partner Categories</field>
<field name="model">res.partner.category</field>
<field name="arch" type="xml">
<form string="Partner Tag">
<form string="Partner Category">
<group col="4">
<field name="name"/>
<field name="active"/>
@@ -527,11 +527,11 @@
</field>
</record>
<record id="view_partner_category_list" model="ir.ui.view">
<field name="name">Partner Tags</field>
<field name="name">Partner Categories</field>
<field name="model">res.partner.category</field>
<field eval="6" name="priority"/>
<field name="arch" type="xml">
<tree string="Partner Tags">
<tree string="Partner Categories">
<field name="complete_name"/>
</tree>
</field>
@@ -541,7 +541,7 @@
<field name="model">res.partner.category</field>
<field name="field_parent">child_ids</field>
<field name="arch" type="xml">
<tree toolbar="1" string="Partner Tags">
<tree toolbar="1" string="Partner Categories">
<field name="name"/>
</tree>
</field>
@@ -560,7 +560,7 @@
-->
<record id="action_partner_by_category" model="ir.actions.act_window">
<field name="name">Partner Tags</field>
<field name="name">Partner Categories</field>
<field name="res_model">res.partner</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
@@ -577,21 +577,21 @@
</record>
<record id="action_partner_category_form" model="ir.actions.act_window">
<field name="name">Partner Tags</field>
<field name="name">Partner Categories</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.partner.category</field>
<field name="view_type">form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to create a new partner tags.
Click to create a new partner Categories.
</p><p>
Manage the partner tags to better classify them for tracking and analysis purposes.
A partner may have several tags and tags have a hierarchical structure: a partner with a tag has also the parent tags.
Manage the partner categories to better classify them for tracking and analysis purposes.
A partner may have several categories and categories have a hierarchical structure: a partner with a categorie has also the parent categorie.
</p>
</field>
</record>
<menuitem action="action_partner_category_form" id="menu_partner_category_form" name="Tags" sequence="1" parent="menu_config_address_book" groups="base.group_no_one"/>
<menuitem action="action_partner_category_form" id="menu_partner_category_form" name="Categories" sequence="1" parent="menu_config_address_book" groups="base.group_no_one"/>
</data>
</openerp>