Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions document_page_procedure/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
6 changes: 6 additions & 0 deletions document_page_procedure/data/document_page_procedure.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,10 @@
]]>
</field>
</record>
<record id="document_procedure" model="mgmtsystem.document">
<field name="name">Procedure</field>
<field name="kind">procedure</field>
<field name="document_type">document</field>
<field name="document_page_id" ref="document_page_group_procedure" />
</record>
</odoo>
6 changes: 6 additions & 0 deletions document_page_procedure/demo/document_page_procedure.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,10 @@
]]>
</field>
</record>
<record id="demo_document_procedure" model="mgmtsystem.document">
<field name="name">Procedure</field>
<field name="kind">procedure</field>
<field name="document_type">document</field>
<field name="document_page_id" ref="document_page_procedure" />
</record>
</odoo>
2 changes: 2 additions & 0 deletions document_page_procedure/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import mgmtsystem_document
from . import document_page
58 changes: 58 additions & 0 deletions document_page_procedure/models/document_page.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# Copyright 2025 Dixmit
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import api, fields, models


class DocumentPage(models.Model):
_inherit = "document.page"

mgmtsystem_document_procedure_ids = fields.One2many(
"mgmtsystem.document",
"document_page_id",
domain=[("kind", "=", "procedure")],
)

def toggle_active(self):
to_activate = self.filtered(lambda p: not p.active)
to_deactivate = self.filtered(lambda p: p.active)
for pages, expected in [(to_activate, False), (to_deactivate, True)]:
if pages:
self.env["mgmtsystem.document"].search(
[
("kind", "=", "procedure"),
("document_page_id", "in", pages.ids),
("active", "=", expected),
]
).toggle_active()
return super().toggle_active()

def toggle_procedure(self):
self.ensure_one()
if not self.active:
# If the page is archived, we do nothing.
return
document = (
self.env["mgmtsystem.document"]
.with_context(active_test=False)
.search([("kind", "=", "procedure"), ("document_page_id", "in", self.ids)])
)
if document:
document.toggle_active()
else:
self.env["mgmtsystem.document"].create(
{
"name": self.name,
"kind": "procedure",
"document_type": "document",
"document_page_id": self.id,
}
)

@api.model_create_multi
def create(self, mvals):
result = super().create(mvals)
if self.env.context.get("_mgmtsystem_procedure_generate"):
for record in result:
record.toggle_procedure()
return result
45 changes: 45 additions & 0 deletions document_page_procedure/models/mgmtsystem_document.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Copyright 2025 Dixmit
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import api, fields, models


class MgmtsystemDocument(models.Model):
_inherit = "mgmtsystem.document"

kind = fields.Selection(
selection_add=[("procedure", "Procedure")],
ondelete={"procedure": "set null"},
)
document_page_id = fields.Many2one(
"document.page",
)

def _get_document_page_vals(self):
result = super()._get_document_page_vals()
if self.kind == "procedure":
parent = self.env.ref(
"document_page_procedure.document_page_group_procedure",
raise_if_not_found=False,
)
result.update({"parent_id": parent and parent.id})
return result

@api.depends("document_page_id.name")
def _compute_name(self):
return super()._compute_name()

def _get_document_context(self):
result = super()._get_document_context()
if self.kind == "procedure":
parent = self.env.ref(
"document_page_procedure.document_page_group_procedure",
raise_if_not_found=False,
)
result.update(
{
"_mgmtsystem_procedure_generate": True,
"default_parent_id": parent and parent.id,
}
)
return result
4 changes: 4 additions & 0 deletions document_page_procedure/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Copyright 2012 Savoir-faire Linux <http://www.savoirfairelinux.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from . import test_document_page
64 changes: 64 additions & 0 deletions document_page_procedure/tests/test_document_page.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# Copyright 2025 Dixmit
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo.tests import Form, common, tagged


@tagged("post_install", "-at_install")
class TestDocumentPage(common.TransactionCase):
def setUp(self):
super().setUp()
if (
"mgmtsystem.document" not in self.env
or "document_page_id" not in self.env["mgmtsystem.document"]._fields
):
self.skipTest("mgmtsystem module is not installed")

def test_types(self):
types = self.env["mgmtsystem.document"].get_document_types()
self.assertIn("document", [t["id"] for t in types])

def test_create_document(self):
action = self.env["mgmtsystem.document"].add_element("document")
with Form(
self.env[action["res_model"]].with_context(**action["context"])
) as doc_form:
doc_form.name = "SampleSystem"
doc_form.kind = "procedure"
doc = doc_form.save()
action = doc.action_create()
rec = self.env[action["res_model"]].browse(action["res_id"])
self.assertEqual(rec, doc.document_page_id)
self.assertEqual(rec.name, "SampleSystem")
rec.name = "ModifiedName"
self.assertEqual(doc.name, "ModifiedName")
self.assertEqual(
rec.parent_id,
self.env.ref(
"document_page_procedure.document_page_group_procedure",
),
)
rec.toggle_active()
self.assertFalse(doc.active)
rec.toggle_active()
self.assertTrue(doc.active)

