Initial commit: OCA Technical packages (595 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:03 +02:00
commit 2cc02aac6e
24950 changed files with 2318079 additions and 0 deletions

View file

@ -0,0 +1,2 @@
from . import test_maintenance_plan
from . import test_maintenance_plan_domain

View file

@ -0,0 +1,83 @@
# Copyright 2017 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from freezegun import freeze_time
import odoo.tests.common as test_common
class TestMaintenancePlanBase(test_common.TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
# HACK https://github.com/spulec/freezegun/issues/485
freezer = freeze_time("2023-01-25 15:30:00")
freezer.__enter__()
cls.addClassCleanup(freezer.__exit__)
# Remove this variable in v16 and put instead:
# from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT
DISABLED_MAIL_CONTEXT = {
"tracking_disable": True,
"mail_create_nolog": True,
"mail_create_nosubscribe": True,
"mail_notrack": True,
"no_reset_password": True,
}
cls.env = cls.env(context=dict(cls.env.context, **DISABLED_MAIL_CONTEXT))
cls.maintenance_request_obj = cls.env["maintenance.request"]
cls.maintenance_plan_obj = cls.env["maintenance.plan"]
cls.maintenance_equipment_obj = cls.env["maintenance.equipment"]
cls.cron = cls.env.ref("maintenance.maintenance_requests_cron")
cls.weekly_kind = cls.env.ref("maintenance_plan.maintenance_kind_weekly")
cls.done_stage = cls.env.ref("maintenance.stage_3")
cls.equipment_1 = cls.maintenance_equipment_obj.create({"name": "Laptop 1"})
cls.maintenance_plan_1 = cls.maintenance_plan_obj.create(
{
"equipment_id": cls.equipment_1.id,
"start_maintenance_date": "2023-01-25",
"interval": 1,
"interval_step": "month",
"maintenance_plan_horizon": 2,
"planning_step": "month",
}
)
cls.maintenance_plan_2 = cls.maintenance_plan_obj.create(
{
"equipment_id": cls.equipment_1.id,
"maintenance_kind_id": cls.weekly_kind.id,
"interval": 1,
"interval_step": "week",
"maintenance_plan_horizon": 2,
"planning_step": "month",
}
)
cls.maintenance_plan_3 = cls.maintenance_plan_obj.create(
{
"name": "My custom plan",
"equipment_id": cls.equipment_1.id,
"interval": 2,
"interval_step": "week",
"maintenance_plan_horizon": 2,
"planning_step": "month",
}
)
cls.maintenance_plan_4 = cls.maintenance_plan_obj.create(
{
"name": "Plan without equipment",
"maintenance_kind_id": cls.weekly_kind.id,
"interval": 1,
"interval_step": "week",
"maintenance_plan_horizon": 2,
"planning_step": "month",
}
)
cls.maintenance_plan_5 = cls.maintenance_plan_obj.create(
{
"start_maintenance_date": "2023-01-25",
"interval": 1,
"interval_step": "month",
"maintenance_plan_horizon": 2,
"planning_step": "month",
}
)
cls.report_obj = cls.env["ir.actions.report"]

View file

@ -0,0 +1,231 @@
# Copyright 2017 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from dateutil.relativedelta import relativedelta
from odoo import _, fields
from .common import TestMaintenancePlanBase
class TestMaintenancePlan(TestMaintenancePlanBase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.today_date = fields.Date.from_string("2023-01-25")
def test_name_get(self):
self.assertEqual(
self.maintenance_plan_1.name_get()[0][1],
_(
"Unnamed %(void)s plan (%(eqpmnt)s)",
void="",
eqpmnt=self.maintenance_plan_1.equipment_id.name,
),
)
self.assertEqual(
self.maintenance_plan_2.name_get()[0][1],
_(
"Unnamed %(kind)s plan (%(eqpmnt)s)",
kind=self.maintenance_plan_2.maintenance_kind_id.name,
eqpmnt=self.maintenance_plan_2.equipment_id.name,
),
)
self.assertEqual(
self.maintenance_plan_3.name_get()[0][1], self.maintenance_plan_3.name
)
def test_next_maintenance_date_01(self):
# We set start maintenance date tomorrow and check next maintenance
# date has been correctly computed
self.maintenance_plan_1.start_maintenance_date = "2023-01-24"
# Check next maintenance date is 1 month from start date
self.assertEqual(
self.maintenance_plan_1.next_maintenance_date,
fields.Date.from_string("2023-02-24"),
)
def test_next_maintenance_date_02(self):
self.cron.method_direct_trigger()
# Check maintenance plan dates
self.assertEqual(
self.maintenance_plan_1.start_maintenance_date, self.today_date
)
self.assertEqual(self.maintenance_plan_1.next_maintenance_date, self.today_date)
# Check information from generated_requests
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_1.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 3)
maintenance_1 = generated_requests[0]
# First maintenance was planned 2023-01-25
self.assertEqual(maintenance_1.request_date, self.today_date)
# Complete request:
maintenance_1.stage_id = self.done_stage
# Check next one:
maintenance_2 = generated_requests[1]
# This should be expected 2023-02-25
self.assertEqual(
maintenance_2.request_date, fields.Date.from_string("2023-02-25")
)
# Complete request and Check next one:
maintenance_2.stage_id = self.done_stage
maintenance_3 = generated_requests[2]
# This one should be expected 2023-03-25
self.assertEqual(
maintenance_3.request_date, fields.Date.from_string("2023-03-25")
)
# Move it to a date before `start_maintenance_date` (the request should
# be ignored)
past_date = fields.Date.from_string("2022-12-25")
maintenance_3.request_date = past_date
self.assertNotEqual(self.maintenance_plan_1.next_maintenance_date, past_date)
self.assertEqual(
self.maintenance_plan_1.next_maintenance_date,
fields.Date.from_string("2023-03-25"),
)
# Move the request_date far into the future:
future_date = fields.Date.from_string("2023-05-25")
maintenance_3.request_date = future_date
self.assertEqual(self.maintenance_plan_1.next_maintenance_date, future_date)
# Complete request in that date, next expected date should be 1 month
# after latest request done.:
maintenance_3.stage_id = self.done_stage
self.assertEqual(
self.maintenance_plan_1.next_maintenance_date,
fields.Date.from_string("2023-06-25"),
)
def test_generate_requests(self):
self.cron.method_direct_trigger()
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_1.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 3)
self.assertEqual(
fields.Date.to_date(generated_requests[0].schedule_date), self.today_date
)
self.assertEqual(
fields.Date.to_date(generated_requests[1].schedule_date),
fields.Date.from_string("2023-02-25"),
)
self.assertEqual(
fields.Date.to_date(generated_requests[2].schedule_date),
fields.Date.from_string("2023-03-25"),
)
generated_request = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_4.id)], limit=1
)
self.assertEqual(
generated_request.name,
_(
"Preventive Maintenance (%(kind)s) - %(plan)s",
kind=self.weekly_kind.name,
plan=self.maintenance_plan_4.name,
),
)
def test_generate_requests2(self):
self.cron.method_direct_trigger()
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_1.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 3)
# We set plan start_maintenanca_date to a future one. New requests should take
# into account this new date.
new_date = fields.Date.from_string("2023-04-25")
self.maintenance_plan_1.next_maintenance_date = new_date
self.maintenance_plan_1.maintenance_plan_horizon = 3
self.cron.method_direct_trigger()
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_1.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 4)
self.assertEqual(generated_requests[-1].request_date, new_date)
def test_generate_requests_no_equipment(self):
self.cron.method_direct_trigger()
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_5.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 3)
# We set plan start_maintenanca_date to a future one. New requests should take
# into account this new date.
self.maintenance_plan_5.write(
{
"start_maintenance_date": fields.Date.to_string(
self.today_date + relativedelta(weeks=9)
),
"maintenance_plan_horizon": 3,
}
)
self.cron.method_direct_trigger()
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_5.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 4)
self.assertEqual(
generated_requests[-1].request_date,
self.today_date + relativedelta(weeks=9),
)
self.assertFalse(generated_requests.mapped("equipment_id"))
def test_get_relativedelta(self):
plan = self.maintenance_plan_1
result = plan.get_relativedelta(1, "day")
self.assertEqual(relativedelta(days=1), result)
result = plan.get_relativedelta(1, "week")
self.assertEqual(relativedelta(weeks=1), result)
result = plan.get_relativedelta(1, "month")
self.assertEqual(relativedelta(months=1), result)
result = plan.get_relativedelta(1, "year")
self.assertEqual(relativedelta(years=1), result)
def test_generate_requests_inactive_equipment(self):
self.equipment_1.active = False
self.cron.method_direct_trigger()
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_1.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 0)
self.equipment_1.active = True
self.cron.method_direct_trigger()
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_1.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 3)
def test_maintenance_request_report(self):
self.cron.method_direct_trigger()
generated_request = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_1.id)],
order="schedule_date asc",
limit=1,
)
generated_request.note = "TEST-INSTRUCTIONS"
res = self.report_obj._render_qweb_text(
"base_maintenance.report_maintenance_request",
generated_request.ids,
False,
)
self.assertRegex(str(res[0]), "TEST-INSTRUCTIONS")
def test_maintenance_plan_button_manual_request_generation(self):
self.assertEqual(len(self.maintenance_plan_1.maintenance_ids), 0)
self.maintenance_plan_1.button_manual_request_generation()
self.assertEqual(len(self.maintenance_plan_1.maintenance_ids), 3)

View file

@ -0,0 +1,38 @@
# Copyright 2023 Dixmit
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
import json
from odoo.addons.maintenance_plan.tests.common import TestMaintenancePlanBase
class TestMaintenancePlanDomain(TestMaintenancePlanBase):
def test_generate_requests_no_domain(self):
self.cron.method_direct_trigger()
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_5.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 3)
self.assertFalse(generated_requests.mapped("equipment_id"))
def test_generate_requests_domain(self):
equipment_2 = self.maintenance_equipment_obj.create({"name": "Laptop 2"})
self.maintenance_plan_5.write(
{
"generate_with_domain": True,
"generate_domain": json.dumps(
[("id", "in", [equipment_2.id, self.equipment_1.id])]
),
}
)
self.cron.method_direct_trigger()
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_5.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 6)
self.assertIn(equipment_2, generated_requests.mapped("equipment_id"))
self.assertIn(self.equipment_1, generated_requests.mapped("equipment_id"))