mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[IMP]pms_housekeeping: constrains and tests for housekeeping tasks
This commit is contained in:
@@ -44,14 +44,14 @@ class PmsHouseKeepingTask(models.Model):
|
|||||||
readonly=False,
|
readonly=False,
|
||||||
)
|
)
|
||||||
cleaning_comments = fields.Text(string="Cleaning Comments")
|
cleaning_comments = fields.Text(string="Cleaning Comments")
|
||||||
employee_ids = fields.Many2many(
|
housekeeper_ids = fields.Many2many(
|
||||||
comodel_name="hr.employee",
|
comodel_name="hr.employee",
|
||||||
relation="pms_housekeeping_task_hr_employee_rel",
|
relation="pms_housekeeping_task_hr_employee_rel",
|
||||||
column1="task_id",
|
column1="task_id",
|
||||||
column2="employee_id",
|
column2="employee_id",
|
||||||
string="Employees",
|
string="Housekeepers",
|
||||||
domain="[('job_id.name', '=', 'Housekeeper')]",
|
domain="[('job_id.name', '=', 'Housekeeper')]",
|
||||||
compute="_compute_employee_ids",
|
compute="_compute_housekeeper_ids",
|
||||||
store=True,
|
store=True,
|
||||||
readonly=False,
|
readonly=False,
|
||||||
)
|
)
|
||||||
@@ -96,6 +96,11 @@ class PmsHouseKeepingTask(models.Model):
|
|||||||
string="Is Done Allowed",
|
string="Is Done Allowed",
|
||||||
compute="_compute_done_allowed",
|
compute="_compute_done_allowed",
|
||||||
)
|
)
|
||||||
|
allowed_housekeeper_ids = fields.Many2many(
|
||||||
|
comodel_name="hr.employee",
|
||||||
|
string="Allowed Housekeepers",
|
||||||
|
compute="_compute_allowed_housekeeper_ids",
|
||||||
|
)
|
||||||
|
|
||||||
@api.constrains("task_date")
|
@api.constrains("task_date")
|
||||||
def _check_task_date(self):
|
def _check_task_date(self):
|
||||||
@@ -111,6 +116,16 @@ class PmsHouseKeepingTask(models.Model):
|
|||||||
if rec.parent_id.parent_id:
|
if rec.parent_id.parent_id:
|
||||||
raise ValidationError(_("Parent task cannot have a parent task"))
|
raise ValidationError(_("Parent task cannot have a parent task"))
|
||||||
|
|
||||||
|
@api.constrains("housekeeper_ids")
|
||||||
|
def _check_housekeeper_ids(self):
|
||||||
|
for rec in self:
|
||||||
|
if rec.housekeeper_ids:
|
||||||
|
for housekeeper in rec.housekeeper_ids:
|
||||||
|
if housekeeper not in rec.allowed_housekeeper_ids:
|
||||||
|
raise ValidationError(
|
||||||
|
_("The housekeeper should belong to the room's property.")
|
||||||
|
)
|
||||||
|
|
||||||
def action_cancel(self):
|
def action_cancel(self):
|
||||||
for rec in self:
|
for rec in self:
|
||||||
rec.state = "cancel"
|
rec.state = "cancel"
|
||||||
@@ -207,20 +222,20 @@ class PmsHouseKeepingTask(models.Model):
|
|||||||
rec.done_allowed = False
|
rec.done_allowed = False
|
||||||
|
|
||||||
@api.depends("room_id", "task_type_id")
|
@api.depends("room_id", "task_type_id")
|
||||||
def _compute_employee_ids(self):
|
def _compute_housekeeper_ids(self):
|
||||||
for rec in self:
|
for rec in self:
|
||||||
employee_ids = False
|
housekeeper_ids = False
|
||||||
if rec.room_id or rec.task_type_id:
|
if rec.room_id or rec.task_type_id:
|
||||||
employee_ids = self.env["hr.employee"].search(
|
housekeeper_ids = self.env["hr.employee"].search(
|
||||||
[("pre_assigned_room_ids", "in", [rec.room_id.id])]
|
[("pre_assigned_room_ids", "in", [rec.room_id.id])]
|
||||||
)
|
)
|
||||||
if not employee_ids:
|
if not housekeeper_ids:
|
||||||
employee_ids = (
|
housekeeper_ids = (
|
||||||
self.env["pms.housekeeping.task.type"]
|
self.env["pms.housekeeping.task.type"]
|
||||||
.search([("id", "=", rec.task_type_id.id)])
|
.search([("id", "=", rec.task_type_id.id)])
|
||||||
.housekeeper_ids
|
.housekeeper_ids
|
||||||
)
|
)
|
||||||
rec.employee_ids = employee_ids
|
rec.housekeeper_ids = housekeeper_ids
|
||||||
|
|
||||||
@api.depends("task_type_id")
|
@api.depends("task_type_id")
|
||||||
def _compute_priority(self):
|
def _compute_priority(self):
|
||||||
@@ -230,6 +245,19 @@ class PmsHouseKeepingTask(models.Model):
|
|||||||
else:
|
else:
|
||||||
rec.priority = False
|
rec.priority = False
|
||||||
|
|
||||||
|
@api.depends('room_id')
|
||||||
|
def _compute_allowed_housekeeper_ids(self):
|
||||||
|
for rec in self:
|
||||||
|
domain = [('job_id.name', '=', 'Housekeeper')]
|
||||||
|
if rec.room_id:
|
||||||
|
domain = [
|
||||||
|
('job_id.name', '=', 'Housekeeper'),
|
||||||
|
'|',
|
||||||
|
('property_ids', 'in', rec.room_id.pms_property_id.ids),
|
||||||
|
('property_ids', '=', False),
|
||||||
|
]
|
||||||
|
rec.allowed_housekeeper_ids = self.env['hr.employee'].search(domain).ids
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def create(self, vals):
|
def create(self, vals):
|
||||||
task_type_id = vals.get("task_type_id")
|
task_type_id = vals.get("task_type_id")
|
||||||
|
|||||||
@@ -47,14 +47,6 @@ class PmsHouseKeepingTaskType(models.Model):
|
|||||||
string="Properties",
|
string="Properties",
|
||||||
)
|
)
|
||||||
|
|
||||||
allowed_housekeeper_ids = fields.Many2many(
|
|
||||||
comodel_name="hr.employee",
|
|
||||||
relation="pms_housekeeping_task_type_allowed_hr_employee_rel",
|
|
||||||
column1="task_type_id",
|
|
||||||
column2="employee_id",
|
|
||||||
string="Allowed Employees",
|
|
||||||
compute="_compute_allowed_housekeeper_ids",
|
|
||||||
)
|
|
||||||
|
|
||||||
@api.constrains("is_overnight", "days_after_clean_overnight")
|
@api.constrains("is_overnight", "days_after_clean_overnight")
|
||||||
def _check_days_after_clean_overnight(self):
|
def _check_days_after_clean_overnight(self):
|
||||||
@@ -80,15 +72,12 @@ class PmsHouseKeepingTaskType(models.Model):
|
|||||||
_("Parent task type cannot have a parent task type")
|
_("Parent task type cannot have a parent task type")
|
||||||
)
|
)
|
||||||
|
|
||||||
@api.depends("pms_property_ids")
|
@api.constrains("housekeeper_ids")
|
||||||
def _compute_allowed_housekeeper_ids(self):
|
def _check_housekeeper_ids(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
domain = []
|
if record.housekeeper_ids:
|
||||||
if record.pms_property_ids:
|
for employee in record.housekeeper_ids:
|
||||||
domain = [
|
if employee.job_id.name != 'Housekeeper':
|
||||||
"|",
|
raise ValidationError(
|
||||||
("property_ids", "in", record.pms_property_ids.ids),
|
_("The job position should be Housekeeper.")
|
||||||
("property_ids", "in", False),
|
)
|
||||||
]
|
|
||||||
domain.append(("job_id.name", "=", "Housekeeper"))
|
|
||||||
record.allowed_housekeeper_ids = self.env["hr.employee"].search(domain).ids
|
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
from . import test_pms_housekeeping_task
|
from . import test_pms_housekeeping_task
|
||||||
from . import test_pms_hr_employee
|
from . import test_pms_hr_employee
|
||||||
|
from . import test_pms_housekeeping_task_type
|
||||||
|
|||||||
@@ -359,7 +359,7 @@ class TestPmsHousekeepingTask(TestPms):
|
|||||||
self.assertFalse(housekeeping_task, "Housekeeping task shouldn't be created")
|
self.assertFalse(housekeeping_task, "Housekeeping task shouldn't be created")
|
||||||
|
|
||||||
@freeze_time("2000-01-04")
|
@freeze_time("2000-01-04")
|
||||||
def test_create_task_type_childs(self):
|
def test_create_task_childs(self):
|
||||||
# ARRANGE
|
# ARRANGE
|
||||||
# create task type
|
# create task type
|
||||||
parent_task_type = self.env["pms.housekeeping.task.type"].create(
|
parent_task_type = self.env["pms.housekeeping.task.type"].create(
|
||||||
@@ -400,7 +400,7 @@ class TestPmsHousekeepingTask(TestPms):
|
|||||||
# Verify that the housekeeping task is not created
|
# Verify that the housekeeping task is not created
|
||||||
self.assertTrue(housekeeping_task, "Child housekeeping task should be created")
|
self.assertTrue(housekeeping_task, "Child housekeeping task should be created")
|
||||||
|
|
||||||
def test_no_create_task_type_childs(self):
|
def test_no_create_task_childs(self):
|
||||||
# ARRANGE
|
# ARRANGE
|
||||||
# create task type
|
# create task type
|
||||||
self.env["pms.housekeeping.task.type"].create(
|
self.env["pms.housekeeping.task.type"].create(
|
||||||
@@ -437,30 +437,190 @@ class TestPmsHousekeepingTask(TestPms):
|
|||||||
housekeeping_task.child_ids, "Child housekeeping task shouldn´t be created"
|
housekeeping_task.child_ids, "Child housekeeping task shouldn´t be created"
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_days_after_clean_overnight_constraint(self):
|
def test_no_create_grandchild_task(self):
|
||||||
# ARRANGE, ACT & ASSERT
|
# ARRANGE
|
||||||
# create task type and verify that the constraint is raised
|
# create task type
|
||||||
|
task_type = self.env["pms.housekeeping.task.type"].create(
|
||||||
|
{
|
||||||
|
"name": "Task Type Parent",
|
||||||
|
"is_checkout": True,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
parent_task = self.env["pms.housekeeping.task"].create(
|
||||||
|
{
|
||||||
|
"name": "Task",
|
||||||
|
"room_id": self.room1.id,
|
||||||
|
"task_type_id": task_type.id,
|
||||||
|
"task_date": datetime.today(),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
child_task = self.env["pms.housekeeping.task"].create(
|
||||||
|
{
|
||||||
|
"name": "Child Task",
|
||||||
|
"room_id": self.room1.id,
|
||||||
|
"task_type_id": task_type.id,
|
||||||
|
"parent_id": parent_task.id,
|
||||||
|
"task_date": datetime.today(),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# ACT & ASSERT
|
||||||
with self.assertRaises(
|
with self.assertRaises(
|
||||||
ValidationError, msg="Days After Clean Overnight should be greater than 0"
|
ValidationError, msg="Grandchild task shouldn´t exist."
|
||||||
):
|
):
|
||||||
self.env["pms.housekeeping.task.type"].create(
|
self.env["pms.housekeeping.task"].create(
|
||||||
{
|
{
|
||||||
"name": "Task Type 1",
|
"name": "Grandchild Task",
|
||||||
"is_overnight": True,
|
"room_id": self.room1.id,
|
||||||
"days_after_clean_overnight": 0,
|
"task_type_id": task_type.id,
|
||||||
|
"parent_id": child_task.id,
|
||||||
|
"task_date": datetime.today(),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_days_after_clean_empty_constraint(self):
|
def test_create_task_with_no_housekeeper(self):
|
||||||
# ARRANGE, ACT & ASSERT
|
|
||||||
# create task type and verify that the constraint is raised
|
# ARRANGE
|
||||||
|
self.job_id = self.env["hr.job"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Job",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
self.employee = self.env["hr.employee"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Employee",
|
||||||
|
"company_id": self.company1.id,
|
||||||
|
"job_id": self.job_id.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# create task type
|
||||||
|
self.task_type = self.env["pms.housekeeping.task.type"].create(
|
||||||
|
{
|
||||||
|
"name": "Task Type 1",
|
||||||
|
"is_checkout": True,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# ACT & ASSERT
|
||||||
with self.assertRaises(
|
with self.assertRaises(
|
||||||
ValidationError, msg="Days After Clean Overnight should be greater than 0"
|
ValidationError, msg="Employee should have a housekeeper job"
|
||||||
):
|
):
|
||||||
self.env["pms.housekeeping.task.type"].create(
|
self.env["pms.housekeeping.task"].create(
|
||||||
{
|
{
|
||||||
"name": "Task Type 1",
|
"name": "Task",
|
||||||
"is_empty": True,
|
"room_id": self.room1.id,
|
||||||
"days_after_clean_empty": 0,
|
"task_type_id": self.task_type.id,
|
||||||
|
"task_date": datetime.today(),
|
||||||
|
"housekeeper_ids": [(6, 0, [self.employee.id])],
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_create_task_with_housekeeper(self):
|
||||||
|
|
||||||
|
# ARRANGE
|
||||||
|
self.employee = self.env["hr.employee"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Employee",
|
||||||
|
"company_id": self.company1.id,
|
||||||
|
"job_id": self.env.ref("pms_housekeeping.housekeeping_job_id").id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# create task type
|
||||||
|
self.task_type = self.env["pms.housekeeping.task.type"].create(
|
||||||
|
{
|
||||||
|
"name": "Task Type 1",
|
||||||
|
"is_checkout": True,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# ACT
|
||||||
|
self.task = self.env["pms.housekeeping.task"].create(
|
||||||
|
{
|
||||||
|
"name": "Task",
|
||||||
|
"room_id": self.room1.id,
|
||||||
|
"task_type_id": self.task_type.id,
|
||||||
|
"task_date": datetime.today(),
|
||||||
|
"housekeeper_ids": [(6, 0, [self.employee.id])],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
#ASSERT
|
||||||
|
self.assertTrue(self.task, "Housekeeping task should be created")
|
||||||
|
|
||||||
|
def test_task_housekeeper_room_inconsistency(self):
|
||||||
|
|
||||||
|
# ARRANGE
|
||||||
|
self.pms_property2 = self.env["pms.property"].create(
|
||||||
|
{
|
||||||
|
"name": "Property 2",
|
||||||
|
"company_id": self.company1.id,
|
||||||
|
"default_pricelist_id": self.pricelist1.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
self.room2 = self.env["pms.room"].create(
|
||||||
|
{
|
||||||
|
"name": "Room 202",
|
||||||
|
"pms_property_id": self.pms_property2.id,
|
||||||
|
"room_type_id": self.room_type1.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
self.employee = self.env["hr.employee"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Employee",
|
||||||
|
"company_id": self.company1.id,
|
||||||
|
"job_id": self.env.ref("pms_housekeeping.housekeeping_job_id").id,
|
||||||
|
"property_ids": [(6, 0, [self.pms_property1.id])],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# create task type
|
||||||
|
self.task_type = self.env["pms.housekeeping.task.type"].create(
|
||||||
|
{
|
||||||
|
"name": "Task Type 1",
|
||||||
|
"is_checkout": True,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# ACT & ASSERT
|
||||||
|
with self.assertRaises(
|
||||||
|
ValidationError, msg="The room and housekeeper should belong to the same property."
|
||||||
|
):
|
||||||
|
self.env["pms.housekeeping.task"].create(
|
||||||
|
{
|
||||||
|
"name": "Task",
|
||||||
|
"room_id": self.room2.id,
|
||||||
|
"task_type_id": self.task_type.id,
|
||||||
|
"task_date": datetime.today(),
|
||||||
|
"housekeeper_ids": [(6, 0, [self.employee.id])],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_task_housekeeper_room_consistency(self):
|
||||||
|
# ARRANGE
|
||||||
|
self.employee = self.env["hr.employee"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Employee",
|
||||||
|
"company_id": self.company1.id,
|
||||||
|
"job_id": self.env.ref("pms_housekeeping.housekeeping_job_id").id,
|
||||||
|
"property_ids": [(6, 0, [self.pms_property1.id])],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# create task type
|
||||||
|
self.task_type = self.env["pms.housekeeping.task.type"].create(
|
||||||
|
{
|
||||||
|
"name": "Task Type 1",
|
||||||
|
"is_checkout": True,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# ACT
|
||||||
|
task = self.env["pms.housekeeping.task"].create(
|
||||||
|
{
|
||||||
|
"name": "Task",
|
||||||
|
"room_id": self.room1.id,
|
||||||
|
"task_type_id": self.task_type.id,
|
||||||
|
"task_date": datetime.today(),
|
||||||
|
"housekeeper_ids": [(6, 0, [self.employee.id])],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# ASSERT
|
||||||
|
self.assertTrue(task, "Housekeeping task should be created")
|
||||||
|
|||||||
63
pms_housekeeping/tests/test_pms_housekeeping_task_type.py
Normal file
63
pms_housekeeping/tests/test_pms_housekeeping_task_type.py
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
from .common import TestPms
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
|
|
||||||
|
|
||||||
|
class TestPmsHousekeepingTask(TestPms):
|
||||||
|
def setUp(self):
|
||||||
|
super().setUp()
|
||||||
|
|
||||||
|
def test_days_after_clean_overnight_constraint(self):
|
||||||
|
# ARRANGE, ACT & ASSERT
|
||||||
|
# create task type and verify that the constraint is raised
|
||||||
|
with self.assertRaises(
|
||||||
|
ValidationError, msg="Days After Clean Overnight should be greater than 0"
|
||||||
|
):
|
||||||
|
self.env["pms.housekeeping.task.type"].create(
|
||||||
|
{
|
||||||
|
"name": "Task Type 1",
|
||||||
|
"is_overnight": True,
|
||||||
|
"days_after_clean_overnight": 0,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_days_after_clean_empty_constraint(self):
|
||||||
|
# ARRANGE, ACT & ASSERT
|
||||||
|
# create task type and verify that the constraint is raised
|
||||||
|
with self.assertRaises(
|
||||||
|
ValidationError, msg="Days After Clean Overnight should be greater than 0"
|
||||||
|
):
|
||||||
|
self.env["pms.housekeeping.task.type"].create(
|
||||||
|
{
|
||||||
|
"name": "Task Type 1",
|
||||||
|
"is_empty": True,
|
||||||
|
"days_after_clean_empty": 0,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_no_create_grandchild_task_type(self):
|
||||||
|
# ARRANGE
|
||||||
|
# create task type
|
||||||
|
parent_task_type = self.env["pms.housekeeping.task.type"].create(
|
||||||
|
{
|
||||||
|
"name": "Task Type Parent",
|
||||||
|
"is_checkout": True,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
child_task_type = self.env["pms.housekeeping.task.type"].create(
|
||||||
|
{
|
||||||
|
"name": "Task Type Child",
|
||||||
|
"is_checkout": True,
|
||||||
|
"parent_id": parent_task_type.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# ACT & ASSERT
|
||||||
|
with self.assertRaises(
|
||||||
|
ValidationError, msg="Grandchild task type shouldn´t exist."
|
||||||
|
):
|
||||||
|
self.env["pms.housekeeping.task.type"].create(
|
||||||
|
{
|
||||||
|
"name": "Task Type Grandchild",
|
||||||
|
"is_checkout": True,
|
||||||
|
"parent_id": child_task_type.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -77,11 +77,16 @@ class TestPmsHrEmployee(TestPms):
|
|||||||
|
|
||||||
def test_not_pre_assigned_room_no_housekeeper_employee(self):
|
def test_not_pre_assigned_room_no_housekeeper_employee(self):
|
||||||
# ARRANGE
|
# ARRANGE
|
||||||
|
self.job_id = self.env["hr.job"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Job",
|
||||||
|
}
|
||||||
|
)
|
||||||
self.hr_employee = self.env["hr.employee"].create(
|
self.hr_employee = self.env["hr.employee"].create(
|
||||||
{
|
{
|
||||||
"name": "Test Employee",
|
"name": "Test Employee",
|
||||||
"company_id": self.company1.id,
|
"company_id": self.company1.id,
|
||||||
"job_id": self.env.ref("hr.job_trainee").id,
|
"job_id": self.job_id.id,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -57,10 +57,12 @@
|
|||||||
<field
|
<field
|
||||||
name="housekeeper_ids"
|
name="housekeeper_ids"
|
||||||
widget="many2many_tags"
|
widget="many2many_tags"
|
||||||
domain="[('id', 'in', allowed_housekeeper_ids)]"
|
domain="[('job_id.name', '=', 'Housekeeper')]"
|
||||||
|
/>
|
||||||
|
<field
|
||||||
|
name="pms_property_ids"
|
||||||
|
widget="many2many_tags"
|
||||||
/>
|
/>
|
||||||
<field name="pms_property_ids" widget="many2many_tags" />
|
|
||||||
<field name="allowed_housekeeper_ids" invisible="1" />
|
|
||||||
<field name="parent_id" />
|
<field name="parent_id" />
|
||||||
<field name="description" />
|
<field name="description" />
|
||||||
</group>
|
</group>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<field name="state" />
|
<field name="state" />
|
||||||
<field name="priority" />
|
<field name="priority" />
|
||||||
<field name="cleaning_comments" />
|
<field name="cleaning_comments" />
|
||||||
<field name="employee_ids" />
|
<field name="housekeeper_ids" />
|
||||||
<field name="parent_id" />
|
<field name="parent_id" />
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
@@ -73,7 +73,12 @@
|
|||||||
<group class="col-6">
|
<group class="col-6">
|
||||||
<field name="task_date" />
|
<field name="task_date" />
|
||||||
<field name="priority" />
|
<field name="priority" />
|
||||||
<field name="employee_ids" widget="many2many_tags" />
|
<field
|
||||||
|
name="housekeeper_ids"
|
||||||
|
widget="many2many_tags"
|
||||||
|
domain="[('id', 'in', allowed_housekeeper_ids)]"
|
||||||
|
/>
|
||||||
|
<field name="allowed_housekeeper_ids" invisible="1"/>
|
||||||
</group>
|
</group>
|
||||||
<group class="col-12">
|
<group class="col-12">
|
||||||
<field name="parent_id" />
|
<field name="parent_id" />
|
||||||
|
|||||||
Reference in New Issue
Block a user