Initial commit: OCA Mrp packages (117 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:05 +02:00
commit 277e84fd7a
4403 changed files with 395154 additions and 0 deletions

View file

@ -0,0 +1,44 @@
# MRP Workcenter Hierarchical
Odoo addon: mrp_workcenter_hierarchical
## Installation
```bash
pip install odoo-bringout-oca-manufacture-mrp_workcenter_hierarchical
```
## Dependencies
This addon depends on:
- mrp
## Manifest Information
- **Name**: MRP Workcenter Hierarchical
- **Version**: 16.0.1.0.0
- **Category**: Manufacturing
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/manufacture](https://github.com/OCA/manufacture) branch 16.0, addon `mrp_workcenter_hierarchical`.
## License
This package maintains the original AGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Mrp_workcenter_hierarchical Module - mrp_workcenter_hierarchical
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for mrp_workcenter_hierarchical. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,5 @@
# Dependencies
This addon depends on:
- [mrp](../../odoo-bringout-oca-ocb-mrp)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon mrp_workcenter_hierarchical or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-manufacture-mrp_workcenter_hierarchical"
# or
uv pip install odoo-bringout-oca-manufacture-mrp_workcenter_hierarchical"
```

View file

@ -0,0 +1,13 @@
# Models
Detected core models and extensions in mrp_workcenter_hierarchical.
```mermaid
classDiagram
class mrp_workcenter
class res_company
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: mrp_workcenter_hierarchical. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon mrp_workcenter_hierarchical
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,34 @@
# Security
Access control and security definitions in mrp_workcenter_hierarchical.
## Access Control Lists (ACLs)
Model access permissions defined in:
- **[ir.model.access.csv](../mrp_workcenter_hierarchical/security/ir.model.access.csv)**
- 1 model access rules
## Record Rules
Row-level security rules defined in:
```mermaid
graph TB
subgraph "Security Layers"
A[Users] --> B[Groups]
B --> C[Access Control Lists]
C --> D[Models]
B --> E[Record Rules]
E --> F[Individual Records]
end
```
Security files overview:
- **[ir.model.access.csv](../mrp_workcenter_hierarchical/security/ir.model.access.csv)**
- Model access permissions (CRUD rights)
Notes
- Access Control Lists define which groups can access which models
- Record Rules provide row-level security (filter records by user/group)
- Security groups organize users and define permission sets
- All security is enforced at the ORM level by Odoo

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon mrp_workcenter_hierarchical
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,116 @@
===========================
MRP Workcenter Hierarchical
===========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:22cb1398c6641db8541bb53d56ebaec41fea1e8fe3efc39e9786cb19e6e4be01
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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%2Fmanufacture-lightgray.png?logo=github
:target: https://github.com/OCA/manufacture/tree/16.0/mrp_workcenter_hierarchical
:alt: OCA/manufacture
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/manufacture-16-0/manufacture-16-0-mrp_workcenter_hierarchical
: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/manufacture&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
Allow to define a parent workcenter to a workcenter
**Table of contents**
.. contents::
:local:
Configuration
=============
Activate workcenters:
* Manufacturing > Configuration > Settings > Configuration
* Check Work Orders and save
Usage
=====
* Go to Manufacturing > Configuration > Work Centers
* Set parent field on workcenters
* Go to Manufacturing > Configuration > Settings
* Set the parent level empty configuration if needed.
Without setting this parameter, the parent levels are always set, never mind the depth
of the parent workcenters. The last parent level will contain the last parent and
the top parent workcenter, will appear it self in its parent level.
The idea is to be able to see group of workcenters :
../static/src/img/img1.png
With the parameter, the parent levels will be empty if the depth of the parent is
to small. (ie : a workcenter with 1 parent and 1 great parent will have parent level 1 and 2 set, but parent level 3 will be empty)
../static/src/img/img2.png
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/manufacture/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 <https://github.com/OCA/manufacture/issues/new?body=module:%20mrp_workcenter_hierarchical%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Akretion
Contributors
~~~~~~~~~~~~
Akretion:
* David BEAL <david.beal@akretion.com>
* Sébastien BEAU <sebastien.beau@akretion.com>
* Thibault REY <thibault.rey@akretion.com>
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-florian-dacosta| image:: https://github.com/florian-dacosta.png?size=40px
:target: https://github.com/florian-dacosta
:alt: florian-dacosta
Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-florian-dacosta|
This module is part of the `OCA/manufacture <https://github.com/OCA/manufacture/tree/16.0/mrp_workcenter_hierarchical>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,2 @@
from . import models
from . import wizards

View file

@ -0,0 +1,27 @@
# 2016 Akretion (http://www.akretion.com)
# David BEAL <david.beal@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "MRP Workcenter Hierarchical",
"version": "16.0.1.0.0",
"author": "Akretion,Odoo Community Association (OCA)",
"summary": "Organise Workcenters by section",
"category": "Manufacturing",
"maintainers": ["florian-dacosta"],
"depends": [
"mrp",
],
"website": "https://github.com/OCA/manufacture",
"data": [
"security/ir.model.access.csv",
"views/workcenter_view.xml",
"wizards/switch_workcenter.xml",
"wizards/res_config_settings_views.xml",
],
"demo": [
"data/mrp_demo.xml",
],
"license": "AGPL-3",
"installable": True,
}

View file

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="workc_12345" model="mrp.workcenter">
<field name="name">12345</field>
</record>
<record id="workc_1234" model="mrp.workcenter">
<field name="name">1234</field>
<field name="parent_id" ref="workc_12345" />
</record>
<record id="workc_123" model="mrp.workcenter">
<field name="name">123</field>
<field name="parent_id" ref="workc_1234" />
</record>
<record id="workc_12" model="mrp.workcenter">
<field name="name">12</field>
<field name="parent_id" ref="workc_123" />
</record>
<record id="workc_1" model="mrp.workcenter">
<field name="name">1</field>
<field name="parent_id" ref="workc_12" />
</record>
<record id="mrp_workcenter_tree_view_demo" model="ir.ui.view">
<!-- This view is only pedagocical purpose on demo -->
<field name="model">mrp.workcenter</field>
<field name="inherit_id" ref="mrp.mrp_workcenter_tree_view" />
<field name="arch" type="xml">
<field name="parent_id" position="after">
<field name="parent_level_1_id" />
<field name="parent_level_2_id" />
<field name="parent_level_3_id" />
</field>
</field>
</record>
</odoo>

View file

@ -0,0 +1,176 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mrp_workcenter_hierarchical
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.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: mrp_workcenter_hierarchical
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_wiz_switch_workcenter_form
msgid "Apply"
msgstr "Primijeni"
#. module: mrp_workcenter_hierarchical
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_wiz_switch_workcenter_form
msgid "Cancel"
msgstr "Otkaži"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__child_ids
msgid "Children"
msgstr "Podređeni"
#. module: mrp_workcenter_hierarchical
#: model:ir.model,name:mrp_workcenter_hierarchical.model_res_company
msgid "Companies"
msgstr "Kompanije"
#. module: mrp_workcenter_hierarchical
#: model:ir.model,name:mrp_workcenter_hierarchical.model_res_config_settings
msgid "Config Settings"
msgstr "Postavke"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter__create_uid
msgid "Created by"
msgstr "Kreirao"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter__create_date
msgid "Created on"
msgstr "Kreirano"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter__display_name
msgid "Display Name"
msgstr "Prikazani naziv"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter__id
msgid "ID"
msgstr "ID"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter____last_update
msgid "Last Modified on"
msgstr "Zadnje mijenjano"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter__write_uid
msgid "Last Updated by"
msgstr "Zadnji ažurirao"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter__write_date
msgid "Last Updated on"
msgstr "Zadnje ažurirano"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_id
msgid "Parent"
msgstr "Nasljeđeni"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_level_1_id
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_mrp_workcenter_search
msgid "Parent Level 1"
msgstr "Roditeljski nivo 1"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_level_2_id
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_mrp_workcenter_search
msgid "Parent Level 2"
msgstr "Roditeljski nivo 2"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_level_3_id
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_mrp_workcenter_search
msgid "Parent Level 3"
msgstr "Roditeljski nivo 3"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_path
msgid "Parent Path"
msgstr "Putanja nadređenih"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter__parent_workcenter_id
msgid "Parent Workcenter"
msgstr "Roditeljski radni centar"
#. module: mrp_workcenter_hierarchical
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_wiz_switch_workcenter_form
msgid "Replace selected workcenters by another one."
msgstr "Zamijenite odabrane radne centre drugim"
#. module: mrp_workcenter_hierarchical
#: model:ir.actions.act_window,name:mrp_workcenter_hierarchical.action_switch_workcenter
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_wiz_switch_workcenter_form
msgid "Switch Workcenter"
msgstr "Prebaci radni centar"
#. module: mrp_workcenter_hierarchical
#: model:ir.model,name:mrp_workcenter_hierarchical.model_switch_workcenter
msgid "Switch Workcenter onf workorders"
msgstr "Prebaci radni centar na radnim nalozima"
#. module: mrp_workcenter_hierarchical
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.res_config_settings_view_form
msgid ""
"The parent level on workcenters will be empty if case of there are no parent/great parent or more.\n"
" On the contrary, by default, the parent level are always set, allowing a view by workorder grouped by top parent workcenter"
msgstr ""
#. module: mrp_workcenter_hierarchical
#. odoo-python
#: code:addons/mrp_workcenter_hierarchical/wizards/switch_workcenter.py:0
#, python-format
msgid ""
"The present workcenter of the workorders does not belong to any group of "
"workcenter. It can't be switched"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model,name:mrp_workcenter_hierarchical.model_mrp_workcenter
msgid "Work Center"
msgstr "Radni centar"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter__workcenter_id
msgid "Workcenter"
msgstr "Radni Centar"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_res_company__workcenter_parent_level_empty
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_res_config_settings__workcenter_parent_level_empty
msgid "Workcenter Parent Level Empty"
msgstr "Roditeljski nivo radnog centra prazan"
#. module: mrp_workcenter_hierarchical
#. odoo-python
#: code:addons/mrp_workcenter_hierarchical/wizards/switch_workcenter.py:0
#, python-format
msgid "You can not change the workcenter of an in progress or done operation"
msgstr "Ne možete promijeniti radni centar operacije koja je u toku ili završena"
#. module: mrp_workcenter_hierarchical
#. odoo-python
#: code:addons/mrp_workcenter_hierarchical/wizards/switch_workcenter.py:0
#, python-format
msgid ""
"You can only change the workcenter of workorders belonging to the same "
"workcenter"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_wiz_switch_workcenter_form
msgid "or"
msgstr "ili"

View file

@ -0,0 +1,70 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mrp_workcenter_hierarchical
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-12-23 00:01+0000\n"
"Last-Translator: Ivorra78 <informatica@totmaterial.es>\n"
"Language-Team: none\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: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__child_ids
msgid "Children"
msgstr "Niños"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__display_name
msgid "Display Name"
msgstr "Mostrar Nombre"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__id
msgid "ID"
msgstr "ID (identificación)"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter____last_update
msgid "Last Modified on"
msgstr "Última Modificación el"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_id
msgid "Parent"
msgstr "Parental"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_level_1_id
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_mrp_workcenter_search
msgid "Parent Level 1"
msgstr "Padres Nivel 1"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_level_2_id
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_mrp_workcenter_search
msgid "Parent Level 2"
msgstr "Padres Nivel 2"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_level_3_id
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_mrp_workcenter_search
msgid "Parent Level 3"
msgstr "Padres Nivel 3"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_path
msgid "Parent Path"
msgstr "Ruta Parental"
#. module: mrp_workcenter_hierarchical
#: model:ir.model,name:mrp_workcenter_hierarchical.model_mrp_workcenter
msgid "Work Center"
msgstr "Centro de trabajo"

View file

@ -0,0 +1,70 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mrp_workcenter_hierarchical
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2022-12-20 13:44+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: none\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.14.1\n"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__child_ids
msgid "Children"
msgstr "Figli"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__id
msgid "ID"
msgstr "ID"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_id
msgid "Parent"
msgstr "Padre"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_level_1_id
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_mrp_workcenter_search
msgid "Parent Level 1"
msgstr "Padre livello 1"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_level_2_id
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_mrp_workcenter_search
msgid "Parent Level 2"
msgstr "Padre livello 2"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_level_3_id
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_mrp_workcenter_search
msgid "Parent Level 3"
msgstr "Padre livello 3"
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_path
msgid "Parent Path"
msgstr "Percorso padre"
#. module: mrp_workcenter_hierarchical
#: model:ir.model,name:mrp_workcenter_hierarchical.model_mrp_workcenter
msgid "Work Center"
msgstr "Centro di lavoro"

View file

@ -0,0 +1,176 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mrp_workcenter_hierarchical
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.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: mrp_workcenter_hierarchical
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_wiz_switch_workcenter_form
msgid "Apply"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_wiz_switch_workcenter_form
msgid "Cancel"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__child_ids
msgid "Children"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model,name:mrp_workcenter_hierarchical.model_res_company
msgid "Companies"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model,name:mrp_workcenter_hierarchical.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter__create_uid
msgid "Created by"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter__create_date
msgid "Created on"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter__display_name
msgid "Display Name"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter__id
msgid "ID"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter____last_update
msgid "Last Modified on"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter__write_uid
msgid "Last Updated by"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter__write_date
msgid "Last Updated on"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_id
msgid "Parent"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_level_1_id
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_mrp_workcenter_search
msgid "Parent Level 1"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_level_2_id
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_mrp_workcenter_search
msgid "Parent Level 2"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_level_3_id
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_mrp_workcenter_search
msgid "Parent Level 3"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__parent_path
msgid "Parent Path"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter__parent_workcenter_id
msgid "Parent Workcenter"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_wiz_switch_workcenter_form
msgid "Replace selected workcenters by another one."
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.actions.act_window,name:mrp_workcenter_hierarchical.action_switch_workcenter
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_wiz_switch_workcenter_form
msgid "Switch Workcenter"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model,name:mrp_workcenter_hierarchical.model_switch_workcenter
msgid "Switch Workcenter onf workorders"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.res_config_settings_view_form
msgid ""
"The parent level on workcenters will be empty if case of there are no parent/great parent or more.\n"
" On the contrary, by default, the parent level are always set, allowing a view by workorder grouped by top parent workcenter"
msgstr ""
#. module: mrp_workcenter_hierarchical
#. odoo-python
#: code:addons/mrp_workcenter_hierarchical/wizards/switch_workcenter.py:0
#, python-format
msgid ""
"The present workcenter of the workorders does not belong to any group of "
"workcenter. It can't be switched"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model,name:mrp_workcenter_hierarchical.model_mrp_workcenter
msgid "Work Center"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_switch_workcenter__workcenter_id
msgid "Workcenter"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_res_company__workcenter_parent_level_empty
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_res_config_settings__workcenter_parent_level_empty
msgid "Workcenter Parent Level Empty"
msgstr ""
#. module: mrp_workcenter_hierarchical
#. odoo-python
#: code:addons/mrp_workcenter_hierarchical/wizards/switch_workcenter.py:0
#, python-format
msgid "You can not change the workcenter of an in progress or done operation"
msgstr ""
#. module: mrp_workcenter_hierarchical
#. odoo-python
#: code:addons/mrp_workcenter_hierarchical/wizards/switch_workcenter.py:0
#, python-format
msgid ""
"You can only change the workcenter of workorders belonging to the same "
"workcenter"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model_terms:ir.ui.view,arch_db:mrp_workcenter_hierarchical.view_wiz_switch_workcenter_form
msgid "or"
msgstr ""

View file

@ -0,0 +1,2 @@
from . import mrp_workcenter
from . import res_company

View file

@ -0,0 +1,80 @@
# 2016 Akretion (http://www.akretion.com)
# David BEAL <david.beal@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class MrpWorkcenter(models.Model):
_inherit = "mrp.workcenter"
_parent_name = "parent_id"
_parent_store = True
parent_id = fields.Many2one(
comodel_name="mrp.workcenter", string="Parent", index=True
)
parent_path = fields.Char(index=True, unaccent=False)
child_ids = fields.One2many(
comodel_name="mrp.workcenter", inverse_name="parent_id", string="Children"
)
parent_level_1_id = fields.Many2one(
comodel_name="mrp.workcenter",
compute="_compute_parent_level",
string="Parent Level 1",
store=True,
)
parent_level_2_id = fields.Many2one(
comodel_name="mrp.workcenter",
compute="_compute_parent_level",
string="Parent Level 2",
store=True,
)
parent_level_3_id = fields.Many2one(
comodel_name="mrp.workcenter",
compute="_compute_parent_level",
string="Parent Level 3",
store=True,
)
def _get_parent_ids(self):
self.ensure_one()
if self.parent_id:
ids = self.parent_id._get_parent_ids()
ids.append(self.parent_id.id)
else:
ids = []
return ids
@api.depends(
"parent_id.parent_id.parent_id",
"child_ids",
"company_id.workcenter_parent_level_empty",
)
def _compute_parent_level(self):
def get_next_level(parent_ids, workcenter, exclude_ids):
has_parent = bool(parent_ids)
parent_level_id = (
parent_ids
and parent_ids.pop(0)
or (workcenter.child_ids and workcenter.id or workcenter.parent_id.id)
)
if exclude_ids and not has_parent:
exclude_ids.append(workcenter.parent_id.id)
return parent_level_id not in exclude_ids and parent_level_id or False
for workcenter in self:
parent_ids = workcenter._get_parent_ids()
if workcenter.company_id.workcenter_parent_level_empty:
exclude_ids = [workcenter.id]
else:
exclude_ids = []
workcenter.parent_level_1_id = get_next_level(
parent_ids, workcenter, exclude_ids
)
workcenter.parent_level_2_id = get_next_level(
parent_ids, workcenter, exclude_ids
)
workcenter.parent_level_3_id = get_next_level(
parent_ids, workcenter, exclude_ids
)

View file

@ -0,0 +1,9 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class ResCompany(models.Model):
_inherit = "res.company"
workcenter_parent_level_empty = fields.Boolean()

View file

@ -0,0 +1,3 @@
Activate workcenters:
* Manufacturing > Configuration > Settings > Configuration
* Check Work Orders and save

View file

@ -0,0 +1,5 @@
Akretion:
* David BEAL <david.beal@akretion.com>
* Sébastien BEAU <sebastien.beau@akretion.com>
* Thibault REY <thibault.rey@akretion.com>

View file

@ -0,0 +1 @@
Allow to define a parent workcenter to a workcenter

View file

@ -0,0 +1,17 @@
* Go to Manufacturing > Configuration > Work Centers
* Set parent field on workcenters
* Go to Manufacturing > Configuration > Settings
* Set the parent level empty configuration if needed.
Without setting this parameter, the parent levels are always set, never mind the depth
of the parent workcenters. The last parent level will contain the last parent and
the top parent workcenter, will appear it self in its parent level.
The idea is to be able to see group of workcenters :
../static/src/img/img1.png
With the parameter, the parent levels will be empty if the depth of the parent is
to small. (ie : a workcenter with 1 parent and 1 great parent will have parent level 1 and 2 set, but parent level 3 will be empty)
../static/src/img/img2.png

View file

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_switch_workcenter,access_switch_workcenter,model_switch_workcenter,mrp.group_mrp_manager,1,1,1,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_switch_workcenter access_switch_workcenter model_switch_workcenter mrp.group_mrp_manager 1 1 1 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,460 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>MRP Workcenter Hierarchical</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="mrp-workcenter-hierarchical">
<h1 class="title">MRP Workcenter Hierarchical</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:22cb1398c6641db8541bb53d56ebaec41fea1e8fe3efc39e9786cb19e6e4be01
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/manufacture/tree/16.0/mrp_workcenter_hierarchical"><img alt="OCA/manufacture" src="https://img.shields.io/badge/github-OCA%2Fmanufacture-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/manufacture-16-0/manufacture-16-0-mrp_workcenter_hierarchical"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/manufacture&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>Allow to define a parent workcenter to a workcenter</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
<dl class="docutils">
<dt>Activate workcenters:</dt>
<dd><ul class="first last simple">
<li>Manufacturing &gt; Configuration &gt; Settings &gt; Configuration</li>
<li>Check Work Orders and save</li>
</ul>
</dd>
</dl>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
<blockquote>
<ul class="simple">
<li>Go to Manufacturing &gt; Configuration &gt; Work Centers</li>
<li>Set parent field on workcenters</li>
<li>Go to Manufacturing &gt; Configuration &gt; Settings</li>
<li>Set the parent level empty configuration if needed.</li>
</ul>
<p>Without setting this parameter, the parent levels are always set, never mind the depth
of the parent workcenters. The last parent level will contain the last parent and
the top parent workcenter, will appear it self in its parent level.
The idea is to be able to see group of workcenters :</p>
<blockquote>
../static/src/img/img1.png</blockquote>
<p>With the parameter, the parent levels will be empty if the depth of the parent is
to small. (ie : a workcenter with 1 parent and 1 great parent will have parent level 1 and 2 set, but parent level 3 will be empty)</p>
<blockquote>
../static/src/img/img2.png</blockquote>
</blockquote>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/manufacture/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/manufacture/issues/new?body=module:%20mrp_workcenter_hierarchical%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-4">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-5">Authors</a></h2>
<ul class="simple">
<li>Akretion</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
<p>Akretion:</p>
<ul class="simple">
<li>David BEAL &lt;<a class="reference external" href="mailto:david.beal&#64;akretion.com">david.beal&#64;akretion.com</a>&gt;</li>
<li>Sébastien BEAU &lt;<a class="reference external" href="mailto:sebastien.beau&#64;akretion.com">sebastien.beau&#64;akretion.com</a>&gt;</li>
<li>Thibault REY &lt;<a class="reference external" href="mailto:thibault.rey&#64;akretion.com">thibault.rey&#64;akretion.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>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.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
<p><a class="reference external image-reference" href="https://github.com/florian-dacosta"><img alt="florian-dacosta" src="https://github.com/florian-dacosta.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/manufacture/tree/16.0/mrp_workcenter_hierarchical">OCA/manufacture</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

View file

@ -0,0 +1,5 @@
# © 2016 Akretion (http://www.akretion.com)
# David BEAL <david.beal@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import test_compute_level

View file

@ -0,0 +1,83 @@
# © 2016 Akretion (http://www.akretion.com)
# David BEAL <david.beal@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import exceptions
from odoo.tests.common import TransactionCase
class ComputeParentLevel(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.workc_12 = cls.env.ref("mrp_workcenter_hierarchical.workc_12")
cls.workc_123 = cls.env.ref("mrp_workcenter_hierarchical.workc_123")
cls.workc_1234 = cls.env.ref("mrp_workcenter_hierarchical.workc_1234")
cls.workc_12345 = cls.env.ref("mrp_workcenter_hierarchical.workc_12345")
def test_compute_low_level_workcenter(self):
workcenter = self.env["mrp.workcenter"].create({"name": "any"})
workcenter.write({"parent_id": self.workc_12.id})
assert workcenter.parent_level_3_id == self.workc_123
assert workcenter.parent_level_2_id == self.workc_1234
assert workcenter.parent_level_1_id == self.workc_12345
def test_compute_hight_level_workcenter(self):
# test high level has parent_level fields set
self.assertEqual(self.workc_12345.parent_level_1_id, self.workc_12345)
self.assertEqual(self.workc_12345.parent_level_2_id, self.workc_12345)
self.assertEqual(self.workc_12345.parent_level_3_id, self.workc_12345)
self.assertEqual(self.workc_1234.parent_level_1_id, self.workc_12345)
self.assertEqual(self.workc_1234.parent_level_2_id, self.workc_1234)
self.assertEqual(self.workc_1234.parent_level_3_id, self.workc_1234)
self.workc_12345.company_id.workcenter_parent_level_empty = True
# test parent level of high parent is left empty if setting is set on company
# level
self.assertFalse(self.workc_12345.parent_level_1_id)
self.assertFalse(self.workc_12345.parent_level_2_id)
self.assertFalse(self.workc_12345.parent_level_2_id)
self.assertEqual(self.workc_1234.parent_level_1_id, self.workc_12345)
self.assertFalse(self.workc_1234.parent_level_2_id)
self.assertFalse(self.workc_1234.parent_level_3_id)
self.assertEqual(self.workc_123.parent_level_1_id, self.workc_12345)
self.assertEqual(self.workc_123.parent_level_2_id, self.workc_1234)
self.assertFalse(self.workc_123.parent_level_3_id)
def test_switch_workcenter(self):
# take a MO with an operation
self.env["mrp.routing.workcenter"].with_context(active_test=False).search(
[]
).active = True
mo = self.env["mrp.production"].create(
{
"product_id": self.env.ref("mrp.product_product_computer_desk_head").id,
}
)
mo.action_confirm()
mo2 = mo.copy()
mo2.action_confirm()
wos = mo.workorder_ids + mo2.workorder_ids
ctx = {"active_model": "mrp.workorder", "active_ids": wos.ids}
# the default wworkcenter does not belong to any group
with self.assertRaises(exceptions.UserError):
self.env["switch.workcenter"].with_context(**ctx).create({})
# set workcenter with group
wos.write({"workcenter_id": self.workc_12345.id})
wizard = (
self.env["switch.workcenter"]
.with_context(**ctx)
.create({"workcenter_id": self.workc_123.id})
)
# used in view
self.assertEqual(
self.workc_12345.parent_level_1_id, wizard.parent_workcenter_id
)
wizard.switch_workcenter()
self.assertEqual(wos.workcenter_id.id, self.workc_123.id)

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="view_mrp_workcenter_search" model="ir.ui.view">
<field name="model">mrp.workcenter</field>
<field name="inherit_id" ref="mrp.view_mrp_workcenter_search" />
<field name="arch" type="xml">
<xpath expr="//group/filter" position="before">
<filter
string="Parent Level 1"
domain="[]"
name="group_by_level_1"
context="{'group_by':'parent_level_1_id'}"
/>
<filter
string="Parent Level 2"
domain="[]"
name="group_by_level_2"
context="{'group_by':'parent_level_2_id'}"
/>
<filter
string="Parent Level 3"
domain="[]"
name="group_by_level_3"
context="{'group_by':'parent_level_3_id'}"
/>
</xpath>
</field>
</record>
<record id="mrp_workcenter_view" model="ir.ui.view">
<field name="model">mrp.workcenter</field>
<field name="inherit_id" ref="mrp.mrp_workcenter_view" />
<field name="arch" type="xml">
<field name="name" position="after">
<field name="parent_id" />
</field>
</field>
</record>
<record id="mrp_workcenter_tree_view" model="ir.ui.view">
<field name="model">mrp.workcenter</field>
<field name="inherit_id" ref="mrp.mrp_workcenter_tree_view" />
<field name="arch" type="xml">
<field name="company_id" position="before">
<field name="parent_id" />
</field>
</field>
</record>
<record id="mrp.mrp_workcenter_action" model="ir.actions.act_window">
<field name="context">{'search_default_group_by_level_1': 1}</field>
</record>
</odoo>

View file

@ -0,0 +1,2 @@
from . import switch_workcenter
from . import res_config_settings

View file

@ -0,0 +1,11 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"
workcenter_parent_level_empty = fields.Boolean(
related="company_id.workcenter_parent_level_empty", store=True, readonly=False
)

View file

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="mrp.res_config_settings_view_form" />
<field name="arch" type="xml">
<xpath
expr="//div[@id='workorder_settings_dependencies']"
position="after"
>
<div
id="workcenter_hierarchy"
class="row mt-2"
attrs="{'invisible': [('group_mrp_routings','=',False)]}"
>
<field
name="workcenter_parent_level_empty"
class="col flex-grow-0 ml16 mr0 pe-2"
/>
<div class="col ps-0">
<label for="workcenter_parent_level_empty" />
<div class="text-muted">
The parent level on workcenters will be empty if case of there are no parent/great parent or more.
On the contrary, by default, the parent level are always set, allowing a view by workorder grouped by top parent workcenter
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,51 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import _, fields, models
from odoo.exceptions import UserError
class SwitchWorkcenter(models.TransientModel):
_name = "switch.workcenter"
_description = "Switch Workcenter onf workorders"
workcenter_id = fields.Many2one("mrp.workcenter", "Workcenter", required=True)
parent_workcenter_id = fields.Many2one(
"mrp.workcenter", "Parent Workcenter", required=True
)
def default_get(self, fields_list):
res = super().default_get(fields_list)
wos = self.env["mrp.workorder"].browse(self.env.context.get("active_ids", []))
if any([wo.state in ("done", "cancel") for wo in wos]):
raise UserError(
_(
"You can not change the workcenter of an in progress or done "
"operation"
)
)
workcenter = wos.workcenter_id
if len(workcenter) != 1:
raise UserError(
_(
"You can only change the workcenter of workorders belonging to the "
"same workcenter"
)
)
parent_level_1_id = workcenter.parent_level_1_id.id
if not parent_level_1_id:
raise UserError(
_(
"The present workcenter of the workorders does not belong to any "
"group of workcenter. It can't be switched"
)
)
res["parent_workcenter_id"] = workcenter.parent_level_1_id.id
return res
def switch_workcenter(self):
self.ensure_one()
active_ids = self.env.context.get("active_ids", [])
vals = {"workcenter_id": self.workcenter_id.id}
lines = self.env["mrp.workorder"].browse(active_ids)
lines.write(vals)
return True

View file

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="view_wiz_switch_workcenter_form" model="ir.ui.view">
<field name="model">switch.workcenter</field>
<field name="arch" type="xml">
<form string="Switch Workcenter">
<group col="4">
<p colspan="4">
Replace selected workcenters by another one.
</p>
<field name="parent_workcenter_id" invisible="1" />
<field
name="workcenter_id"
domain="[('parent_level_1_id', '=', parent_workcenter_id)]"
/>
</group>
<footer>
<button
name="switch_workcenter"
string="Apply"
type="object"
class="oe_highlight"
/>
or
<button special="cancel" string="Cancel" class="oe_link" />
</footer>
</form>
</field>
</record>
<record id="action_switch_workcenter" model="ir.actions.act_window">
<field name="name">Switch Workcenter</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">switch.workcenter</field>
<field name="view_mode">form</field>
<field name="binding_view_types">form,list</field>
<field name="binding_model_id" ref="mrp.model_mrp_workorder" />
<field name="view_id" ref="view_wiz_switch_workcenter_form" />
<field name="target">new</field>
</record>
</odoo>

View file

@ -0,0 +1,42 @@
[project]
name = "odoo-bringout-oca-manufacture-mrp_workcenter_hierarchical"
version = "16.0.0"
description = "MRP Workcenter Hierarchical - Organise Workcenters by section"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-mrp>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["mrp_workcenter_hierarchical"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]