From 80029cae36ab87db7979d24e9aced4719307a882 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentin=20L=C3=B6fberg?= Date: Mon, 9 Apr 2018 13:24:51 +0200 Subject: [PATCH] [FIX] website_sale_wishlist: allow deletion of wishlist item when not connected Add controller to remove (archive) an item from the wishlist. Rpc cannot be used because user can be public Adding tour test task-1834888 This commit closes #24135 --- .../website_sale_wishlist/controllers/main.py | 5 + .../src/js/website_sale_tour_wishlist.js | 130 ++++++++++++++++++ .../static/src/js/website_sale_wishlist.js | 15 +- .../website_sale_wishlist/tests/__init__.py | 1 + .../tests/test_wishlist_process.py | 10 ++ .../views/website_sale_wishlist_template.xml | 1 + 6 files changed, 151 insertions(+), 11 deletions(-) create mode 100644 addons/website_sale_wishlist/static/src/js/website_sale_tour_wishlist.js create mode 100644 addons/website_sale_wishlist/tests/__init__.py create mode 100644 addons/website_sale_wishlist/tests/test_wishlist_process.py diff --git a/addons/website_sale_wishlist/controllers/main.py b/addons/website_sale_wishlist/controllers/main.py index e9ebff51ad0..c9fd9a6b25e 100644 --- a/addons/website_sale_wishlist/controllers/main.py +++ b/addons/website_sale_wishlist/controllers/main.py @@ -39,3 +39,8 @@ class WebsiteSaleWishlist(WebsiteSale): return request.redirect("/shop") return request.render("website_sale_wishlist.product_wishlist", dict(wishes=values)) + + @http.route(['/shop/wishlist/remove/'], type='json', auth="public", website=True) + def rm_from_wishlist(self, wish, **kw): + wish.active = False + return True diff --git a/addons/website_sale_wishlist/static/src/js/website_sale_tour_wishlist.js b/addons/website_sale_wishlist/static/src/js/website_sale_tour_wishlist.js new file mode 100644 index 00000000000..c3e6c9349d8 --- /dev/null +++ b/addons/website_sale_wishlist/static/src/js/website_sale_tour_wishlist.js @@ -0,0 +1,130 @@ +odoo.define('website_sale_wishlist.tour', function (require) { +'use strict'; + +var tour = require("web_tour.tour"); +var base = require("web_editor.base"); + +tour.register('shop_wishlist', { + test: true, + url: '/shop', + wait_for: base.ready(), +}, + [ + { + content: "click on add to wishlist", + trigger: '.o_add_wishlist', + }, + { + content: "go to wishlist", + extra_trigger: ".label:contains(1)", + trigger: 'a[href="/shop/wishlist"]', + }, + { + content: "remove first item in whishlist", + trigger: 'a.o_wish_rm:first', + }, + { + content: "go back to the store", + trigger: "a[href='/shop']" + }, + { + content: "click on add to wishlist", + trigger: '.o_add_wishlist', + }, + { + content: "check value of wishlist and go to login", + extra_trigger: ".my_wish_quantity:contains(1)", + trigger: 'a[href="/web/login"]', + }, + { + content: "submit login", + trigger: ".oe_login_form", + run: function (){ + $('.oe_login_form input[name="login"]').val("admin"); + $('.oe_login_form input[name="password"]').val("admin"); + $('.oe_login_form input[name="redirect"]').val("/shop"); + $('.oe_login_form').submit(); + }, + }, + { + content: "check that logged in and search for ipad", + extra_trigger: 'li span:contains(Administrator)', + trigger: 'form input[name="search"]', + run: "text ipad retina", + }, + { + content: "submit search", + trigger: 'form:has(input[name="search"]) .oe_search_button', + }, + { + content: "click on ipad", + trigger: '.oe_product_cart a:contains("iPad Retina Display")', + }, + { + content: "select ipad 32GB", + extra_trigger: '#product_detail', + trigger: 'label:contains(32 GB) input', + }, + { + content: "click on add to wishlist", + trigger: '#product_detail .o_add_wishlist_dyn', + }, + { + content: "check that wishlist contains 2 items and go to wishlist", + extra_trigger: ".label:contains(2)", + trigger: 'a[href="/shop/wishlist"]', + }, + { + content: "remove Ipad", + trigger: 'tr:contains("iPad Retina Display") a.o_wish_rm:first', + }, + { + content: "check that wishlist contains 1 item", + trigger: ".my_wish_quantity:contains(1)", + run: function() {}, + }, + { + content: "check B2B wishlist mode", + trigger: "input#b2b_wish", + }, + { + content: "add item to cart", + trigger: 'a.o_wish_add:first', + }, + { + content: "check that cart contains 1 item", + trigger: ".my_cart_quantity:contains(1)", + run: function() {}, + }, + { + content: "check that wishlist contains 1 item", + trigger: ".my_wish_quantity:contains(1)", + run: function() {}, + }, + { + content: "remove B2B wishlist mode", + trigger: "input#b2b_wish", + }, + { + content: "add last item to cart", + trigger: 'a.o_wish_add:first', + }, + { + content: "check that user is redirect - wishlist is empty", + trigger: "h2:contains('Shopping Cart')", + run: function() {}, + }, + { + content: "check that cart contains 2 items", + trigger: ".my_cart_quantity:contains(2)", + run: function() {}, + }, + { + content: "check that wishlist is empty and no more visible", + trigger: ":not(:has(.my_wish_quantity:visible))", + run: function() {}, + }, + ] +); + +}); diff --git a/addons/website_sale_wishlist/static/src/js/website_sale_wishlist.js b/addons/website_sale_wishlist/static/src/js/website_sale_wishlist.js index 34ed9c47957..3eb511140a3 100644 --- a/addons/website_sale_wishlist/static/src/js/website_sale_wishlist.js +++ b/addons/website_sale_wishlist/static/src/js/website_sale_wishlist.js @@ -3,11 +3,9 @@ odoo.define('website_sale_wishlist.wishlist', function (require) { require('web.dom_ready'); var ajax = require('web.ajax'); -var rpc = require('web.rpc'); var Widget = require('web.Widget'); var base = require('web_editor.base'); var website_sale_utils = require('website_sale.utils'); -var weContext = require('web_editor.context'); if(!$('.oe_website_sale').length) { return $.Deferred().reject("DOM doesn't contain '.oe_website_sale'"); @@ -71,7 +69,7 @@ var ProductWishlist = Widget.extend({ }); }, - add_new_products:function($el, e){ + add_new_products: function($el, e){ var self = this; var product_id = parseInt($el.data('product-product-id'), 10); if (!product_id && e.currentTarget.classList.contains('o_add_wishlist_dyn')) { @@ -112,14 +110,9 @@ var ProductWishlist = Widget.extend({ var product = tr.data('product-id'); var self = this; - rpc.query({ - model: 'product.wishlist', - method: 'write', - args: [[wish], { active: false }, weContext.getExtra()], - }) - .then(function(){ - $(tr).hide(); - }); + ajax.jsonRpc('/shop/wishlist/remove/' + wish).done(function () { + $(tr).hide(); + }); this.wishlist_product_ids = _.without(this.wishlist_product_ids, product); if (this.wishlist_product_ids.length === 0) { diff --git a/addons/website_sale_wishlist/tests/__init__.py b/addons/website_sale_wishlist/tests/__init__.py new file mode 100644 index 00000000000..c19627a953b --- /dev/null +++ b/addons/website_sale_wishlist/tests/__init__.py @@ -0,0 +1 @@ +from . import test_wishlist_process diff --git a/addons/website_sale_wishlist/tests/test_wishlist_process.py b/addons/website_sale_wishlist/tests/test_wishlist_process.py new file mode 100644 index 00000000000..aaa1791ad04 --- /dev/null +++ b/addons/website_sale_wishlist/tests/test_wishlist_process.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +import odoo.tests + + +@odoo.tests.common.at_install(False) +@odoo.tests.common.post_install(True) +class TestUi(odoo.tests.HttpCase): + def test_01_wishlist_tour(self): + self.phantom_js("/", "odoo.__DEBUG__.services['web_tour.tour'].run('shop_wishlist', 1000)", "odoo.__DEBUG__.services['web_tour.tour'].tours.shop_wishlist.ready") diff --git a/addons/website_sale_wishlist/views/website_sale_wishlist_template.xml b/addons/website_sale_wishlist/views/website_sale_wishlist_template.xml index 4fcb14d7d31..1d306318534 100644 --- a/addons/website_sale_wishlist/views/website_sale_wishlist_template.xml +++ b/addons/website_sale_wishlist/views/website_sale_wishlist_template.xml @@ -5,6 +5,7 @@ +