From a74a4e37e05d9ed3ce7b957172ece274ac5478de Mon Sep 17 00:00:00 2001 From: braisab Date: Fri, 6 May 2022 17:44:15 +0200 Subject: [PATCH] [IMP]pms: added short_name field in rooms and tests --- pms/models/pms_room.py | 63 +++++++++++++++++- pms/tests/test_pms_room.py | 122 +++++++++++++++++++++++++++++++++++ pms/views/pms_room_views.xml | 3 +- 3 files changed, 185 insertions(+), 3 deletions(-) diff --git a/pms/models/pms_room.py b/pms/models/pms_room.py index 0c03d5cc7..beba3be96 100644 --- a/pms/models/pms_room.py +++ b/pms/models/pms_room.py @@ -101,13 +101,25 @@ class PmsRoom(models.Model): translate=True, ) + short_name = fields.Char( + string="Short Name", + help="Four character name, if not set, autocompletes with the first two letters of " + "the room name and two incremental numbers", + ) + _sql_constraints = [ ( "room_property_unique", "unique(name, pms_property_id)", - "you cannot have more than one room " + "You cannot have more than one room " "with the same name in the same property", - ) + ), + ( + "room_short_name_unique", + "unique(short_name, pms_property_id)", + "You cannot have more than one room " + "with the same short name in the same property", + ), ] @api.depends("child_ids") @@ -174,6 +186,53 @@ class PmsRoom(models.Model): ) ) + @api.constrains("short_name") + def _check_short_name(self): + for record in self: + if len(record.short_name) > 4: + raise ValidationError( + _("The short name can't contain more than 4 characters") + ) + + @api.model + def create(self, vals): + if vals.get("name") and not vals.get("short_name"): + if len(vals["name"]) > 4: + short_name = self.calculate_short_name(vals) + vals.update({"short_name": short_name}) + else: + vals.update({"short_name": vals["name"]}) + return super(PmsRoom, self).create(vals) + + def write(self, vals): + if vals.get("name") and not vals.get("short_name"): + if len(vals["name"]) > 4: + short_name = self.calculate_short_name(vals) + vals.update({"short_name": short_name}) + else: + vals.update({"short_name": vals["name"]}) + return super(PmsRoom, self).write(vals) + + def calculate_short_name(self, vals): + short_name = vals["name"][:2].upper() + pms_property_id = self.pms_property_id.id + if vals.get("pms_property_id"): + pms_property_id = vals["pms_property_id"] + rooms = self.env["pms.room"].search([("pms_property_id", "=", pms_property_id)]) + same_name_rooms = rooms.filtered( + lambda room: room.name[:2].upper() == short_name + ) + numbers_name = [0] + for room in same_name_rooms: + if room.short_name and room.short_name[:2] == short_name: + if all(character.isdigit() for character in room.short_name[2:4]): + numbers_name.append(int(room.short_name[2:4])) + max_number = max(numbers_name) + 1 + if max_number < 10: + max_number = str(max_number).zfill(2) + short_name += max_number + return short_name + # Business methods def get_capacity(self, extra_bed=0): diff --git a/pms/tests/test_pms_room.py b/pms/tests/test_pms_room.py index 6d0fd4369..60feabcdc 100644 --- a/pms/tests/test_pms_room.py +++ b/pms/tests/test_pms_room.py @@ -1,5 +1,6 @@ from psycopg2 import IntegrityError +from odoo.exceptions import ValidationError from odoo.tools import mute_logger from .common import TestPms @@ -218,3 +219,124 @@ class TestPmsRoom(TestPms): expected_display_name, "The display name of the room is not as expected", ) + + def test_short_name_room_name_gt_4(self): + """ + It checks through subtest that the short names of the + rooms are correctly established when the names of these + exceed 4 characters. + ------------------------------------------------------- + First a room_type (Sweet Imperial) is created. Then 6 rooms + are created with the name Sweet Imperial + room number. Finally + in a loop we check that the short name of the rooms was set + correctly: 'SW01, SW02, SW03...' + """ + self.room_type2 = self.env["pms.room.type"].create( + { + "pms_property_ids": [self.pms_property1.id], + "name": "Sweet Imperial", + "default_code": "SWI", + "class_id": self.room_type_class1.id, + "list_price": 100, + } + ) + rooms = [] + self.room1 = self.env["pms.room"].create( + { + "name": "Sweet Imperial 101", + "pms_property_id": self.pms_property1.id, + "room_type_id": self.room_type2.id, + } + ) + rooms.append(self.room1) + self.room2 = self.env["pms.room"].create( + { + "name": "Sweet Imperial 102", + "pms_property_id": self.pms_property1.id, + "room_type_id": self.room_type2.id, + } + ) + rooms.append(self.room2) + self.room3 = self.env["pms.room"].create( + { + "name": "Sweet Imperial 103", + "pms_property_id": self.pms_property1.id, + "room_type_id": self.room_type2.id, + } + ) + rooms.append(self.room3) + self.room4 = self.env["pms.room"].create( + { + "name": "Sweet Imperial 104", + "pms_property_id": self.pms_property1.id, + "room_type_id": self.room_type2.id, + } + ) + rooms.append(self.room4) + self.room5 = self.env["pms.room"].create( + { + "name": "Sweet Imperial 105", + "pms_property_id": self.pms_property1.id, + "room_type_id": self.room_type2.id, + } + ) + rooms.append(self.room5) + self.room6 = self.env["pms.room"].create( + { + "name": "Sweet Imperial 106", + "pms_property_id": self.pms_property1.id, + "room_type_id": self.room_type2.id, + } + ) + rooms.append(self.room6) + for index, room in enumerate(rooms, start=1): + with self.subTest(room): + self.assertEqual( + room.short_name, + "SW0" + str(index), + "The short name of the room should be SW0" + str(index), + ) + + def test_short_name_room_name_lt_4(self): + """ + Checks that the short name of a room is equal to the name + when it does not exceed 4 characters. + --------------------------------------------------------- + A room is created with a name less than 4 characters (101). + Then it is verified that the short name and the name of the + room are the same. + """ + self.room1 = self.env["pms.room"].create( + { + "name": "101", + "pms_property_id": self.pms_property1.id, + "room_type_id": self.room_type1.id, + } + ) + self.assertEqual( + self.room1.short_name, + self.room1.name, + "The short name of the room should be equal to the name of the room", + ) + + def test_short_name_gt_4_constraint(self): + """ + Check that the short name of a room cannot exceed 4 characters. + -------------------------------------------------------------- + A room named 201 is created. Afterwards, it is verified that a + ValidationError is thrown when trying to change the short name + of that room to 'SIN-201'. + """ + self.room1 = self.env["pms.room"].create( + { + "name": "201", + "pms_property_id": self.pms_property1.id, + "room_type_id": self.room_type1.id, + } + ) + + with self.assertRaises( + ValidationError, + msg="The short_name of the room should not be able to be write.", + ): + self.room1.write({"short_name": "SIN-201"}) diff --git a/pms/views/pms_room_views.xml b/pms/views/pms_room_views.xml index c0d18f339..78acc0faa 100644 --- a/pms/views/pms_room_views.xml +++ b/pms/views/pms_room_views.xml @@ -45,6 +45,7 @@ /> + @@ -185,7 +186,7 @@ - +