From be42807932a47a175f34295f4c7e9de98b8d9e62 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Thu, 23 Apr 2020 13:57:38 +0200 Subject: [PATCH 01/29] [10.0][ADD] stock_available_base_exclude_location Adds a base module to help excluding locations for product available quantities. --- .../README.rst | 92 ++++ .../__init__.py | 1 + .../__manifest__.py | 18 + .../models/__init__.py | 2 + .../models/product_product.py | 40 ++ .../models/stock_exclude_location_mixin.py | 16 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 2 + .../readme/USAGE.rst | 6 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 431 ++++++++++++++++++ .../tests/__init__.py | 2 + .../tests/common.py | 70 +++ .../tests/test_stock_exclude_location.py | 64 +++ 14 files changed, 745 insertions(+) create mode 100644 stock_available_base_exclude_location/README.rst create mode 100644 stock_available_base_exclude_location/__init__.py create mode 100644 stock_available_base_exclude_location/__manifest__.py create mode 100644 stock_available_base_exclude_location/models/__init__.py create mode 100644 stock_available_base_exclude_location/models/product_product.py create mode 100644 stock_available_base_exclude_location/models/stock_exclude_location_mixin.py create mode 100644 stock_available_base_exclude_location/readme/CONTRIBUTORS.rst create mode 100644 stock_available_base_exclude_location/readme/DESCRIPTION.rst create mode 100644 stock_available_base_exclude_location/readme/USAGE.rst create mode 100644 stock_available_base_exclude_location/static/description/icon.png create mode 100644 stock_available_base_exclude_location/static/description/index.html create mode 100644 stock_available_base_exclude_location/tests/__init__.py create mode 100644 stock_available_base_exclude_location/tests/common.py create mode 100644 stock_available_base_exclude_location/tests/test_stock_exclude_location.py diff --git a/stock_available_base_exclude_location/README.rst b/stock_available_base_exclude_location/README.rst new file mode 100644 index 00000000..f2d1df55 --- /dev/null +++ b/stock_available_base_exclude_location/README.rst @@ -0,0 +1,92 @@ +===================================== +Stock Available Base Exclude Location +===================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--warehouse-lightgray.png?logo=github + :target: https://github.com/OCA/stock-logistics-warehouse/tree/10.0/stock_available_base_exclude_location + :alt: OCA/stock-logistics-warehouse +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/stock-logistics-warehouse-10-0/stock-logistics-warehouse-10-0-stock_available_base_exclude_location + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/153/10.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module is a technical base module to allow defining excluded locations +on an Odoo model. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +In new module, inherit from "stock.exclude.location.mixin" model on +the wanted model. + +Then, when querying for product availability, add to context the key +"excluded_location_ids" with your model "stock_excluded_location_ids" +property. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* ACSONE SA/NV + +Contributors +~~~~~~~~~~~~ + +* Denis Roussel + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-rousseldenis| image:: https://github.com/rousseldenis.png?size=40px + :target: https://github.com/rousseldenis + :alt: rousseldenis + +Current `maintainer `__: + +|maintainer-rousseldenis| + +This module is part of the `OCA/stock-logistics-warehouse `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/stock_available_base_exclude_location/__init__.py b/stock_available_base_exclude_location/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/stock_available_base_exclude_location/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/stock_available_base_exclude_location/__manifest__.py b/stock_available_base_exclude_location/__manifest__.py new file mode 100644 index 00000000..4a539f3f --- /dev/null +++ b/stock_available_base_exclude_location/__manifest__.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# Copyright 2020 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Stock Available Base Exclude Location', + 'summary': """ + Base module to exclude locations for product available quantities""", + 'version': '10.0.1.0.0', + 'category': 'Warehouse', + 'maintainers': ['rousseldenis'], + 'license': 'AGPL-3', + 'author': 'ACSONE SA/NV,Odoo Community Association (OCA)', + 'website': 'https://acsone.eu', + 'depends': [ + "stock" + ], +} diff --git a/stock_available_base_exclude_location/models/__init__.py b/stock_available_base_exclude_location/models/__init__.py new file mode 100644 index 00000000..53274ab9 --- /dev/null +++ b/stock_available_base_exclude_location/models/__init__.py @@ -0,0 +1,2 @@ +from . import product_product +from . import stock_exclude_location_mixin diff --git a/stock_available_base_exclude_location/models/product_product.py b/stock_available_base_exclude_location/models/product_product.py new file mode 100644 index 00000000..b62e027e --- /dev/null +++ b/stock_available_base_exclude_location/models/product_product.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# Copyright 2020 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo.osv import expression +from odoo import models + + +class ProductProduct(models.Model): + + _inherit = "product.product" + + def _get_domain_locations_new( + self, location_ids, company_id=False, compute_child=True): + """ + This is used to exclude locations if needed + :param location_ids: + :param company_id: + :param compute_child: + :return: + """ + domain_quant_loc, domain_move_in_loc, domain_move_out_loc = super( + ProductProduct, self)._get_domain_locations_new( + location_ids=location_ids, + company_id=company_id, + compute_child=compute_child) + excluded_location_ids = self.env.context.get("excluded_location_ids") + if excluded_location_ids: + domain_quant_loc = expression.AND([ + [("location_id", "not in", excluded_location_ids.ids)], + domain_quant_loc, + ]) + domain_move_in_loc = expression.AND([ + [("location_dest_id", "not in", excluded_location_ids.ids)], + domain_quant_loc, + ]) + domain_move_out_loc = expression.AND([ + [("location_id", "not in", excluded_location_ids.ids)], + domain_quant_loc, + ]) + return domain_quant_loc, domain_move_in_loc, domain_move_out_loc diff --git a/stock_available_base_exclude_location/models/stock_exclude_location_mixin.py b/stock_available_base_exclude_location/models/stock_exclude_location_mixin.py new file mode 100644 index 00000000..e77b0202 --- /dev/null +++ b/stock_available_base_exclude_location/models/stock_exclude_location_mixin.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Copyright 2020 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class StockExcludeLocationMixin(models.AbstractModel): + + _name = 'stock.exclude.location.mixin' + + stock_excluded_location_ids = fields.Many2many( + comodel_name="stock.location", + help="Fill in this field to exclude locations for product available" + "quantities." + ) diff --git a/stock_available_base_exclude_location/readme/CONTRIBUTORS.rst b/stock_available_base_exclude_location/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..9179ee4b --- /dev/null +++ b/stock_available_base_exclude_location/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Denis Roussel diff --git a/stock_available_base_exclude_location/readme/DESCRIPTION.rst b/stock_available_base_exclude_location/readme/DESCRIPTION.rst new file mode 100644 index 00000000..9fc10b0c --- /dev/null +++ b/stock_available_base_exclude_location/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module is a technical base module to allow defining excluded locations +on an Odoo model. diff --git a/stock_available_base_exclude_location/readme/USAGE.rst b/stock_available_base_exclude_location/readme/USAGE.rst new file mode 100644 index 00000000..0fb2bad6 --- /dev/null +++ b/stock_available_base_exclude_location/readme/USAGE.rst @@ -0,0 +1,6 @@ +In new module, inherit from "stock.exclude.location.mixin" model on +the wanted model. + +Then, when querying for product availability, add to context the key +"excluded_location_ids" with your model "stock_excluded_location_ids" +property. diff --git a/stock_available_base_exclude_location/static/description/icon.png b/stock_available_base_exclude_location/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/stock_available_base_exclude_location/static/description/index.html b/stock_available_base_exclude_location/static/description/index.html new file mode 100644 index 00000000..0c682ff1 --- /dev/null +++ b/stock_available_base_exclude_location/static/description/index.html @@ -0,0 +1,431 @@ + + + + + + +Stock Available Base Exclude Location + + + +
+

