From 6f0b8a64682811cd6bae29c3c4ded57fff239db6 Mon Sep 17 00:00:00 2001
From: achulii <96129046+achulii@users.noreply.github.com>
Date: Fri, 24 Jan 2025 14:22:20 +0100
Subject: [PATCH] [MIG] purchase_allowed_product: Migration to 18.0
---
base_view_inheritance_extension/README.rst | 130 +++++
base_view_inheritance_extension/__init__.py | 1 +
.../__manifest__.py | 16 +
.../demo/ir_ui_view.xml | 29 ++
.../i18n/base_view_inheritance_extension.pot | 29 ++
base_view_inheritance_extension/i18n/ca.po | 40 ++
base_view_inheritance_extension/i18n/de.po | 37 ++
base_view_inheritance_extension/i18n/es.po | 41 ++
base_view_inheritance_extension/i18n/es_AR.po | 35 ++
base_view_inheritance_extension/i18n/hr.po | 39 ++
base_view_inheritance_extension/i18n/it.po | 41 ++
base_view_inheritance_extension/i18n/sl.po | 38 ++
base_view_inheritance_extension/i18n/tr.po | 40 ++
.../models/__init__.py | 1 +
.../models/ir_ui_view.py | 200 ++++++++
.../pyproject.toml | 3 +
.../readme/CONTRIBUTORS.md | 9 +
.../readme/DESCRIPTION.md | 2 +
.../readme/ROADMAP.md | 1 +
.../readme/USAGE.md | 32 ++
.../static/description/icon.png | Bin 0 -> 9455 bytes
.../static/description/index.html | 473 ++++++++++++++++++
.../tests/__init__.py | 1 +
.../test_base_view_inheritance_extension.py | 201 ++++++++
purchase_allowed_product/README.rst | 28 +-
purchase_allowed_product/__manifest__.py | 2 +-
purchase_allowed_product/models/product.py | 2 -
.../static/description/index.html | 6 +-
.../tests/test_purchase_allowed_product.py | 3 +-
.../views/account_move_views.xml | 2 +-
.../views/purchase_order_views.xml | 2 +-
requirements.txt | 2 +
32 files changed, 1463 insertions(+), 23 deletions(-)
create mode 100644 base_view_inheritance_extension/README.rst
create mode 100644 base_view_inheritance_extension/__init__.py
create mode 100644 base_view_inheritance_extension/__manifest__.py
create mode 100644 base_view_inheritance_extension/demo/ir_ui_view.xml
create mode 100644 base_view_inheritance_extension/i18n/base_view_inheritance_extension.pot
create mode 100644 base_view_inheritance_extension/i18n/ca.po
create mode 100644 base_view_inheritance_extension/i18n/de.po
create mode 100644 base_view_inheritance_extension/i18n/es.po
create mode 100644 base_view_inheritance_extension/i18n/es_AR.po
create mode 100644 base_view_inheritance_extension/i18n/hr.po
create mode 100644 base_view_inheritance_extension/i18n/it.po
create mode 100644 base_view_inheritance_extension/i18n/sl.po
create mode 100644 base_view_inheritance_extension/i18n/tr.po
create mode 100644 base_view_inheritance_extension/models/__init__.py
create mode 100644 base_view_inheritance_extension/models/ir_ui_view.py
create mode 100644 base_view_inheritance_extension/pyproject.toml
create mode 100644 base_view_inheritance_extension/readme/CONTRIBUTORS.md
create mode 100644 base_view_inheritance_extension/readme/DESCRIPTION.md
create mode 100644 base_view_inheritance_extension/readme/ROADMAP.md
create mode 100644 base_view_inheritance_extension/readme/USAGE.md
create mode 100644 base_view_inheritance_extension/static/description/icon.png
create mode 100644 base_view_inheritance_extension/static/description/index.html
create mode 100644 base_view_inheritance_extension/tests/__init__.py
create mode 100644 base_view_inheritance_extension/tests/test_base_view_inheritance_extension.py
create mode 100644 requirements.txt
diff --git a/base_view_inheritance_extension/README.rst b/base_view_inheritance_extension/README.rst
new file mode 100644
index 00000000000..cb355c44465
--- /dev/null
+++ b/base_view_inheritance_extension/README.rst
@@ -0,0 +1,130 @@
+=========================
+Extended view inheritance
+=========================
+
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:7d139c75ecf0e269f19de0443b9a28f4e56833de6af60ecff96f40a589297f5c
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png
+ :target: https://odoo-community.org/page/development-status
+ :alt: Mature
+.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png
+ :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
+ :alt: License: LGPL-3
+.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpurchase--workflow-lightgray.png?logo=github
+ :target: https://github.com/OCA/purchase-workflow/tree/18.0/base_view_inheritance_extension
+ :alt: OCA/purchase-workflow
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-base_view_inheritance_extension
+ :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/purchase-workflow&target_branch=18.0
+ :alt: Try me on Runboat
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This module was written to make it simple to add custom operators for
+view inheritance.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Usage
+=====
+
+**Change a python dictionary (context for example)**
+
+.. code:: xml
+
+
+
+ {
+ "key": "value",
+ }
+
+
+
+Note that views are subject to evaluation of xmlids anyways, so if you
+need to refer to some xmlid, say ``%(xmlid)s``.
+
+**Add text after and/or before than original**
+
+.. code:: xml
+
+
+ $text_before {old_value} $text_after
+
+
+**Add domain with AND/OR join operator (AND if missed) allowing
+conditional changes**
+
+.. code:: xml
+
+
+ $domain_to_add
+
+
+Known issues / Roadmap
+======================
+
+- Support an ``eval`` attribute for our new node types.
+
+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
+-------
+
+* Therp BV
+
+Contributors
+------------
+
+- Holger Brunn
+- Ronald Portier
+- `Tecnativa `__:
+
+ - Sergio Teruel
+ - Carlos Dauden
+
+- `Trobz `__:
+
+ - Nhan Tran
+
+- Iván Todorovich
+- Frederic Grall
+
+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.
+
+This module is part of the `OCA/purchase-workflow `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/base_view_inheritance_extension/__init__.py b/base_view_inheritance_extension/__init__.py
new file mode 100644
index 00000000000..0650744f6bc
--- /dev/null
+++ b/base_view_inheritance_extension/__init__.py
@@ -0,0 +1 @@
+from . import models
diff --git a/base_view_inheritance_extension/__manifest__.py b/base_view_inheritance_extension/__manifest__.py
new file mode 100644
index 00000000000..a94424976f5
--- /dev/null
+++ b/base_view_inheritance_extension/__manifest__.py
@@ -0,0 +1,16 @@
+# Copyright 2016 Therp BV
+# Copyright 2018 Tecnativa - Sergio Teruel
+# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
+{
+ "name": "Extended view inheritance",
+ "version": "18.0.1.0.0",
+ "development_status": "Mature",
+ "author": "Therp BV,Odoo Community Association (OCA)",
+ "license": "LGPL-3",
+ "category": "Hidden/Dependency",
+ "summary": "Adds more operators for view inheritance",
+ "website": "https://github.com/OCA/purchase-workflow",
+ "depends": ["base"],
+ "external_dependencies": {"python": ["astor"]},
+ "demo": ["demo/ir_ui_view.xml"],
+}
diff --git a/base_view_inheritance_extension/demo/ir_ui_view.xml b/base_view_inheritance_extension/demo/ir_ui_view.xml
new file mode 100644
index 00000000000..93562cc7a4f
--- /dev/null
+++ b/base_view_inheritance_extension/demo/ir_ui_view.xml
@@ -0,0 +1,29 @@
+
+
+
+ res.partner
+
+
+
+ Partner form
+
+
+
+ {
+ "default_email": "info@odoo-community.org",
+ "default_company_id": allowed_company_ids[0]
+ }
+
+
+
+
+ parent_id
+
+
+
+
+
diff --git a/base_view_inheritance_extension/i18n/base_view_inheritance_extension.pot b/base_view_inheritance_extension/i18n/base_view_inheritance_extension.pot
new file mode 100644
index 00000000000..40d680d71f4
--- /dev/null
+++ b/base_view_inheritance_extension/i18n/base_view_inheritance_extension.pot
@@ -0,0 +1,29 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_view_inheritance_extension
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 18.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: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Partner form"
+msgstr ""
+
+#. module: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Phone numbers"
+msgstr ""
+
+#. module: base_view_inheritance_extension
+#: model:ir.model,name:base_view_inheritance_extension.model_ir_ui_view
+msgid "View"
+msgstr ""
diff --git a/base_view_inheritance_extension/i18n/ca.po b/base_view_inheritance_extension/i18n/ca.po
new file mode 100644
index 00000000000..a27155bc6c2
--- /dev/null
+++ b/base_view_inheritance_extension/i18n/ca.po
@@ -0,0 +1,40 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_view_inheritance_extension
+#
+# Translators:
+# Marc Tormo i Bochaca , 2017
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 9.0c\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-04-19 17:59+0000\n"
+"PO-Revision-Date: 2017-04-19 17:59+0000\n"
+"Last-Translator: Marc Tormo i Bochaca , 2017\n"
+"Language-Team: Catalan (https://www.transifex.com/oca/teams/23907/ca/)\n"
+"Language: ca\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: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Partner form"
+msgstr "Empresa de "
+
+#. module: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Phone numbers"
+msgstr ""
+
+#. module: base_view_inheritance_extension
+#: model:ir.model,name:base_view_inheritance_extension.model_ir_ui_view
+msgid "View"
+msgstr ""
+
+#~ msgid "ir.ui.view"
+#~ msgstr "ir.ui.view"
+
+#~ msgid "A new page"
+#~ msgstr "Una nova pàgina "
diff --git a/base_view_inheritance_extension/i18n/de.po b/base_view_inheritance_extension/i18n/de.po
new file mode 100644
index 00000000000..abe9bb05a3b
--- /dev/null
+++ b/base_view_inheritance_extension/i18n/de.po
@@ -0,0 +1,37 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_view_inheritance_extension
+#
+# Translators:
+# Niki Waibel , 2017
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 10.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-12-01 02:10+0000\n"
+"PO-Revision-Date: 2017-12-01 02:10+0000\n"
+"Last-Translator: Niki Waibel , 2017\n"
+"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n"
+"Language: de\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: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Partner form"
+msgstr ""
+
+#. module: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Phone numbers"
+msgstr ""
+
+#. module: base_view_inheritance_extension
+#: model:ir.model,name:base_view_inheritance_extension.model_ir_ui_view
+msgid "View"
+msgstr ""
+
+#~ msgid "ir.ui.view"
+#~ msgstr "ir.ui.view"
diff --git a/base_view_inheritance_extension/i18n/es.po b/base_view_inheritance_extension/i18n/es.po
new file mode 100644
index 00000000000..57c9e77cec1
--- /dev/null
+++ b/base_view_inheritance_extension/i18n/es.po
@@ -0,0 +1,41 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_view_inheritance_extension
+#
+# Translators:
+# Pedro M. Baeza , 2017
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 10.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-12-01 02:10+0000\n"
+"PO-Revision-Date: 2023-09-03 00:14+0000\n"
+"Last-Translator: Ivorra78 \n"
+"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
+"Language: es\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"
+"X-Generator: Weblate 4.17\n"
+
+#. module: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Partner form"
+msgstr "Formulario de socio"
+
+#. module: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Phone numbers"
+msgstr "Números de teléfono"
+
+#. module: base_view_inheritance_extension
+#: model:ir.model,name:base_view_inheritance_extension.model_ir_ui_view
+msgid "View"
+msgstr "Vista"
+
+#~ msgid "Smart Search"
+#~ msgstr "Búsqueda inteligente"
+
+#~ msgid "ir.ui.view"
+#~ msgstr "ir.ui.view"
diff --git a/base_view_inheritance_extension/i18n/es_AR.po b/base_view_inheritance_extension/i18n/es_AR.po
new file mode 100644
index 00000000000..6df53684ff6
--- /dev/null
+++ b/base_view_inheritance_extension/i18n/es_AR.po
@@ -0,0 +1,35 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_view_inheritance_extension
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 15.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2023-06-09 16:09+0000\n"
+"Last-Translator: Ignacio Buioli \n"
+"Language-Team: none\n"
+"Language: es_AR\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"
+"X-Generator: Weblate 4.17\n"
+
+#. module: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Partner form"
+msgstr "Contacto desde"
+
+#. module: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Phone numbers"
+msgstr "Números de teléfono"
+
+#. module: base_view_inheritance_extension
+#: model:ir.model,name:base_view_inheritance_extension.model_ir_ui_view
+msgid "View"
+msgstr "Vista"
+
+#~ msgid "Smart Search"
+#~ msgstr "Búsqueda Inteligente"
diff --git a/base_view_inheritance_extension/i18n/hr.po b/base_view_inheritance_extension/i18n/hr.po
new file mode 100644
index 00000000000..61b0ca1e97e
--- /dev/null
+++ b/base_view_inheritance_extension/i18n/hr.po
@@ -0,0 +1,39 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_view_inheritance_extension
+#
+# Translators:
+# Bole , 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 10.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-03-02 18:40+0000\n"
+"PO-Revision-Date: 2023-01-04 03:00+0000\n"
+"Last-Translator: Bole \n"
+"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n"
+"Language: hr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.14.1\n"
+
+#. module: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Partner form"
+msgstr "Forma partnera"
+
+#. module: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Phone numbers"
+msgstr "Brojevi telefona"
+
+#. module: base_view_inheritance_extension
+#: model:ir.model,name:base_view_inheritance_extension.model_ir_ui_view
+msgid "View"
+msgstr "Pogled"
+
+#~ msgid "ir.ui.view"
+#~ msgstr "ir.ui.view"
diff --git a/base_view_inheritance_extension/i18n/it.po b/base_view_inheritance_extension/i18n/it.po
new file mode 100644
index 00000000000..4cb1fa47241
--- /dev/null
+++ b/base_view_inheritance_extension/i18n/it.po
@@ -0,0 +1,41 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_view_inheritance_extension
+#
+# Translators:
+# Paolo Valier , 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 10.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-01-06 02:25+0000\n"
+"PO-Revision-Date: 2023-09-21 16:40+0000\n"
+"Last-Translator: mymage \n"
+"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n"
+"Language: it\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"
+"X-Generator: Weblate 4.17\n"
+
+#. module: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Partner form"
+msgstr "Form Partner"
+
+#. module: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Phone numbers"
+msgstr "Numeri di telefono"
+
+#. module: base_view_inheritance_extension
+#: model:ir.model,name:base_view_inheritance_extension.model_ir_ui_view
+msgid "View"
+msgstr "Vista"
+
+#~ msgid "Smart Search"
+#~ msgstr "Ricerca intelligente"
+
+#~ msgid "ir.ui.view"
+#~ msgstr "ir.ui.view"
diff --git a/base_view_inheritance_extension/i18n/sl.po b/base_view_inheritance_extension/i18n/sl.po
new file mode 100644
index 00000000000..6a5156242a1
--- /dev/null
+++ b/base_view_inheritance_extension/i18n/sl.po
@@ -0,0 +1,38 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_view_inheritance_extension
+#
+# Translators:
+# Matjaž Mozetič , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 9.0c\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-12-29 03:39+0000\n"
+"PO-Revision-Date: 2016-12-29 03:39+0000\n"
+"Last-Translator: Matjaž Mozetič , 2016\n"
+"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n"
+"Language: sl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
+"n%100==4 ? 2 : 3);\n"
+
+#. module: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Partner form"
+msgstr "Partnerjev obrazec"
+
+#. module: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Phone numbers"
+msgstr ""
+
+#. module: base_view_inheritance_extension
+#: model:ir.model,name:base_view_inheritance_extension.model_ir_ui_view
+msgid "View"
+msgstr ""
+
+#~ msgid "A new page"
+#~ msgstr "Nova stran"
diff --git a/base_view_inheritance_extension/i18n/tr.po b/base_view_inheritance_extension/i18n/tr.po
new file mode 100644
index 00000000000..66aaa0e7209
--- /dev/null
+++ b/base_view_inheritance_extension/i18n/tr.po
@@ -0,0 +1,40 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_view_inheritance_extension
+#
+# Translators:
+# Ahmet Altinisik , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 9.0c\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-12-29 03:39+0000\n"
+"PO-Revision-Date: 2016-12-29 03:39+0000\n"
+"Last-Translator: Ahmet Altinisik , 2016\n"
+"Language-Team: Turkish (https://www.transifex.com/oca/teams/23907/tr/)\n"
+"Language: tr\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: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Partner form"
+msgstr "İş ortağı formu"
+
+#. module: base_view_inheritance_extension
+#: model_terms:ir.ui.view,arch_db:base_view_inheritance_extension.view_partner_simple_form
+msgid "Phone numbers"
+msgstr ""
+
+#. module: base_view_inheritance_extension
+#: model:ir.model,name:base_view_inheritance_extension.model_ir_ui_view
+msgid "View"
+msgstr ""
+
+#~ msgid "ir.ui.view"
+#~ msgstr "ir.ui.view"
+
+#~ msgid "A new page"
+#~ msgstr "Yeni bir sayfa"
diff --git a/base_view_inheritance_extension/models/__init__.py b/base_view_inheritance_extension/models/__init__.py
new file mode 100644
index 00000000000..81f52e3bfa6
--- /dev/null
+++ b/base_view_inheritance_extension/models/__init__.py
@@ -0,0 +1 @@
+from . import ir_ui_view
diff --git a/base_view_inheritance_extension/models/ir_ui_view.py b/base_view_inheritance_extension/models/ir_ui_view.py
new file mode 100644
index 00000000000..2593d3eff82
--- /dev/null
+++ b/base_view_inheritance_extension/models/ir_ui_view.py
@@ -0,0 +1,200 @@
+# Copyright 2016 Therp BV
+# Copyright 2018 Tecnativa - Sergio Teruel
+# Copyright 2021 Camptocamp SA (https://www.camptocamp.com).
+# Copyright 2023 Tecnativa - Carlos Dauden
+# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
+import ast
+import re
+
+from lxml import etree
+
+from odoo import api, models
+from odoo.osv import expression
+
+
+def ast_dict_update(source, update):
+ """Perform a dict `update` on an ast.Dict
+
+ Behaves similar to :meth:`dict.update`, but on ast.Dict instead.
+ Only compares string-like ast.Dict keys (ast.Str or ast.Constant).
+
+ :returns: The updated ast.Dict
+ :rtype: ast.Dict
+ """
+ if not isinstance(source, ast.Dict):
+ raise TypeError("`source` must be an AST dict")
+ if not isinstance(update, ast.Dict):
+ raise TypeError("`update` must be an AST dict")
+
+ def ast_key_eq(k1, k2):
+ # python < 3.8 uses ast.Str; python >= 3.8 uses ast.Constant
+ if type(k1) is not type(k2):
+ return False
+ elif isinstance(k1, ast.Str):
+ return k1.s == k2.s
+ elif isinstance(k1, ast.Constant):
+ return k1.value == k2.value
+
+ toadd_uidx = []
+ for uidx, ukey in enumerate(update.keys):
+ found = False
+ for sidx, skey in enumerate(source.keys):
+ if ast_key_eq(ukey, skey):
+ source.values[sidx] = update.values[uidx]
+ found = True
+ break
+ if not found:
+ toadd_uidx.append(uidx)
+ for uidx in toadd_uidx:
+ source.keys.append(update.keys[uidx])
+ source.values.append(update.values[uidx])
+ return source
+
+
+class IrUiView(models.Model):
+ _inherit = "ir.ui.view"
+
+ @api.model
+ def apply_inheritance_specs(self, source, specs_tree, pre_locate=lambda s: True):
+ for specs, handled_by in self._iter_inheritance_specs(specs_tree):
+ pre_locate(specs)
+ source = handled_by(source, specs)
+ return source
+
+ @api.model
+ def _iter_inheritance_specs(self, spec):
+ if spec.tag == "data":
+ for child in spec:
+ for node, handler in self._iter_inheritance_specs(child):
+ yield node, handler
+ return
+ if spec.get("position") == "attributes":
+ if all(not c.get("operation") for c in spec):
+ yield spec, self._get_inheritance_handler(spec)
+ return
+ for child in spec:
+ node = etree.Element(spec.tag, **spec.attrib)
+ node.insert(0, child)
+ yield node, self._get_inheritance_handler_attributes(child)
+ return
+ yield spec, self._get_inheritance_handler(spec)
+
+ @api.model
+ def _get_inheritance_handler(self, node):
+ handler = super().apply_inheritance_specs
+ if hasattr(self, f"inheritance_handler_{node.tag}"):
+ handler = getattr(self, f"inheritance_handler_{node.tag}")
+ return handler
+
+ @api.model
+ def _get_inheritance_handler_attributes(self, node):
+ handler = super().apply_inheritance_specs
+ if hasattr(self, f"_inheritance_handler_attributes_{node.get('operation')}"):
+ handler = getattr(
+ self, f"_inheritance_handler_attributes_{node.get('operation')}"
+ )
+ return handler
+
+ @api.model
+ def _inheritance_handler_attributes_update(self, source, specs):
+ """Implement dict `update` operation on the attribute node.
+
+ .. code-block:: xml
+
+
+
+ {
+ "key": "value",
+ }
+
+
+ """
+ node = self.locate_node(source, specs)
+ for spec in specs:
+ attr_name = spec.get("name")
+ # Parse ast from both node and spec
+ node_attr = (node.get(attr_name) or "{}").strip()
+ source_ast = ast.parse(node_attr, mode="eval").body
+ update_ast = ast.parse(spec.text.strip(), mode="eval").body
+ if not isinstance(source_ast, ast.Dict):
+ raise TypeError(f"Attribute `{attr_name}` is not a dict")
+ if not isinstance(update_ast, ast.Dict):
+ raise TypeError(f"Operation for attribute `{attr_name}` is not a dict")
+ # Update node ast dict
+ source_ast = ast_dict_update(source_ast, update_ast)
+ # Dump the ast back to source
+ node.attrib[attr_name] = ast.unparse(source_ast).strip()
+ return source
+
+ @api.model
+ def _inheritance_handler_attributes_text_add(self, source, specs):
+ """Implement
+ <$node position="attributes">
+
+ $text_before {old_value} $text_after
+
+ $node>"""
+ node = self.locate_node(source, specs)
+ for attribute_node in specs:
+ attribute_name = attribute_node.get("name")
+ old_value = node.get(attribute_name) or ""
+ node.attrib[attribute_name] = attribute_node.text.format(
+ old_value=old_value
+ )
+ return source
+
+ @api.model
+ def _inheritance_handler_attributes_domain_add(self, source, specs):
+ """Implement
+ <$node position="attributes">
+
+ $domain_to_add
+
+ $node>"""
+ node = self.locate_node(source, specs)
+ for attribute_node in specs:
+ attribute_name = attribute_node.get("name")
+ condition = attribute_node.get("condition")
+ join_operator = attribute_node.get("join_operator") or "AND"
+ old_value = node.get(attribute_name) or ""
+ if old_value:
+ old_domain = ast.literal_eval(
+ self._var2str_domain_text(old_value.strip())
+ )
+ new_domain = ast.literal_eval(
+ self._var2str_domain_text(attribute_node.text.strip())
+ )
+ if join_operator == "OR":
+ new_value = str(expression.OR([old_domain, new_domain]))
+ else:
+ new_value = str(expression.AND([old_domain, new_domain]))
+ new_value = self._str2var_domain_text(new_value)
+ old_value = "".join(old_value.splitlines())
+ else:
+ # We must ensure that the domain definition has not line breaks because
+ # in update mode the domain cause an invalid syntax error
+ new_value = attribute_node.text.strip()
+ if condition:
+ new_value = f"{condition} and {new_value} or {old_value or []}"
+ node.attrib[attribute_name] = new_value
+ return source
+
+ @api.model
+ def _var2str_domain_text(self, domain_str):
+ """Replaces var names with str names to allow eval without defined vars"""
+ # Replace fields in 2 steps because 1 step returns "parent_sufix"."var_sufix"
+ regex_parent = re.compile(r"parent\.(\b\w+\b)")
+ domain_str = re.sub(
+ regex_parent, r"'parent.\1_is_a_var_to_replace'", domain_str
+ )
+ regex = re.compile(r"(?\>
+- Ronald Portier \<\>
+- [Tecnativa](https://www.tecnativa.com):
+ - Sergio Teruel
+ - Carlos Dauden
+- [Trobz](https://www.trobz.com):
+ - Nhan Tran \<\>
+- Iván Todorovich \<\>
+- Frederic Grall \<>
diff --git a/base_view_inheritance_extension/readme/DESCRIPTION.md b/base_view_inheritance_extension/readme/DESCRIPTION.md
new file mode 100644
index 00000000000..4fc9dc0a49d
--- /dev/null
+++ b/base_view_inheritance_extension/readme/DESCRIPTION.md
@@ -0,0 +1,2 @@
+This module was written to make it simple to add custom operators for
+view inheritance.
diff --git a/base_view_inheritance_extension/readme/ROADMAP.md b/base_view_inheritance_extension/readme/ROADMAP.md
new file mode 100644
index 00000000000..f2dc1c6a7b3
--- /dev/null
+++ b/base_view_inheritance_extension/readme/ROADMAP.md
@@ -0,0 +1 @@
+- Support an `eval` attribute for our new node types.
diff --git a/base_view_inheritance_extension/readme/USAGE.md b/base_view_inheritance_extension/readme/USAGE.md
new file mode 100644
index 00000000000..e4bda1aa927
--- /dev/null
+++ b/base_view_inheritance_extension/readme/USAGE.md
@@ -0,0 +1,32 @@
+**Change a python dictionary (context for example)**
+
+``` xml
+
+
+ {
+ "key": "value",
+ }
+
+
+```
+
+Note that views are subject to evaluation of xmlids anyways, so if you
+need to refer to some xmlid, say `%(xmlid)s`.
+
+**Add text after and/or before than original**
+
+``` xml
+
+ $text_before {old_value} $text_after
+
+```
+
+**Add domain with AND/OR join operator (AND if missed) allowing
+conditional changes**
+
+``` xml
+
+ $domain_to_add
+
+```
diff --git a/base_view_inheritance_extension/static/description/icon.png b/base_view_inheritance_extension/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/base_view_inheritance_extension/static/description/index.html b/base_view_inheritance_extension/static/description/index.html
new file mode 100644
index 00000000000..c8c868924cd
--- /dev/null
+++ b/base_view_inheritance_extension/static/description/index.html
@@ -0,0 +1,473 @@
+
+
+
+
+
+Extended view inheritance
+
+
+
+
+
Extended view inheritance
+
+
+
+
This module was written to make it simple to add custom operators for
+view inheritance.
+
Table of contents
+
+
+
+
Change a python dictionary (context for example)
+
+<field position="attributes">
+ <attribute name="context" operation="update">
+ {
+ "key": "value",
+ }
+ </attribute>
+</field>
+
+
Note that views are subject to evaluation of xmlids anyways, so if you
+need to refer to some xmlid, say %(xmlid)s.
+
Add text after and/or before than original
+
+<attribute name="$attribute" operation="text_add">
+ $text_before {old_value} $text_after
+</attribute>
+
+
Add domain with AND/OR join operator (AND if missed) allowing
+conditional changes
+
+<attribute name="$attribute" operation="domain_add"
+ condition="$field_condition" join_operator="OR">
+ $domain_to_add
+</attribute>
+
+
+
+
+
+- Support an eval attribute for our new node types.
+
+
+
+
+
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.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+
+
+
+
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.
+
This module is part of the OCA/purchase-workflow project on GitHub.
+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
+
+
+
+
+
diff --git a/base_view_inheritance_extension/tests/__init__.py b/base_view_inheritance_extension/tests/__init__.py
new file mode 100644
index 00000000000..261fddfad36
--- /dev/null
+++ b/base_view_inheritance_extension/tests/__init__.py
@@ -0,0 +1 @@
+from . import test_base_view_inheritance_extension
diff --git a/base_view_inheritance_extension/tests/test_base_view_inheritance_extension.py b/base_view_inheritance_extension/tests/test_base_view_inheritance_extension.py
new file mode 100644
index 00000000000..eeaf22c2a73
--- /dev/null
+++ b/base_view_inheritance_extension/tests/test_base_view_inheritance_extension.py
@@ -0,0 +1,201 @@
+# Copyright 2016 Therp BV
+# Copyright 2021 Camptocamp SA (https://www.camptocamp.com).
+# @author Iván Todorovich
+# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
+
+from lxml import etree
+
+from odoo.tests.common import TransactionCase
+
+
+class TestBaseViewInheritanceExtension(TransactionCase):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+ cls.maxDiff = None
+
+ def test_base_view_inheritance_extension(self):
+ view_id = self.env.ref("base.view_partner_simple_form").id
+ arch, _ = self.env["res.partner"]._get_view(view_id=view_id)
+ # Verify normal attributes work
+ self.assertEqual(arch.xpath("//form")[0].get("string"), "Partner form")
+ # Verify our extra context key worked
+ self.assertTrue(
+ "'default_email': 'info@odoo-community.org'"
+ in arch.xpath('//field[@name="parent_id"]')[0].get("context")
+ )
+ self.assertTrue(
+ "'default_company_id': allowed_company_ids[0]"
+ in arch.xpath('//field[@name="parent_id"]')[0].get("context")
+ )
+
+ def test_update_context_default(self):
+ source = etree.fromstring(
+ """
+
+ """
+ )
+ specs = etree.fromstring(
+ """
+
+
+ {"default_company_id": company_id}
+
+
+ """
+ )
+ res = self.env["ir.ui.view"].apply_inheritance_specs(source, specs)
+ self.assertEqual(
+ res.xpath('//field[@name="account_move_id"]')[0].attrib["context"],
+ "{'default_journal_id': journal_id, 'default_company_id': company_id}",
+ )
+
+ def test_update_context_complex(self):
+ source = etree.fromstring(
+ """
+
+ """
+ )
+ specs = etree.fromstring(
+ """
+
+
+ {
+ "default_product_id": product_id,
+ "default_cost_center_id": (
+ context.get("handle_mrp_cost") and cost_center_id or False
+ ),
+ }
+
+
+ """
+ )
+ res = self.env["ir.ui.view"].apply_inheritance_specs(source, specs)
+ expected_items = [
+ "'default_type': context.get('default_type')",
+ "'journal_id': journal_id",
+ "'default_partner_id': commercial_partner_id",
+ (
+ "'default_currency_id': "
+ "currency_id != company_currency_id and currency_id or False"
+ ),
+ "'default_name': 'The company name'",
+ "'default_product_id': product_id",
+ (
+ "'default_cost_center_id': "
+ "context.get('handle_mrp_cost') and cost_center_id or False"
+ ),
+ ]
+ self.assertEqual(
+ res.xpath('//field[@name="invoice_line_ids"]')[0].attrib["context"],
+ "{%s}" % ", ".join(expected_items), # noqa: UP031
+ )
+
+ def test_text_add_operation(self):
+ source = etree.fromstring(
+ """
+
+ """
+ )
+
+ specs = etree.fromstring(
+ """
+
+ {old_value} Customer
+
+ """
+ )
+
+ res = self.env["ir.ui.view"].apply_inheritance_specs(source, specs)
+ self.assertEqual(
+ res.xpath('//field[@name="customer_id"]')[0].attrib["string"],
+ "Client Customer",
+ )
+
+ def test_update_operation_not_a_dict(self):
+ """We should get an error if we try to update a dict with a non-dict spec"""
+ source = etree.fromstring(
+ """
+
+ """
+ )
+ specs = etree.fromstring(
+ """
+
+
+ ["not", "a", "dict"]
+
+
+ """
+ )
+ with self.assertRaisesRegex(
+ TypeError, "Operation for attribute `context` is not a dict"
+ ):
+ self.env["ir.ui.view"].apply_inheritance_specs(source, specs)
+
+ def test_domain_add_operation(self):
+ source = etree.fromstring(
+ """
+
+ """
+ )
+ specs = etree.fromstring(
+ """
+
+
+ [('state', '!=', 'draft')]
+
+
+ """
+ )
+ res = self.env["ir.ui.view"].apply_inheritance_specs(source, specs)
+ self.assertEqual(
+ res.xpath('//field[@name="child_ids"]')[0].attrib["domain"],
+ "['&', ('state', '=', 'confirm'), ('state', '!=', 'draft')]",
+ )
+
+ def test_update_source_not_a_dict(self):
+ """We should get an error if we try to update a non-dict attribute"""
+ source = etree.fromstring(
+ """
+
+ """
+ )
+ specs = etree.fromstring(
+ """
+
+
+ {
+ "required": [('state', '!=', 'draft')],
+ }
+
+
+ """
+ )
+ with self.assertRaisesRegex(TypeError, "Attribute `domain` is not a dict"):
+ self.env["ir.ui.view"].apply_inheritance_specs(source, specs)
diff --git a/purchase_allowed_product/README.rst b/purchase_allowed_product/README.rst
index af22cacb6fb..9ce3f36720b 100644
--- a/purchase_allowed_product/README.rst
+++ b/purchase_allowed_product/README.rst
@@ -17,13 +17,13 @@ Purchase and Invoice Allowed Product
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpurchase--workflow-lightgray.png?logo=github
- :target: https://github.com/OCA/purchase-workflow/tree/17.0/purchase_allowed_product
+ :target: https://github.com/OCA/purchase-workflow/tree/18.0/purchase_allowed_product
:alt: OCA/purchase-workflow
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/purchase-workflow-17-0/purchase-workflow-17-0-purchase_allowed_product
+ :target: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-purchase_allowed_product
: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/purchase-workflow&target_branch=17.0
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=18.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -48,7 +48,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.
@@ -63,19 +63,19 @@ Authors
Contributors
------------
-- Chafique Delli
-- Mourad EL HADJ MIMOUNE
-- Hieu, Vo Minh Bao
-- `Tecnativa `__:
+- Chafique Delli
+- Mourad EL HADJ MIMOUNE
+- Hieu, Vo Minh Bao
+- `Tecnativa `__:
- - Manuel Calero
- - Pedro M. Baeza
+ - Manuel Calero
+ - Pedro M. Baeza
-- `Via laurea `__:
+- `Via laurea `__:
- - Darius Žižys
+ - Darius Žižys
-- Eduardo de Miguel (`Moduon `__)
+- Eduardo de Miguel (`Moduon `__)
Maintainers
-----------
@@ -90,6 +90,6 @@ 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.
-This module is part of the `OCA/purchase-workflow `_ project on GitHub.
+This module is part of the `OCA/purchase-workflow `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/purchase_allowed_product/__manifest__.py b/purchase_allowed_product/__manifest__.py
index 9e123f7e857..19f9ed20dbe 100644
--- a/purchase_allowed_product/__manifest__.py
+++ b/purchase_allowed_product/__manifest__.py
@@ -6,7 +6,7 @@
"name": "Purchase and Invoice Allowed Product",
"summary": "This module allows to select only products that can be "
"supplied by the vendor",
- "version": "17.0.1.0.0",
+ "version": "18.0.1.0.0",
"category": "Accounting & Finance",
"website": "https://github.com/OCA/purchase-workflow",
"author": "Akretion, Odoo Community Association (OCA)",
diff --git a/purchase_allowed_product/models/product.py b/purchase_allowed_product/models/product.py
index 0329f3a1759..f2af0c24a15 100644
--- a/purchase_allowed_product/models/product.py
+++ b/purchase_allowed_product/models/product.py
@@ -16,7 +16,6 @@ def _search(
offset=0,
limit=None,
order=None,
- access_rights_uid=None,
):
if self.env.context.get("use_only_supplied_product"):
restrict_supplier_id = self.env.context.get("restrict_supplier_id")
@@ -38,5 +37,4 @@ def _search(
offset=offset,
limit=limit,
order=order,
- access_rights_uid=access_rights_uid,
)
diff --git a/purchase_allowed_product/static/description/index.html b/purchase_allowed_product/static/description/index.html
index 65dd44c954f..64e23737cef 100644
--- a/purchase_allowed_product/static/description/index.html
+++ b/purchase_allowed_product/static/description/index.html
@@ -369,7 +369,7 @@ Purchase and Invoice Allowed Product
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:376569ec84ca307bb83baf306b91200c633f7ee20fd6f9feb448155fb174beef
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
+
This module adds a restriction in purchase and supplier invoices that
has the mark “Order and invoice only supplied products” checked for
allowing to select only products that can be supplied by the defined
@@ -394,7 +394,7 @@
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.
@@ -432,7 +432,7 @@
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.
-
This module is part of the OCA/purchase-workflow project on GitHub.
+
This module is part of the OCA/purchase-workflow project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/purchase_allowed_product/tests/test_purchase_allowed_product.py b/purchase_allowed_product/tests/test_purchase_allowed_product.py
index dc8e0c7edcb..4cf0d31ad56 100644
--- a/purchase_allowed_product/tests/test_purchase_allowed_product.py
+++ b/purchase_allowed_product/tests/test_purchase_allowed_product.py
@@ -3,7 +3,8 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-from odoo.tests.common import Form, TransactionCase
+from odoo.tests import Form
+from odoo.tests.common import TransactionCase
class TestPurchaseAllowedProduct(TransactionCase):
diff --git a/purchase_allowed_product/views/account_move_views.xml b/purchase_allowed_product/views/account_move_views.xml
index 1e9645657c3..d0042bb2692 100644
--- a/purchase_allowed_product/views/account_move_views.xml
+++ b/purchase_allowed_product/views/account_move_views.xml
@@ -12,7 +12,7 @@
/>
diff --git a/purchase_allowed_product/views/purchase_order_views.xml b/purchase_allowed_product/views/purchase_order_views.xml
index 321a1b7c130..8ac7bb4e1f8 100644
--- a/purchase_allowed_product/views/purchase_order_views.xml
+++ b/purchase_allowed_product/views/purchase_order_views.xml
@@ -8,7 +8,7 @@
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 00000000000..f0e2006cc32
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,2 @@
+# generated from manifests external_dependencies
+astor