From 81fa8d0c59890f9d89eef7767cd9935dcc1f09dc Mon Sep 17 00:00:00 2001 From: Pablo Montenegro Date: Mon, 18 Oct 2021 16:15:43 -0300 Subject: [PATCH 1/6] [ADD]website_sale_product_multi_website:new module --- .../addons/website_sale_product_multi_website | 1 + .../setup.py | 6 ++ website_sale_product_multi_website/README.rst | 0 .../__init__.py | 2 + .../__manifest__.py | 14 +++++ website_sale_product_multi_website/hooks.py | 7 +++ .../models/__init__.py | 1 + .../models/product_template.py | 15 +++++ .../views/product_template_views.xml | 56 +++++++++++++++++++ 9 files changed, 102 insertions(+) create mode 120000 setup/website_sale_product_multi_website/odoo/addons/website_sale_product_multi_website create mode 100644 setup/website_sale_product_multi_website/setup.py create mode 100644 website_sale_product_multi_website/README.rst create mode 100644 website_sale_product_multi_website/__init__.py create mode 100644 website_sale_product_multi_website/__manifest__.py create mode 100644 website_sale_product_multi_website/hooks.py create mode 100644 website_sale_product_multi_website/models/__init__.py create mode 100644 website_sale_product_multi_website/models/product_template.py create mode 100644 website_sale_product_multi_website/views/product_template_views.xml diff --git a/setup/website_sale_product_multi_website/odoo/addons/website_sale_product_multi_website b/setup/website_sale_product_multi_website/odoo/addons/website_sale_product_multi_website new file mode 120000 index 0000000000..d59fd585ec --- /dev/null +++ b/setup/website_sale_product_multi_website/odoo/addons/website_sale_product_multi_website @@ -0,0 +1 @@ +../../../../website_sale_product_multi_website \ No newline at end of file diff --git a/setup/website_sale_product_multi_website/setup.py b/setup/website_sale_product_multi_website/setup.py new file mode 100644 index 0000000000..28c57bb640 --- /dev/null +++ b/setup/website_sale_product_multi_website/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/website_sale_product_multi_website/README.rst b/website_sale_product_multi_website/README.rst new file mode 100644 index 0000000000..e69de29bb2 diff --git a/website_sale_product_multi_website/__init__.py b/website_sale_product_multi_website/__init__.py new file mode 100644 index 0000000000..cc6b6354ad --- /dev/null +++ b/website_sale_product_multi_website/__init__.py @@ -0,0 +1,2 @@ +from . import models +from .hooks import post_init_hook diff --git a/website_sale_product_multi_website/__manifest__.py b/website_sale_product_multi_website/__manifest__.py new file mode 100644 index 0000000000..bf33b03e5a --- /dev/null +++ b/website_sale_product_multi_website/__manifest__.py @@ -0,0 +1,14 @@ +{ + "name": "Multi-website product", + "summary": "Show products in many web-sites", + "version": "13.0.1.0.0", + "category": "Website", + "author": "Odoo Community Association (OCA), Adhoc S.A.", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": ["website_sale"], + "data": ["views/product_template_views.xml"], + "demo": [], + "post_init_hook": "post_init_hook", +} diff --git a/website_sale_product_multi_website/hooks.py b/website_sale_product_multi_website/hooks.py new file mode 100644 index 0000000000..f667849a08 --- /dev/null +++ b/website_sale_product_multi_website/hooks.py @@ -0,0 +1,7 @@ +from odoo import SUPERUSER_ID, api + + +def post_init_hook(cr, registry): + env = api.Environment(cr, SUPERUSER_ID, {}) + for rec in env["product.template"].with_context(active_test=False).search([]): + rec.website_ids += rec.website_id diff --git a/website_sale_product_multi_website/models/__init__.py b/website_sale_product_multi_website/models/__init__.py new file mode 100644 index 0000000000..e8fa8f6bf1 --- /dev/null +++ b/website_sale_product_multi_website/models/__init__.py @@ -0,0 +1 @@ +from . import product_template diff --git a/website_sale_product_multi_website/models/product_template.py b/website_sale_product_multi_website/models/product_template.py new file mode 100644 index 0000000000..c8b9675f28 --- /dev/null +++ b/website_sale_product_multi_website/models/product_template.py @@ -0,0 +1,15 @@ +from odoo import fields, models +from odoo.http import request + + +class ProductTemplate(models.Model): + _inherit = "product.template" + + website_ids = fields.Many2many("website", string="Websites") + + def can_access_from_current_website(self, website_id=False): + website_id = website_id or request.website.id + for rec in self.filtered(lambda x: x.website_ids): + if website_id not in rec.website_ids.ids: + return False + return True diff --git a/website_sale_product_multi_website/views/product_template_views.xml b/website_sale_product_multi_website/views/product_template_views.xml new file mode 100644 index 0000000000..3291907205 --- /dev/null +++ b/website_sale_product_multi_website/views/product_template_views.xml @@ -0,0 +1,56 @@ + + + product.template.inherit.view.form + product.template + + + + 1 + + + + + + + + product.product.website.inherit.view.tree + product.product + + + + 1 + + + + + + + + product_template_view_tree.view.tree + product.template + + + + 1 + + + + + + + From fa79caf0491ebb81a4f3017762765f658c1f0031 Mon Sep 17 00:00:00 2001 From: Katherine Zaoral Date: Tue, 26 Oct 2021 11:54:35 -0300 Subject: [PATCH 2/6] wip --- .../models/product_template.py | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/website_sale_product_multi_website/models/product_template.py b/website_sale_product_multi_website/models/product_template.py index c8b9675f28..6fb0df39c9 100644 --- a/website_sale_product_multi_website/models/product_template.py +++ b/website_sale_product_multi_website/models/product_template.py @@ -1,5 +1,9 @@ -from odoo import fields, models +from odoo import api, fields, models from odoo.http import request +from odoo.osv import expression +import logging + +_logger = logging.getLogger(__name__) class ProductTemplate(models.Model): @@ -8,8 +12,38 @@ class ProductTemplate(models.Model): website_ids = fields.Many2many("website", string="Websites") def can_access_from_current_website(self, website_id=False): + """ We overwrite this method completely in order to use the website_ids logic instead of website_id """ website_id = website_id or request.website.id for rec in self.filtered(lambda x: x.website_ids): if website_id not in rec.website_ids.ids: return False return True + + @api.depends('is_published', 'website_ids') + @api.depends_context('website_id') + def _compute_website_published(self): + """ We overwrite this method completely in order to use the website_ids logic instead of website_id """ + current_website_id = self._context.get('website_id') + for record in self: + if current_website_id: + record.website_published = record.is_published and ( + not record.website_ids or current_website_id in record.website_ids.ids) + else: + record.website_published = record.is_published + + def _search_website_published(self, operator, value): + """ We overwrite this method completely in order to use the website_ids logic instead of website_id """ + if not isinstance(value, bool) or operator not in ('=', '!='): + _logger.warning('unsupported search on website_published: %s, %s', operator, value) + return [()] + + if operator in expression.NEGATIVE_TERM_OPERATORS: + value = not value + + current_website_id = self._context.get('website_id') + is_published = [('is_published', '=', value)] + if current_website_id: + on_current_website = ['|'] + [('website_ids', 'ilike', item) for item in (False, current_website_id)] + return (['!'] if value is False else []) + expression.AND([is_published, on_current_website]) + else: # should be in the backend, return things that are published anywhere + return is_published From ac3509a96e6c4225295bb2312610a8992debed53 Mon Sep 17 00:00:00 2001 From: Katherine Zaoral Date: Wed, 27 Oct 2021 10:54:12 -0300 Subject: [PATCH 3/6] wip2 --- .../models/product_template.py | 18 + .../tests/tours/website_sale_complete_flow.js | 386 ++++++++++++++++++ .../tests/__init__.py | 2 + .../website_sale_product_multi_website.py | 22 + 4 files changed, 428 insertions(+) create mode 100644 website_sale_product_multi_website/static/tests/tours/website_sale_complete_flow.js create mode 100644 website_sale_product_multi_website/tests/__init__.py create mode 100644 website_sale_product_multi_website/tests/website_sale_product_multi_website.py diff --git a/website_sale_product_multi_website/models/product_template.py b/website_sale_product_multi_website/models/product_template.py index 6fb0df39c9..140fefbaef 100644 --- a/website_sale_product_multi_website/models/product_template.py +++ b/website_sale_product_multi_website/models/product_template.py @@ -47,3 +47,21 @@ def _search_website_published(self, operator, value): return (['!'] if value is False else []) + expression.AND([is_published, on_current_website]) else: # should be in the backend, return things that are published anywhere return is_published + + +# # TODO KZ If it works move it to new file +# class ProductPublicCategory(models.Model): +# # _inherit = ["product.public.category", "website.published.mixin"] +# # _name = "product.public.category" +# _inherit = "product.public.category" +# website_ids = fields.Many2many("website", string="Websites") + +# class Website(models.Model): + +# _inherit = "website" + +# @api.model +# def website_domain(self, website_id=False): +# res = ['|'] + [('website_ids', 'ilike', item) for item in (False, website_id or self.id)] +# print(" --- website_domain %s" % res) +# return res diff --git a/website_sale_product_multi_website/static/tests/tours/website_sale_complete_flow.js b/website_sale_product_multi_website/static/tests/tours/website_sale_complete_flow.js new file mode 100644 index 0000000000..0aa9a2d250 --- /dev/null +++ b/website_sale_product_multi_website/static/tests/tours/website_sale_complete_flow.js @@ -0,0 +1,386 @@ +odoo.define('website_sale_tour.tour', function (require) { + 'use strict'; + + var tour = require("web_tour.tour"); + var rpc = require("web.rpc"); + + tour.register('website_sale_tour', { + test: true, + url: '/shop?search=Storage Box', + }, [ + // Testing b2c with Tax-Excluded Prices + { + content: "Open product page", + trigger: '.oe_product_cart a:contains("Storage Box")', + }, + { + content: "Add one more storage box", + trigger: '.js_add_cart_json:eq(1)', + }, + { + content: "Check b2b Tax-Excluded Prices", + trigger: '.product_price .oe_price .oe_currency_value:containsExact(79.00)', + run: function () {}, // it's a check + }, + { + content: "Click on add to cart", + trigger: '#add_to_cart', + }, + { + content: "Check for 2 products in cart and proceed to checkout", + extra_trigger: '#cart_products tr:contains("Storage Box") input.js_quantity:propValue(2)', + trigger: 'a[href*="/shop/checkout"]', + }, + { + content: "Check Price b2b subtotal", + trigger: 'tr#order_total_untaxed .oe_currency_value:containsExact(158.00)', + run: function () {}, // it's a check + }, + { + content: "Check Price b2b Sale Tax(15%)", + trigger: 'tr#order_total_taxes .oe_currency_value:containsExact(23.70)', + run: function () {}, // it's a check + }, + { + content: "Check Price b2b Total amount", + trigger: 'tr#order_total .oe_currency_value:containsExact(181.70)', + run: function () {}, // it's a check + }, + { + content: "Fulfill billing address form", + trigger: 'select[name="country_id"]', + run: function () { + $('input[name="name"]').val('abc'); + $('input[name="phone"]').val('99999999'); + $('input[name="email"]').val('abc@odoo.com'); + $('input[name="street"]').val('SO1 Billing Street, 33'); + $('input[name="city"]').val('SO1BillingCity'); + $('#country_id option:eq(1)').attr('selected', true); + }, + }, + { + content: "Shipping address is not same as billing address", + trigger: '#shipping_use_same', + }, + { + content: "Click on next button", + trigger: '.oe_cart .btn:contains("Next")', + }, + { + content: "Fulfill shipping address form", + trigger: 'select[name="country_id"]', + extra_trigger: 'h2:contains("Shipping Address")', + run: function () { + $('input[name="name"]').val('def'); + $('input[name="phone"]').val('8888888888'); + $('input[name="street"]').val('17, SO1 Shipping Road'); + $('input[name="city"]').val('SO1ShippingCity'); + $('#country_id option:eq(1)').attr('selected', true); + }, + }, + { + content: "Click on next button", + trigger: '.oe_cart .btn:contains("Next")', + }, + { + content: "Check selected billing address is same as typed in previous step", + trigger: '#shipping_and_billing:contains(SO1 Billing Street, 33):contains(SO1BillingCity):contains(Afghanistan)', + run: function () {}, // it's a check + }, + { + content: "Check selected shipping address is same as typed in previous step", + trigger: '#shipping_and_billing:contains(17, SO1 Shipping Road):contains(SO1ShippingCity):contains(Afghanistan)', + run: function () {}, // it's a check + }, + { + content: "Click for edit address", + trigger: 'a:contains("Edit") i', + }, + { + content: "Click for edit billing address", + trigger: '.js_edit_address:first', + }, + { + content: "Change billing address form", + trigger: 'select[name="country_id"]', + extra_trigger: 'h2:contains("Your Address")', + run: function () { + $('input[name="name"]').val('abcd'); + $('input[name="phone"]').val('11111111'); + $('input[name="street"]').val('SO1 Billing Street Edited, 33'); + $('input[name="city"]').val('SO1BillingCityEdited'); + }, + }, + { + content: "Click on next button", + trigger: '.oe_cart .btn:contains("Next")', + }, + { + content: "Confirm Address", + trigger: 'a.btn:contains("Confirm")', + }, + { + content: "Check selected billing address is same as typed in previous step", + trigger: '#shipping_and_billing:contains(SO1 Billing Street Edited, 33):contains(SO1BillingCityEdited):contains(Afghanistan)', + run: function () {}, // it's a check + }, + { + content: "Select `Wire Transfer` payment method", + trigger: '#payment_method label:contains("Wire Transfer")', + }, + { + content: "Pay Now", + extra_trigger: '#payment_method label:contains("Wire Transfer") input:checked,#payment_method:not(:has("input:radio:visible"))', + trigger: 'button[id="o_payment_form_pay"]:visible:not(:disabled)', + }, + { + content: "Sign up", + trigger: '.oe_cart a:contains("Sign Up")', + }, + { + content: "Submit login", + trigger: '.oe_signup_form', + run: function () { + $('.oe_signup_form input[name="password"]').val("1admin@admin"); + $('.oe_signup_form input[name="confirm_password"]').val("1admin@admin"); + $('.oe_signup_form').submit(); + }, + }, + { + content: "See Quotations", + trigger: '.o_portal_docs a:contains("Quotations")', + }, + // Sign in as admin change config auth_signup -> b2b, sale_show_tax -> total and Logout + { + content: "Open Dropdown for logout", + trigger: '#top_menu li.dropdown:visible a:contains("abcd")', + }, + { + content: "Logout", + trigger: '#o_logout:contains("Logout")', + }, + { + content: "Sign in as admin", + trigger: '#top_menu li a b:contains("Sign in")', + }, + { + 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("/"); + $('.oe_login_form').submit(); + }, + }, + { + content: "Configuration Settings for 'Tax Included' and sign up 'On Invitation'", + extra_trigger: '.o_connected_user #wrapwrap', + trigger: '#wrapwrap', + run: function () { + var def1 = rpc.query({ + model: 'res.config.settings', + method: 'create', + args: [{ + 'auth_signup_uninvited': 'b2b', + 'show_line_subtotals_tax_selection': 'tax_included', + 'group_show_line_subtotals_tax_excluded': false, + 'group_show_line_subtotals_tax_included': true, + }], + }); + var def2 = def1.then(function (resId) { + return rpc.query({ + model: 'res.config.settings', + method: 'execute', + args: [[resId]], + }); + }); + def2.then(function () { + window.location.href = '/web/session/logout?redirect=/shop?search=Storage Box'; + }); + }, + }, + // Testing b2b with Tax-Included Prices + { + content: "Open product page", + trigger: '.oe_product_cart a:contains("Storage Box")', + }, + { + content: "Add one more Storage Box", + trigger: '.js_add_cart_json:eq(1)', + }, + { + content: "Check b2c Tax-Included Prices", + trigger: '.product_price .oe_price .oe_currency_value:containsExact(90.85)', + run: function () {}, // it's a check + }, + { + content: "Click on add to cart", + trigger: '#add_to_cart', + }, + { + content: "Check for 2 products in cart and proceed to checkout", + extra_trigger: '#cart_products tr:contains("Storage Box") input.js_quantity:propValue(2)', + trigger: 'a[href*="/shop/checkout"]', + }, + { + content: "Check Price b2c total", + trigger: 'tr#order_total_untaxed .oe_currency_value:containsExact(158.00)', + run: function () {}, // it's a check + }, + { + content: "Check Price b2c Sale Tax(15%)", + trigger: 'tr#order_total_taxes .oe_currency_value:containsExact(23.70)', + run: function () {}, // it's a check + }, + { + content: "Check Price b2c Total amount", + trigger: 'tr#order_total .oe_currency_value:containsExact(181.70)', + run: function () {}, // it's a check + }, + { + content: "Click on Login Button", + trigger: '.oe_cart a.btn:contains("Log In")', + }, + { + content: "Submit login", + trigger: '.oe_login_form', + run: function () { + $('.oe_login_form input[name="login"]').val("abc@odoo.com"); + $('.oe_login_form input[name="password"]').val("1admin@admin"); + $('.oe_login_form').submit(); + }, + }, + { + content: "Add new shipping address", + trigger: '.one_kanban form[action^="/shop/address"] .btn', + }, + { + content: "Fulfill shipping address form", + trigger: 'select[name="country_id"]', + run: function () { + $('input[name="name"]').val('ghi'); + $('input[name="phone"]').val('7777777777'); + $('input[name="street"]').val('SO2New Shipping Street, 5'); + $('input[name="city"]').val('SO2NewShipping'); + $('#country_id option:eq(1)').attr('selected', true); + }, + }, + { + content: "Click on next button", + trigger: '.oe_cart .btn:contains("Next")', + }, + { + content: "Select `Wire Transfer` payment method", + trigger: '#payment_method label:contains("Wire Transfer")', + }, + { + content: "Pay Now", + extra_trigger: '#payment_method label:contains("Wire Transfer") input:checked,#payment_method:not(:has("input:radio:visible"))', + trigger: 'button[id="o_payment_form_pay"]:visible:not(:disabled)', + }, + { + content: "Open Dropdown for See quotation", + extra_trigger: '.oe_cart .oe_website_sale_tx_status', + trigger: '#top_menu li.dropdown:visible a:contains("abc")', + }, + { + content: "My account", + extra_trigger: '#top_menu li.dropdown .js_usermenu.show', + trigger: '#top_menu .dropdown-menu a[href="/my/home"]:visible', + }, + { + content: "See Quotations", + trigger: '.o_portal_docs a:contains("Quotations") .badge:containsExact(2)', + }, + + // enable extra step on website checkout and check extra step on checkout process + { + content: "Open Dropdown for logout", + trigger: '#top_menu li.dropdown:visible a:contains("abc")', + }, + { + content: "Logout", + trigger: '#o_logout:contains("Logout")', + }, + { + content: "Sign in as admin", + trigger: '#top_menu li a b:contains("Sign in")', + }, + { + 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/cart"); + $('.oe_login_form').submit(); + }, + }, + { + content: "Open Customize menu", + trigger: '.o_menu_sections a:contains("Customize")', + }, + { + content: "Enable Extra step", + trigger: 'a.dropdown-item label:contains("Extra Step Option")', + }, + { + content: "Open Dropdown for logout", + extra_trigger: '.progress-wizard-step:contains("Extra Info")', + trigger: '#top_menu li.dropdown:visible a:contains("Mitchell Admin")', + }, + { + content: "Logout", + trigger: '#o_logout:contains("Logout")', + }, + { + content: "Sign in as abc", + trigger: '#top_menu li a b:contains("Sign in")', + }, + { + content: "Submit login", + trigger: '.oe_login_form', + run: function () { + $('.oe_login_form input[name="login"]').val("abc@odoo.com"); + $('.oe_login_form input[name="password"]').val("1admin@admin"); + $('.oe_login_form input[name="redirect"]').val("/shop?search=Storage Box"); + $('.oe_login_form').submit(); + }, + }, + { + content: "Open product page", + trigger: '.oe_product_cart a:contains("Storage Box")', + }, + { + content: "Click on add to cart", + trigger: '#add_to_cart', + }, + { + content: "Proceed to checkout", + trigger: 'a[href*="/shop/checkout"]', + }, + { + content: "Click on next button", + trigger: '.oe_cart .btn:contains("Next")', + }, + { + content: "Check selected billing address is same as typed in previous step", + trigger: '#shipping_and_billing:contains(SO1 Billing Street Edited, 33):contains(SO1BillingCityEdited):contains(Afghanistan)', + run: function () {}, // it's a check + }, + { + content: "Check selected shipping address is same as typed in previous step", + trigger: '#shipping_and_billing:contains(SO2New Shipping Street, 5):contains(SO2NewShipping):contains(Afghanistan)', + run: function () {}, // it's a check + }, + { + content: "Select `Wire Transfer` payment method", + trigger: '#payment_method label:contains("Wire Transfer")', + }, + { + content: "Pay Now", + extra_trigger: '#payment_method label:contains("Wire Transfer") input:checked,#payment_method:not(:has("input:radio:visible"))', + trigger: 'button[id="o_payment_form_pay"]:visible', + }]); +}); diff --git a/website_sale_product_multi_website/tests/__init__.py b/website_sale_product_multi_website/tests/__init__.py new file mode 100644 index 0000000000..cc6b6354ad --- /dev/null +++ b/website_sale_product_multi_website/tests/__init__.py @@ -0,0 +1,2 @@ +from . import models +from .hooks import post_init_hook diff --git a/website_sale_product_multi_website/tests/website_sale_product_multi_website.py b/website_sale_product_multi_website/tests/website_sale_product_multi_website.py new file mode 100644 index 0000000000..da977396ff --- /dev/null +++ b/website_sale_product_multi_website/tests/website_sale_product_multi_website.py @@ -0,0 +1,22 @@ +from odoo.tests + + +class TestWebsiteSaleProductMultiWebsite(tests.HttpCase): + + def setUp(self): + super().setUp() + # Create multiple websites + self.website0 = self.env['website'].create({'name': 'web0'}) + self.website1 = self.env['website'].create({'name': 'web1'}) + self.website2 = self.env['website'].create({'name': 'web2'}) + + # create a product template + self.product_template = self.env['product.template'].create({ + 'name': 'Test Product', + 'is_published': True, + 'list_price': 750, + }) + + def test_01(self): + """ Prueba que si el producto no tiene websites dicho producto esta disponible en todos los websites + """ From 7d8ae808702679b5956a9b47309ca6258fd93a5e Mon Sep 17 00:00:00 2001 From: Katherine Zaoral Date: Fri, 29 Oct 2021 18:25:35 -0300 Subject: [PATCH 4/6] wip --- .../__manifest__.py | 1 + website_sale_product_multi_website/hooks.py | 7 +++++++ .../models/product_template.py | 18 ------------------ .../tests/__init__.py | 4 ++-- 4 files changed, 10 insertions(+), 20 deletions(-) diff --git a/website_sale_product_multi_website/__manifest__.py b/website_sale_product_multi_website/__manifest__.py index bf33b03e5a..917a277e3d 100644 --- a/website_sale_product_multi_website/__manifest__.py +++ b/website_sale_product_multi_website/__manifest__.py @@ -11,4 +11,5 @@ "data": ["views/product_template_views.xml"], "demo": [], "post_init_hook": "post_init_hook", + "uninstall_hook": "uninstall_hook", } diff --git a/website_sale_product_multi_website/hooks.py b/website_sale_product_multi_website/hooks.py index f667849a08..ea8c9fec21 100644 --- a/website_sale_product_multi_website/hooks.py +++ b/website_sale_product_multi_website/hooks.py @@ -5,3 +5,10 @@ def post_init_hook(cr, registry): env = api.Environment(cr, SUPERUSER_ID, {}) for rec in env["product.template"].with_context(active_test=False).search([]): rec.website_ids += rec.website_id + rec.website_id = False + + +def uninstall_hook(cr, registry): + env = api.Environment(cr, SUPERUSER_ID, {}) + for rec in env["product.template"].with_context(active_test=False).search([]): + rec.website_id = rec.website_ids[0] diff --git a/website_sale_product_multi_website/models/product_template.py b/website_sale_product_multi_website/models/product_template.py index 140fefbaef..6fb0df39c9 100644 --- a/website_sale_product_multi_website/models/product_template.py +++ b/website_sale_product_multi_website/models/product_template.py @@ -47,21 +47,3 @@ def _search_website_published(self, operator, value): return (['!'] if value is False else []) + expression.AND([is_published, on_current_website]) else: # should be in the backend, return things that are published anywhere return is_published - - -# # TODO KZ If it works move it to new file -# class ProductPublicCategory(models.Model): -# # _inherit = ["product.public.category", "website.published.mixin"] -# # _name = "product.public.category" -# _inherit = "product.public.category" -# website_ids = fields.Many2many("website", string="Websites") - -# class Website(models.Model): - -# _inherit = "website" - -# @api.model -# def website_domain(self, website_id=False): -# res = ['|'] + [('website_ids', 'ilike', item) for item in (False, website_id or self.id)] -# print(" --- website_domain %s" % res) -# return res diff --git a/website_sale_product_multi_website/tests/__init__.py b/website_sale_product_multi_website/tests/__init__.py index cc6b6354ad..79d7d2aa85 100644 --- a/website_sale_product_multi_website/tests/__init__.py +++ b/website_sale_product_multi_website/tests/__init__.py @@ -1,2 +1,2 @@ -from . import models -from .hooks import post_init_hook +# TODO wip +# from . import website_sale_product_multi_website From b4f1623a08beace1618da44c0fd94b2990e239f4 Mon Sep 17 00:00:00 2001 From: Katherine Zaoral Date: Fri, 29 Oct 2021 18:47:09 -0300 Subject: [PATCH 5/6] version2 --- .../__manifest__.py | 1 - website_sale_product_multi_website/hooks.py | 6 ------ .../models/__init__.py | 1 + .../models/product_template.py | 16 +--------------- .../models/website.py | 16 ++++++++++++++++ 5 files changed, 18 insertions(+), 22 deletions(-) create mode 100644 website_sale_product_multi_website/models/website.py diff --git a/website_sale_product_multi_website/__manifest__.py b/website_sale_product_multi_website/__manifest__.py index 917a277e3d..bf33b03e5a 100644 --- a/website_sale_product_multi_website/__manifest__.py +++ b/website_sale_product_multi_website/__manifest__.py @@ -11,5 +11,4 @@ "data": ["views/product_template_views.xml"], "demo": [], "post_init_hook": "post_init_hook", - "uninstall_hook": "uninstall_hook", } diff --git a/website_sale_product_multi_website/hooks.py b/website_sale_product_multi_website/hooks.py index ea8c9fec21..681f893154 100644 --- a/website_sale_product_multi_website/hooks.py +++ b/website_sale_product_multi_website/hooks.py @@ -6,9 +6,3 @@ def post_init_hook(cr, registry): for rec in env["product.template"].with_context(active_test=False).search([]): rec.website_ids += rec.website_id rec.website_id = False - - -def uninstall_hook(cr, registry): - env = api.Environment(cr, SUPERUSER_ID, {}) - for rec in env["product.template"].with_context(active_test=False).search([]): - rec.website_id = rec.website_ids[0] diff --git a/website_sale_product_multi_website/models/__init__.py b/website_sale_product_multi_website/models/__init__.py index e8fa8f6bf1..eafa9a1069 100644 --- a/website_sale_product_multi_website/models/__init__.py +++ b/website_sale_product_multi_website/models/__init__.py @@ -1 +1,2 @@ from . import product_template +from . import website diff --git a/website_sale_product_multi_website/models/product_template.py b/website_sale_product_multi_website/models/product_template.py index 6fb0df39c9..1b794382c0 100644 --- a/website_sale_product_multi_website/models/product_template.py +++ b/website_sale_product_multi_website/models/product_template.py @@ -1,6 +1,5 @@ from odoo import api, fields, models from odoo.http import request -from odoo.osv import expression import logging _logger = logging.getLogger(__name__) @@ -33,17 +32,4 @@ def _compute_website_published(self): def _search_website_published(self, operator, value): """ We overwrite this method completely in order to use the website_ids logic instead of website_id """ - if not isinstance(value, bool) or operator not in ('=', '!='): - _logger.warning('unsupported search on website_published: %s, %s', operator, value) - return [()] - - if operator in expression.NEGATIVE_TERM_OPERATORS: - value = not value - - current_website_id = self._context.get('website_id') - is_published = [('is_published', '=', value)] - if current_website_id: - on_current_website = ['|'] + [('website_ids', 'ilike', item) for item in (False, current_website_id)] - return (['!'] if value is False else []) + expression.AND([is_published, on_current_website]) - else: # should be in the backend, return things that are published anywhere - return is_published + return super(ProductTemplate, self.with_context(multi_website_domain=True))._search_website_published(operator, value) diff --git a/website_sale_product_multi_website/models/website.py b/website_sale_product_multi_website/models/website.py new file mode 100644 index 0000000000..2ad40f4b84 --- /dev/null +++ b/website_sale_product_multi_website/models/website.py @@ -0,0 +1,16 @@ +from odoo import api, models + + +class Website(models.Model): + + _inherit = "website" + + @api.model + def website_domain(self, website_id=False): + if self._context.get('multi_website_domain'): + return ['|'] + [('website_ids', 'ilike', item) for item in (False, website_id or self.id)] + return super().website_domain(website_id=website_id) + + def sale_product_domain(self): + """ We add a context in order to change the way that website_domain behavies """ + return super(Website, self.with_context(multi_website_domain=True)).website_domain() From 6a30b7855a46173b6a656a2f2b476f06acae3d8c Mon Sep 17 00:00:00 2001 From: Juan Jose Scarafia Date: Sun, 31 Oct 2021 06:23:51 -0300 Subject: [PATCH 6/6] [FIX] website_sale_product_multi_website --- website_sale_product_multi_website/hooks.py | 1 - website_sale_product_multi_website/models/website.py | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/website_sale_product_multi_website/hooks.py b/website_sale_product_multi_website/hooks.py index 681f893154..f667849a08 100644 --- a/website_sale_product_multi_website/hooks.py +++ b/website_sale_product_multi_website/hooks.py @@ -5,4 +5,3 @@ def post_init_hook(cr, registry): env = api.Environment(cr, SUPERUSER_ID, {}) for rec in env["product.template"].with_context(active_test=False).search([]): rec.website_ids += rec.website_id - rec.website_id = False diff --git a/website_sale_product_multi_website/models/website.py b/website_sale_product_multi_website/models/website.py index 2ad40f4b84..8ad55cbcd5 100644 --- a/website_sale_product_multi_website/models/website.py +++ b/website_sale_product_multi_website/models/website.py @@ -8,9 +8,9 @@ class Website(models.Model): @api.model def website_domain(self, website_id=False): if self._context.get('multi_website_domain'): - return ['|'] + [('website_ids', 'ilike', item) for item in (False, website_id or self.id)] + return ['|', ('website_ids', '=', False), ('website_ids', '=', website_id or self.id)] return super().website_domain(website_id=website_id) def sale_product_domain(self): """ We add a context in order to change the way that website_domain behavies """ - return super(Website, self.with_context(multi_website_domain=True)).website_domain() + return super(Website, self.with_context(multi_website_domain=True)).sale_product_domain()