Stock Available Base Exclude Location

+ + +

Beta License: AGPL-3 OCA/stock-logistics-warehouse Translate me on Weblate Try me on Runbot

+

This module is a technical base module to allow defining excluded locations +on an Odoo model.

+

Table of contents

+ +
+

Usage

+

In new module, inherit from “stock.exclude.location.mixin” model on +the wanted model.

+

Then, when querying for product availability, add to context the key +“excluded_location_ids” with your model “stock_excluded_location_ids” +property.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • ACSONE SA/NV
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

rousseldenis

+

This module is part of the OCA/stock-logistics-warehouse project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/stock_available_base_exclude_location/tests/__init__.py b/stock_available_base_exclude_location/tests/__init__.py new file mode 100644 index 00000000..d48fb9c8 --- /dev/null +++ b/stock_available_base_exclude_location/tests/__init__.py @@ -0,0 +1,2 @@ +from . import common +from . import test_stock_exclude_location diff --git a/stock_available_base_exclude_location/tests/common.py b/stock_available_base_exclude_location/tests/common.py new file mode 100644 index 00000000..4c6d2cc9 --- /dev/null +++ b/stock_available_base_exclude_location/tests/common.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +# Copyright 2020 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import mock +from operator import attrgetter +from odoo import models + + +class TestExcludeLocationMixin(object): + # Generate xmlids + # This is needed if you want to load data tied to a test model via xid. + _test_setup_gen_xid = False + # If you extend a real model (ie: res.partner) you must enable this + # to not delete the model on tear down. + _test_teardown_no_delete = False + # You can add custom fields to real models (eg: res.partner). + # In this case you must delete them to leave registry and model clean. + # This is mandatory for relational fields that link a fake model. + _test_purge_fields = [] + + @classmethod + def _test_setup_model(cls, env): + """Initialize it.""" + with mock.patch.object(env.cr, "commit"): + cls._build_model(env.registry, env.cr) + env.registry.setup_models(env.cr) + ctx = dict(env.context, update_custom_fields=True) + env.registry.init_models(env.cr, [cls._name], ctx) + + @classmethod + def _test_teardown_model(cls, env): + """Cleanup registry and real models.""" + + for fname in cls._test_purge_fields: + model = env[cls._name] + if fname in model: + model._pop_field(fname) + + if not getattr(cls, "_test_teardown_no_delete", False): + del env.registry.models[cls._name] + # here we must remove the model from list of children of inherited + # models + parents = cls._inherit + parents = ( + [parents] + if isinstance(parents, basestring) + else (parents or []) + ) + # keep a copy to be sure to not modify the original _inherit + parents = list(parents) + parents.extend(cls._inherits.keys()) + parents.append("base") + funcs = [ + attrgetter(kind + "_children") + for kind in ["_inherits", "_inherit"] + ] + for parent in parents: + for func in funcs: + children = func(env.registry[parent]) + if cls._name in children: + # at this stage our cls is referenced as children of + # parent -> must un reference it + children.remove(cls._name) + + +class ExcludeLocationModelFake(models.Model, TestExcludeLocationMixin): + + _name = "exclude.location.fake" + _inherit = "stock.exclude.location.mixin" + _description = "Exclude Location Fake" diff --git a/stock_available_base_exclude_location/tests/test_stock_exclude_location.py b/stock_available_base_exclude_location/tests/test_stock_exclude_location.py new file mode 100644 index 00000000..f552eeea --- /dev/null +++ b/stock_available_base_exclude_location/tests/test_stock_exclude_location.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +# Copyright 2020 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo.tests import SavepointCase +from .common import TestExcludeLocationMixin, ExcludeLocationModelFake + + +class TestExcludeLocation(SavepointCase, TestExcludeLocationMixin): + + @classmethod + def setUpClass(cls): + super(TestExcludeLocation, cls).setUpClass() + ExcludeLocationModelFake._test_setup_model(cls.env) + cls.fake = cls.env["exclude.location.fake"].create({}) + cls.location_shop = cls.env.ref("stock.stock_location_shop0") + vals = { + "location_id": cls.location_shop.id, + "name": "Sub Location 1" + } + cls.sub_location_1 = cls.env["stock.location"].create(vals) + cls.sub_location_1._parent_store_compute() + cls.product = cls.env.ref("product.product_product_4") + + @classmethod + def tearDownClass(cls): + ExcludeLocationModelFake._test_teardown_model(cls.env) + super(TestExcludeLocation, cls).tearDownClass() + + def _add_stock_to_product(self, product, location, qty): + """ + Set the stock quantity of the product + :param product: product.product recordset + :param qty: float + """ + wizard = self.env["stock.change.product.qty"].create( + { + "product_id": product.id, + "new_quantity": qty, + "location_id": location.id, + } + ) + wizard.change_product_qty() + + def test_exclude_location(self): + # Add different levels of stock for product as : + # Shop 0: 50.0 + # Sub Level (Shop 0 / Sub Location 1): 25.0 + # Query product stock availability normally and with excluded + # location as Sub Location 1 + self._add_stock_to_product(self.product, self.location_shop, 50.0) + self._add_stock_to_product(self.product, self.sub_location_1, 25.0) + self.fake.stock_excluded_location_ids = self.sub_location_1 + qty = self.product.with_context( + excluded_location_ids=self.fake.stock_excluded_location_ids).\ + qty_available + self.assertEquals( + 50.0, + qty + ) + qty = self.product.qty_available + self.assertEquals( + 75.0, + qty + ) From 6bf335526d92fd7508d60c58f9455395d30d7724 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Fri, 18 Sep 2020 15:48:09 +0200 Subject: [PATCH 02/29] [10.0][IMP] stock_available_base_exclude_location: Better tests --- .../__manifest__.py | 2 +- .../tests/__init__.py | 1 - .../tests/common.py | 66 +------------------ .../tests/test_stock_exclude_location.py | 14 ++-- 4 files changed, 13 insertions(+), 70 deletions(-) diff --git a/stock_available_base_exclude_location/__manifest__.py b/stock_available_base_exclude_location/__manifest__.py index 4a539f3f..826a2589 100644 --- a/stock_available_base_exclude_location/__manifest__.py +++ b/stock_available_base_exclude_location/__manifest__.py @@ -11,7 +11,7 @@ 'maintainers': ['rousseldenis'], 'license': 'AGPL-3', 'author': 'ACSONE SA/NV,Odoo Community Association (OCA)', - 'website': 'https://acsone.eu', + 'website': 'https://github.com/OCA/stock-logistics-warehouse', 'depends': [ "stock" ], diff --git a/stock_available_base_exclude_location/tests/__init__.py b/stock_available_base_exclude_location/tests/__init__.py index d48fb9c8..7e9fc5d7 100644 --- a/stock_available_base_exclude_location/tests/__init__.py +++ b/stock_available_base_exclude_location/tests/__init__.py @@ -1,2 +1 @@ -from . import common from . import test_stock_exclude_location diff --git a/stock_available_base_exclude_location/tests/common.py b/stock_available_base_exclude_location/tests/common.py index 4c6d2cc9..837c8a7a 100644 --- a/stock_available_base_exclude_location/tests/common.py +++ b/stock_available_base_exclude_location/tests/common.py @@ -1,70 +1,10 @@ # -*- coding: utf-8 -*- # Copyright 2020 ACSONE SA/NV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -import mock -from operator import attrgetter from odoo import models -class TestExcludeLocationMixin(object): - # Generate xmlids - # This is needed if you want to load data tied to a test model via xid. - _test_setup_gen_xid = False - # If you extend a real model (ie: res.partner) you must enable this - # to not delete the model on tear down. - _test_teardown_no_delete = False - # You can add custom fields to real models (eg: res.partner). - # In this case you must delete them to leave registry and model clean. - # This is mandatory for relational fields that link a fake model. - _test_purge_fields = [] +class ResPartner(models.Model): - @classmethod - def _test_setup_model(cls, env): - """Initialize it.""" - with mock.patch.object(env.cr, "commit"): - cls._build_model(env.registry, env.cr) - env.registry.setup_models(env.cr) - ctx = dict(env.context, update_custom_fields=True) - env.registry.init_models(env.cr, [cls._name], ctx) - - @classmethod - def _test_teardown_model(cls, env): - """Cleanup registry and real models.""" - - for fname in cls._test_purge_fields: - model = env[cls._name] - if fname in model: - model._pop_field(fname) - - if not getattr(cls, "_test_teardown_no_delete", False): - del env.registry.models[cls._name] - # here we must remove the model from list of children of inherited - # models - parents = cls._inherit - parents = ( - [parents] - if isinstance(parents, basestring) - else (parents or []) - ) - # keep a copy to be sure to not modify the original _inherit - parents = list(parents) - parents.extend(cls._inherits.keys()) - parents.append("base") - funcs = [ - attrgetter(kind + "_children") - for kind in ["_inherits", "_inherit"] - ] - for parent in parents: - for func in funcs: - children = func(env.registry[parent]) - if cls._name in children: - # at this stage our cls is referenced as children of - # parent -> must un reference it - children.remove(cls._name) - - -class ExcludeLocationModelFake(models.Model, TestExcludeLocationMixin): - - _name = "exclude.location.fake" - _inherit = "stock.exclude.location.mixin" - _description = "Exclude Location Fake" + _name = "res.partner" + _inherit = ["res.partner", "stock.exclude.location.mixin"] diff --git a/stock_available_base_exclude_location/tests/test_stock_exclude_location.py b/stock_available_base_exclude_location/tests/test_stock_exclude_location.py index f552eeea..9b2a5e34 100644 --- a/stock_available_base_exclude_location/tests/test_stock_exclude_location.py +++ b/stock_available_base_exclude_location/tests/test_stock_exclude_location.py @@ -2,16 +2,20 @@ # Copyright 2020 ACSONE SA/NV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo.tests import SavepointCase -from .common import TestExcludeLocationMixin, ExcludeLocationModelFake +from odoo_test_helper import FakeModelLoader -class TestExcludeLocation(SavepointCase, TestExcludeLocationMixin): +class TestExcludeLocation(SavepointCase): @classmethod def setUpClass(cls): super(TestExcludeLocation, cls).setUpClass() - ExcludeLocationModelFake._test_setup_model(cls.env) - cls.fake = cls.env["exclude.location.fake"].create({}) + cls.loader = FakeModelLoader(cls.env, cls.__module__) + cls.loader.backup_registry() + from .common import ResPartner + cls.loader.update_registry((ResPartner,)) + + cls.fake = cls.env["res.partner"].create({"name": "name"}) cls.location_shop = cls.env.ref("stock.stock_location_shop0") vals = { "location_id": cls.location_shop.id, @@ -23,7 +27,7 @@ def setUpClass(cls): @classmethod def tearDownClass(cls): - ExcludeLocationModelFake._test_teardown_model(cls.env) + cls.loader.restore_registry() super(TestExcludeLocation, cls).tearDownClass() def _add_stock_to_product(self, product, location, qty): From b66c53ab6e03526f9b9479401b24d24c06c6ee6e Mon Sep 17 00:00:00 2001 From: oca-travis Date: Sat, 19 Sep 2020 06:39:27 +0000 Subject: [PATCH 03/29] [UPD] Update stock_available_base_exclude_location.pot --- .../stock_available_base_exclude_location.pot | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 stock_available_base_exclude_location/i18n/stock_available_base_exclude_location.pot diff --git a/stock_available_base_exclude_location/i18n/stock_available_base_exclude_location.pot b/stock_available_base_exclude_location/i18n/stock_available_base_exclude_location.pot new file mode 100644 index 00000000..79b34970 --- /dev/null +++ b/stock_available_base_exclude_location/i18n/stock_available_base_exclude_location.pot @@ -0,0 +1,50 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * stock_available_base_exclude_location +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: stock_available_base_exclude_location +#: model:ir.model.fields,field_description:stock_available_base_exclude_location.field_stock_exclude_location_mixin_display_name +msgid "Display Name" +msgstr "" + +#. module: stock_available_base_exclude_location +#: model:ir.model.fields,help:stock_available_base_exclude_location.field_stock_exclude_location_mixin_stock_excluded_location_ids +msgid "Fill in this field to exclude locations for product availablequantities." +msgstr "" + +#. module: stock_available_base_exclude_location +#: model:ir.model.fields,field_description:stock_available_base_exclude_location.field_stock_exclude_location_mixin_id +msgid "ID" +msgstr "" + +#. module: stock_available_base_exclude_location +#: model:ir.model.fields,field_description:stock_available_base_exclude_location.field_stock_exclude_location_mixin___last_update +msgid "Last Modified on" +msgstr "" + +#. module: stock_available_base_exclude_location +#: model:ir.model,name:stock_available_base_exclude_location.model_product_product +msgid "Product" +msgstr "" + +#. module: stock_available_base_exclude_location +#: model:ir.model.fields,field_description:stock_available_base_exclude_location.field_stock_exclude_location_mixin_stock_excluded_location_ids +msgid "Stock excluded location ids" +msgstr "" + +#. module: stock_available_base_exclude_location +#: model:ir.model,name:stock_available_base_exclude_location.model_stock_exclude_location_mixin +msgid "stock.exclude.location.mixin" +msgstr "" + From 1c3550a49f090bb05098de8ff88bc0547690a4ff Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sat, 19 Sep 2020 07:19:56 +0000 Subject: [PATCH 04/29] [UPD] README.rst --- .../static/description/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stock_available_base_exclude_location/static/description/index.html b/stock_available_base_exclude_location/static/description/index.html index 0c682ff1..db296733 100644 --- a/stock_available_base_exclude_location/static/description/index.html +++ b/stock_available_base_exclude_location/static/description/index.html @@ -3,7 +3,7 @@ - + Stock Available Base Exclude Location -
-