def test_procedure_from_doc(self):
doc = self.env["document.page"].create(
{
"name": "ProcedureDoc",
"content": "<p>Content</p>",
}
)
self.assertFalse(doc.mgmtsystem_document_procedure_ids)
doc.toggle_procedure()
self.assertEqual(len(doc.mgmtsystem_document_procedure_ids), 1)
mgmtsystem_doc = doc.mgmtsystem_document_procedure_ids
doc.toggle_procedure()
doc.invalidate_recordset()
self.assertFalse(mgmtsystem_doc.active)
self.assertFalse(doc.mgmtsystem_document_procedure_ids)
doc.toggle_procedure()
doc.invalidate_recordset()
self.assertTrue(mgmtsystem_doc.active)
self.assertEqual(doc.mgmtsystem_document_procedure_ids, mgmtsystem_doc)
49 changes: 27 additions & 22 deletions document_page_procedure/views/document_page_procedure.xml
Original file line number Diff line number Diff line change
@@ -1,32 +1,37 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record model="ir.ui.view" id="view_wiki_form">
<field name="name">mgmtsystem.document.tree.procedures</field>
<field name="model">document.page</field>
<field name="inherit_id" ref="document_page.view_wiki_form" />
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside">
<button
type="object"
name="toggle_procedure"
string="Add Procedure"
groups="mgmtsystem.group_mgmtsystem_manager"
invisible="not active or mgmtsystem_document_procedure_ids"
/>
<button
type="object"
name="toggle_procedure"
string="Remove Procedure"
groups="mgmtsystem.group_mgmtsystem_manager"
invisible="not active or not mgmtsystem_document_procedure_ids"
/>
</xpath>
</field>
</record>
<record model="ir.actions.act_window" id="action_procedures">
<field name="name">Procedures</field>
<field name="res_model">document.page</field>
<field name="res_model">mgmtsystem.document</field>
<field name="view_mode">list,form</field>
<field name="help">Procedures of your management system.</field>
<field
name="domain"
eval="[('parent_id','=',ref('document_page_group_procedure'))]"
/>
<field
name="context"
eval="{'default_parent_id': ref('document_page_group_procedure')}"
/>
</record>
<record id="action_procedures_tree" model="ir.actions.act_window.view">
<field name="sequence" eval="0" />
<field name="view_mode">list</field>
<field name="view_id" ref="document_page.view_wiki_tree" />
<field name="act_window_id" ref="action_procedures" />
</record>
<record id="action_procedures_form" model="ir.actions.act_window.view">
<field name="sequence" eval="5" />
<field name="view_mode">form</field>
<field name="view_id" ref="document_page.view_wiki_form" />
<field name="act_window_id" ref="action_procedures" />
<field name="domain" eval="[('kind','=','procedure')]" />
<field name="context">{'default_kind': 'procedure'}</field>
<field name="path">mgmtsystem-procedures</field>
</record>

<menuitem
id="menu_mgmtsystem_manuals_procedures"
name="Procedures"
Expand Down
9 changes: 4 additions & 5 deletions mgmtsystem/README.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association

=================
Management System
=================
Expand All @@ -17,7 +13,7 @@ Management System
.. |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/license-AGPL--3-blue.png
.. |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%2Fmanagement--system-lightgray.png?logo=github
Expand Down Expand Up @@ -103,6 +99,9 @@ Contributors
- Dung Tran <dungtd@trobz.com>

- Yvan Dotet <yvan.dotet@logicasoft.eu>
- `Dixmit <https://www.dixmit.com>`__

- Enric Tobella

Other credits
-------------
Expand Down
9 changes: 8 additions & 1 deletion mgmtsystem/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,20 @@
"website": "https://github.com/OCA/management-system",
"license": "AGPL-3",
"category": "Management System",
"depends": ["base"],
"depends": ["web"],
"data": [
"security/mgmtsystem_security.xml",
"security/ir.model.access.csv",
"views/menus.xml",
"views/mgmtsystem_document.xml",
"views/mgmtsystem_system.xml",
"views/res_config.xml",
],
"application": True,
"assets": {
"web.assets_backend": [
"mgmtsystem/static/src/**/*.esm.js",
"mgmtsystem/static/src/**/*.xml",
],
},
}
1 change: 1 addition & 0 deletions mgmtsystem/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
from . import mgmtsystem_system
from . import res_config
from . import mgmtsystem_document
Loading