From ffbac75519daef9a08ad5f3aab7a46c8d06a43c3 Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Thu, 11 Jul 2013 16:24:34 +0200 Subject: [PATCH] [IMP] website_sale: recommended bzr revid: chm@openerp.com-20130711142434-natrpfsutm6o66a9 --- addons/website_crm/__openerp__.py | 4 +- addons/website_sale/__openerp__.py | 3 +- addons/website_sale/controllers/main.py | 36 ++++++++- .../website_sale/static/src/css/ecommerce.css | 26 +++++-- .../static/src/css/ecommerce.sass | 73 +++++++++++-------- .../website_sale/static/src/js/ecommerce.js | 2 +- addons/website_sale/views/ecommerce.xml | 38 ++++++++-- 7 files changed, 133 insertions(+), 49 deletions(-) diff --git a/addons/website_crm/__openerp__.py b/addons/website_crm/__openerp__.py index 70819e4d631..1f56f9be0af 100644 --- a/addons/website_crm/__openerp__.py +++ b/addons/website_crm/__openerp__.py @@ -9,11 +9,11 @@ OpenERP Contact Form """, 'author': 'OpenERP SA', 'depends': ['website', 'crm'], - 'installable': True, - 'auto_install': True, 'data': [ 'views/website_crm.xml' ], 'js': ['static/src/js/ecommerce.js'], 'css': ['static/src/css/ecommerce.css'], + 'installable': True, + 'auto_install': True, } diff --git a/addons/website_sale/__openerp__.py b/addons/website_sale/__openerp__.py index a8366e36a24..9accf2a1b6f 100644 --- a/addons/website_sale/__openerp__.py +++ b/addons/website_sale/__openerp__.py @@ -9,10 +9,11 @@ OpenERP E-Commerce """, 'author': 'OpenERP SA', 'depends': ['website', 'sale', 'point_of_sale'], - 'installable': True, 'data': [ 'views/ecommerce.xml' ], 'js': ['static/src/js/ecommerce.js'], 'css': ['static/src/css/ecommerce.css'], + 'installable': True, + 'auto_install': True, } diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index 5aabbf00554..6dd1cac4beb 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -14,7 +14,7 @@ class Ecommerce(http.Controller): if request.session._uid: request.httprequest.session['ecommerce_partner_id'] = False - partner_id = request.registry.get('res.users').browse(cr, uid, uid).partner_id.id + partner_id = request.registry.get('res.users').browse(cr, uid, request.session._uid).partner_id.id else: partner_id = request.httprequest.session.get('ecommerce_partner_id', False) if partner_id and not request.registry.get('res.partner').search(cr, uid, [('id', '=', partner_id)]): @@ -37,7 +37,7 @@ class Ecommerce(http.Controller): if not order_id: fields = [k for k, v in order_obj._columns.items()] order_value = order_obj.default_get(cr, uid, fields, context=context) - order_value['partner_id'] = partner_id + order_value['partner_id'] = partner_id or request.registry.get('res.users').browse(cr, uid, uid).partner_id.id order_value.update(order_obj.onchange_partner_id(cr, uid, [], uid, context=context)['value']) order_id = order_obj.create(cr, uid, order_value, context=context) request.httprequest.session['ecommerce_order'] = order_id @@ -87,8 +87,12 @@ class Ecommerce(http.Controller): product_id = product_id and int(product_id) or 0 product_obj = request.registry.get('product.product') + line = [line for line in values['order'].order_line if line.product_id.id == product_id] + quantity = line and int(line[0].product_uom_qty) or 0 + values.update({ 'product': product_obj.browse(cr, uid, product_id), + 'quantity': quantity, }) html = request.registry.get("ir.ui.view").render(cr, uid, "website_sale.product", values) return html @@ -96,7 +100,29 @@ class Ecommerce(http.Controller): @http.route(['/shop/my_cart'], type='http', auth="admin") def my_cart(self, offset=0): cr, uid, partner_id = self.get_cr_uid() - html = request.registry.get("ir.ui.view").render(cr, uid, "website_sale.my_cart", self.get_values()) + values = self.get_values() + + my_pids = ",".join([str(line.product_id.id) for line in values['order'].order_line]) + + product_ids = [] + query = """ + SELECT sol.product_id + FROM sale_order_line as my + LEFT JOIN sale_order_line as sol + ON sol.order_id = my.order_id + WHERE my.product_id in (%s) + AND sol.product_id not in (%s) + GROUP BY sol.product_id + ORDER BY COUNT(sol.order_id) DESC + LIMIT 8 + """ % (my_pids, my_pids) + cr.execute(query) + for p in cr.fetchall(): + product_ids.append(p[0]) + + values["recommended_products"] = request.registry.get('product.product').browse(cr, uid, product_ids) + + html = request.registry.get("ir.ui.view").render(cr, uid, "website_sale.my_cart", values) return html @http.route(['/shop/add_cart'], type='http', auth="admin") @@ -132,7 +158,9 @@ class Ecommerce(http.Controller): # change and record value if quantity: pricelist_id = order.pricelist_id and order.pricelist_id.id or False - values.update(order_line_obj.product_id_change(cr, uid, [], pricelist_id, product_id, partner_id=partner_id, context=context)['value']) + values.update(order_line_obj.product_id_change(cr, uid, [], pricelist_id, product_id, + partner_id=partner_id or request.registry.get('res.users').browse(cr, uid, uid).partner_id.id, + context=context)['value']) if order_line_ids: order_line_obj.write(cr, uid, order_line_ids, values, context=context) else: diff --git a/addons/website_sale/static/src/css/ecommerce.css b/addons/website_sale/static/src/css/ecommerce.css index ff916d2c0f4..5576ac5358b 100644 --- a/addons/website_sale/static/src/css/ecommerce.css +++ b/addons/website_sale/static/src/css/ecommerce.css @@ -85,6 +85,9 @@ top: 6px; text-align: right; } +.oe_ecommerce .oe_mycart form input { + margin-bottom: 0; +} .oe_ecommerce .oe_product { vertical-align: top; position: relative; @@ -100,12 +103,12 @@ -moz-box-shadow: 0 0 3px 1px rgba(0, 0, 0, 0.1); box-shadow: 0 0 3px 1px rgba(0, 0, 0, 0.1); } -.oe_ecommerce .oe_product .oe_button_cart { +.oe_ecommerce .oe_button_cart { width: 100%; font-size: 11px; position: absolute; } -.oe_ecommerce .oe_product .oe_button_cart button { +.oe_ecommerce .oe_button_cart button { text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.44); overflow: hidden; text-align: center; @@ -117,14 +120,14 @@ height: 22px; position: relative; } -.oe_ecommerce .oe_product .oe_button_cart button:first-child { +.oe_ecommerce .oe_button_cart button:first-child { background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #aaaaaa), color-stop(100%, #999999)); background: -webkit-linear-gradient(#aaaaaa, #999999); background: -moz-linear-gradient(#aaaaaa, #999999); background: -o-linear-gradient(#aaaaaa, #999999); background: linear-gradient(#aaaaaa, #999999); } -.oe_ecommerce .oe_product .oe_button_cart button:first-child span { +.oe_ecommerce .oe_button_cart button:first-child span { opacity: 0.8; filter: alpha(opacity=80); color: #eb1212; @@ -133,14 +136,14 @@ top: 3px; font-size: 20px; } -.oe_ecommerce .oe_product .oe_button_cart button:last-child { +.oe_ecommerce .oe_button_cart button:last-child { background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0088cc), color-stop(100%, #0076b1)); background: -webkit-linear-gradient(#0088cc, #0076b1); background: -moz-linear-gradient(#0088cc, #0076b1); background: -o-linear-gradient(#0088cc, #0076b1); background: linear-gradient(#0088cc, #0076b1); } -.oe_ecommerce .oe_product .oe_button_cart button:last-child.btn-success { +.oe_ecommerce .oe_button_cart button:last-child.btn-success { background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #51a351), color-stop(100%, #418541)); background: -webkit-linear-gradient(#51a351, #418541); background: -moz-linear-gradient(#51a351, #418541); @@ -155,3 +158,14 @@ margin: 24px; text-align: center; } +.oe_ecommerce .oe_product_detail .oe_button_cart { + position: relative; + text-align: right; +} +.oe_ecommerce .oe_recommended a { + margin: 0 3px; +} +.oe_ecommerce .oe_recommended img { + max-width: 64px; + max-height: 64px; +} diff --git a/addons/website_sale/static/src/css/ecommerce.sass b/addons/website_sale/static/src/css/ecommerce.sass index 1bedf005295..963dbd1941a 100644 --- a/addons/website_sale/static/src/css/ecommerce.sass +++ b/addons/website_sale/static/src/css/ecommerce.sass @@ -67,6 +67,9 @@ right: 6px top: 6px text-align: right + form + input + margin-bottom: 0 .oe_product vertical-align: top position: relative @@ -75,39 +78,49 @@ +border-radius(5px) border: 1px solid rgba(0,0,0,.1) +box-shadow(0 0 3px 1px rgba(0,0,0,.1)) - .oe_button_cart - width: 100% - font-size: 11px - position: absolute - button - +text-shadow(0px 1px 1px rgba(0, 0, 0, 0.44)) - overflow: hidden - text-align: center - font-size: 12px - margin: 0 auto - margin-bottom: 5px - padding: 2px - width: 50px - height: 22px - position: relative - &:first-child - @include background(linear-gradient(#aaaaaa,#999999)) - span - opacity: 0.8 - filter: alpha(opacity=80) - color: rgb(235, 18, 18) - position: absolute - left: +18px - top: 3px - font-size: 20px - &:last-child - @include background(linear-gradient(#0088cc,#0076b1)) - &.btn-success - @include background(linear-gradient(#51a351, #418541)) + .oe_button_cart + width: 100% + font-size: 11px + position: absolute + button + +text-shadow(0px 1px 1px rgba(0, 0, 0, 0.44)) + overflow: hidden + text-align: center + font-size: 12px + margin: 0 auto + margin-bottom: 5px + padding: 2px + width: 50px + height: 22px + position: relative + &:first-child + @include background(linear-gradient(#aaaaaa,#999999)) + span + opacity: 0.8 + filter: alpha(opacity=80) + color: rgb(235, 18, 18) + position: absolute + left: +18px + top: 3px + font-size: 20px + &:last-child + @include background(linear-gradient(#0088cc,#0076b1)) + &.btn-success + @include background(linear-gradient(#51a351, #418541)) form.oe_signup display: none .oe_search form width: 100% margin: 24px - text-align: center \ No newline at end of file + text-align: center + .oe_product_detail + .oe_button_cart + position: relative + text-align: right + .oe_recommended + a + margin: 0 3px + img + max-width: 64px + max-height: 64px \ No newline at end of file diff --git a/addons/website_sale/static/src/js/ecommerce.js b/addons/website_sale/static/src/js/ecommerce.js index 9fd040f4215..016f4556033 100644 --- a/addons/website_sale/static/src/js/ecommerce.js +++ b/addons/website_sale/static/src/js/ecommerce.js @@ -1,5 +1,5 @@ $(document).ready(function (){ - $('.oe_ecommerce').on('click', '.oe_product .btn-success,.oe_product .btn-primary,.btn-inverse', function (e) { + $('.oe_ecommerce').on('click', '.oe_product .btn-success,.oe_product .btn-primary, .oe_product .btn-inverse, .oe_product_detail .btn-success,.oe_product_detail .btn-primary, .oe_product_detail .btn-inverse', function (e) { var mycart = !!$('.oe_ecommerce .oe_mycart').size(); var $button = $(e.currentTarget); var link = $button.hasClass('btn-inverse') ? '/shop/remove_cart' : '/shop/add_cart'; diff --git a/addons/website_sale/views/ecommerce.xml b/addons/website_sale/views/ecommerce.xml index ab9ca74d40d..057bb819714 100644 --- a/addons/website_sale/views/ecommerce.xml +++ b/addons/website_sale/views/ecommerce.xml @@ -110,6 +110,20 @@ + + + product_recommended + qweb + + + + + @@ -119,11 +133,18 @@ Product -
-

- -
-
€
+
+

+
+ + +
+ +
+
€
@@ -145,6 +166,13 @@ +
+ +
+