[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:
@@ -20,3 +20,4 @@
|
||||
##############################################################################
|
||||
|
||||
import controllers
|
||||
import models
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
@@ -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>&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>
|
||||
@@ -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'),
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user