Stock Available Base Exclude Location

+
+ + +Odoo Community Association + +
+

Stock Available Base Exclude Location

-

Beta License: AGPL-3 OCA/stock-logistics-availability Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/stock-logistics-availability Translate me on Weblate Try me on Runboat

This module is a technical base module to allow defining excluded locations on an Odoo model.

Table of contents

@@ -386,7 +391,7 @@

Stock Available Base Exclude Location

-

Usage

+

Usage

In new module, inherit from “stock.exclude.location.mixin” model on the wanted model.

Then, when querying for product availability, add to context the key @@ -394,7 +399,7 @@

Usage

property.

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -402,15 +407,15 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • ACSONE SA/NV
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -436,5 +441,6 @@

Maintainers

+
From 795cf94fd1b16e099ffc38ad4a184c714476498a Mon Sep 17 00:00:00 2001 From: Jacques-Etienne Baudoux Date: Tue, 16 Dec 2025 09:39:16 +0100 Subject: [PATCH 24/29] stock_available_base_exclude_location: Fix Migration 18.0 Move test dependency to test-requirements.txt --- stock_available_base_exclude_location/__manifest__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/stock_available_base_exclude_location/__manifest__.py b/stock_available_base_exclude_location/__manifest__.py index d556a71f..8772fe7e 100644 --- a/stock_available_base_exclude_location/__manifest__.py +++ b/stock_available_base_exclude_location/__manifest__.py @@ -12,5 +12,4 @@ "author": "ACSONE SA/NV,Odoo Community Association (OCA)", "website": "https://github.com/OCA/stock-logistics-availability", "depends": ["stock"], - "external_dependencies": {"python": ["odoo_test_helper"]}, } From beb9c266276de748499c764e858d88cef1252ab5 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 16 Dec 2025 10:07:37 +0000 Subject: [PATCH 25/29] [BOT] post-merge updates --- stock_available_base_exclude_location/README.rst | 2 +- stock_available_base_exclude_location/__manifest__.py | 2 +- .../static/description/index.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/stock_available_base_exclude_location/README.rst b/stock_available_base_exclude_location/README.rst index def8ef16..1bb898b6 100644 --- a/stock_available_base_exclude_location/README.rst +++ b/stock_available_base_exclude_location/README.rst @@ -11,7 +11,7 @@ Stock Available Base Exclude Location !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:04b932fbe1028e429dde7519d997eca7304fe5eb584d8293a8e712e932bb0fbd + !! source digest: sha256:848da39f22eccb054be59544b511cf8ee1c62d2cbf8bb37ee97a83c159347f56 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/stock_available_base_exclude_location/__manifest__.py b/stock_available_base_exclude_location/__manifest__.py index 8772fe7e..62d9cc50 100644 --- a/stock_available_base_exclude_location/__manifest__.py +++ b/stock_available_base_exclude_location/__manifest__.py @@ -5,7 +5,7 @@ "name": "Stock Available Base Exclude Location", "summary": """ Base module to exclude locations for product available quantities""", - "version": "18.0.1.0.0", + "version": "18.0.1.0.1", "category": "Warehouse", "maintainers": ["rousseldenis"], "license": "AGPL-3", diff --git a/stock_available_base_exclude_location/static/description/index.html b/stock_available_base_exclude_location/static/description/index.html index 35f11f17..5b5a08be 100644 --- a/stock_available_base_exclude_location/static/description/index.html +++ b/stock_available_base_exclude_location/static/description/index.html @@ -372,7 +372,7 @@

