Merge PR #1263 into 16.0

Signed-off-by bguillot
This commit is contained in:
OCA-git-bot
2024-05-29 12:57:58 +00:00
30 changed files with 1257 additions and 0 deletions

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,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,67 @@
# 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"
"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:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__child_ids
msgid "Children"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__display_name
msgid "Display Name"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter__id
msgid "ID"
msgstr ""
#. module: mrp_workcenter_hierarchical
#: model:ir.model.fields,field_description:mrp_workcenter_hierarchical.field_mrp_workcenter____last_update
msgid "Last Modified 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,name:mrp_workcenter_hierarchical.model_mrp_workcenter
msgid "Work Center"
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 @@
../../../../mrp_workcenter_hierarchical

View File

@@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)