Initial commit: Odoo 18.0-20251222 extra-addons
Some checks failed
pre-commit / pre-commit (push) Has been cancelled
tests / Detect unreleased dependencies (push) Has been cancelled
tests / test with OCB (push) Has been cancelled
tests / test with Odoo (push) Has been cancelled

This commit is contained in:
tocmo0nlord
2026-03-13 20:43:25 +00:00
parent 36e847a7df
commit adbe430761
9472 changed files with 1265727 additions and 0 deletions

View File

@@ -0,0 +1,86 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association
=========================
Maintenance Plan Activity
=========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:c3646940de02504c979a98766caf2474a45b20d33863f5b5652d8c82433712fe
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmaintenance-lightgray.png?logo=github
:target: https://github.com/OCA/maintenance/tree/18.0/maintenance_plan_activity
:alt: OCA/maintenance
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/maintenance-18-0/maintenance-18-0-maintenance_plan_activity
: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/maintenance&target_branch=18.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module allows defining in the maintenance plan activities that will
be created once the maintenance requests are created as a consequence of
the plan itself.
|Maintenance Planned Activities|
.. |Maintenance Planned Activities| image:: https://raw.githubusercontent.com/maintenance_plan_activity/static/description/maintenance_plan_activity.png
**Table of contents**
.. contents::
:local:
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/maintenance/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/maintenance/issues/new?body=module:%20maintenance_plan_activity%0Aversion:%2018.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
-------
* ForgeFlow
Contributors
------------
- Adria Gil Sorribes <adria.gil@forgeflow.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.
This module is part of the `OCA/maintenance <https://github.com/OCA/maintenance/tree/18.0/maintenance_plan_activity>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

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

View File

@@ -0,0 +1,20 @@
# Copyright 2019-20 ForgeFlow S.L. (https://www.forgeflow.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Maintenance Plan Activity",
"summary": """
This module allows defining in the maintenance plan activities that
will be created once the maintenance requests are created as a
consequence of the plan itself.""",
"version": "18.0.1.0.0",
"license": "AGPL-3",
"author": "ForgeFlow, Odoo Community Association (OCA)",
"maintainers": [],
"website": "https://github.com/OCA/maintenance",
"depends": ["maintenance_plan"],
"data": [
"security/ir.model.access.csv",
"views/maintenance_views.xml",
],
}

View File

@@ -0,0 +1,111 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * maintenance_plan_activity
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-07-14 15:48+0000\n"
"Last-Translator: Enric Tobella <etobella@creublanca.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.3.2\n"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__date_before_request
msgid "# Days before request"
msgstr "# Días antes de la petición"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__activity_type_id
msgid "Activity Type"
msgstr "Tipo de actividad"
#. module: maintenance_plan_activity
#: code:addons/maintenance_plan_activity/models/maintenance.py:0
#, python-format
msgid "Activity automatically generated from maintenance plan"
msgstr "Actividad generada automáticamente desde un plan de mantenimiento"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__create_date
msgid "Created on"
msgstr "Creado en"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__display_name
msgid "Display Name"
msgstr "Nombre a mostrar"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__id
msgid "ID"
msgstr "ID"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity____last_update
msgid "Last Modified on"
msgstr "Última modificación en"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__write_uid
msgid "Last Updated by"
msgstr "Última modificación por"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__write_date
msgid "Last Updated on"
msgstr "Última actualización en"
#. module: maintenance_plan_activity
#: model:ir.model,name:maintenance_plan_activity.model_maintenance_equipment
msgid "Maintenance Equipment"
msgstr "Equipamiento"
#. module: maintenance_plan_activity
#: model:ir.model,name:maintenance_plan_activity.model_maintenance_plan
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__maintenance_plan_id
msgid "Maintenance Plan"
msgstr "Plan de mantenimiento"
#. module: maintenance_plan_activity
#: model:ir.model,name:maintenance_plan_activity.model_maintenance_planned_activity
msgid "Maintenance Planned Activity"
msgstr "Actividad planificada de mantenimiento"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_plan__planned_activity_ids
msgid "Planned Activities"
msgstr "Actividades planificadas"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__user_id
msgid "Responsible"
msgstr "Responsable"
#. module: maintenance_plan_activity
#: model_terms:ir.ui.view,arch_db:maintenance_plan_activity.maintenance_plan_view_form
msgid "Scheduled Activities"
msgstr "Actividades programadas"
#. module: maintenance_plan_activity
#: model:ir.model.fields,help:maintenance_plan_activity.field_maintenance_planned_activity__date_before_request
msgid ""
"This is the number of days the due date of the activity will beset before "
"the Maintenance request scheduled date"
msgstr ""
"Este es el número de días para definir la fecha prevista de la actividades "
"desde la fecha programada de la solicitud"
#~ msgid "Maintenance Planned Activities"
#~ msgstr "Actividades planificadas de mantenimiento"

View File

@@ -0,0 +1,109 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * maintenance_plan_activity
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-10-10 15:58+0000\n"
"Last-Translator: Yann Papouin <ypa@decgroupe.com>\n"
"Language-Team: none\n"
"Language: fr\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 5.10.4\n"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__date_before_request
msgid "# Days before request"
msgstr "# Nombre de jours avant la demande"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__activity_type_id
msgid "Activity Type"
msgstr "Type d'activité"
#. module: maintenance_plan_activity
#. odoo-python
#: code:addons/maintenance_plan_activity/models/maintenance.py:0
#, python-format
msgid "Activity automatically generated from maintenance plan"
msgstr "Activité générée automatiquement à partir du plan de maintenance"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__create_uid
msgid "Created by"
msgstr "Créé par"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__create_date
msgid "Created on"
msgstr "Créé le"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__id
msgid "ID"
msgstr "ID"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity____last_update
msgid "Last Modified on"
msgstr "Dernière modification le"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__write_uid
msgid "Last Updated by"
msgstr "Modifié par"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__write_date
msgid "Last Updated on"
msgstr "Modifié le"
#. module: maintenance_plan_activity
#: model:ir.model,name:maintenance_plan_activity.model_maintenance_equipment
msgid "Maintenance Equipment"
msgstr "Équipement de maintenance"
#. module: maintenance_plan_activity
#: model:ir.model,name:maintenance_plan_activity.model_maintenance_plan
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__maintenance_plan_id
msgid "Maintenance Plan"
msgstr "Plan de Maintenance"
#. module: maintenance_plan_activity
#: model:ir.model,name:maintenance_plan_activity.model_maintenance_planned_activity
msgid "Maintenance Planned Activity"
msgstr "Activité de Maintenance Planifiée"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_plan__planned_activity_ids
msgid "Planned Activities"
msgstr "Activités planifiées"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__user_id
msgid "Responsible"
msgstr "Responsable"
#. module: maintenance_plan_activity
#: model_terms:ir.ui.view,arch_db:maintenance_plan_activity.maintenance_plan_view_form
msgid "Scheduled Activities"
msgstr "Activités programmées"
#. module: maintenance_plan_activity
#: model:ir.model.fields,help:maintenance_plan_activity.field_maintenance_planned_activity__date_before_request
msgid ""
"This is the number of days the due date of the activity will beset before "
"the Maintenance request scheduled date"
msgstr ""
"Il s'agit du nombre de jours pendant lesquels la date d'échéance de "
"l'activité précède la date prévue de la demande de maintenance"

View File

@@ -0,0 +1,111 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * maintenance_plan_activity
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-31 16:06+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 5.6.2\n"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__date_before_request
msgid "# Days before request"
msgstr "N° giorni prima della richiesta"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__activity_type_id
msgid "Activity Type"
msgstr "Tipo attività"
#. module: maintenance_plan_activity
#: code:addons/maintenance_plan_activity/models/maintenance.py:0
#, python-format
msgid "Activity automatically generated from maintenance plan"
msgstr "Attività generata automaticamente da piano di manutenzione"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__create_uid
msgid "Created by"
msgstr "Creato da"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__create_date
msgid "Created on"
msgstr "Creato il"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__id
msgid "ID"
msgstr "ID"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: maintenance_plan_activity
#: model:ir.model,name:maintenance_plan_activity.model_maintenance_equipment
msgid "Maintenance Equipment"
msgstr "Attrezzatura manutenzione"
#. module: maintenance_plan_activity
#: model:ir.model,name:maintenance_plan_activity.model_maintenance_plan
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__maintenance_plan_id
msgid "Maintenance Plan"
msgstr "Piano manutenzione"
#. module: maintenance_plan_activity
#: model:ir.model,name:maintenance_plan_activity.model_maintenance_planned_activity
msgid "Maintenance Planned Activity"
msgstr "Attività di manutenzione pianificata"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_plan__planned_activity_ids
msgid "Planned Activities"
msgstr "Attività pianificate"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__user_id
msgid "Responsible"
msgstr "Responsabile"
#. module: maintenance_plan_activity
#: model_terms:ir.ui.view,arch_db:maintenance_plan_activity.maintenance_plan_view_form
msgid "Scheduled Activities"
msgstr "Attività schedulate"
#. module: maintenance_plan_activity
#: model:ir.model.fields,help:maintenance_plan_activity.field_maintenance_planned_activity__date_before_request
msgid ""
"This is the number of days the due date of the activity will beset before "
"the Maintenance request scheduled date"
msgstr ""
"Questo è il numero di giorni in cui la data di scadenza dell'attività verrà "
"fissata prima della data pianificata della richiesta di manutenzione"
#~ msgid "Maintenance Planned Activities"
#~ msgstr "Attività piano di manutenzione"

View File

@@ -0,0 +1,98 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * maintenance_plan_activity
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__date_before_request
msgid "# Days before request"
msgstr ""
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__activity_type_id
msgid "Activity Type"
msgstr ""
#. module: maintenance_plan_activity
#. odoo-python
#: code:addons/maintenance_plan_activity/models/maintenance_equipment.py:0
msgid "Activity automatically generated from maintenance plan"
msgstr ""
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__create_uid
msgid "Created by"
msgstr ""
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__create_date
msgid "Created on"
msgstr ""
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__display_name
msgid "Display Name"
msgstr ""
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__id
msgid "ID"
msgstr ""
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__write_uid
msgid "Last Updated by"
msgstr ""
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__write_date
msgid "Last Updated on"
msgstr ""
#. module: maintenance_plan_activity
#: model:ir.model,name:maintenance_plan_activity.model_maintenance_equipment
msgid "Maintenance Equipment"
msgstr ""
#. module: maintenance_plan_activity
#: model:ir.model,name:maintenance_plan_activity.model_maintenance_plan
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__maintenance_plan_id
msgid "Maintenance Plan"
msgstr ""
#. module: maintenance_plan_activity
#: model:ir.model,name:maintenance_plan_activity.model_maintenance_planned_activity
msgid "Maintenance Planned Activity"
msgstr ""
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_plan__planned_activity_ids
msgid "Planned Activities"
msgstr ""
#. module: maintenance_plan_activity
#: model:ir.model.fields,field_description:maintenance_plan_activity.field_maintenance_planned_activity__user_id
msgid "Responsible"
msgstr ""
#. module: maintenance_plan_activity
#: model_terms:ir.ui.view,arch_db:maintenance_plan_activity.maintenance_plan_view_form
msgid "Scheduled Activities"
msgstr ""
#. module: maintenance_plan_activity
#: model:ir.model.fields,help:maintenance_plan_activity.field_maintenance_planned_activity__date_before_request
msgid ""
"This is the number of days the due date of the activity will beset before "
"the Maintenance request scheduled date"
msgstr ""

View File

@@ -0,0 +1,3 @@
from . import maintenance_plan
from . import maintenance_equipment
from . import maintenance_planned_activity

View File

@@ -0,0 +1,40 @@
# Copyright 2019-20 ForgeFlow S.L. (https://www.forgeflow.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from datetime import timedelta
from odoo import _, models
class MaintenanceEquipment(models.Model):
_inherit = "maintenance.equipment"
def _prepare_new_request_activity_values(self, request, activity):
"""Prepare the values to create a new mail.activity for a maintenance request
created from a maintenance plan.
"""
return {
"activity_type_id": activity.activity_type_id.id,
"note": _("Activity automatically generated from maintenance plan"),
"user_id": activity.user_id.id or self.env.user.id,
"res_id": request.id,
"res_model_id": self.env.ref("maintenance.model_maintenance_request").id,
"date_deadline": request.schedule_date
- timedelta(days=activity.date_before_request),
}
def _create_new_request(self, maintenance_plan):
new_requests = super()._create_new_request(maintenance_plan)
for request in new_requests:
for planned_activity in maintenance_plan.planned_activity_ids:
# In case mail_activity_team is installed this makes sure
# the correct activity team is selected. If that module is
# not installed the context does nothing
activity_data = self._prepare_new_request_activity_values(
request, planned_activity
)
if activity_data:
self.env["mail.activity"].with_context(
default_res_model="maintenance.request"
).create(activity_data)
return new_requests

View File

@@ -0,0 +1,14 @@
# Copyright 2019-20 ForgeFlow S.L. (https://www.forgeflow.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class MaintenancePlan(models.Model):
_inherit = "maintenance.plan"
planned_activity_ids = fields.One2many(
comodel_name="maintenance.planned.activity",
inverse_name="maintenance_plan_id",
string="Planned Activities",
)

View File

@@ -0,0 +1,29 @@
# Copyright 2019-20 ForgeFlow S.L. (https://www.forgeflow.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class MaintenancePlannedActivity(models.Model):
_name = "maintenance.planned.activity"
_description = "Maintenance Planned Activity"
activity_type_id = fields.Many2one(
comodel_name="mail.activity.type",
string="Activity Type",
required=True,
)
user_id = fields.Many2one(
comodel_name="res.users",
string="Responsible",
default=lambda self: self.env.user,
)
date_before_request = fields.Integer(
string="# Days before request",
help="This is the number of days the due date of the activity will be"
"set before the Maintenance request scheduled date",
)
maintenance_plan_id = fields.Many2one(
comodel_name="maintenance.plan",
string="Maintenance Plan",
)

View File

@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"

View File

@@ -0,0 +1 @@
- Adria Gil Sorribes \<adria.gil@forgeflow.com\>

View File

@@ -0,0 +1,5 @@
This module allows defining in the maintenance plan activities that will
be created once the maintenance requests are created as a consequence of
the plan itself.
![Maintenance Planned Activities](/maintenance_plan_activity/static/description/maintenance_plan_activity.png)

View File

@@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_maintenance_planned_activity_user,access_maintenance_planned_activity_user,model_maintenance_planned_activity,base.group_user,1,0,0,0
access_maintenance_planned_activity_manager,access_maintenance_planned_activity_manager,model_maintenance_planned_activity,maintenance.group_equipment_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_maintenance_planned_activity_user access_maintenance_planned_activity_user model_maintenance_planned_activity base.group_user 1 0 0 0
3 access_maintenance_planned_activity_manager access_maintenance_planned_activity_manager model_maintenance_planned_activity maintenance.group_equipment_manager 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,432 @@
<!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>README.rst</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
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: gray; } /* 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, pre.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">
<a class="reference external image-reference" href="https://odoo-community.org/get-involved?utm_source=readme">
<img alt="Odoo Community Association" src="https://odoo-community.org/readme-banner-image" />
</a>
<div class="section" id="maintenance-plan-activity">
<h1>Maintenance Plan Activity</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:c3646940de02504c979a98766caf2474a45b20d33863f5b5652d8c82433712fe
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/license-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/maintenance/tree/18.0/maintenance_plan_activity"><img alt="OCA/maintenance" src="https://img.shields.io/badge/github-OCA%2Fmaintenance-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/maintenance-18-0/maintenance-18-0-maintenance_plan_activity"><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/maintenance&amp;target_branch=18.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module allows defining in the maintenance plan activities that will
be created once the maintenance requests are created as a consequence of
the plan itself.</p>
<p><img alt="Maintenance Planned Activities" src="https://raw.githubusercontent.com/maintenance_plan_activity/static/description/maintenance_plan_activity.png" /></p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-1">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-2">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-3">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-4">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-5">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h2><a class="toc-backref" href="#toc-entry-1">Bug Tracker</a></h2>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/maintenance/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/maintenance/issues/new?body=module:%20maintenance_plan_activity%0Aversion:%2018.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">
<h2><a class="toc-backref" href="#toc-entry-2">Credits</a></h2>
<div class="section" id="authors">
<h3><a class="toc-backref" href="#toc-entry-3">Authors</a></h3>
<ul class="simple">
<li>ForgeFlow</li>
</ul>
</div>
<div class="section" id="contributors">
<h3><a class="toc-backref" href="#toc-entry-4">Contributors</a></h3>
<ul class="simple">
<li>Adria Gil Sorribes &lt;<a class="reference external" href="mailto:adria.gil&#64;forgeflow.com">adria.gil&#64;forgeflow.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h3><a class="toc-backref" href="#toc-entry-5">Maintainers</a></h3>
<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>This module is part of the <a class="reference external" href="https://github.com/OCA/maintenance/tree/18.0/maintenance_plan_activity">OCA/maintenance</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>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@@ -0,0 +1 @@
from . import test_maintenance_plan_activity

View File

@@ -0,0 +1,61 @@
# Copyright 2019-20 ForgeFlow S.L. (https://www.forgeflow.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from datetime import timedelta
import odoo.tests.common as test_common
from odoo import fields
class TestMaintenancePlanActivity(test_common.TransactionCase):
def setUp(self):
super().setUp()
self.maintenance_request_obj = self.env["maintenance.request"]
self.maintenance_plan_obj = self.env["maintenance.plan"]
self.maintenance_equipment_obj = self.env["maintenance.equipment"]
self.maintenance_planned_activity_obj = self.env["maintenance.planned.activity"]
self.mail_activity_obj = self.env["mail.activity"]
self.cron = self.env.ref("maintenance_plan.maintenance_requests_cron")
self.equipment_1 = self.maintenance_equipment_obj.create({"name": "Laptop 1"})
self.call = self.env["mail.activity.type"].search(
[("name", "=", "Call")], limit=1
)
self.maintenance_plan_1 = self.maintenance_plan_obj.create(
{
"equipment_id": self.equipment_1.id,
"interval": 1,
"interval_step": "month",
"maintenance_plan_horizon": 2,
"planning_step": "month",
}
)
self.planned_activity = self.maintenance_planned_activity_obj.create(
{
"maintenance_plan_id": self.maintenance_plan_1.id,
"activity_type_id": self.call.id,
"date_before_request": 2,
}
)
def test_01_cron_auto_create_activities(self):
"""Execute cron and check the request and the activities that have
been created
"""
self.cron.method_direct_trigger()
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_1.id)]
)
self.assertEqual(len(generated_requests), 3)
request_1 = generated_requests[0]
# Check if activity Call has been created for the request 1
generated_activities = self.mail_activity_obj.search(
[("res_id", "=", request_1.id)]
)
self.assertEqual(len(generated_activities), 2)
self.assertEqual(generated_activities[0].activity_type_id.name, self.call.name)
self.assertEqual(
generated_activities[0].date_deadline,
fields.Date.to_date(request_1.schedule_date) - timedelta(days=2),
)

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- maintenance.plan : views -->
<record id="maintenance_plan_view_form" model="ir.ui.view">
<field name="name">maintenance.plan.form</field>
<field name="model">maintenance.plan</field>
<field name="inherit_id" ref="maintenance_plan.maintenance_plan_view_form" />
<field name="arch" type="xml">
<xpath expr="//form/sheet/notebook/page[1]" position="after">
<page string="Scheduled Activities">
<field name="planned_activity_ids" nolabel="1" />
</page>
</xpath>
</field>
</record>
<!-- maintenance.planned.activities : views-->
<record id="maintenance_planned_activity_view_tree" model="ir.ui.view">
<field name="name">maintenance.planned.activity.list</field>
<field name="model">maintenance.planned.activity</field>
<field name="arch" type="xml">
<list editable="bottom">
<field name="activity_type_id" />
<field name="user_id" />
<field name="date_before_request" />
</list>
</field>
</record>
</odoo>