[ADD] maintenance_create_requests_from_project_task: create add-on

This commit is contained in:
Stéphan Sainléger
2025-06-03 00:59:05 +02:00
committed by Stéphan Sainléger
parent ff75a1b4cd
commit 1e7671c119
13 changed files with 666 additions and 0 deletions

View File

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

View File

@@ -0,0 +1,98 @@
from odoo import api, fields, models, _
from odoo.tools.safe_eval import safe_eval
class CreateMaintenanceRequestsWizard(models.TransientModel):
_name= "create.maintenance.requests.wizard"
_description= "Configure the maintenance requests to create from the current task."
@api.model
def _default_task_id(self):
return self.env["project.task"].browse(self._context.get("active_ids"))
name = fields.Char("Title", required=True)
user_id = fields.Many2one('res.users', string='Technician')
priority = fields.Selection([('0', 'Very Low'), ('1', 'Low'), ('2', 'Normal'), ('3', 'High')], string='Priority')
maintenance_type = fields.Selection([('corrective', 'Corrective'), ('preventive', 'Preventive')], string='Maintenance Type', default="corrective")
schedule_date = fields.Datetime('Scheduled Date')
duration = fields.Float(help="Duration in hours.")
description = fields.Html('Description')
equipment_domain = fields.Char("Equipment Domain")
task_id = fields.Many2one(
"project.task",
string="Task",
required=True,
default=_default_task_id,
)
@api.model
def action_open_wizard(self):
"""
Open the form view.
"""
return {
'name': _('Create maintenance requests'),
'type': 'ir.actions.act_window',
'res_model': 'create.maintenance.requests.wizard',
'view_type': 'form',
'view_mode': 'form',
'target': 'new',
}
def create_maintenance_requests(self):
"""
Create the maintenance requests with the data filled in the wizard form.
"""
vals_list = self._compute_vals_list()
maintenance_requests = self.env["maintenance.request"].sudo().create(vals_list)
return self._get_action(maintenance_requests)
def _compute_vals_list(self):
"""
Compute the list of data to use for all the maintenance requests creation
"""
equipment_list = self.env["maintenance.equipment"].search(safe_eval(self.equipment_domain))
if len(equipment_list) == 0:
raise UserError("No equipment is matching the domain. Maintenance request creation is not possible.")
vals_list = []
common_vals = {
"name": self.name,
"user_id": self.user_id.id,
"priority": self.priority,
"maintenance_type": self.maintenance_type,
"schedule_date": self.schedule_date,
"duration": self.duration,
"description": self.description,
"task_id": self.task_id.id,
"project_id": self.task_id.project_id.id
}
for equipment in equipment_list:
vals = common_vals.copy()
vals["equipment_id"] = equipment.id
vals_list.append(vals)
return vals_list
def _get_action(self, maintenance_requests):
"""
Provide the action to go to the tree view of the maintenance requests created.
"""
search_view_ref = self.env.ref('maintenance.hr_equipment_request_view_search', False)
form_view_ref = self.env.ref('maintenance.hr_equipment_request_view_form', False)
tree_view_ref = self.env.ref('maintenance.hr_equipment_request_view_tree', False)
return {
'domain': [('id', 'in', maintenance_requests.ids)],
'name': 'Maintenance Requests',
'res_model': 'maintenance.request',
'type': 'ir.actions.act_window',
'views': [(tree_view_ref.id, 'tree'), (form_view_ref.id, 'form')],
'search_view_id': search_view_ref and [search_view_ref.id],
}

View File

@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="create_maintenance_requests_wizard_view_form" model="ir.ui.view">
<field name="name">create.maintenance.requests.wizard.view.form</field>
<field name="model">create.maintenance.requests.wizard</field>
<field name="arch" type="xml">
<form string="Create maintenance requests">
<sheet>
<group name="name">
<field name="task_id" readonly="1" />
<field name="name" />
</group>
<group name="domain" string="Equipments targetted">
<field
name="equipment_domain"
widget="domain"
options='{"model": "maintenance.equipment"}'
/>
</group>
<group name="data" string="Requests data">
<field name="user_id" />
<field name="maintenance_type" />
<field name="priority" />
<field name="duration" />
<field name="schedule_date" />
<field name="description" />
</group>
</sheet>
<footer>
<button string="Create" name="create_maintenance_requests" type="object"
class="btn-primary" />
<button string="Cancel" class="btn-secondary" special="cancel" />
</footer>
</form>
</field>
</record>
<record
id="action_create_maintenance_requests_wizard" model="ir.actions.act_window">
<field name="name">Create Maintenance Requests</field>
<field name="res_model">create.maintenance.requests.wizard</field>
<field name="view_mode">form</field>
<field name="view_id" ref="create_maintenance_requests_wizard_view_form" />
<field name="target">new</field>
</record>
<record id="task_wizard_action_create_maintenance_requests" model="ir.actions.server">
<field name="name">Create maintenance requests</field>
<field name="model_id" ref="maintenance_create_requests_from_project_task.model_create_maintenance_requests_wizard"/>
<field name="binding_model_id" ref="project.model_project_task"/>
<field name="state">code</field>
<field name="code">action = model.action_open_wizard()</field>
</record>
</odoo>