From 92ed8b09b09d80f95b8ad466830fd90f6c6e73b2 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Sat, 22 Feb 2025 13:09:25 +0100 Subject: [PATCH] [ADD] product_uom_company_favorite: new module --- product_uom_company_favorite/README.rst | 146 ++++++ product_uom_company_favorite/__init__.py | 2 + product_uom_company_favorite/__manifest__.py | 22 + .../demo/res_company.xml | 14 + product_uom_company_favorite/i18n/fr.po | 71 +++ .../models/__init__.py | 3 + .../models/product_template.py | 28 + .../models/res_company.py | 30 ++ .../models/uom_uom.py | 27 + .../post_init_hook.py | 16 + .../readme/CONFIGURE.rst | 7 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 18 + product_uom_company_favorite/readme/USAGE.rst | 8 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 493 ++++++++++++++++++ .../description/product_category_tree.png | Bin 0 -> 32890 bytes .../static/description/product_form_view.png | Bin 0 -> 23491 bytes .../tests/__init__.py | 1 + .../tests/test_module.py | 62 +++ .../views/view_product_template.xml | 19 + .../views/view_uom_category.xml | 19 + .../views/view_uom_uom.xml | 50 ++ .../odoo/addons/product_uom_company_favorite | 1 + setup/product_uom_company_favorite/setup.py | 6 + 25 files changed, 1044 insertions(+) create mode 100644 product_uom_company_favorite/README.rst create mode 100644 product_uom_company_favorite/__init__.py create mode 100644 product_uom_company_favorite/__manifest__.py create mode 100644 product_uom_company_favorite/demo/res_company.xml create mode 100644 product_uom_company_favorite/i18n/fr.po create mode 100644 product_uom_company_favorite/models/__init__.py create mode 100644 product_uom_company_favorite/models/product_template.py create mode 100644 product_uom_company_favorite/models/res_company.py create mode 100644 product_uom_company_favorite/models/uom_uom.py create mode 100644 product_uom_company_favorite/post_init_hook.py create mode 100644 product_uom_company_favorite/readme/CONFIGURE.rst create mode 100644 product_uom_company_favorite/readme/CONTRIBUTORS.rst create mode 100644 product_uom_company_favorite/readme/DESCRIPTION.rst create mode 100644 product_uom_company_favorite/readme/USAGE.rst create mode 100644 product_uom_company_favorite/static/description/icon.png create mode 100644 product_uom_company_favorite/static/description/index.html create mode 100644 product_uom_company_favorite/static/description/product_category_tree.png create mode 100644 product_uom_company_favorite/static/description/product_form_view.png create mode 100644 product_uom_company_favorite/tests/__init__.py create mode 100644 product_uom_company_favorite/tests/test_module.py create mode 100644 product_uom_company_favorite/views/view_product_template.xml create mode 100644 product_uom_company_favorite/views/view_uom_category.xml create mode 100644 product_uom_company_favorite/views/view_uom_uom.xml create mode 120000 setup/product_uom_company_favorite/odoo/addons/product_uom_company_favorite create mode 100644 setup/product_uom_company_favorite/setup.py diff --git a/product_uom_company_favorite/README.rst b/product_uom_company_favorite/README.rst new file mode 100644 index 00000000..9c279583 --- /dev/null +++ b/product_uom_company_favorite/README.rst @@ -0,0 +1,146 @@ +====================================== +Product Categories - Company Favorites +====================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:a72e6c252981c898aa0b5a7afcc5dad3199450bef31ae2b76ca04c99a0021cac + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fmulti--company-lightgray.png?logo=github + :target: https://github.com/OCA/multi-company/tree/16.0/product_category_company_favorite + :alt: OCA/multi-company +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/multi-company-16-0/multi-company-16-0-product_category_company_favorite + :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/multi-company&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module is usefull in a multi-company context if +- the companies doesn't have to use all the same categories +- if you apply companies to your products. + +Without that module, when creating products, end user can select categories +that don't make sense for the current company. +With that module, categories manager can set for each company, which category +will be displayed, reducing configuration error. (and so accounting error +if accounts are set at the category level.) + +You could be interested by concurrent module named ``product_category_company``, +(same repository), that propose similar features but with alternative implementation. + +**Note** + +- When creating **new root category**: + + - it is favorite for all the other company if it is favorite in the current + context. + - it is not favorite for all the other company if it is not favorite in the current + context. + +- When creating **new child category**: + + - the category will inherit the configuration + of the parent category in each company. + +- when creating a **new company**: + + - all the existing categories are favorite in the new created company. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +* Select a company you want to configure + +* Go to "Inventory" > "Configuration" > "Product Categories" + +* Uncheck categories you don't want to use for the current company. + +.. figure:: https://raw.githubusercontent.com/OCA/multi-company/16.0/product_category_company_favorite/static/description/product_category_tree.png + +Usage +===== + +* Go in "Inventory" > "Master Data" > "Products" + +* Create a new product + +.. figure:: https://raw.githubusercontent.com/OCA/multi-company/16.0/product_category_company_favorite/static/description/product_form_view.png + +End user doesn't have access to the category "All / Consumable" +that is not favorite in the current company. + +Known issues / Roadmap +====================== + +There is a little UX bug. When user display product categories in the tree view +and click to select which category is favorite +and which category is not, if the category has children, the value of the children +is updated in the database but the display is not updated. + +Refresh the page resolve the problem. + +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 `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* GRAP + +Contributors +~~~~~~~~~~~~ + +* Sylvain LE GAL (https://www.twitter.com/legalsylvain) + +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-legalsylvain| image:: https://github.com/legalsylvain.png?size=40px + :target: https://github.com/legalsylvain + :alt: legalsylvain + +Current `maintainer `__: + +|maintainer-legalsylvain| + +This module is part of the `OCA/multi-company `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/product_uom_company_favorite/__init__.py b/product_uom_company_favorite/__init__.py new file mode 100644 index 00000000..a803b649 --- /dev/null +++ b/product_uom_company_favorite/__init__.py @@ -0,0 +1,2 @@ +from . import models +from .post_init_hook import initialize_is_favorite_field diff --git a/product_uom_company_favorite/__manifest__.py b/product_uom_company_favorite/__manifest__.py new file mode 100644 index 00000000..6552d3a6 --- /dev/null +++ b/product_uom_company_favorite/__manifest__.py @@ -0,0 +1,22 @@ +# Copyright (C) 2025 - Today: GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + "name": "Product UoM - Company Favorites", + "summary": "Possilibity to set favorite product units" " of Measure per company", + "version": "16.0.1.0.1", + "category": "Product", + "author": "GRAP,Odoo Community Association (OCA)", + "maintainers": ["legalsylvain"], + "website": "https://github.com/grap/grap-odoo-incubator", + "license": "AGPL-3", + "depends": ["product"], + "data": [ + "views/view_uom_uom.xml", + "views/view_uom_category.xml", + "views/view_product_template.xml", + ], + "demo": ["demo/res_company.xml"], + "installable": True, + "post_init_hook": "initialize_is_favorite_field", +} diff --git a/product_uom_company_favorite/demo/res_company.xml b/product_uom_company_favorite/demo/res_company.xml new file mode 100644 index 00000000..6df1f881 --- /dev/null +++ b/product_uom_company_favorite/demo/res_company.xml @@ -0,0 +1,14 @@ + + + + + + Demo Company For Favorite UoM + + + + diff --git a/product_uom_company_favorite/i18n/fr.po b/product_uom_company_favorite/i18n/fr.po new file mode 100644 index 00000000..8ddd6e2a --- /dev/null +++ b/product_uom_company_favorite/i18n/fr.po @@ -0,0 +1,71 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_uom_company_favorite +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-02-24 15:37+0000\n" +"PO-Revision-Date: 2025-02-24 15:37+0000\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: product_uom_company_favorite +#: model:ir.model,name:product_uom_company_favorite.model_res_company +msgid "Companies" +msgstr "Sociétés" + +#. module: product_uom_company_favorite +#: model:ir.model.fields,help:product_uom_company_favorite.field_product_product__uom_id +#: model:ir.model.fields,help:product_uom_company_favorite.field_product_template__uom_id +msgid "Default unit of measure used for all stock operations." +msgstr "" +"Unité de mesure par défaut utilisée pour toutes les opérations de stock" + +#. module: product_uom_company_favorite +#: model:ir.model.fields,field_description:product_uom_company_favorite.field_uom_uom__is_favorite +msgid "Favorite" +msgstr "Favorite" + +#. module: product_uom_company_favorite +#: model_terms:ir.ui.view,arch_db:product_uom_company_favorite.view_uom_uom_search +msgid "Favorites" +msgstr "Favorites" + +#. module: product_uom_company_favorite +#: model:ir.model.fields,help:product_uom_company_favorite.field_uom_uom__is_favorite +msgid "" +"If this field is unchecked, the uom will be hidden when searching uom in a " +"drop-down list like in the product form view." +msgstr "" +"Si cette case est décochée, l'unité de mesure sera cachée lors de la recherche" +" d'unité de mesure dans une liste déroulante, comme dans la vue formulaire " +"du produit." + +#. module: product_uom_company_favorite +#: model:ir.model,name:product_uom_company_favorite.model_product_template +msgid "Product" +msgstr "Produit" + +#. module: product_uom_company_favorite +#: model:ir.model,name:product_uom_company_favorite.model_uom_uom +msgid "Product Unit of Measure" +msgstr "Unité de mesure du produit" + +#. module: product_uom_company_favorite +#: model:ir.model.fields,field_description:product_uom_company_favorite.field_product_product__uom_id +#: model:ir.model.fields,field_description:product_uom_company_favorite.field_product_template__uom_id +msgid "Unit of Measure" +msgstr "Unité de mesure" + +#. module: product_uom_company_favorite +#. odoo-python +#: code:addons/product_uom_company_favorite/models/product_template.py:0 +#, python-format +msgid "You can not set this Unit of Measure." +msgstr "Vous ne pouvez pas utiliser cette unité de mesure." diff --git a/product_uom_company_favorite/models/__init__.py b/product_uom_company_favorite/models/__init__.py new file mode 100644 index 00000000..cafdb80e --- /dev/null +++ b/product_uom_company_favorite/models/__init__.py @@ -0,0 +1,3 @@ +from . import res_company +from . import uom_uom +from . import product_template diff --git a/product_uom_company_favorite/models/product_template.py b/product_uom_company_favorite/models/product_template.py new file mode 100644 index 00000000..b6d07055 --- /dev/null +++ b/product_uom_company_favorite/models/product_template.py @@ -0,0 +1,28 @@ +# Copyright (C) 2023-Today: GRAP () +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class ProductTemplate(models.Model): + _inherit = "product.template" + + uom_id = fields.Many2one(default=lambda x: x._get_default_uom_id()) + + def _get_default_uom_id(self): + """Overwrite the original function that returns 'Units' + In our case, if there are many favorites, force user to decide. + Otherwise, set the unique favorite unit of measure as the default one. + """ + favorite_uoms = self.env["uom.uom"].search([("is_favorite", "=", True)]) + if len(favorite_uoms) == 1: + return favorite_uoms[0].id + return False + + @api.constrains("uom_id") + def _check_uom(self): + if self.filtered(lambda x: not x.uom_id.is_favorite): + raise ValidationError(_("You can not set this Unit of Measure.")) + return super()._check_uom() diff --git a/product_uom_company_favorite/models/res_company.py b/product_uom_company_favorite/models/res_company.py new file mode 100644 index 00000000..263b650b --- /dev/null +++ b/product_uom_company_favorite/models/res_company.py @@ -0,0 +1,30 @@ +# Copyright (C) 2023-Today: GRAP () +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + def _configure_favorite_uom(self): + for company in self: + result = self.env["product.template"].read_group( + [("company_id", "in", [company.id, False])], ["uom_id"], ["uom_id"] + ) + uom_ids = [x["uom_id"][0] for x in result] + + uoms = ( + self.env["uom.uom"] + .sudo() + .with_company(company) + .search([("id", "in", uom_ids)]) + ) + uoms.write({"is_favorite": True}) + + @api.model_create_multi + def create(self, vals_list): + companies = super().create(vals_list) + companies._configure_favorite_uom() + return companies diff --git a/product_uom_company_favorite/models/uom_uom.py b/product_uom_company_favorite/models/uom_uom.py new file mode 100644 index 00000000..be34e4e5 --- /dev/null +++ b/product_uom_company_favorite/models/uom_uom.py @@ -0,0 +1,27 @@ +# Copyright (C) 2023-Today: GRAP () +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class ProductUom(models.Model): + _inherit = "uom.uom" + + is_favorite = fields.Boolean( + string="Favorite", + company_dependent=True, + help="If this field is unchecked, the uom will" + " be hidden when searching uom in a drop-down list" + " like in the product form view.", + ) + + def _name_search( + self, name, args=None, operator="ilike", limit=100, name_get_uid=None + ): + args = list(args or []) + if self.env.context.get("display_only_favorite", False): + args += [("is_favorite", "=", True)] + return super()._name_search( + name, args=args, operator=operator, limit=limit, name_get_uid=name_get_uid + ) diff --git a/product_uom_company_favorite/post_init_hook.py b/product_uom_company_favorite/post_init_hook.py new file mode 100644 index 00000000..4a02bf47 --- /dev/null +++ b/product_uom_company_favorite/post_init_hook.py @@ -0,0 +1,16 @@ +# Copyright (C) 2025-Today: GRAP () +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import logging + +from odoo import SUPERUSER_ID, api + +_logger = logging.getLogger(__name__) + + +def initialize_is_favorite_field(cr, registry): + env = api.Environment(cr, SUPERUSER_ID, {}) + for company in env["res.company"].with_context(active_test=False).search([]): + _logger.info("Configure is_favorite field for the company %s" % (company.name)) + company._configure_favorite_uom() diff --git a/product_uom_company_favorite/readme/CONFIGURE.rst b/product_uom_company_favorite/readme/CONFIGURE.rst new file mode 100644 index 00000000..ff12c385 --- /dev/null +++ b/product_uom_company_favorite/readme/CONFIGURE.rst @@ -0,0 +1,7 @@ +* Select a company you want to configure + +* Go to "Units of Measure" + +* Uncheck units you don't want to use for the current company. + +.. figure:: ../static/description/product_uom_tree.png diff --git a/product_uom_company_favorite/readme/CONTRIBUTORS.rst b/product_uom_company_favorite/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..e1525ce0 --- /dev/null +++ b/product_uom_company_favorite/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Sylvain LE GAL (https://www.twitter.com/legalsylvain) diff --git a/product_uom_company_favorite/readme/DESCRIPTION.rst b/product_uom_company_favorite/readme/DESCRIPTION.rst new file mode 100644 index 00000000..7bcbf185 --- /dev/null +++ b/product_uom_company_favorite/readme/DESCRIPTION.rst @@ -0,0 +1,18 @@ +This module is usefull in a multi-company context if +- the companies doesn't have to use all the same units +- if you apply companies to your products. + +Without that module, when creating products, end user can select units +that don't make sense for the current company. +With that module, units manager can set for each company, which units +will be displayed, reducing configuration error. + +This module also change the default unit of measure. +If many units are favorite, default unit is False, so it forces the +user to choose the correct one. + +**Note** + +When installing the module for all companies, or when creating a new company, +we set as favorite units, all the units set for the products of the company +(or the global products) diff --git a/product_uom_company_favorite/readme/USAGE.rst b/product_uom_company_favorite/readme/USAGE.rst new file mode 100644 index 00000000..68a85b41 --- /dev/null +++ b/product_uom_company_favorite/readme/USAGE.rst @@ -0,0 +1,8 @@ +* Go in "Inventory" > "Master Data" > "Products" + +* Create a new product + +.. figure:: ../static/description/product_form_view.png + +End user doesn't have access to the units +that are not favorite in the current company. diff --git a/product_uom_company_favorite/static/description/icon.png b/product_uom_company_favorite/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/product_uom_company_favorite/static/description/index.html b/product_uom_company_favorite/static/description/index.html new file mode 100644 index 00000000..ce34de66 --- /dev/null +++ b/product_uom_company_favorite/static/description/index.html @@ -0,0 +1,493 @@ + + + + + +Product Categories - Company Favorites + + + +
+