Stock Available Base Exclude Location

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:04b932fbe1028e429dde7519d997eca7304fe5eb584d8293a8e712e932bb0fbd +!! source digest: sha256:848da39f22eccb054be59544b511cf8ee1c62d2cbf8bb37ee97a83c159347f56 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/stock-logistics-availability Translate me on Weblate Try me on Runboat

This module is a technical base module to allow defining excluded From 65e037a929a330a54da359ffa866fcdf64b618b7 Mon Sep 17 00:00:00 2001 From: Jacques-Etienne Baudoux Date: Tue, 3 Mar 2026 12:21:02 +0100 Subject: [PATCH 26/29] [FIX] stock_available_base_exclude_location: FakeModel --- .../tests/test_stock_exclude_location.py | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/stock_available_base_exclude_location/tests/test_stock_exclude_location.py b/stock_available_base_exclude_location/tests/test_stock_exclude_location.py index d1e65838..585128c7 100644 --- a/stock_available_base_exclude_location/tests/test_stock_exclude_location.py +++ b/stock_available_base_exclude_location/tests/test_stock_exclude_location.py @@ -12,23 +12,26 @@ class TestExcludeLocation(BaseCommon): def setUpClass(cls): super().setUpClass() cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) - cls.loader = FakeModelLoader(cls.env, cls.__module__) - cls.loader.backup_registry() - from .common import ResPartner - - cls.loader.update_registry((ResPartner,)) - - cls.fake = cls.env["res.partner"].create({"name": "name"}) cls.location_shop = cls.env.ref("stock.stock_location_stock") vals = {"location_id": cls.location_shop.id, "name": "Sub Location 1"} cls.sub_location_1 = cls.env["stock.location"].create(vals) cls.sub_location_1._parent_store_compute() cls.product = cls.env.ref("product.product_product_4") - @classmethod - def tearDownClass(cls): - cls.loader.restore_registry() - super().tearDownClass() + def setUp(self): + super().setUp() + self.loader = FakeModelLoader(self.env, self.__module__) + self.loader.backup_registry() + + from .common import ResPartner + + self.loader.update_registry((ResPartner,)) + + self.fake = self.env["res.partner"].create({"name": "name"}) + + def tearDown(self): + self.loader.restore_registry() + super().tearDown() @classmethod def _create_stock_move( From b26bf157972dd7ee7ea5f6231273e316d5c3dc7c Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 3 Mar 2026 14:27:08 +0000 Subject: [PATCH 27/29] [BOT] post-merge updates --- stock_available_base_exclude_location/README.rst | 2 +- stock_available_base_exclude_location/__manifest__.py | 2 +- .../static/description/index.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/stock_available_base_exclude_location/README.rst b/stock_available_base_exclude_location/README.rst index 1bb898b6..84d483e5 100644 --- a/stock_available_base_exclude_location/README.rst +++ b/stock_available_base_exclude_location/README.rst @@ -11,7 +11,7 @@ Stock Available Base Exclude Location !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:848da39f22eccb054be59544b511cf8ee1c62d2cbf8bb37ee97a83c159347f56 + !! source digest: sha256:e10cd857d3686fca227a280cedda4aa830c2308bd03beb11bff5cefcd8f030ac !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/stock_available_base_exclude_location/__manifest__.py b/stock_available_base_exclude_location/__manifest__.py index 62d9cc50..b7cf8a33 100644 --- a/stock_available_base_exclude_location/__manifest__.py +++ b/stock_available_base_exclude_location/__manifest__.py @@ -5,7 +5,7 @@ "name": "Stock Available Base Exclude Location", "summary": """ Base module to exclude locations for product available quantities""", - "version": "18.0.1.0.1", + "version": "18.0.1.0.2", "category": "Warehouse", "maintainers": ["rousseldenis"], "license": "AGPL-3", diff --git a/stock_available_base_exclude_location/static/description/index.html b/stock_available_base_exclude_location/static/description/index.html index 5b5a08be..833f4b47 100644 --- a/stock_available_base_exclude_location/static/description/index.html +++ b/stock_available_base_exclude_location/static/description/index.html @@ -372,7 +372,7 @@

Stock Available Base Exclude Location

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:848da39f22eccb054be59544b511cf8ee1c62d2cbf8bb37ee97a83c159347f56 +!! source digest: sha256:e10cd857d3686fca227a280cedda4aa830c2308bd03beb11bff5cefcd8f030ac !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/stock-logistics-availability Translate me on Weblate Try me on Runboat

This module is a technical base module to allow defining excluded From b9aa35d0bfdc34a9b844abfb74a936313ebd5938 Mon Sep 17 00:00:00 2001 From: "Denis Roussel (ACSONE)" Date: Fri, 3 Apr 2026 09:31:38 +0000 Subject: [PATCH 28/29] Added translation using Weblate (French) --- .../i18n/fr.po | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 stock_available_base_exclude_location/i18n/fr.po diff --git a/stock_available_base_exclude_location/i18n/fr.po b/stock_available_base_exclude_location/i18n/fr.po new file mode 100644 index 00000000..16fe815a --- /dev/null +++ b/stock_available_base_exclude_location/i18n/fr.po @@ -0,0 +1,55 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * stock_available_base_exclude_location +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" + +#. module: stock_available_base_exclude_location +#: model:ir.model.fields,field_description:stock_available_base_exclude_location.field_stock_exclude_location_mixin__stock_excluded_location_domain_char +msgid "Domain to filter locations" +msgstr "" + +#. module: stock_available_base_exclude_location +#: model:ir.model.fields,help:stock_available_base_exclude_location.field_stock_exclude_location_mixin__stock_excluded_location_ids +msgid "" +"Fill in this field to exclude locations for product available quantities." +msgstr "" + +#. module: stock_available_base_exclude_location +#: model:ir.model.fields,help:stock_available_base_exclude_location.field_stock_exclude_location_mixin__stock_excluded_location_domain +#: model:ir.model.fields,help:stock_available_base_exclude_location.field_stock_exclude_location_mixin__stock_excluded_location_domain_char +msgid "" +"Fill in this with the domain you want to exclude locations for product " +"available quantities" +msgstr "" + +#. module: stock_available_base_exclude_location +#: model:ir.model,name:stock_available_base_exclude_location.model_product_product +msgid "Product Variant" +msgstr "" + +#. module: stock_available_base_exclude_location +#: model:ir.model.fields,field_description:stock_available_base_exclude_location.field_stock_exclude_location_mixin__stock_excluded_location_domain +msgid "Stock Excluded Location Domain" +msgstr "" + +#. module: stock_available_base_exclude_location +#: model:ir.model.fields,field_description:stock_available_base_exclude_location.field_stock_exclude_location_mixin__stock_excluded_location_ids +msgid "Stock Excluded Locations" +msgstr "" + +#. module: stock_available_base_exclude_location +#: model:ir.model,name:stock_available_base_exclude_location.model_stock_exclude_location_mixin +msgid "" +"technical base module to allow defining excluded locations on an Odoo model" +msgstr "" From feea07ef0300b004c2aef4eb8bbf6286450e89db Mon Sep 17 00:00:00 2001 From: AaronHForgeFlow Date: Mon, 18 May 2026 16:10:28 +0200 Subject: [PATCH 29/29] [MIG] stock_available_base_exclude_location: Migration to v19 --- .../README.rst | 18 ++--- .../__manifest__.py | 2 +- .../models/product_product.py | 68 ++++++------------- .../static/description/index.html | 6 +- .../tests/common.py | 7 +- .../tests/test_stock_exclude_location.py | 44 ++++++------ 6 files changed, 58 insertions(+), 87 deletions(-) diff --git a/stock_available_base_exclude_location/README.rst b/stock_available_base_exclude_location/README.rst index 84d483e5..075d3108 100644 --- a/stock_available_base_exclude_location/README.rst +++ b/stock_available_base_exclude_location/README.rst @@ -21,13 +21,13 @@ Stock Available Base Exclude Location :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--availability-lightgray.png?logo=github - :target: https://github.com/OCA/stock-logistics-availability/tree/18.0/stock_available_base_exclude_location + :target: https://github.com/OCA/stock-logistics-availability/tree/19.0/stock_available_base_exclude_location :alt: OCA/stock-logistics-availability .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/stock-logistics-availability-18-0/stock-logistics-availability-18-0-stock_available_base_exclude_location + :target: https://translation.odoo-community.org/projects/stock-logistics-availability-19-0/stock-logistics-availability-19-0-stock_available_base_exclude_location :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/stock-logistics-availability&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/stock-logistics-availability&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -56,7 +56,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -71,11 +71,11 @@ Authors Contributors ------------ -- Denis Roussel -- Xavier Bouquiaux -- `Heliconia Solutions Pvt. Ltd. `__ +- Denis Roussel +- Xavier Bouquiaux +- `Heliconia Solutions Pvt. Ltd. `__ - - Bhavesh Heliconia + - Bhavesh Heliconia Maintainers ----------- @@ -98,6 +98,6 @@ Current `maintainer `__: |maintainer-rousseldenis| -This module is part of the `OCA/stock-logistics-availability `_ project on GitHub. +This module is part of the `OCA/stock-logistics-availability `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/stock_available_base_exclude_location/__manifest__.py b/stock_available_base_exclude_location/__manifest__.py index b7cf8a33..6641d634 100644 --- a/stock_available_base_exclude_location/__manifest__.py +++ b/stock_available_base_exclude_location/__manifest__.py @@ -5,7 +5,7 @@ "name": "Stock Available Base Exclude Location", "summary": """ Base module to exclude locations for product available quantities""", - "version": "18.0.1.0.2", + "version": "19.0.1.0.0", "category": "Warehouse", "maintainers": ["rousseldenis"], "license": "AGPL-3", diff --git a/stock_available_base_exclude_location/models/product_product.py b/stock_available_base_exclude_location/models/product_product.py index f638c1c8..e8623a84 100644 --- a/stock_available_base_exclude_location/models/product_product.py +++ b/stock_available_base_exclude_location/models/product_product.py @@ -1,7 +1,7 @@ # Copyright 2020 ACSONE SA/NV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import models -from odoo.osv import expression +from odoo.fields import Domain class ProductProduct(models.Model): @@ -28,70 +28,40 @@ def _get_domain_locations_new(self, location_ids): domain_excluded_move_in_loc = [] domain_excluded_move_out_loc = [] if excluded_location_ids: - domain_excluded_quant_loc = expression.AND( - [ - [("location_id", "not in", excluded_location_ids.ids)], - domain_excluded_quant_loc, - ] + domain_excluded_quant_loc = list( + Domain([("location_id", "not in", excluded_location_ids.ids)]) + & Domain(domain_excluded_quant_loc) ) - domain_excluded_move_in_loc = expression.AND( - [ - [("location_id", "not in", excluded_location_ids.ids)], - domain_excluded_move_in_loc, - ] + domain_excluded_move_in_loc = list( + Domain([("location_id", "not in", excluded_location_ids.ids)]) + & Domain(domain_excluded_move_in_loc) ) - domain_excluded_move_out_loc = expression.AND( - [ - [("location_id", "not in", excluded_location_ids.ids)], - domain_excluded_move_out_loc, - ] + domain_excluded_move_out_loc = list( + Domain([("location_id", "not in", excluded_location_ids.ids)]) + & Domain(domain_excluded_move_out_loc) ) if excluded_location_domain: - domain_excluded_quant_loc = expression.AND( - [ - excluded_location_domain, - domain_excluded_quant_loc, - ] + domain_excluded_quant_loc = list( + Domain(excluded_location_domain) & Domain(domain_excluded_quant_loc) ) - domain_excluded_move_in_loc = expression.AND( - [ - excluded_location_domain, - domain_excluded_move_in_loc, - ] + domain_excluded_move_in_loc = list( + Domain(excluded_location_domain) & Domain(domain_excluded_move_in_loc) ) - domain_excluded_move_out_loc = expression.AND( - [ - excluded_location_domain, - domain_excluded_move_out_loc, - ] + domain_excluded_move_out_loc = list( + Domain(excluded_location_domain) & Domain(domain_excluded_move_out_loc) ) domain_quant_loc = ( - expression.AND( - [ - domain_excluded_quant_loc, - domain_quant_loc, - ] - ) + list(Domain(domain_excluded_quant_loc) & Domain(domain_quant_loc)) if domain_excluded_quant_loc else domain_quant_loc ) domain_move_in_loc = ( - expression.AND( - [ - domain_excluded_move_in_loc, - domain_move_in_loc, - ] - ) + list(Domain(domain_excluded_move_in_loc) & Domain(domain_move_in_loc)) if domain_excluded_move_in_loc else domain_move_in_loc ) domain_move_out_loc = ( - expression.AND( - [ - domain_excluded_move_out_loc, - domain_move_out_loc, - ] - ) + list(Domain(domain_excluded_move_out_loc) & Domain(domain_move_out_loc)) if domain_excluded_move_in_loc else domain_move_out_loc ) diff --git a/stock_available_base_exclude_location/static/description/index.html b/stock_available_base_exclude_location/static/description/index.html index 833f4b47..41ad0371 100644 --- a/stock_available_base_exclude_location/static/description/index.html +++ b/stock_available_base_exclude_location/static/description/index.html @@ -374,7 +374,7 @@

Stock Available Base Exclude Location

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:e10cd857d3686fca227a280cedda4aa830c2308bd03beb11bff5cefcd8f030ac !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/stock-logistics-availability Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/stock-logistics-availability Translate me on Weblate Try me on Runboat

This module is a technical base module to allow defining excluded locations on an Odoo model.

Table of contents

@@ -403,7 +403,7 @@

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -436,7 +436,7 @@

Maintainers

promote its widespread use.

Current maintainer:

rousseldenis

-

This module is part of the OCA/stock-logistics-availability project on GitHub.

+

This module is part of the OCA/stock-logistics-availability project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/stock_available_base_exclude_location/tests/common.py b/stock_available_base_exclude_location/tests/common.py index ad6c1860..40cc1ae2 100644 --- a/stock_available_base_exclude_location/tests/common.py +++ b/stock_available_base_exclude_location/tests/common.py @@ -3,6 +3,7 @@ from odoo import models -class ResPartner(models.Model): - _name = "res.partner" - _inherit = ["res.partner", "stock.exclude.location.mixin"] +class TestExcludeLocationOwner(models.Model): + _name = "test.exclude.location.owner" + _inherit = ["stock.exclude.location.mixin"] + _description = "Test model for stock exclude location mixin" diff --git a/stock_available_base_exclude_location/tests/test_stock_exclude_location.py b/stock_available_base_exclude_location/tests/test_stock_exclude_location.py index 585128c7..926ae68a 100644 --- a/stock_available_base_exclude_location/tests/test_stock_exclude_location.py +++ b/stock_available_base_exclude_location/tests/test_stock_exclude_location.py @@ -1,37 +1,38 @@ # Copyright 2020 ACSONE SA/NV # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo_test_helper import FakeModelLoader +from odoo.orm.model_classes import add_to_registry +from odoo.tests import common -from odoo.addons.base.tests.common import BaseCommon -from odoo.addons.stock.models.stock_location import Location +from odoo.addons.stock.models.stock_location import StockLocation as Location from odoo.addons.stock.models.stock_move import StockMove -class TestExcludeLocation(BaseCommon): +class TestExcludeLocation(common.TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() + from .common import TestExcludeLocationOwner + + add_to_registry(cls.registry, TestExcludeLocationOwner) + cls.registry._setup_models__(cls.env.cr, [TestExcludeLocationOwner._name]) + cls.registry.init_models( + cls.env.cr, + [TestExcludeLocationOwner._name], + {"models_to_check": True}, + ) + cls.addClassCleanup(cls.registry.__delitem__, TestExcludeLocationOwner._name) cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) cls.location_shop = cls.env.ref("stock.stock_location_stock") vals = {"location_id": cls.location_shop.id, "name": "Sub Location 1"} cls.sub_location_1 = cls.env["stock.location"].create(vals) - cls.sub_location_1._parent_store_compute() - cls.product = cls.env.ref("product.product_product_4") - - def setUp(self): - super().setUp() - self.loader = FakeModelLoader(self.env, self.__module__) - self.loader.backup_registry() - - from .common import ResPartner - - self.loader.update_registry((ResPartner,)) - - self.fake = self.env["res.partner"].create({"name": "name"}) - - def tearDown(self): - self.loader.restore_registry() - super().tearDown() + cls.product = cls.env["product.product"].create( + { + "name": "Test Product", + "type": "consu", + "is_storable": True, + } + ) + cls.fake = cls.env[TestExcludeLocationOwner._name].create({}) @classmethod def _create_stock_move( @@ -39,7 +40,6 @@ def _create_stock_move( ) -> StockMove: move = cls.env["stock.move"].create( { - "name": "Move", "location_id": location.id, "location_dest_id": location_dest.id, "product_id": cls.product.id,