From f318f998257846a2e54833936539159af0c80642 Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Tue, 5 Nov 2013 16:09:28 +0100 Subject: [PATCH] [IMP] website_sale: attributes/filter, fix access right, add default value for filter (for custom user ecommerce with category,label...) bzr revid: chm@openerp.com-20131105150928-ps01ziqnfgd9hu46 --- addons/website_sale/controllers/main.py | 40 +++++++++++-------- .../website_sale/models/product_attributes.py | 4 +- .../website_sale/security/ir.model.access.csv | 4 +- addons/website_sale/views/website_sale.xml | 14 ++++--- 4 files changed, 38 insertions(+), 24 deletions(-) diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index a6879191802..5cdfc1d1351 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -223,19 +223,21 @@ class Ecommerce(http.Controller): product_ids = [id for id in product_ids if id in product_obj.search(request.cr, request.uid, [("id", 'in', product_ids)], context=request.context)] return product_obj.browse(request.cr, request.uid, product_ids, context=request.context) - def has_search_attributes(self, attribute_id, value_id=None): - if request.httprequest.args.get('attributes'): - attributes = simplejson.loads(request.httprequest.args['attributes']) + def has_search_filter(self, attribute_id, value_id=None): + if request.httprequest.args.get('filter'): + filter = simplejson.loads(request.httprequest.args['filter']) else: - attributes = [] - for key_val in attributes: + filter = [] + for key_val in filter: if key_val[0] == attribute_id and (not value_id or value_id in key_val[1:]): return key_val return False - @website.route(['/shop/attributes/'], type='http', auth="public", multilang=True) - def attributes(self, **post): - attributes = [] + @website.route(['/shop/filter/'], type='http', auth="public", multilang=True) + def filter(self, add_filter="", **post): + filter = [] + if add_filter: + filter = simplejson.loads(add_filter) index = [] for key, val in post.items(): cat = key.split("-") @@ -248,16 +250,20 @@ class Ecommerce(http.Controller): _max = int(post.pop("att-%s-max" % cat[1])) _min = int(val) if (minmem != _min or maxmem != _max) and cat_id not in index: - attributes.append([cat_id , [_min, _max] ]) + filter.append([cat_id , [_min, _max] ]) index.append(cat_id) elif cat_id not in index: - attributes.append([ cat_id, int(cat[2]) ]) + filter.append([ cat_id, int(cat[2]) ]) index.append(cat_id) else: - attributes[index.index(cat_id)].append( int(cat[2]) ) + filter[index.index(cat_id)].append( int(cat[2]) ) post.pop(key) - return request.redirect("/shop/?attributes=%s&%s" % (simplejson.dumps(attributes).replace(" ", ""), urllib.urlencode(post))) + return request.redirect("/shop/?filter=%s%s%s" % ( + simplejson.dumps(filter).replace(" ", ""), + add_filter and "&add_filter=%s" % add_filter or "", + post and "&%s" % urllib.urlencode(post) or "" + )) def attributes_to_ids(self, attributes): obj = request.registry.get('product.attribute.product') @@ -273,7 +279,7 @@ class Ecommerce(http.Controller): return [r["product_id"][0] for r in att] @website.route(['/shop/', '/shop/page//'], type='http', auth="public", multilang=True) - def category(self, category=0, attributes="", page=0, **post): + def category(self, category=0, filter="", page=0, **post): # TDE-NOTE: shouldn't we do somethign about product_template without variants ??? # TDE-NOTE: is there a reason to call a method category when the route is # basically a shop without category_id speceified ? @@ -295,10 +301,10 @@ class Ecommerce(http.Controller): cat_id = int(category) domain = [('product_variant_ids.public_categ_id.id', 'child_of', cat_id)] + domain - if attributes: - attributes = simplejson.loads(attributes) - if attributes: - ids = self.attributes_to_ids(attributes) + if filter: + filter = simplejson.loads(filter) + if filter: + ids = self.attributes_to_ids(filter) domain = [('id', 'in', ids or [0] )] + domain step = 20 diff --git a/addons/website_sale/models/product_attributes.py b/addons/website_sale/models/product_attributes.py index ddc5467a19d..2262aae33b3 100644 --- a/addons/website_sale/models/product_attributes.py +++ b/addons/website_sale/models/product_attributes.py @@ -48,9 +48,11 @@ class attributes(osv.Model): 'float_min': fields.function(_get_float_min, type='float', string="Min", store={ 'product.attribute.product': (_get_min_max, ['value','attribute_id'], 20), }), + 'visible': fields.boolean('Visible'), } _defaults = { - 'type': 'distinct' + 'type': 'distinct', + 'visible': True, } class attributes_value(osv.Model): diff --git a/addons/website_sale/security/ir.model.access.csv b/addons/website_sale/security/ir.model.access.csv index 9bcdbfd00d1..2e80fcc1b3c 100644 --- a/addons/website_sale/security/ir.model.access.csv +++ b/addons/website_sale/security/ir.model.access.csv @@ -7,4 +7,6 @@ access_product_pricelist_version_public,product.pricelist.version.public,product access_product_pricelist_public,product.pricelist.public,product.model_product_pricelist,base.group_public,1,0,0,0 access_product_product_price_type_public,product.price.type.public,product.model_product_price_type,base.group_public,1,0,0,0 access_sale_order_public,sale.order.public,model_sale_order,base.group_public,1,0,0,0 -access_sale_order_line_public,sale.order.line.public,model_sale_order_line,base.group_public,1,0,0,0 \ No newline at end of file +access_sale_order_line_public,sale.order.line.public,model_sale_order_line,base.group_public,1,0,0,0 +access_product_attribute,product.attribute.public,website_sale.model_product_attribute,base.group_public,1,0,0,0 +access_product_attribute_value,product.attribute.value.public,website_sale.model_product_attribute_value,base.group_public,1,0,0,0 \ No newline at end of file diff --git a/addons/website_sale/views/website_sale.xml b/addons/website_sale/views/website_sale.xml index 3fbf67744fe..a9d88b2d8ce 100644 --- a/addons/website_sale/views/website_sale.xml +++ b/addons/website_sale/views/website_sale.xml @@ -67,6 +67,8 @@ -