Product Categories - Company Favorites

+ + +

Beta License: AGPL-3 OCA/multi-company Translate me on Weblate Try me on Runboat

+

This module is usefull in a multi-company context if +- the companies doesn’t have to use all the same categories +- if you apply companies to your products.

+

Without that module, when creating products, end user can select categories +that don’t make sense for the current company. +With that module, categories manager can set for each company, which category +will be displayed, reducing configuration error. (and so accounting error +if accounts are set at the category level.)

+

You could be interested by concurrent module named product_category_company, +(same repository), that propose similar features but with alternative implementation.

+

Note

+
    +
  • When creating new root category:

    +
    +
      +
    • it is favorite for all the other company if it is favorite in the current +context.
    • +
    • it is not favorite for all the other company if it is not favorite in the current +context.
    • +
    +
    +
  • +
  • When creating new child category:

    +
    +
      +
    • the category will inherit the configuration +of the parent category in each company.
    • +
    +
    +
  • +
  • when creating a new company:

    +
    +
      +
    • all the existing categories are favorite in the new created company.
    • +
    +
    +
  • +
+

Table of contents

+ +
+

Configuration

+
    +
  • Select a company you want to configure
  • +
  • Go to “Inventory” > “Configuration” > “Product Categories”
  • +
  • Uncheck categories you don’t want to use for the current company.
  • +
+
+https://raw.githubusercontent.com/OCA/multi-company/16.0/product_category_company_favorite/static/description/product_category_tree.png +
+
+
+

Usage

+
    +
  • Go in “Inventory” > “Master Data” > “Products”
  • +
  • Create a new product
  • +
+
+https://raw.githubusercontent.com/OCA/multi-company/16.0/product_category_company_favorite/static/description/product_form_view.png +
+

End user doesn’t have access to the category “All / Consumable” +that is not favorite in the current company.

+
+
+

Known issues / Roadmap

+

There is a little UX bug. When user display product categories in the tree view +and click to select which category is favorite +and which category is not, if the category has children, the value of the children +is updated in the database but the display is not updated.

+

Refresh the page resolve the problem.

+
+
+

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.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • GRAP
  • +
+
+ +
+

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:

+

legalsylvain

+

This module is part of the OCA/multi-company project on GitHub.

+

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

