diff --git a/addons/ecommerce/__openerp__.py b/addons/ecommerce/__openerp__.py index e35f293d8bd..c7c862f39e7 100644 --- a/addons/ecommerce/__openerp__.py +++ b/addons/ecommerce/__openerp__.py @@ -13,4 +13,6 @@ OpenERP E-Commerce 'data': [ 'views/ecommerce.xml' ], + 'js': ['static/src/js/ecommerce.js'], + 'css': ['static/src/css/ecommerce.css'], } diff --git a/addons/ecommerce/controllers/main.py b/addons/ecommerce/controllers/main.py index e7a19021c5f..4606a658f0e 100644 --- a/addons/ecommerce/controllers/main.py +++ b/addons/ecommerce/controllers/main.py @@ -9,61 +9,147 @@ import urllib class Ecommerce(http.Controller): - @http.route(['/shop', '/shop/category/'], type='http', auth="db") - def category(self, cat_id=0, offset=0): + def get_cr_uid(self): try: request.session.check_security() - editable = True uid = request.session._uid except http.SessionExpiredException: - editable = False uid = openerp.SUPERUSER_ID + return (request.cr, uid) + + def get_values(self): + cr, uid = self.get_cr_uid() + + total_price = 0 + cart = {} + if request.session.get('ecommerce'): + order = request.registry.get('sale.order').browse(cr, uid, request.session.get('ecommerce')) + total_price = order.amount_total + for line in order.order_line: + cart[line.product_id.id] = {'product_id': line.product_id.id, 'quantity': int(line.product_uom_qty)} + + values = { + 'request': request, + 'registry': request.registry, + 'cr': cr, + 'uid': uid, + 'cart': cart, + 'total_price': total_price, + } + return values + + @http.route(['/shop', '/shop/category/'], type='http', auth="db") + def category(self, cat_id=0, offset=0): + values = self.get_values() + cr, uid = self.get_cr_uid() cat_id = cat_id and int(cat_id) or 0 category_obj = request.registry.get('pos.category') product_obj = request.registry.get('product.product') - category_ids = category_obj.search(request.cr, uid, [('parent_id', '=', False)]) - product_ids = product_obj.search(request.cr, uid, cat_id and [('pos_categ_id.id', 'child_of', cat_id)] or [(1, '=', 1)], limit=20, offset=offset) + category_ids = category_obj.search(cr, uid, [('parent_id', '=', False)]) + product_ids = product_obj.search(cr, uid, cat_id and [('pos_categ_id.id', 'child_of', cat_id)] or [(1, '=', 1)], limit=20, offset=offset) - values = { - 'editable': editable, - 'request': request, - 'registry': request.registry, - 'cr': request.cr, - 'uid': uid, + values.update({ 'current_category': cat_id, - 'categories': category_obj.browse(request.cr, uid, category_ids), - 'products': product_obj.browse(request.cr, uid, product_ids), - } - html = request.registry.get("ir.ui.view").render(request.cr, uid, "ecommerce.categories", values) + 'categories': category_obj.browse(cr, uid, category_ids), + 'products': product_obj.browse(cr, uid, product_ids), + }) + html = request.registry.get("ir.ui.view").render(cr, uid, "ecommerce.categories", values) return html - @http.route(['/shop/category//product/', '/shop/product/'], type='http', auth="db") + @http.route(['/shop/product/'], type='http', auth="db") def product(self, cat_id=0, product_id=0, offset=0): - try: - request.session.check_security() - editable = True - uid = request.session._uid - except http.SessionExpiredException: - editable = False - uid = openerp.SUPERUSER_ID + values = self.get_values() + cr, uid = self.get_cr_uid() product_id = product_id and int(product_id) or 0 category_obj = request.registry.get('pos.category') product_obj = request.registry.get('product.product') - category_ids = category_obj.search(request.cr, uid, [('parent_id', '=', False)]) + category_ids = category_obj.search(cr, uid, [('parent_id', '=', False)]) - values = { - 'editable': editable, - 'request': request, - 'registry': request.registry, - 'cr': request.cr, - 'uid': uid, - 'categories': category_obj.browse(request.cr, uid, category_ids), - 'product': product_obj.browse(request.cr, uid, product_id), - } - html = request.registry.get("ir.ui.view").render(request.cr, uid, "ecommerce.product", values) + values.update({ + 'categories': category_obj.browse(cr, uid, category_ids), + 'product': product_obj.browse(cr, uid, product_id), + }) + html = request.registry.get("ir.ui.view").render(cr, uid, "ecommerce.product", values) return html + @http.route(['/shop/my_cart'], type='http', auth="db") + def my_cart(self, cat_id=0, offset=0): + values = self.get_values() + cr, uid = self.get_cr_uid() + + cat_id = cat_id and int(cat_id) or 0 + category_obj = request.registry.get('pos.category') + product_obj = request.registry.get('product.product') + + category_ids = category_obj.search(cr, uid, [('parent_id', '=', False)]) + product_ids = [product for product in values['cart']] + + values.update({ + 'my_cart': True, + 'categories': category_obj.browse(cr, uid, category_ids), + 'products': product_obj.browse(cr, uid, product_ids), + }) + html = request.registry.get("ir.ui.view").render(cr, uid, "ecommerce.categories", values) + return html + + @http.route(['/shop/add_cart'], type='http', auth="db") + def add_cart(self, product_id=0, remove=False): + cr, uid = self.get_cr_uid() + context = {} + + order_obj = request.registry.get('sale.order') + order_line_obj = request.registry.get('sale.order.line') + + product_id = product_id and int(product_id) or 0 + partner = request.registry.get('res.users').browse(cr, uid, uid, context=context).partner_id + + order_id = request.session.get('ecommerce') + + # find or set order_id + 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.update(order_obj.onchange_partner_id(cr, uid, [], uid, context=context)['value']) + order_id = order_obj.create(cr, uid, order_value, context=context) + request.session['ecommerce'] = order_id + order = order_obj.browse(cr, uid, order_id, context=context) + + # values initialisation + order_line_ids = order_line_obj.search(cr, uid, [('order_id', '=', order_id), ('product_id', '=', product_id)], context=context) + values = {} + if order_line_ids: + order_line = order_line_obj.read(cr, uid, order_line_ids, [], context=context)[0] + quantity = order_line['product_uom_qty'] + (remove and -1 or 1) + if quantity < 0: + quantity = 0 + else: + fields = [k for k, v in order_line_obj._columns.items()] + values = order_line_obj.default_get(cr, uid, fields, context=context) + quantity = 1 + values['product_uom_qty'] = quantity + values['product_id'] = product_id + values['order_id'] = order_id + + # change and record value + 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']) + if order_line_ids: + order_line_obj.write(cr, uid, order_line_ids, values, context=context) + else: + order_line_id = order_line_obj.create(cr, uid, values, context=context) + order.write({'order_line': [(4, order_line_id)]}, context=context) + + return "%s" % values['product_uom_qty'] + + @http.route(['/shop/remove_cart'], type='http', auth="db") + def remove_cart(self, product_id=0): + return self.add_cart(product_id=0, remove=True) + + @http.route(['/shop/confirm_cart'], type='http', auth="db") + def confirm_cart(self): + return "" # vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/ecommerce/static/src/css/ecommerce.css b/addons/ecommerce/static/src/css/ecommerce.css new file mode 100644 index 00000000000..3e0e3cff635 --- /dev/null +++ b/addons/ecommerce/static/src/css/ecommerce.css @@ -0,0 +1,12 @@ +.oe_website_body .oe_ecommerce .btn.btn-success .oe_txt_empty, +.oe_website_body .oe_ecommerce .btn.btn-primary .oe_txt, +.oe_website_body .oe_ecommerce .btn.oe_hidden { + display: none; +} +.oe_website_body .oe_ecommerce .oe_button_cart, +.oe_website_body .oe_ecommerce .well.media a { + float: right; +}, +.oe_website_body .oe_ecommerce .well.media { + margin-top: 30px; +} \ No newline at end of file diff --git a/addons/ecommerce/static/src/js/ecommerce.js b/addons/ecommerce/static/src/js/ecommerce.js new file mode 100644 index 00000000000..b6afc2b2ee8 --- /dev/null +++ b/addons/ecommerce/static/src/js/ecommerce.js @@ -0,0 +1,19 @@ +$(document).ready(function (){ + $('.oe_ecommerce').on('click', '.btn-success,.btn-primary,.btn-inverse', function (e) { + var $button = $(e.currentTarget); + var link = $button.hasClass('btn-inverse') ? '/shop/remove_cart' : '/shop/add_cart'; + // var $add = $button.parent().find('.btn-success,.btn-primary'); + // var $remove = $button.parent().find('.btn-inverse'); + + $.get(link, {'product_id': $button.data('id')}, function (quantity) { + // var quantity = parseInt(quantity); + // $add.find('.oe_quantity').html(quantity); + // $add.toggleClass('btn-primary', !quantity).toggleClass('btn-success', !!quantity); + // $remove.toggleClass('oe_hidden', !quantity); + // if (!quantity) { + // $button.parents('.media:first').remove() + // } + window.location.href = window.location.pathname; + }); + }); +}); \ No newline at end of file diff --git a/addons/ecommerce/views/ecommerce.xml b/addons/ecommerce/views/ecommerce.xml index 31def04f8c0..fee78d13563 100644 --- a/addons/ecommerce/views/ecommerce.xml +++ b/addons/ecommerce/views/ecommerce.xml @@ -9,7 +9,8 @@ -
  • Shop
  • +
  • My cart
  • +
  • Shop
  • SHOP Footer @@ -20,8 +21,8 @@ - - ecommerce_product + + categories_product qweb
    @@ -29,6 +30,13 @@
    +
    + + +

    €
    @@ -59,8 +67,9 @@ qweb - Shop - Categories -
    + Shop - CategoriesMy cart + +
    - + +
    +

    + + Total: € +

    +
    @@ -80,13 +95,15 @@ + + product qweb Shop - Categories -
    +