+
+
+
+ + diff --git a/product_uom_company_favorite/static/description/product_category_tree.png b/product_uom_company_favorite/static/description/product_category_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..ee27a76fc5c38953539b1fe562497c8812fc427a GIT binary patch literal 32890 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%0DxffNz~$~BG%e*AkX)}Q$5QE z>q-Ck4C9xJJ+v6<@D=?2VK*=^AeTRZ zv*-kzbF|TX7s{Z`TuYObnCk5G`}Pf!g@yKjI17jqzW)BJ>+6bN>>tStjB=JjE%?Cj zaA2yfYI|P%A@k964e)8Z#}*57CV!bs`IVKGcV=d0eiM(*LB4)4Otv;QZ#X%N zkGhm-mHebsVsl>NNKGCi%z{k@berT~VKt3>75HaWrSmC*>~ zxIl)ZG0o$7^!7w>`$*TpA+f$w;BrsKy=V+|Abke}qUjo^(J|Ijk0Sb9W8)4g3g!2j z#>SkqnZ#rr?cG*U7VlV`kxoJcOl;ez->a(oJqfz8zFjx&YCI!>GHH$8)Kai+_8U&; z9Ir!hfAIRx&+}>FpHKo~p59S2D(kkzP+P|R^S)7~nplKqtflAeRnsn)`zHON+ndPy z|EIRMfU3If_C-+?5hMg91@u(`rKF?;6a)kWB&1WiyGxW%Qo2D}y1S%Px)+_&-F4>j zefPKb{?0z<-f_pcj=>lbYr(&s`Kvh}e!(8sR&>aTe({k|?+c+IVsT>Wu3`5rDk62_ z-lv*8o%cC4NqZX0V;NQlf6LZZZz7XlYCA<26*;PQjl^L>YFq04eVif=!rmVYiNC6S zDVLb^3cQ`^*evdOkC;kElqaxQ3TZ6*2fpXMqvMxBZD!u#9>7DjCUULNk6Z@|mK@9@~zFi$Ld;2XE}0GtE*sh>y_`Mdz0~QixO;cZAJ>-YOLFF*Rv_Ui>)3c}rIYk$xXxqaG%ol~TlGIYdW7(NU1mmm8Zk3OOeS6ffS2i(^96B z8py5vnG{GW*~sp_W4pqBD}6B?rU$&PWK}E>egl# zch;pQJ~445J16Heqt=%dw&%IkjmeLiYfm2tx3!hA8T}-k6AX=z7cpEC=O`~<<28#Q zpQu#-@IlH5QM{UemcMKo<-jtF$mMOBUqs(bcd3rt+FqhnsPQJAa{bInb>ky(;S#gv zfzvoi1=DVeXL0kJ!eD>E4lQ`O$hcxjf?*lZ#P#yRW}Xr!KW7 zHlyVWjUEii4jyZq7}0xp1jht@N=bR_vvkpU!h7*ys;(g!#w7@dB8IZJztG$(XPGS4>=+ATK`ZY;-qZ3(DT?tdRK)X+JB;}MCNsP$z`-5*xhV%~FWc`QO0 z|E)D}j%s_k*YBd6N8r_~E0qUF6SmG@g@t2oa-=c0U)NjP@cf$3NHdhx!0=37SF68D z0bkIMsQt%n27EHhSbNOy72}6bI6QJ|&ae0hHXP+Y%rDAQZ^!8u786Cq5YqX4<6tR! zTk{z!tM=l!K=Q*LEvjFLHc^n3Xf#!mF; z6}`CZloq&2_+52^v&aX*74R`b*}!#NDaaZ2Zg zh>8UjMAbclu9Q48Ri_z_WpP&S*k(P}r1$A&SiqxiF%{k0T40%FULUOlzJ;QJo&}We!>#wK85kB%@}` z7dzGv?7g(jRtwsQ#b=QU6pY|8y-f?lZ}lSyL5a6hU<$!ACS) zKJ>AidD;kU@i^=R>yAaB5w7ab{?Lei$;|_x5zPCU-AEd7yfP)fk3cgR$V*L=W0O5U z;HtZU9q96qEF}=nPw=x~Qg8ahCy%dxES)?pleg#lfQM4)j5-1^e*5NE0Zi+ioxMvo zg~~8|l(r}7oQRE~u5~FXDGqB&_d3**)${xh#_!AC(K0@{XR!d7~ zc}gz5}I$8~9?f;d3)rHfbARws;F1X^ET{ z4-bE|YC#R^>&(#4yKq#CHdg-HFQ55MOqk`Uh?-8t0$2aJE3vz@m|b<*77o}T%D40F z8R}ue%R0DtBJ85tbG@y8C;KY};0Z$kOEvvA+YF^Nvj>QvyM}u2YRQXZ4EkED9}o;?0Mk(-90!^;u$Wl?v6CniAh%QOo&=TXM9JRR zx4wR_G8d*)9FNuy#gNo(cHzN`-ZUyu^b<@OC}1vQ11KW1M{WIp3O@2l9#QR#Mcjtg zUNb15{@B=W&sQvE!ospnHSs}kUYJkEWg)?WulthiV`$9CMeH=(x;R=j1vDhB@}5Xq z)0PcM-S$>7Y&H&(EL#qo4z^DP9v&5xSXO??41BHZM{6G9*wH$}Z-3}#PV^-7tXP}$ z;?=3%(73~z7a7bVVw7~fN02)uAz zyDpaoebV*I-rioNoI^B0oEY*k`;eoeJCoaSvlj1FAtiZ4giL2yU8WMDgM%%V-Q_FU z%L6XZ7ofUM_v2i8rKdj;mCMo2b;ZR}Staya*?+PMivWXwi_3)ygZ#B?*QOWt)d{Y^ ze|ie#7-DxmojQGa`Kn!!rF{6AxgBXp1r06hawYW}gy+|ewbP8+EMH&iOUAM(p0Ab2 zTU@#(zKbxvN}}b!IFmC*q}XUsvBU_`*8X_cTjwfpKPn{WEFkuje1ZraJWb4+EbW`U z9ooQf|I5nY`yykocKOp~fGA&nKQA&Kpx9~S8KJ~AjLGLjg2OX^9xTU&n?xC<~KE#QPF(tXzE<_{h{a`*N1cJ$H*mJ0oJ zFkb7ud@TGxV?);4VJj77WfXKQtjEx6%STdDRMgnkmj1&8=vIAC=yF)XjbFH?x&Ofy z75>amkiip1P6mDbI4~K>g#Wis=aL5;9T6>`|DA_o7z>+P=L}HasnEuGCBN|DAFlg% z0PtV$@?;Gi%2kO{z+ zSCOgVNl8f%_{_?4$Mkrpf`fzeK~s|^OB{}3Rzo&58QNzU|3yG+=-+bwlO}}TIXIwc$o=Kb|Seba>l&RsFwUTW%Q9z_(Sgx&ii zWfsH1fq`EYW0PzVvCdT#j%Qcd2_5p4twEG}@mZ`wK|$djyIlknY&}H9W8k)PR1$L5 z^0VZ|6Zt+1nJzRZXSD%54>=bV(@(RME8RjuiZJwD56+sdt#iq5I0*VW2K$6J?3q*+ z1{^+B%GQ~zPlzN6cN$c9*?9B zb%;|^5rksyu3FaGh(mRUrZzCHYc?g5-DdWYfi*TO8JV4Z>q}_5kecl2n197%<9J!u zFoHnL4D}St+XKOKQK^Xng!+t$slMEXjpe#T$hy3g+kv|>{FsrN#4;YEd54UtSMCx3k}OI4i^2)(hJK3Ldb{T zl}k$eF*nUl}f8v5j0VA0kUlri%Fy7rfsKRgNg6u(-$w0lPgL6IjMj4$8EmxK^8QNx{vG9G zTKw;ZL^T(ki!6Om_6sf6JwKc}J~yt<(w9Cy3qIV&yrnazrernNV^HjL*bmb0Tlu|? zZeZ#}%&rRZv(<~pQr%O`(^YJEm!>rDhaj+vh)TUDH*hEhj~(R;FKqo|*_&{rDH-=y zyV23dKmxu@ocjR-4_Qj{82m`fd(-*3#A7g?j9tP2I$#n6O=P)wZz}`4(t=Za3d*T` zT#h3*DP6@I&~j49D>bRa^II6c=}Xt@ta}SU4fmd`!O%cQnjpZLw@*d_-93cN__`C* zArU(SMl|XPuc*)BuZ;VA=4sU~SKx<`Z(;j5lhjVD+a_(TAUy>mnA2&JhL*v(AD|IaA!O`_;b<^&TOYy0m z#jFjgB(I(L{<_Upy9%U>ONkWdP+w^&&h6WQO$VDjIapvW^cL7NqaC=0P1IcBG*&LV zBlx?iql(eykxj{StL1?!a63WnD6x^p(Rwq(7BSDj(^M%Whol0n!;=~a{|V6T0J|V# zwnsg$2F%Tyi(R-Kj`yZ}0_Oxy6=j%PV0i<>0Z=E*f+j<*S;xoM;YHYF9I3W~e?7C~ zEqVUDiu3F-(4u6Q>WUvSVJYNXqN11<78d2?q+Tf=*R54z_78;6`PHGZr?jx7fG??6 zT~{}=@K<9aQK*PViig16*OYss+F~IZdcJ=uZF>X;j(Cd|n zRG6-?J|_T_6Vwi7<3(jWJiOzzxx=!1HXbk&`L@mDt02lV6&AF1cMk)r;_ztwp%+KN zQYBvvH>=)?zC!hets+}50;ecG>A%rb0A z{D_{%4J_Q<0tCuL*ka; z(4hBPpyk`Qh*lu@FhpY^I9t|ot4FfJb}*KbzOB5+CpmTEyR=t{?RgH+>02aQ_jU>C zP^XvF2zpZATc*A}x#b~MSH?#5d!oCyj=U5tr!(#%wyOj==z6nj;_amg6F3i}`GyS9 zr6vrFoPqaUlmzSX_rnqpcb0GAa5KforsWzm-rr_!V>(1^V z-9?6(Z7CRMGKIhLdCG>PPhj9}s2DR8WjJteR6*q$kw0`Oip|Cn3Wy(g!mvJaWp8;| z3@+`#$qgpBwBVWaL^2W9;}Rh|jg*zI4#~>KU{?PuinP3WYfMN)nD zcUjp{2DUVcqZ6tb5dS7iSDndD3Z&3R@GI6$NYnP<=&pFRqM|%5Vf;_OJu4JiTH3OE zASR|BakINzd1bZHgU!s$Ty1;~zMyVb92H!8(eMUvIucDL>aPoy=GZPSE+jso{)ott zM!taph`8Fx!GcV(LMBK636~ zOl(ptJP*1Fe0S0e3x)8aSt zWq7gxltWDTwV*(u^RQ}teQqnmZ?BiCE>;Dpa;c?RofAOomckz- zJaX&64rS88nFTW}OTD9n49cXD!NAYrFg{3(XR15P^IBYy;~UZ z7Sdq?H zDk$hlf+nCx-_0JW39gQ%o07Qrq$ZcO7{AWN_?&5RKR>sxqf+Q=3;mhMwOU$vzA-;i zC?3pq>aHY}m7zplxB*NavW|y{gY)zA?SliC`&a&0dUHvYGd%H>W)Lwm8Gn-o26n`6 zd%kWD(Qpn5hd|I*t=0C!Bl)^fp_vXJk6aTTDXp=r@+_5-H=7}84-`ub=%7u)Y5%z8 zJ()M|EIHBmn^LjNuoM&1wGGPJL@Zx5^=A{DwoXQPInV%gUym2$_e`X@ci1`|lw)`1 z#4@vw8@M-oUyMn@;r%(-2?3s@dCG-KZI4U$zo_^+(0PmXQU z2ZBI+{QTw?78!Y*$oP?$0=)RjYat$ zxI#(IzlMx1SumD)X~LW1;?Vp*aI2%_feimE6NE8!4Y+dlL?4i?{~-Z?@$%NTZ)!63 z?H24@>s%=+d@M@M(*h-6pj+eFmT zebu36+%H}{UCVx1s%nSwE|<>$*`QBuq8+8`@9*E--(ScF{rghsTU%TAk=EtPpKt4E zi&TK?8xb8XXE*mWG^76SIdfjIbqvYv(ClAsQ=QQOzv96y-sO{%8~HX3f-EFr@4b*C zLKt;>gxQ#BeE5a@17l-dg(uvU)$IxuqLiKHnw_GekIruPQHs%Z%G{|3k=HHmf121X6u1y;=jD-glXnKbC+06#cCF-Ep{U0jv6L z5zf}lCCCZXO-^EiAlKC1kn=jvXh9LUQ%h?r`qEgj-I8DaK&Da}A7Zn&n3>g(Q${Z~ z<>oD(pWp)CrGd~MQYUgezbY&&*3g`a23uP!4r=f}eVls3-o- zH6|T*w1%OfG;L&wDIy9jXCKMjo^V9M2{-%Q%9xd%{b*S>AIej?*$f_%xp7*Abde#Z zY*pOqPW8c)_`}>_lLgABCnRc4J6E2DKJH~4HZ#j(F#V0=@$vh)o%L#>^u;<3@7!qT z=jAC0O2{#FXw0yW$T`J3I@soJaf;$OY%_u03?0a+^2a7>t{~CWoo-gSfop(=AKcpZ zE4!%7otozJn+nh>t9TaQhh@o&fp!hhO+!n@X;C@how}(Udj%GUZCqKI9U9JBfNnqK z`#Z&D+OXDJZ4AT#y)!zt)h!P)dAW5Z&OR|f++IfJ);gl3`M=RSxcm;5 zREQgrzVQ>F4Kyo9DzOFda zpdRX&s7k<9b1kLyhIX4>4w(8ur_IM*<8D;dtLuZK6}elL*O?sYHK>#b7w z+9IAgSYWk4;)ME1Qa4k-w~AQJ^&)@r0u605P5QJ1oaDPS0lwY|E)x|npgzLaaMU9q`vV%~4D**g0byx!|m zSzm83yBv9br4akct49HkwNM%sP~QONMX+P*&lLKJ_S@g-bSo(XS$uVh)A#RWu~v)2 z%l}^gF;d`#apU$;>1wWBY-%oi>RT?rvF?xw!BDufQ4eSR`N?noFiLx8Z#3~-B94b2 zAkaH%Z#9fJz!sN+Ym+>5nHRgGnnQ%+`+gR?q_=Etfzq3yY z%`m}ZHD+n)mElaE;`i1Lr*@LCkwu_nFQ+veP-ER>9AxUeNrr}?P3+r|`|H2{O8Qve zTL=(coRw@DAZVss5?q=ZV?%>si$oBmRqZzPp@J+Ina@ZOB@i;~p8UQ&GCBrsisSeM ziP_#!8{VmMpY^gZK5wE>X&3T2U^IOTSkn=RKL{};>m$E9_|c?Vnuv!__J1!=#5M>? z+*vo2{B_TfO9{B{2gz)bSgw*Km>dJylkbBD98P;>lf+-YJKxAF&YuYlzaia`P6=>Y zAf*6su7bSGLn^9pz~Z!Yv_Dp7vr2i>x?)mZO21qUqq8b0)|>PN(qC7+YF>3Pbo%yO zUnieJ9BXB`VQkEs(vP$^^*!ca8|-Y_90x$22P`ta`iWu1xh@JrysWLgoqnvAcBz!M zMV09JpO|5B=v|PZ5nMUTS0W;alBCihzm|>h7yilG0oHdoT!Dv_5R(`w(PYcTrttoo z$Pzhyyv?wx#-0R3c46YP>LhpB9fGcIO9F^Jx292C1axS~$pcygjr1Agb4n=uXJ<~a zoI%o3UwyrGev0N2WU{fcVu9;ChDExKi9RdnfVQZU3K%k+C^J}EEGQ_*x?NgI3WaF@ z#1*rSMUgH}?1fbgDbSuK(eUHF&zH-8s4T2O^C^Tk@-C+}bh_2t1(WJ39pwgA?xl7| zb=>+dRCaoF0M&!Ex=hlS?-1Rv(+(rtG0%j_L4xZHxeO=V>dxG5Yp@6B2^C9_$up zkIc=t?QA!_i;M3T8w@?7e~|EdEba&A5`*%ir<|VdjjwG^Pf)+bhf4sdN@!^LJtSZo zRrY9!k0B_^hF{msj|V`*v%E`YTIGVPA4hiy`zunYV7Lb%sT;;bPA4QeZKq#YT5^FV)a>Wrk#8zK zy)sCB_W2+%D5(BywEvw#M#OQ))#}qwn>EwqG-l_a7ZBBP6DJ!p=YAfxz3C$V;nw3= zwb1sRxPa1eyXChHL%zBl8{#k`}H8UFnq1dY{<2JEfqzy3yX-)fbC#3UgZH0cxYLZUrr9zwvL!%pRZqh zLF_JXyg_sA8buG+U+(pewrm&09(h|d@J?p41H|I-97Rek6YulBf9+QytlrdbjSt9-~%wC0q9z;JJ2!?=itYGlV8dAk$CfH*5DDC zt&pDj%y)&@whA4&69h;j4Tb3&UntZegoE4`0-*P6!IrJVp>+tezAH@CoGF*2hTESZ zrmk$A$x0!h`e4!3RIzA&aWQewGT@#55*ti{0dMfodCgJm3e@D^Q3J>m3m+8-8}oSfX3Z7Fni^^-z{ z1>I&fciaQi(?XpIiXwv<1s1%g)YR%zZv1DP*~9xKka8#|A^tUmu=xhvqafYIiA8U1 zMCV?4=CYPat6CD}dNBc89W{d5o|Tn_f|PkWqbhNyKB}MWA8548;Va}jkU_P+krEh0 zPlniqm;NoqV$bvoOGAL9zOOHcAnup<2fdZvFDW!bL7}l85QSyHB6+tLuoLTiw$qPu zY<+A{6LChiV#Es2CF0_ottl1J@Gu9@a=l_wK=a*Ea>{N3;b@gL7i76c27bI6?jj?4 zJ}-bGSiJ*7lP~MC$}xq-#p}Ad!UCooy;cTAU7U5#E3D0IP2aeP>{KcWDI#S9$xR26ZTf2)vRRWKr=6j_UqN?f zh)!6zZEb87+$worKi_mUU=Gd)j1a>jW|_9vxhVKJJazmL)@@|oAt6Mue z4)_0y)ryxBI{pi?;^pQKW5KOaPh7gmO-QdoxmW)ZG^}^`*Pr04M@-Q|-+NRvX*? z)1NW9m@@d|;K%}|I6{`Or6wK8X zE^_L3w;>jgS2R$ahHT+|_8N#U?7jqjy59mN&1u%)o8Y51wFwijLbTTIMaXhgj*sX} z_FeE?wRFNR==%!_{>@&E+W4&VWtbN$A34>ty=9u*AGkW-i>yb;cIf{k?f>?vZ?IH< zCMTMe+Q;kvHRg+vU1KZr-rnS_xJSw5gq<}AmP88wNG|Wt-v(>W3z^ngSlXT zP=GX3|2Lae8~y*I&6*^a`$>jHp@qVT6prpSF%kH!F{{#T*p9c0b`-hc0N;0f56*ec z8(8IjUC%Q2TYObTMg!!3wxJ{$nHT4l;WusihVflh}8mZ!1!;wAXKB z-`T}%C*wCUA!i71ilsx8gjeP;P`b8Isk!X_9D@#zD$WhMnq!v}=i!9z#cYJV^|;a= z#SR8ZH6a;Q zp2TA6p1+Sz-AVFZa(Xt*cJeYLkLLCn)0`vZ@9E@JAftbZLk^(~Q(r$nZ)1e(*0b94 z3o1s&VW>&whSTltr7fDq#_w~UcRXca*mN6m<($8F^Q*8gDR-iLxooC(L-Q|KBSkGl zo&u^XGVJ$eYxb)!j0KpWwcQsA7Kz(|v660WL~8v{Z+K1$ER_cJ9(Jz5}#%J(Tl_W$5fWvRhz$b@J<6v;3P|T>7EQS0I>2A{o(Q4Q%l<73lLzjN z5Oaoyohot~%1M`~eq!Sj&~D=cp+)dIUjq|t_IJ7-O)_+-GNpQXA1wLA{7R+#9pLAt={Zl&&pNJRlXHrws*>mIukH*T<+E62=a%~Q_=H1N_3>@FhsY)x^CZC@ zu$)kk;N6t;c@VhuNlB==x5%IY_p&%VBBZgbbP}wWNI?@U`_+9$fJ@Mvvk?*;-BEMy zwYAcF7au?P1A<<;;?__1Qq`8`RL`y&h@U7_S>2tH`wP?>O;~f67y41DV>nRkv^z;r zZrNSvgSm#fwfrl62R8HyhTdw(SRU<`E&%;@xzN6%F>|{!`uHKrrVIP+kC6Lg*e5bR zvSdbTE^pqvPLSCeYz)vFtqZ-!LeA~%;$n*{KBJKV4X5&q%AwKAls$#NwCYK|)vp*0|P2E#{;8bd}Q3SZX zV9>x}dASl)6_mHJ&x56PyDUygxr3#pB90dB^!4{6U8Q0J4o1x`C+vGXidp_R7l)K; zE+4h?W~b)&`we(rNz8LjJMSOB|Sb^F!Z;1p}r*f0&Yp&OT&E-+spYC2)fd1D}wV z;Z1>}EjC={VP?<%ROu9Bpl?ykMim`#4-k+j(R@b^d#mgD(n7;&=*X(=J_ zaP1e{YG6$?zJMmoF0!$^gS|OohFRGesJM5@P+vmeO2D}||4B?NJDCNxp&<<b~_oqrgAn-|WI}`>EB%)pGx`sTF*9#I~RcB7{_lYPwU1cTHE}|hP zLkqRKa)+|GcXDCqzDNF9AkVG;_Z@EkL{tBN>u~!!n`(b@iyy7#-E2T84|g@RT|`?h zF+8)K$#ptyxJA$vDemNS^=0p!Qg8&jieta{(Hwha@*LRMKq|7mt^a|%qM}r(Kc+wS zK@7V!8eHrBm8VfG^vb;E3@zvw0TNOc7~NPTXg{;3_+Xt6vTAzR1SZAvO_Dp0!cWNj zIIlfirJ{NAmt+urns{)8j9m^I4u!N40`%1){lP?PH$79zS}xwH4Jmo{z+T3x)8?|u zl69H>z~L5Ottq#L7@X=afq_B1Y?loqferfo6_1rlOmtg*>2D};tPQO*`X3yiIGrC; zK|ts3puVOtQuQocq;E_UV&iezG^SUs>V(u|2vN(zRy`}axVZn}KvyiJ0U$r@kT$qE zP$aC0465iCE?R6$5wVhCx_$@0ZBDV49K^6jWuFv((RI94NVQ+TPeqj`Z$B(fHj=l^ z08k8~FU`GmZZK~HrKg;qD@0_0o8ln~u+)OWL8sHf#!GSZcbV=KasZEjE*li^dppZU zu)fxxbpKS84I`aKA4H6oC;hO3Rq;y1(Tw|t(zQ;NBN~vlAArz6!q#ECanO{lfg0Nl zm9lAt8G@-w!{QK3wc2BkzL@leU@Az-;4Q&c8`-aVSu7j`DZvGVR3yQ=?uQSbAkz*} zgR9_GgOua9Ps)}L8#aOn+B`520*J&D%RcbPyudyixWpu z5N^#3r(r-gwI!GB*c{;-NKHbi>O&j?>%wvm>dF2FOumjqhOm)A9Ecjd>+f|t z_6fgoXCf|n&|t&CcVqAMl#k zbPt7zWBKQpDNzVsdAoa!KPn{hH@{>cy?01eDHd-fI}VEr3?Bi4SbzqO`w&M3u}U8q zM~z=;8STMLPEB2Qs!93&{o}{!bCA~wLQ_&EpNskW^%}4kftA9#%7(Ozkx|eBQ-&(o zpHXcy?yS<14cTc0MbFH11V*23Nobvw1;Uxfwb*z8xzn?)UyqP^)QP-6weZ}@bDkp)qRbsSmD3jOyys&$AG zh=Yv7A4ZRc2`u(`98wv+h$B<%i5ZVnG_SYf)%g8_q8J4f-(eZmoMRPVHsb|fKAY#gZS*~ zVQ-GLsBjtIi>vT#dAIaKkWc3CuxWwKXnh7YKf0tKnynbJ`Or>2^vQA*(i%OcF7plv z40IFGX78>>4jmGaPEB5&o#lJ;2A!Dr?jd&n|KN;J(S4g7n^<-hZn zf6JaS`b&spuMqVd3U+!u$k}=JPkW;#{z8L2X-5OezpT>Oe2;~OW1?m+)_?sJSNWfg z&VMCP|Lv{+51-CuV1Iw4qm%lc47O)SmrT(5pTn^K*tz!91X2t0^N`?$^VEn+^=F5z n#Gp5Q$n*BE_RIhKr)Lx)t_WQT0ohw9@K0Dk{B;hW`ltT|x_L{v literal 0 HcmV?d00001 diff --git a/product_uom_company_favorite/static/description/product_form_view.png b/product_uom_company_favorite/static/description/product_form_view.png new file mode 100644 index 0000000000000000000000000000000000000000..e936a84e188ab5ad186f9cdd0fde9a915ea070bb GIT binary patch literal 23491 zcmcG01#nwYbFLl7cFfGo%*-(}Gdm`knK5Q&W+s`L?Us5HFfp-lG_!TO0PE%l0U-pD z6cJQ$%RJq1c0yGr7`(bT9pobg{X*K(9zrM@-c;0}L8+9B*nnzIr4Wu5vU5%!^o3!7 z&du+4_V1ou8=9MUMY9A%!ieJi2QC0YM%D(8YjD~I;JnjQT~Sq4^cztiqL6Xufw%hi zzlS?pBE1QSLZ63Fq`Xjn-%I`e{~CUset!7%VFZIa$c;->anlto5D|-XTe3qDIWf?U z?I?=}xioM%lax1XiQG>zw3%eTl}u17bX>SM!OetfYq^iaC^S0CGo}$~r+cJlGMQHH z-Z#ez7a2!p&2>27KwbQT%pwFX@JibzR3{4kahlfycnpO!^(_ z>ipBlaM!^BXuU?;*>InEB0tPSyhskDxDvWHr4uN4-vKdwZ?^Cnn8+6l-99&Z`tDs5s2b!g9Clg=h>qFH(LNLD!oxpB<$ z9O}7bLlbSnL&*~hlX5~`y_>Lpha%dfhmzmHGT(~SN6p-e(hhaq6+PUHnA9Zd&!E_r zG}iF2-Ml8J>u-;{_DYDrAlhX3ygVsVuSd!bd1r&gq>6$|Ajr-0)3dPddX@Fa6)q6)7%^miCt-MRd;a@&)VD66W>#14);Rz+(79nG;33E}6;W!cN zAc*YgWAQx%O%PLg17oKzcJql+*Hx$k2RXZ6nvX%GGlDV6&Vl9y*HTfsIRLH%W$U;t zaCltLX;V_-b13nbq|AGr9bDy#xX-)tbqf~qAGWKy4*F*&q z8qsB`H%#UZzB^sCTYRoYezR+99#CH2+@rB7tF6_f>T_!CCS4M0E941*jO(Sgc*C%| zcLItodLh+}=6Wq6=JJ#`#LKyT^Bf8RLfZa}6l&fh`bQ=!7uuZY=S1pBhq^Ef&kS7% zsFLPdnpUC$b*KFPxdIh}U;f!7PaD-Nn>ou}jm|J}nv#gf#E#R2r(b5;4vV$UzPPQ9 zj!@~HRz^1}6mZq;6PgmRswArmV>Jb+V;nsDAp4xKP_{8H)2}I z&YDGC_@Livz}npUD`lUU=#23>MdIAode2##`>jw?=E-EiRod~SW6UD^nhMONd{w^AU@%u-M}G?ver=;oq$DBSJ`#|watj*9HGWM%yoecG zUx#&cq)T_25`<%)bm8RY`K?%nyV<(i>Q0BQD!cc(X<4dTKG$KPrju!9?_A$2Gr9Z0 znzo=3`XD_iNW>fxIdxO0@dE%k62`5<7F}aUQpJ^JTm|+wLU}2$KC8PY83uLYi3AOe zAk_L0?m?@Ej!RC;5^eHLjPTTo@OzC1NTA4l9|+z_azOU{{cUYh6cG)pC+epi@;)y5 z=L+lh&0HBIiqNp!7eU)Xf8;c|HG!sYJej33B)~bWHWkmr(%hI}O6AH;vX}oG9v=~u z=hdxlRCkTOMb8-kETiL5g?}AnRlrhBOudEgQi2}qADSqm6}ozIoA}A7685j%IRX6} zlu-*^!P0==Lz~Z%hCC^B1;%>8Q`}I~B71t1aR=deLV-eeBQK)f?V;rV)009 zV(mm^^H&BqCtBy+t(1dD@ijh27Yf(TC!En7G#SUagNu?o9Bz_GxW>yUD10X$LEXt> zN=VBC?|6sZwJlL%%3OBDZUzcpNoJ4aW>J_c1A!v~poL;Nhbk)eUJk`e)4-llBA6=r zqgSOk?7mv8fX6#~VRAUzz>w?IGZNnejzfBxBhw+?Du%oi{M@;dTKbvP?6Z!M zAMk(h9gPkm;uhH6VZ%ume@i7bZ5%1F(P;G< z!PBP?g%>nK$+Hhtn!&BQnoF8+oWYE$DD+L$SuIN4e+@*gwl7pzD0aF~z(aT%>G_CU zZ><}H-4!xMp0%c6reizBY^Oim-?cd3tI|y9z;M}pSf1}Q& z^4i}_rU2c6dlU@%uMSgo!G z08S1WwGl73-M0BE#*ZyP_SH1<+J*jcMEf3p2m|D!mZMfX6GrR`lt~*|#yC5X#!ZXX z&`E$uv{JqUQ`Q{UYuT!>y2#;!ov3i#=OXR#4AjbbK6CuHO6+yc8>nh>bGu3v5Z3Jt zd1`V;%_u^l9J0L$!->cYkM@L5BoK1uf^j7|AJ5tq*t`LizDl0+h=fx7($^436bu|X))LlA9}vy9To~b z6HtH>3XUbE`SSDeRy@eol=sZ9=9n!$&(!Dp5jU@;CZtTjl zb*+Tu0ggVgVkrtV=THbN(dvdzH<{swOZQ|Tsk!~+g=h(ZH>C-b;#6ggP;xrnA2imS zpf|6yT$a9`dR*&g*1X(B~teV}q;pjsl_Icsx%AhMafXIAw?Obc{c`+qY2!ZkUN z&xj>rO1|MDWK92=<^BbkA77yU2?7zxV=w>P2Dg~)k?%swx;DI#y8HKMtDSDo;I{5Za(rCNAIkV~=~+_)m~d<% zsP*P(RUKtE_ke|IK7-pX5pFNt1a!G;Po)ns3opt%AdF4Z z^~dKV2OaT6BcPaAo&aPfby&H?vI;a-7zV z&T9cm^4O|$@^SG=Wt$f0CC=Y>WZyCOr2{OIDAlUqWg#o}4Xr%1cfKcBJeAqd5!BcQ z^2dU2XwS7wdDs+N2+ABx2g2X3T!I(@Uyc;r8{EIXaqvlX>cE-q{;EFeCfnOLnuA@^ z;I_ln#_#Yu-+=X8ars;fZUlPu`;tAaPVUf}_$CjJ{IBWrNsD*V2^+_fb_%$|%1_E| zs>6OpvnGo&+M~-vPnVm^0mSA~%wH?F+ijFv605N~gV9L#eCN`ZToG43G`{0x;6>ux z^E8jWFuNEavHqB8@i5LkHofOu{)wIOJ)bH2WC-4#XfvWp7$=ry#;NHB@SYfVTQkykPn1+E*@~z5kk)d+ z?(E>Eu&VoI{zQuNV(5n_L&q*c-P;b}meShXgUI4*$>cHR8vjYTK3yr4$Pjjo=fV=q zXMQ>5c4ot4y*){*VK6qIMx)7{%jPJK{(Bc*fVm-pW2FH-@v(!245U=PipSHe^_ZK( zxe!Vo!shjghXNUT&hplP8+G205@~XK3Q&JzKv{`nF->VO9Uu(KV6oWf`yP^;F44a$ zzAo!AT!iPS;i)@Nt0)R>Nrb4NBXwgw$3R)}X4$!<)W!b(jmEb-z`FBl9A`1M+jC>b zg~{Q@`}9QCbf?+5wgl7#Q}IMAF+c#-dt-wdWFAxQlq*VmA@7lN z%6NJ*p@B*jO&o=#4BIP7Fsh@!EvS6O{+&Ng(jcQAcB1Whwk7wz(Iw|I zW;E|M_Mw=KXqC|wP&aOuyih!zEg?l_EJm0OebiQHB5PAb8=YrMuSYQ(R)r0fqW4_N z5QN1IArKg`iZC|XV-@pz&wmT*BUZ@5VKlonfsohmx9ux(Q?cxuj@wdVd8sF$w>YJL zURt?ZA_ylt*UL&{&4rJa8kTPE$GnOSx%#a~NN`WZpBohy76=BJ zn$lrhlOKwwio0{*e_F79!PZ&VnK7%Mv7a>S8n1eKkyNY7HmfC+F95A5-OBozHTU@A zw@_D(R&<|{g+Wpi`eM@2lO^Qn+DZbOs~~jSS{^tvvzf^5pWyPK(K{U1P*s?Zjov(a zr-22bp0Z;D^atvP2X3?|u=DEa2vX+W;ZCrZR^>V-)hskr;B@Xdx7vBvNQw1LhTU&+ zhxc3W@cHp&%W>Y$Qtf$sa64M9uQ8;)LOZHTcS~4RwHF4YXx!{2N@_5K7|vP?CZ65G znW0reWZzG=MFZ;2Tg*X(DGh|vRu_hUfW}7b1f4G9Vf*=2B-(I9hM}+6&5#Jy~{TeG?SQ#b+o-$`6C~941g(|u#MC8gzdx_Uem&!maZtaul;D0sc z@-$r?Xr!0@ac;Z4iPdD6S|}BaQcolKwU}WFS6^qjYu5IL+)p8TD)Fr`PpTxH)jBmv zH{_=Q&BZ@;NFkq2f25|kS=cvW!>2hcS|ikUNED=WoeY+I)ORi$ClfNKQw zacew89pfgFZ)+7hqvWFmn@%gT)Et4;n{->zJ~MSS;9xF?zx1E;;H3mK9?w%He4KDH zcC`=Q+yx6JY?beV7+%RqW6h4Ia>(~9d?Nsq2A+?up|j`v_^&4S;i{9N-*Y6X^~NB00LAu+4`2_G{c7xxopkM@?&<0mC8f38%IKQwKtBQJ(3Us=MVZ3t2 zz9NB@G~^D?trv6;0DD-Lp8?X;^OMUTUG%?UL9HxrH&uO;_k znRubuf2Yby8-nD<*6#M&B`qW@BF&n8gAv~wR4YKPwS;|d-!$+JLKNyytj5Y_HLhGt zqFQLTm1n5wj3 zU!~;}&rm_Ipjx)(^V?A3HC7HS7Dk_Sl34u$eYHPz^K^Zfq9WYE&xZcd`JU>2SLC08 z^3i~ml&|Luc)s8q?o5YcR*3aGDXHGk>smR1v>w2PvF6P~5Dp#Djg0}Ovv^F1b!>F! zMmpkREWVC1gxuWRBvxNB7U>uf+lOISoSxRqmy+`Fj~rX8&(H)-OP+jk%*ImJeZPq3 z6#HW8ZzAbb%h5=k0U61!3!Nj*00N#bESG&8!Gy02oXUBL8z;^17QAJ9SwV9wKE}73 z8d42U+4N6UOzrxBE~||gsuaGX+X93l89Xq6UOYM;HDVV~pt9>c_~K7zs;4Tsc)u_{ zd8bX$Uq`})14sWrgPJ1*l=zkdpVu>H%tTaGg@_G@PqyFrfpqN4 z(0KsjKw?%gmPpH+>Q0x`Uz)6ueHH?|Ka+dr#=sjN+@^_~&y++FYGVosm3nAH8_7!1p!Z9!h z!HCh7dcEObe!StbVzpDUYy|pkOOr_lqrzn529S;z*87iHm<{wnWpiyLXPxy%(NgP; z8{_(IQ7Fv?5{#({og#c*p6o>xct5kn#W8N)ZUtHkri6M%qmE|tAX@2WtwPV4{+;Y% zvLBE5(+`ajV+q3z^EF1NZJ8-C<*f!IUQLN-2xz{+Om#5+=<2&p>DMM3sI_^QW-<;$`6<-i&)+xIP963CbW7H zSWL#zcLa{d@{?dv7aBo89VzOc+wgCfH2B>4eyBdz+C3RAPMt{aUkYe+yhyrcV)yN5 z+&AF!q$KTXCs5cy?fQ0$9!K-yfm%|0LOXm{8e@#}4djf*%0Q{6cvvhs^JfZO@>w&G z8T|+Rq5p-y6lzw=o1b{?w(*;Pau22VUXNZ-sd7G6Ow|U$fLqa~Dr5eCzPxHM9(!sv zzC^#XG}$vrfurJf@~}8-(2Q~k3aNZ$O1@t{G76KEOVd#4eM7Jt+&Aj7iAC_Ntg){lWG6ou(IAHezIaKl&>m>CBo{d+Ab%y` z={ZX@>VREZc4dr*o=8`wDhD@Z|0nuqW%85$5rZ)MyBje2+?D><=$q7%`swd=li^;Q zIWq$aLz4WN%)mOQ^ki95bpiqk@D2u!nLXY3bkIPO0&9juwA&2OZy^&7!If-= zMS{_se?^i;%N$SkmIRgBiwwOf=hIV%yA5S>S`ywL1!#HVp4BN-KNx!?desU43qXCA z*MvHx|8kcE|A2^v+)s#@l#{oqDk@dqNOR)@Ys70xhPHU+yRQ=XMb`=H4eSyIUkYEK zbOGQ*y!nT+l#;IV4A1)sFr7(|2KRs6sqNp~gl2IH%-ZT7REGLG$K!z15BwJU?g3>pFi}!AE_&;$DDD;e$8pKozWRu=kiP4ST)U zE4sf?lm^#fu0~Qd=FBJzMU)U*PI6`@e~j&FnT94H?~k~iiVN@Ho47}ftfJcD>g@|r zbgT5xtdAb8*vV;P)mB88^9G|j_H5av(*gYHC^riYu0wK>+MSn`+hZ&x8--b2{MI#Q zf$y@2j(@mz(j@F7Ee3YH^88|aymeQ}*frVs`BGXeDc$5#=byi*N2_ly{<&jxBMS!t znO9X}?-|{mn}NWoPOK;~6;(1);@}Sa^NWI2Auq&F<~}r|o-aHRx5^<>-yB-!~~E z11CE>+t!=!Zz+R-5$^|)J!c!2$umb^oyk}+wER@N-)E)v2QzlmS8#A7RMgu=utcY| z|4m%Hi_fpF&Ra?a6Dg{vv*^`@r_GVcsmglFA6RO*#rswB)ZT&_XGn1pu*}@VK&RbM zypqb7`Dl%br`4QiAJTfd#gtqu?1Gf+_m)WXd?Rx*9WJK-SlHTVGQVBO(SQt+RLUoR zQiWXWOWlc{c_>>Y`0dKaj1`-gkIy)EknLZz08mg+?k6Xsrx@DA0kA}Vth$~^-DZ67 zE7#0L?%?U%uP@c?D3dSt%bPG4j{#QQk63(C+Ua_s*ga+S+@noX>CYBDb{SiPQ#)qa zi?{fi!I|tHLSXl`cAHj&+~JGb$?xCg2@gc6y=>5Eh6X$Z&p(<53FI0J!)&X8~40N zofF~!y?G$EX3MscY0vbxKVDl=t)$tuAs@Pr@sV((cQT-V3WYw%6}WR)3#IY!Vnt!H zVVmQRfmBM{m^Mv`yF?&*jPs6<@|c)u&Axi8pWK!H+p-XKG`WvK`OF~~nksHirg?PX z{~)JmQ3-=u?pYVr=JKI{sFeP3+;A@8d2yOrfb43`ag$=R+kZxh40~YApop-QElXty znR_@hGvFogCV&2?UZKXpsLiQV&?bTvC*N~CPBlWa>4Lh)1BZ9iSBPUv47E`j5Q0hI zcwGU$-{mNW0ur^pR-3uCD`43F=#p6Db6pcbV-2}CVDm?QT-!1FdO|q$a_&M$de-qG zMex;kH^J=SU84d ziX+7uC%eG~vNNTm=`)fehdS&C$faIEP&OwDFwd-_$&UAVs4a<{T31S)-=L846uWO5 z3@Y5SG0tkvBQ8TZC)>58D=E3EQ>B7txmWI zB7C}MTSL*O9ZlsJOf?@&@0Z-U-YwPN0jgjVD*<0kKKz;b1jO#NM>6kxkrDHD5~pAY zwwmUrjP5#wKZP0uSHTWpQu9Sok>{KK$7o|prEX+EuUWr$nn{!wDRpNE`tjHB@FZUY zz;#C1c1B`HJ;MMr28n(iz%~e5Zrgu*-=xDHTiRjuc=^cHPrxyGKPCU;`uEq;A4AK| zTnq&2jufsF>3f|uINd|V_zKkahf~Np9k5Rg=IEL!xzXxhv`b`6W|B!VTd|}%1OosY zleZrohzF&CPjrT}Q0m+=seR9?H>r!WSRVr!oN1}1blV|m%%(6`1a~Ggqu}GmT0eib zCTM!=B0O7GWOroOP`_!kcrl$E-W54K63}kG74pbMZC}fJYQo^~M)8I*KUAmq% z+2Qrc*~-C=>t^w>CTznvOW+vCbnwg7*;S$#|65D-)z zQ*<1?fNnVuoBUKuyAiF~%}Q>&y1R?zQKb`J(lfRD)Tj=pGf8jsSoe~6%oVq#CiCN` zIw#Fw)t*x?&K56`2>A_!R<=rhwCr9vy>yGIZs021+Vr@r@bcZrUObo?u5|1!A6wGVxt_^yK3DWchVNG? zK8VIHV&{0vQ(5s*Wyck{3PBJii?t39vi#N=TY+F4aW^Fw%7v!f)ry&=&u3G9Wa}Rw03Ci) zhXAi-%b)SGW}5Z{j_@15%U|8i`Hfk_GicPFIfY1ImpL^MaZqlIX%oN}yt@jm&>eGW zD>D)e9-dLwZLS6c${BTxwt6I}ovh@FD$u{vA2$HU?tMZykUI0| zL-|bMmlDG}JBgD?3I3|+7*@N)p`&J9OzQ{3wPw@}AMp-V2jB7eKU^5eoHawQ^&ein zm2&O4KSHifbEd;csHja9TOr3h)V0hWOXbF?CsHJumIt1#t3>pw8zKYay^yNWB?_<=#GY7wOWuwhgqSvQ z5<>B2f*z?O_tRNctU5yqCT3m~*kfs~>`98GyIB9U)@zpFI#cf@Fv+Sv>_?O|9gGJU zoHEkz*+Xa25_ecQ9h(iydB58!%(|sigssUv4&|f084>CqF?nUS;qt5wEEv(se9nTn zR4zy6q%`=ZBYfdE#_4`Y^urz+{;AVkO8|1o)#h;djMM5y?J#4TLbcGqC67U*BwCQ_SV8&NI)8@?feQG4v zgqANUN=m;WKkG&R;yL)n@#?5PbF63PPlcmWmn6a9s|G?$AWEdwV%kE}hDLK6jVKDj z%?-xJil#BCuZ*qC{a(iF)rp3wjexX52cPK46SJ2cjMTE=_*2p=uN9Fe81XND9JDqW zfMAGF;iv@s%2QK5SL?@J57hLQar2gSJ_-8HnmrPTg##~>nkVNRtpM6wQ#!A_1IRna z&GrIWXEG<)2sh2OyRR6=#S{ow?E^!d(UF&!3_IX?x~+w5^YHghqZQ8!=E6!=2NxS@ zX>u&EaY({g1NE6FeMgB#!bC0BTW$4YyR_izphm(33xeE?$EDk~NEFM8 z&O4Vat*%Z@OcXi!KKE^0p!k5jp#?&^{D&vppQ!WC9a<05fNvZ2*vi~?qQy=RONjp< zJfvr6c(~xeQ5uu3WE@ie3g_?G8CM7+*6kUW7S4~GFDw}H&_8|;c43?*IKk8xJCtlY z(O$`GVp|^Gwm+({-TC?rqI+f}Y8Mz78NEH+Q(?nNtu7f)3sfuCG&jG{I00(|MM;r7 z40$W>-|F=W1dGf>aH*3&cCH+RLQ~w&E{$7ib2>Rx>Yf`4!a~XhusECTFy|1ot_O0V z=Ix_*K}GH7z9as0=klU($<1tqSjvYl6|{V+I;qYaoB6ioS2RtaKhdGzhHU-9!y+&h z%=C&~LccY%KlXl0hc?mmRIkZ676jDy?UU#4vC3+V)DJ<=A1ua4Wz#b?jp-VPq8A?W z5x#0^3Jz2DV42@VC}x*9c&-)J34O>vnTFVtV*jm4xVu)|f?lGSabcFUkQw5M!DzjL zNS;{P+Yp@ehh>Kb-X(Qvnk?zhl^N;@vIUFJaEb9!zrB+e$MYLRW813)fXDYh9!nA- zgV*YVipNq+*1%H5+6VK4D!Xln^uWc}bX;~g%My0QRyNzP$}6)~yuMTAUvDLE=ahXT zR09AtcT>qKrPc{~4o;weZk`?RtNQ#3Uuug?Cr z3oTv7+}e?qSRCCDTotI1f;fM??=8|1e!#&;yQE^2kDYGc*{Oo4Aot>jNICk)<`)M+>XQ-!1l~MHG+zn?n@{w z?soo}l(JF!?(ZG%!nu?%`r|A!3io^}+Fgki`p+Hjn_&SHJ-Ks>*Fg17iAPd?uHx;V zcN^z9B%FkAi$@*bYX@d}kf#`e87C+n66oZ~cYb`8N^aO44@CT6tKR4_j{HWUq&j?% z{i#n{k5u_y09t@wAj&>E|KxuU2lL@rRAyh`l*K*&(t^J4VA0y-jyJRmGvmHv=Fwy$ zdl5$RNUe_gvUtANvz1b(b-idNcaz+8YpV%cxg)i2YW)P1CGc2u?Q?r!R^R#VYl?DG zC6r`4#GJcu*nl-1!%#0?>zg7VA3{q>U-Z;)gwbF%7fG$j(pApN1)Ql8cI5vkgwhT6 z3P{n!U8)xN1+uJmJi=hT&LvQZvY|Gl=sHcvKUVD5LQ=8eMeyRW#d5V)%zAdo;(fe) zZFhk`iNosa&5n6%rW>xXdsA(uw8%e!(;yT*%jR~eJK*bWCloc{TP68XXss8kQdfxd;-RYR>SA3 zZW%M`{BfB4^bb?(kjf%|Y~Ps969hYH+wVC*ZRwsyL$>gZl|jR9!W~#@s0Vmv=il-& zJjh{0Onz>(wav}Fuy{WXIcl#|zHq-K^w?Waio0YIj(;QFG(EYe*{e{*no11G)Fk2u zT1;-U;c%e&5NZZI-G*nf<_fMH^_0|@Zr{G`e$PlyJ?LciXa0; z#cv)5B^Tegg9jd@rfW@BoF3HM8r;i{_kVs2e%SL1#W0<-uc=jTOVk8se&)=@jUZIZ z0O!8rdrA0>FcPk3c29QP$=^(uhNcGxrAR&NQ4-&)?TOl@VGpCTDQKzUh5#Q!2RBn0 zA-&;sY@^7Xo^Tmp1vBL%Uvo4jbA6PT-!I`*WWL3fb>0tE3{t_!g-Z<=AV%(avw!D% z3gjq$u_-GuF46zv>q}Z6;x%xfA93^K+K07TXTUwhhWtwTwLnu8n)fV)c}f-(fo?EY z{3{O8-8U+@NqRZ6`S$*SkGp1Nba7UTFHn-yk}(9xrV=~bm)xk>?@Kf)1xS_Rm`v4o znOYwK5OkS2lL9hdXIlsB z&7tUD+^FuFg8xk2Z?m*JJtP>a2h;a;?Kh)kX!85O^wf$~WI8HTjH*YP?FS`@<)zC@ z%gN;oah$1CRMacnk}y#7;P1YZ@GTcp(pXwQzab8-7a5rgFrXJWyGSivh;Fsnq|(40 zsn~KmLb{k_rJ=!djVYCT@U!!JNhGGDuxgIjx<}3kSP|0;4pd43AiR=c;HbLken^h6 zZ_SxJA)7v&$VkMaAHM22JmA)cp7a!Y%Q>`WXza6H>$ zYSYAj*a)A*!%S+ybwhslLo*Omx>;!c=m~G)`W54OA_$S8u&b&N<@hq4Z2on#a~|&D zZi+r;v*J0Kwo2{!C^o$m2uyEKK2yvOJm!0C0ZLyr1VRoixa(Q~!NVJs4madf`LiItWQZ>X^AgH{J-$TAi z=XP9Mhb~p4!EV~|f)o1@0r!IM{E&s8p?|UIG~u|~<<69=3$Sw$88KA?dUB8NJXA~O%0@;;ER>Yu(^FGR z$w^5|udc2vtgI@qQBVptVLdJnsEGsJ1}AbMEo5XOv2k$92Zx5rKe-kQL&N;^#Kb~! z3W{>>EV+e~JKvmU^C8eGWVCFcU#=HqlEvinNdK6b*FJc>-PGstC6b$Pv^wlz zCWG>nXT@anq;Vbk4S9ssH@Ze>s^F?Q5;`hhf24Cd`8Ky5wKh3%&M_PotgWuF!ae%Q zL%#NgrkkX$)=J(1-#4G4|tG{|Z&`2C{)Kh1971)MnUIFRnl<;_oteSmK1>g0**j4^z%@BxbdCQyW249an#N)x^!zPbG9NAakSF_O==LdQ^S*&!Ct( zvHv;I(k}MBKdpaJNRfa9ZiBUbe!aW&h+Xi%FF*N zTJb+=`)wibw0Huk(PyhOEhdnwJ{;*sYhS`9zoRp*>xsv>uy9p*E<}OBs;ABsQPk7_ znbUl%JM)m7Sz4O590$#xwTZy)OR~OsI%=r9-xUw{df0mFTKATL6lkGNR`tJ4IPCjK-hO^~p`C@j*714G3b;bO@ z;hLYUUumPY77HJSC26y{f_vz$?Oe~klAposZfztR?wub+a3<4*2?H6l%0vis`x(0V z^6knAQu!^h9es{Otk0Ny@H&&nMi>~l-bWSTu`C(AHetnB8;HmkFB!JfKh==fpK^X< zJquWh`^>@0V+F5x0JGVlT{M<5M$%@}#z#(F|Sm=Q>l# zWG&*EUu5Aqs_ayqnZD0jXSU#p`uAj>k{xfa)l-?Af!y+Px20Z`e2n0EqeH9N$fUrt z4O_>V3OmJc)mbo&-RqKR*anC{$^SW63(a>qIz`+ylFM$)U3Z-<)U(*Tsw8w8NS|4! z5m*GN(tK>NgvAn5gLIudxyuUqMmJV+k2?1nt$|9C02)}ITub?ojkv#u9G7?JX9G^J_|sFD%g)6 z2F2KFA0O5-pMC!nZ*hodeXfC`U_7Ix{SGgkiL7-t%lL<0n^*jd)xo@fR!5D+%4e9y zIYS-0k<~bls-RnQ^`>Ry_2aO*EuP7IOu_t!mP*|sCeN}f>I>wm&}WM=r^~w1?+8l> zGhamZNu@GsLi|wFN3YcRRZ#{0EtMy2Vd*Znd+>PV1gd;CCTI+!-bYWLI^?5gXG6Yi zcOH{|tD)p>xwQg!E1lO*8uR0YPRVueFCiCKhT(8I5$Il#ArLw^N-s9SEhWO;E&|6h zWZsC1wmu6%L+9R6zH4s|E)1|XI1DRakDB$9rP6w^6nEwTzva;6vw<&J*J8H6GE|Gc zAsT9JjeI=gM&Hy;+pPVX9F)#ta*yD}k;}uDRd+QapYTVwgcr>L(*9nFmKwrFzeUQQ zJP<}bUy%vX>411}c7OQ64l)5_Jy#+otU|Lf5Utw__9eOg>Nvqi(+CkDJjQ4@Yv%LL zN-$EA!sNB$Ep?YUY)ezj_=_eJ%}CvWyQg1R@Kf@I_}QeE!0d4G%jZ0?LR1w1K2QV= zH_B@;be>Vj!Tsk6nalT?Uv%`)w<%54KL5D60BfO+unj~2J@PqQ?X0WdBhp$YQVA4X z{9;lDZ!z3KE*23@FtUix|ah!y2&ww^J*M~E-AGBFqB3!822c1``{^^(bS8>f-A`G^nuIk;svhq zMaKAQ29gvsSbK;QRV`i3nkK$aDnhjh+Ura?d01E+ij`M;Q{ZJT>3Y8o$&NnO*ytNZ zRr;0US;u-8=BK7Kkmb;jN;eNAdF7bVVCSKM(kg)Ivsx@7jcc_N8tu((GnzizXrc6L zBFaimZ1Nc|1bf0TlpMj!Sh-SHl~pw^8l z#3VhxaJp#tWH%qCKy&`qoWLGqVtlb&V@aND>CZp_chrRPpZ0m=*$(3Tqs=2hZ@!L7 zIRZN!OeU)(`YpxZ4f8cM1LIYr=Ji{fk_lz$0!mJ9-}oxLwlp}~JHF=yYcL*?h~_*ZsG#Ed z0Nt3(gx9QE^SrqA%=rAXre>4oLAadqd65Yfv42ZVsDHi{ z%fka?ekd3>an;tt30rlV=f!v@z~DUVBGd7_)l+Gu8vtpU(lr*}Vvx=O{fn&w?F{(d zlaIh&!!RUfGb(oA+YmNtt%ah>9D`NWq8St4#Sqo!POd>>Hgn0S@BL2E19!Z$k1STu zhE<`1B%Xy1cgZZ{5QEoua3E?Tk5PkXx`r|KNYwfBOGd%F6+UZc7nP>I?{M9jCTgmC z;d|ZB68x;mlowWB|4kZ<~6@y4;ke&kS#5e)xc9$xvna?-T_AMUw@DE#I zV5zlaJ7%j!C`UF|*!pahn}H)?^lh4{t3`l-Sm4=|of6nO2I<$>2SI|@-CW#am4oEF7Bhm_tCkV(lpJSDl zG@Wh)0m0$?`@aC4D`ze;bEId#fAk6g^&<@z9{>#dKL^`V=T$-Y5`H zM=Cm>V<>Yw%v+fxb=+Wm=4XuIobp&-ZWQ4ALW{dx8x|MaIP!Y}nb;|N{4G)~6PLs!-vH*R5*5Wq_EUbj# zN~S9&KPvz09#a0&r0KY42Gq*~3orgjPo4?`aYu~0I+o8mL^qTDl z0XOz)s^;JzrOFQ5PnU}9(I)cnt{|A&4YPg&;)nLp$eL9Dm;sDDuD?Rp=d^^421_1} zwjW)dBJ-~@M%JQ(!MI$X>CIcrgwd-)MBv*UrFN$q$dL%ykC%6jQ?zgH4ACsQcp7isc@W(3`io=2k-iSHQ2 zxCVkEQ4&>+$8U?}k*RtkxTxHweHgWFo&bbdVNMGX`v*MPvO*-NziuV2D%`~2G`@I#I^oofpn^CNJJYmyplum9AiGYHx^k#_K zUfN)6tv#|Hv{geyA2j|&{ne5!w@>%&&l))<2jNHc6Rhu0)=@bJjU$owfJ> zxA$55N@|r6ibnob8eu_VQqeMM1pnz<=;3O@HN$`B{kVWxpis1OiqgifQCe|y(xdOm zL(n{B$C*#g`o8xf3j{GsM~qpVicS4PDGLd}N0SkhF$K(Twf8r5IH0r{#G z#)X{UR=;KBDh<`tgoW;cAxH_@Jv&biAvu2!)i?KvvBg6jWTK)D!rtVyXK(TL{nwt- z=j?9-A^9ScL6@~VJ&2J@M}f4$eI4)wb?Rd8{FKPs}t<2G` zI!&gP4hu);nbS?*lYyM;5#nXB!|K3tMaS2}AIuC}O2jF*TCiuI@M;!>67d|?fe}&R ziQ*Mq{OqQm#}kqUVzd{B+grVYl#d83pP@u+jdAlhETk#a`p0uh;?4x80I$!>3q^0sl}G9#x!&-(JD@PQrO77RDrYqKQ*Zm|?R z7gKzT%U>P_0_79;ZR{YDr^?b$Gk`~*>#^1hhq#zT=;pLHhxeDgo{=o&97g%CVxCKt z0Z~z_Wh*>fkgi7xLmT7wG`0q;SEKfgknI5qr!*`BPgPGHv z#?Bi`b$)vVV}|cwZd;aQb@|7etReS==Z(kgOjPgIH&d@Pi28RXm?!L_8-YpoIhrn4 z!qAT&0gj68*DFw}eL!T#{Sk~C)V#HH{k7e$6Gt_|!&=>sqA+6Uu-y( zNArfRg!CoK$-<4UWll_ptbVtBbD_tAg2kVhAD5gQwi|4sEqfh4c)7cix5Oz%HNm91 zgQf&oEti?qH1x^jU%0Q^3$3lKn|@6A9y{F-$)?#Z*;cU`YjEZsT`RL{MM2A*_~9&s z1T@v3LWGZ9)~(-cyQAEWu#2U@P||QuJxM#ZkSO)neij_(l7&IA4p-{I^b_N*0r4?| zj}37=8TApmo)Xyn)45!0$$^AU^_x|=aJ>eyHI2R{0VRL0dWxp7nH1`Nmf6@ay>;8y zM;slCR#2!SHG-Oz0`A96!?l7VRP5WBfvS2cstTG$-7()VUo0_m!mBU71I!lMyymfm zj#W{AQ)P?=t-#0fo`tc%%xC~IYd>xvc5)jsSAz!&9{+inqu9%9PLX)0-xkcPl>Z(( z_<60v#f@iQqgPQOmzjY@swI4S!#?p8GrBuxPsv%(>}N-pM5zg~M3kFx+r~UL9k@Do zol8%C?&rrhlw*QjisOmMk$gBPqi$;}XB7F}c1{=5K;+gC458E+)V8~hI4{?!)G`$U zf6C=qJ(>NY_r^ddMbq3?98^ZCPc6?o@V9DDlWXXkR#jdsilpkrS~kH+sA3{Gv99EX zdRkOwsbmP=U(C^%;xG){n|&rvkg5_pyu)YX z$cG(ncK-?wB_yDulO@0PjAjzS3*xJ#OKLn}{bvR}+Y;Na)jO^!f51Ru`}-P;RMIXp zrG4Sxfur@X)0GGBfW)phecI2+Cd1at%8$xH#3Gbr`kz_B1)lER@yG2a6cj)id%V@go9y1;Wuqk@!-b$1bkT?g0>SayBZbPn~yPr(<+hn zcfAm_$$_P!vQ;kp+#Ru-MTaPgYNGWcoIuYxj~nac{k z^^iTc&7|c_+{kcnD>wP%2c=%0(21J4w*}kZZ(_OXT zhiaEc3N8Kx9 zhWM=G?qDOS6+)D8nz-{Ec9l2kyJWkIeF|n_*>pbIL z1>C+1t2bYQlH&41wAUvJZ;cgo+Dc~u?~+1AUy=tV;YK8NCukj4*DM3*o>}@mU!V9w zNgV%@sz*kM2hn0aINDe%5P0*PKW#8=cwm9je|9o#i(e-8mBQ`9>QJJ|$2z7*_)0hA z8LeMSpsgcXdt_2XP6xSr4`G{{O=WVNVGd-F5I2b97m`W;^f7cDB4La6VpDfe|m_S~4 zexAACEOZ>0{Px9_&DB=%UY*;YAJLC1b%L zR|Z?zv{nww0(RhIhd{7J2DlcM1#)y$O1o;Uw!+lh@v4y>m+W%!?ULLp5fTV`)hjs) znCx@SqyMt*f__Aw#-94qijS+L#=PQH%*TXbZUv;@k$PTB=KhoHgRLc9{lGuN7(Wby zc9an!%TL}^Fazb;lYE^WS3EwoT)Hl@nmlk)5DM;_HIZ4KVhn#(&q~hKqe7h~(WR;D z$Hl01E}_(_fN5Qz7MsE|g6E%2*cS)e z8#6?Iz{YuBP}(Jj*eFLsB7O$zZ8kgq4Y6VOh95UoyM_gkn95Yy0Vv3+6@CVD%i4cs zeYkM&bMH<_F>%vtrp)3(iIBMLZ7q3##=484U)WPn2pQX~UhH6$-;#Ny;Itj05JY>i ze8W`hNR!`Qov|@|^QE&P?Ua3ITzAi$jtv!)xtq5VuLFSiAD(N|dcE9roN^6TwB*Pg zlYVyuEF-LLqw zhZ~>hT`6SK74xyl#%`;d&ZoKI{xOSWzGif&0)hvcYg;yGeaYqiXByaww;Y-GAjXM? z2?wROwA2;8E}ZdU5)F5tKmg%kf}yg2=tY$rzJ%Dg*dm85I2G)MHmayT<#1O4U+Dy5 z?vpGUO1KWRMd#UPMGe0&)?I_kdlUq&sjKzXp`j*QM;gOS%n4@^f&^}u?8)eF7m9&x z+t+!8H8c}sytJDo94p%J$A*7hEu>LD`YjG?H}p`_TFcQ|g#^41w2?+0uxB9pmL^s8 zX#6b1S&Xmsv~-l=4~!UbnaW~m&>FvPeRZLqMbn)iCZ^B5HL?ey!H`RLH_sBy2-g&Yd*1+?oS zXHBunMaKBs<)(wui9MBmn#U_S$l3?jF&uQ->;)=g%zR5XB=LLh4-_2lh{40e4iJG? z&5CUDHatR`=zI|zC?QPDUWfbcjL2#QV|4OH+XrN$(b~$)lk)Qc)eKPo#L@xNOfw9- zc+Fs4ex7s;^31Q@Qkkhh(bSVeLgoKaPv$eAqZMmuF-e}8-}SygUx&TcZ_CX-eYWZYNvgwJl{=4`9{Zt_?h zt?_4u#mG~~gyIUP-w{MJgr-Dq7OT0X5itCV%PuOKEHag8Vr|*N@lKHj@@KY`B_2oT z@gf}N0}W~{thC^dVf3^97}L2@l#T-$w47|v29)Su1_}75oRG3K?ME4v&&#F`wpnBQ zl)!R&ux>k4h}cn^nIc|sm9UDg5o0&Qkzm_f7fY2`qdNWux+wmcG~T49@m)tZwYlrB z3#j}KooN78AqcB})o}$EnPty^i6INUXnX&wovqZL0Xbx#0in;RF6o*0^r>Wtuv!P&6T}h2o7-713l3IYw zDZ5}O{_Fvt^W|g}z%S^%cp`Rd^|6jQ7I1?Z@AnduwGFZnsCYgC?_ZiC!n|Xc=ol&} z$eJ5{Iw66fw|7d3B*){eXqHM~Q`gROmbRsUpjMtA`BN0tw%~d2ceYkmw~4Ynm`_>t zC$RD*92K~Hh^sbVMDbp-=skD2oboI3f7MP%-A!cff42cq;X9;zDRS1WVTu zL&blzyM$Nox%(v4sD^UMC%c&vMNrgr(t&R7obpj^FK0fVTwW`kQmZK>^S1Cg2lewm zfW}30uBjxO;lQ0tqP9tU0XC;861 z#f)_dTS5wESGyBGLgc^aj)r1TP^Cu8o(xK$STN+SB~gm0l#@_H%)6cG32MeQzaVv? z*C(Io6#SZi?nJa$&_{~U0ZPjb($Ut8qaGF!(aSd$SAHJAmTmdDdr!CI=fy%sfS(?q z``_!;dyoF)s=__ZR-fvxSTVW%VIDGa;RmVQ`H6BT*83>YxJku69ecm9V|56AecrxM zKXn+@^X}%gYtd5cQeo9tFFZqcvx^Esy9FSHe==o($IN1I%nT) zz!fay)IY-i*V#Hpi!^%fU^@GCk`492@EqMPlhj)-{}2hn9+y6sY(wE!oW34=n!5-< zCT?!h^qq8p&9y4Se(4BxPm6vJ(E=OZyJD&t$L;~giQZg~CK!YLOP~Pcj*hN>-&W5d z){b7W@(r@|by>hKeuVIKTzZ+AbJxyUE?^S+%xGs9A}Ius6}SuHC7$ZLqv!RTZ0K*n z=(cpgv@h3WM*GhuR?qJF#eoqg_JUIRr&Qcanc)trR16)L_wu${*4C_Z9K|>Tm~0Gp z`{y2eD=0cVuC+3a-9c-6wJ}W5))6p7c;URR-J=@x^~E6J2Nxh!(WSjRTrU zuMVG#zR|gBG7pS11Q51szK@2O~Sw5y+@6Q&GNsC0Dmv<1r z>UW4Uq4v6qzW7ti@)eTp?oP(E5M}F*YfcKKe3GE8lqMIY+q%fms6+-1Qu3CGLqHl@ zseBnfQhwYj@5(D2$yl?VAH>TdHLm5%cvl$Tw2iOk#4*X(e(8y)$S~cNO;uahGC4u| z7op_;NEprED&zG=-wwi5=G@J8sSK0N#h3XGO$x%}kfNFrK*x#erU!DktB_3T$?l}@ zUm5sLfCq8>eDbWQ|GbYB1Ie$}E$!C7od{AOi1kUw{eyq3ByXr(4ct>S#2ltoVY(?+ z&b$90k}b>Ui&yF4!h9J_AIB~u^0%CQXJS+YuN-~_nwdCXr?8TKD^Sw&+H{?PIX4j} zm31L$f_5Hhz#hvy)`>M#hyr?RIkR=b6m48T>mbZw&eo4BM9_z_PHpUTr80NHFTU4| z)yY4RgoQp;eo1XOv=#SiCznFriCN{!ZM+F^%Q{#d2e}*q-(bD!0S9s*waG(>UkC{- z5O%_yLs z9(9OnYUACV*@)jNR_j;4@jR=UqmFiajjqnDESBhni92gAJc?2F_=VlMtKH@8NuC!5 z^x0}ZZJB<_NM#d7T9};e7hrj|(vk)P!|i8d7jtA#k;^goxz9jb~_0{@ix@ z+qAWoEn<%JU+H^9?*Gb(-Dc4x2`tja_Ok!tL}AMBf&Z@X{C9l(Kal6Yr^`})Wx~w<))^pnVXwGPX`Ixjpj&q%ssz7LaCSD uzlk@g3?}y}{&xERP?h?B-}8qX@~BWTb8DDL$ZZ2|0?p@oYClwMBK`}=A^>Or literal 0 HcmV?d00001 diff --git a/product_uom_company_favorite/tests/__init__.py b/product_uom_company_favorite/tests/__init__.py new file mode 100644 index 00000000..d9b96c4f --- /dev/null +++ b/product_uom_company_favorite/tests/__init__.py @@ -0,0 +1 @@ +from . import test_module diff --git a/product_uom_company_favorite/tests/test_module.py b/product_uom_company_favorite/tests/test_module.py new file mode 100644 index 00000000..602b7759 --- /dev/null +++ b/product_uom_company_favorite/tests/test_module.py @@ -0,0 +1,62 @@ +# Copyright (C) 2023-Today: GRAP () +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo.fields import Command +from odoo.tests import Form, common + + +class TestModule(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.main_company = cls.env.ref("base.main_company") + cls.demo_company = cls.env.ref("product_uom_company_favorite.demo_company") + cls.uom_unit = cls.env.ref("uom.product_uom_unit") + cls.uom_kgm = cls.env.ref("uom.product_uom_kgm") + cls.uom_unused = cls.env.ref("uom.product_uom_cubic_foot") + cls.UomUom = cls.env["uom.uom"] + cls.ProductTemplate = cls.env["product.template"] + cls.ResCompany = cls.env["res.company"] + # Add group 'UoM' to current Bot User, to make 'Form' + # test working. + cls.env.user.groups_id = [Command.link(cls.env.ref("uom.group_uom").id)] + + def test_1_default_uom_on_product_form(self): + # Check without any favorite + self.UomUom.search([]).write({"is_favorite": False}) + form_0_unit = Form(self.ProductTemplate) + self.assertFalse(form_0_unit.uom_id) + self.assertFalse(form_0_unit.uom_po_id) + + # Check with One Favorite + self.uom_unit.is_favorite = True + form_1_unit = Form(self.ProductTemplate) + self.assertEqual(form_1_unit.uom_id, self.uom_unit) + self.assertEqual(form_1_unit.uom_po_id, self.uom_unit) + + # Check with many Favorites + self.uom_kgm.is_favorite = True + form_2_units = Form(self.ProductTemplate) + self.assertFalse(form_2_units.uom_id) + self.assertFalse(form_2_units.uom_po_id) + + def test_2_create_new_company(self): + new_company = self.ResCompany.create({"name": "New Company"}) + self.assertTrue(self.uom_unit.with_company(new_company).is_favorite) + self.assertFalse(self.uom_unused.with_company(new_company).is_favorite) + + def test_3_name_search(self): + self.assertTrue(self.UomUom.name_search(self.uom_unit.name)) + self.assertTrue( + self.UomUom.with_context(display_only_favorite=True).name_search( + self.uom_unit.name + ) + ) + + self.assertTrue(self.UomUom.name_search(self.uom_unused.name)) + self.assertFalse( + self.UomUom.with_context(display_only_favorite=True).name_search( + self.uom_unused.name + ) + ) diff --git a/product_uom_company_favorite/views/view_product_template.xml b/product_uom_company_favorite/views/view_product_template.xml new file mode 100644 index 00000000..6758ff81 --- /dev/null +++ b/product_uom_company_favorite/views/view_product_template.xml @@ -0,0 +1,19 @@ + + + + + + product.template + + + + {'display_only_favorite': 1} + + + + + diff --git a/product_uom_company_favorite/views/view_uom_category.xml b/product_uom_company_favorite/views/view_uom_category.xml new file mode 100644 index 00000000..525225d1 --- /dev/null +++ b/product_uom_company_favorite/views/view_uom_category.xml @@ -0,0 +1,19 @@ + + + + + + uom.category + + + + + + + + + diff --git a/product_uom_company_favorite/views/view_uom_uom.xml b/product_uom_company_favorite/views/view_uom_uom.xml new file mode 100644 index 00000000..bcf646b0 --- /dev/null +++ b/product_uom_company_favorite/views/view_uom_uom.xml @@ -0,0 +1,50 @@ + + + + + + uom.uom + + + + + + + + + + uom.uom + + + + + + + is_favorite == True + + + + + + uom.uom + + + + + + + + + + {'search_default_filter_is_favorite': 1} + + + diff --git a/setup/product_uom_company_favorite/odoo/addons/product_uom_company_favorite b/setup/product_uom_company_favorite/odoo/addons/product_uom_company_favorite new file mode 120000 index 00000000..c273583f --- /dev/null +++ b/setup/product_uom_company_favorite/odoo/addons/product_uom_company_favorite @@ -0,0 +1 @@ +../../../../product_uom_company_favorite \ No newline at end of file diff --git a/setup/product_uom_company_favorite/setup.py b/setup/product_uom_company_favorite/setup.py new file mode 100644 index 00000000..28c57bb6 --- /dev/null +++ b/setup/product_uom_company_favorite/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)