From 8f0e62f622da99de8c21ce1b03bd15938ddbce54 Mon Sep 17 00:00:00 2001 From: Dario Lodeiros Date: Thu, 8 Nov 2018 12:21:50 +0100 Subject: [PATCH 01/13] [WIP] Refactoring Code --- hotel/data/hotel_data.xml | 24 ++++++++++++------------ hotel/models/hotel_room.py | 4 +++- hotel/models/hotel_room_type.py | 12 +++++++++++- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/hotel/data/hotel_data.xml b/hotel/data/hotel_data.xml index 7861a5487..dbd531704 100644 --- a/hotel/data/hotel_data.xml +++ b/hotel/data/hotel_data.xml @@ -13,33 +13,33 @@ - + Beds - + Connectivity - + Extra - + Twin Beds - + - + Double Beds - + - + Extra Bed - + - + 4G - + @@ -116,7 +116,7 @@ 25.00 3 - diff --git a/hotel/models/hotel_room.py b/hotel/models/hotel_room.py index c4896cc2e..a71d5c71c 100644 --- a/hotel/models/hotel_room.py +++ b/hotel/models/hotel_room.py @@ -16,7 +16,9 @@ class HotelRoom(models.Model): name = fields.Char('Room Name', required=True) active = fields.Boolean('Active', default=True) sequence = fields.Integer('Sequence', default=0) - room_type_id = fields.Many2one('hotel.room.type', 'Hotel Room Type') + room_type_id = fields.Many2one('hotel.room.type', 'Hotel Room Type', + required=True, + ondelete='restrict') floor_id = fields.Many2one('hotel.floor', 'Ubication', help='At which floor the room is located.') max_adult = fields.Integer('Max Adult') diff --git a/hotel/models/hotel_room_type.py b/hotel/models/hotel_room_type.py index 759f94d2d..068bfc18e 100644 --- a/hotel/models/hotel_room_type.py +++ b/hotel/models/hotel_room_type.py @@ -1,7 +1,8 @@ # Copyright 2017 Alexandre Díaz # Copyright 2017 Dario Lodeiros # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import models, fields, api +from odoo import models, fields, api, _ +from odoo.exceptions import ValidationError class HotelRoomType(models.Model): """ Before creating a 'room type', you need to consider the following: @@ -43,6 +44,15 @@ class HotelRoomType(models.Model): # total number of rooms in this type total_rooms_count = fields.Integer(compute='_compute_total_rooms') + @api.multi + @api.constrains('room_ids') + def _check_capacity(self): + for record in self: + for room in record.room_ids: + if room.room_type_id and room.room_type_id != record.id: + raise ValidationError(_("You need change de room type from de room form")) + + @api.depends('room_ids') def _compute_total_rooms(self): for record in self: From 7851f3b429d52eb023cc21dd963c188eee51cf8a Mon Sep 17 00:00:00 2001 From: Dario Lodeiros Date: Thu, 8 Nov 2018 12:25:22 +0100 Subject: [PATCH 02/13] [WIP] comment import tests --- hotel/tests/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hotel/tests/__init__.py b/hotel/tests/__init__.py index 6166d346a..741b62584 100644 --- a/hotel/tests/__init__.py +++ b/hotel/tests/__init__.py @@ -20,5 +20,5 @@ # along with this program. If not, see . # ############################################################################## -from . import test_reservation -from . import test_folio +#from . import test_reservation +#from . import test_folio From 7e2ce09887dca1ff727c7302fef00adbc9e97a46 Mon Sep 17 00:00:00 2001 From: Pablo Date: Thu, 8 Nov 2018 12:29:55 +0100 Subject: [PATCH 03/13] [FIX] Delete fields in view --- hotel/views/hotel_room_type_availability_views.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/hotel/views/hotel_room_type_availability_views.xml b/hotel/views/hotel_room_type_availability_views.xml index 36d3b07c7..93d369dc9 100644 --- a/hotel/views/hotel_room_type_availability_views.xml +++ b/hotel/views/hotel_room_type_availability_views.xml @@ -15,8 +15,6 @@ - -
@@ -37,8 +35,6 @@ - - From 7d8a5ddf1b563837989de422973c5be8c15aedf9 Mon Sep 17 00:00:00 2001 From: QS5ELkMu Date: Thu, 8 Nov 2018 12:59:15 +0100 Subject: [PATCH 04/13] [IMP] Rename check_availability_room->check_availability_room_type --- hotel/models/hotel_reservation.py | 2 +- hotel/models/hotel_room_type.py | 7 +-- hotel/models/hotel_room_type_availability.py | 2 +- hotel/tests/test_hotel_room_type_model.py | 55 +++++++++++++++++++ hotel/wizard/duplicate_reservation.py | 4 +- hotel/wizard/massive_changes.py | 2 +- hotel/wizard/wizard_reservation.py | 2 +- .../models/hotel_calendar_management.py | 4 +- .../components/importer.py | 2 +- .../hotel_room_type_availability/common.py | 4 +- .../models/inherited_hotel_room_type.py | 4 +- 11 files changed, 71 insertions(+), 17 deletions(-) create mode 100644 hotel/tests/test_hotel_room_type_model.py diff --git a/hotel/models/hotel_reservation.py b/hotel/models/hotel_reservation.py index 2cc090865..18d7d81d9 100644 --- a/hotel/models/hotel_reservation.py +++ b/hotel/models/hotel_reservation.py @@ -353,7 +353,7 @@ class HotelReservation(models.Model): checkout = values.get('checkout') room_type = values.get('room_type_id') if checkin and checkout and room_type: - room_chosen = self.env['hotel.room.type'].check_availability_room(checkin, checkout, room_type)[0] + room_chosen = self.env['hotel.room.type'].check_availability_room_type(checkin, checkout, room_type)[0] # Check room_chosen exist res.update({ 'room_id': room_chosen.id diff --git a/hotel/models/hotel_room_type.py b/hotel/models/hotel_room_type.py index 068bfc18e..26e789eb9 100644 --- a/hotel/models/hotel_room_type.py +++ b/hotel/models/hotel_room_type.py @@ -12,7 +12,7 @@ class HotelRoomType(models.Model): _name = "hotel.room.type" _description = "Room Type" _inherits = {'product.product': 'product_id'} - + # Relationship between models product_id = fields.Many2one('product.product', 'Product Room Type', required=True, delegate=True, @@ -51,7 +51,7 @@ class HotelRoomType(models.Model): for room in record.room_ids: if room.room_type_id and room.room_type_id != record.id: raise ValidationError(_("You need change de room type from de room form")) - + @api.depends('room_ids') def _compute_total_rooms(self): @@ -74,8 +74,7 @@ class HotelRoomType(models.Model): return min(capacities) if any(capacities) else 0 @api.model - # TODO Rename to check_availability_room_type - def check_availability_room(self, dfrom, dto, + def check_availability_room_type(self, dfrom, dto, room_type_id=False, notthis=[]): """ Check the avalability for an specific type of room diff --git a/hotel/models/hotel_room_type_availability.py b/hotel/models/hotel_room_type_availability.py index e15c600c9..84a076182 100644 --- a/hotel/models/hotel_room_type_availability.py +++ b/hotel/models/hotel_room_type_availability.py @@ -27,7 +27,7 @@ class HotelRoomTypeAvailability(models.Model): record.avail = 0 else: room_type_obj = self.env['hotel.room.type'] - cavail = len(room_type_obj.check_availability_room( + cavail = len(room_type_obj.check_availability_room_type( record.date, record.date, room_type_id=record.room_type_id.id)) diff --git a/hotel/tests/test_hotel_room_type_model.py b/hotel/tests/test_hotel_room_type_model.py new file mode 100644 index 000000000..b847e156e --- /dev/null +++ b/hotel/tests/test_hotel_room_type_model.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2017 Solucións Aloxa S.L. +# Alexandre Díaz +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## +from datetime import timedelta +from .common import TestHotel +from odoo.addons.hotel import date_utils + + +class TestHotelRoomType(TestHotel): + + def test_cancel_folio(self): + now_utc_dt = date_utils.now() + + org_reserv_start_utc_dt = now_utc_dt + timedelta(days=3) + org_reserv_end_utc_dt = org_reserv_start_utc_dt + timedelta(days=6) + folio = self.create_folio(self.user_hotel_manager, self.partner_2) + reservation_a = self.create_reservation( + self.user_hotel_manager, + folio, + org_reserv_start_utc_dt, + org_reserv_end_utc_dt, + self.hotel_room_double_200, + "Reservation Test #1") + reservation_b = self.create_reservation( + self.user_hotel_manager, + folio, + org_reserv_start_utc_dt, + org_reserv_end_utc_dt, + self.hotel_room_simple_100, + "Reservation Test #2") + self.assertEqual(len(folio.room_lines), 2, 'Invalid room lines count') + folio.action_cancel() + self.assertEqual(folio.state, 'cancel', 'Invalid folio state') + for rline in folio.room_lines: + self.assertEqual(rline.state, 'cancelled', + 'Invalid reservation state') diff --git a/hotel/wizard/duplicate_reservation.py b/hotel/wizard/duplicate_reservation.py index 96016d069..3af205cf9 100644 --- a/hotel/wizard/duplicate_reservation.py +++ b/hotel/wizard/duplicate_reservation.py @@ -32,7 +32,7 @@ class DuplicateReservationWizard(models.TransientModel): })) # Check Input - avails = hotel_room_type_obj.check_availability_room( + avails = hotel_room_type_obj.check_availability_room_type( reservation_id.checkin, reservation_id.checkout, room_type_id=reservation_id.room_type_id.id) @@ -43,7 +43,7 @@ class DuplicateReservationWizard(models.TransientModel): There are no '%d' free rooms") % self.num) for i in range(0, self.num): - free_rooms = hotel_room_type_obj.check_availability_room( + free_rooms = hotel_room_type_obj.check_availability_room_type( reservation_id.checkin, reservation_id.checkout, room_type_id=reservation_id.room_type_id.id) diff --git a/hotel/wizard/massive_changes.py b/hotel/wizard/massive_changes.py index 7e1d93528..252bfc6c9 100644 --- a/hotel/wizard/massive_changes.py +++ b/hotel/wizard/massive_changes.py @@ -192,7 +192,7 @@ class MassiveChangesWizard(models.TransientModel): hotel_room_type_obj = self.env['hotel.room.type'] vals = {} if record.change_avail: - cavail = len(hotel_room_type_obj.check_availability_room( + cavail = len(hotel_room_type_obj.check_availability_room_type( ndate.strftime(DEFAULT_SERVER_DATETIME_FORMAT), ndate.strftime(DEFAULT_SERVER_DATETIME_FORMAT), room_type_id=room_type.id)) diff --git a/hotel/wizard/wizard_reservation.py b/hotel/wizard/wizard_reservation.py index 7671e5f17..6db0969ed 100644 --- a/hotel/wizard/wizard_reservation.py +++ b/hotel/wizard/wizard_reservation.py @@ -281,7 +281,7 @@ class HotelRoomTypeWizards(models.TransientModel): avail_restrictions = self.env['hotel.room.type.availability'].search([ ('room_type_id', '=', res.room_type_id.id) ]) - real_max = len(res.room_type_id.check_availability_room( + real_max = len(res.room_type_id.check_availability_room_type( res.checkin, res.checkout, res.room_type_id.id)) diff --git a/hotel_calendar/models/hotel_calendar_management.py b/hotel_calendar/models/hotel_calendar_management.py index 05aa173a5..523162ca7 100644 --- a/hotel_calendar/models/hotel_calendar_management.py +++ b/hotel_calendar/models/hotel_calendar_management.py @@ -36,7 +36,7 @@ class HotelCalendarManagement(models.TransientModel): @api.model def _get_availability_values(self, avail, room_type): room_type_obj = self.env['hotel.room.type'] - cavail = len(room_type_obj.check_availability_room( + cavail = len(room_type_obj.check_availability_room_type( avail['date'], avail['date'], room_type_id=room_type.id)) ravail = min(cavail, room_type.total_rooms_count, int(avail['avail'])) vals = { @@ -251,7 +251,7 @@ class HotelCalendarManagement(models.TransientModel): json_data.setdefault(room_type.id, []).append({ 'date': cur_date_str, 'num': len( - room_type_obj.check_availability_room( + room_type_obj.check_availability_room_type( cur_date_str, cur_date_str, room_type_id=room_type.id)), diff --git a/hotel_channel_connector/components/importer.py b/hotel_channel_connector/components/importer.py index 2127da1ff..35608e458 100644 --- a/hotel_channel_connector/components/importer.py +++ b/hotel_channel_connector/components/importer.py @@ -367,7 +367,7 @@ class HotelChannelConnectorImporter(AbstractComponent): internal_message="Invalid reservation total price! %.2f != %.2f" % (vals['price_unit'], book['amount']), channel_object_id=book['reservation_code']) - free_rooms = room_type.odoo_id.check_availability_room( + free_rooms = room_type.odoo_id.check_availability_room_type( checkin_str, checkout_str, room_type_id=room_type.odoo_id.id, diff --git a/hotel_channel_connector/models/hotel_room_type_availability/common.py b/hotel_channel_connector/models/hotel_room_type_availability/common.py index ccd521a36..4c54d0e51 100644 --- a/hotel_channel_connector/models/hotel_room_type_availability/common.py +++ b/hotel_channel_connector/models/hotel_room_type_availability/common.py @@ -100,7 +100,7 @@ class HotelRoomTypeAvailability(models.Model): room_type_obj = self.env['hotel.room.type'] issue_obj = self.env['hotel.channel.connector.issue'] for record in self: - cavail = len(room_type_obj.check_availability_room( + cavail = len(room_type_obj.check_availability_room_type( record.date, record.date, room_type_id=record.room_type_id.id)) @@ -143,7 +143,7 @@ class HotelRoomTypeAvailability(models.Model): for i in range(0, date_diff): ndate_dt = date_start + timedelta(days=i) ndate_str = ndate_dt.strftime(DEFAULT_SERVER_DATE_FORMAT) - avail = len(room_type_obj.check_availability_room( + avail = len(room_type_obj.check_availability_room_type( ndate_str, ndate_str, room_type_id=room_type.id)) diff --git a/hotel_node_helper/models/inherited_hotel_room_type.py b/hotel_node_helper/models/inherited_hotel_room_type.py index 0887b49c1..7f2695522 100644 --- a/hotel_node_helper/models/inherited_hotel_room_type.py +++ b/hotel_node_helper/models/inherited_hotel_room_type.py @@ -18,12 +18,12 @@ class HotelRoomType(models.Model): Check availability for all or specific room types between dates @return: A list of `ids` with free rooms """ - free_rooms = super().check_availability_room(dfrom, dto, room_type_id, notthis) + free_rooms = super().check_availability_room_type(dfrom, dto, room_type_id, notthis) return free_rooms.ids @api.model def get_room_type_availability(self, dfrom, dto, room_type_id): - free_rooms = self.check_availability_room(dfrom, dto) + free_rooms = self.check_availability_room_type(dfrom, dto) availability_real = self.env['hotel.room'].search_count([ ('id', 'in', free_rooms.ids), ('room_type_id', '=', room_type_id), From c3891c81698f1bd03226ba738fc1bb619d0378ae Mon Sep 17 00:00:00 2001 From: Pablo Date: Thu, 8 Nov 2018 13:02:39 +0100 Subject: [PATCH 05/13] [WIP] Preparing tests --- hotel/tests/common.py | 196 +++------------------------ hotel/tests/test_hotel_room_model.py | 55 ++++++++ 2 files changed, 75 insertions(+), 176 deletions(-) create mode 100644 hotel/tests/test_hotel_room_model.py diff --git a/hotel/tests/common.py b/hotel/tests/common.py index 99ba08061..efd4bb8f9 100644 --- a/hotel/tests/common.py +++ b/hotel/tests/common.py @@ -23,19 +23,16 @@ from datetime import timedelta from odoo import api, fields from odoo.tests import common -from openerp.tools import ( +from odoo.tools import ( DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT) -from odoo.addons.mail.tests.common import TestMail -from odoo.addons.hotel import date_utils -import pytz import logging _logger = logging.getLogger(__name__) # TestMail crea recursos utiles para nuestros test... # por ejemplo, usuarios con distintos tipos de nivel, etc... -class TestHotel(TestMail): +class TestHotel(common.SavepointCase): @classmethod def _init_mock_hotel(cls): @@ -67,13 +64,13 @@ class TestHotel(TestMail): "Hotel Calendar can't create a new reservation!") # Create Reservation Lines + Update Reservation Price - days_diff = date_utils.date_diff(checkin, checkout, hours=False) - res = reservation.sudo(creator).prepare_reservation_lines( - checkin.strftime(DEFAULT_SERVER_DATETIME_FORMAT), days_diff) - reservation.sudo(creator).write({ - 'reservation_lines': res['commands'], - 'price_unit': res['total_price'], - }) + # days_diff = date_utils.date_diff(checkin, checkout, hours=False) + # res = reservation.sudo(creator).prepare_reservation_lines( + # checkin.strftime(DEFAULT_SERVER_DATETIME_FORMAT), days_diff) + # reservation.sudo(creator).write({ + # 'reservation_lines': res['commands'], + # 'price_unit': res['total_price'], + # }) return reservation @@ -83,169 +80,16 @@ class TestHotel(TestMail): cls._init_mock_hotel() - # Restriction Plan - cls.restriction_1 = cls.env['hotel.room.type.restriction'].create({ - 'name': 'Restriction Test #1', - 'active': True - }) - - # Pricelist - cls.pricelist_1 = cls.env['product.pricelist'].create({ - 'name': 'Pricelist Test #1', - }) - - # Minimal Hotel Configuration - cls.tz_hotel = 'Europe/Madrid' - cls.default_pricelist_id = cls.pricelist_1.id - cls.default_restriction_id = cls.restriction_1.id - cls.env['ir.values'].sudo().set_default('res.config.settings', - 'tz_hotel', cls.tz_hotel) - cls.env['ir.values'].sudo().set_default('res.config.settings', - 'default_pricelist_id', - cls.default_pricelist_id) - cls.env['ir.values'].sudo().set_default('res.config.settings', - 'default_restriction_id', - cls.default_restriction_id) - - # User Groups - user_group_hotel_manager = cls.env.ref('hotel.group_hotel_manager') - user_group_hotel_user = cls.env.ref('hotel.group_hotel_user') - user_group_employee = cls.env.ref('base.group_user') - user_group_public = cls.env.ref('base.group_public') - user_group_account_inv = cls.env.ref('account.group_account_invoice') - user_group_sale_manager = cls.env.ref('sales_team.group_sale_manager') - user_group_base_partner_manager = cls.env.ref( - 'base.group_partner_manager') - - # Create Test Users - Users = cls.env['res.users'].with_context({ - 'no_reset_password': True, - 'mail_create_nosubscribe': True - }) - cls.user_hotel_manager = Users.create({ - 'name': 'Jeff Hotel Manager', - 'login': 'hoteljeff', - 'email': 'mynameisjeff@example.com', - 'signature': '--\nJeff', - 'notify_email': 'always', - 'groups_id': [(6, 0, [user_group_hotel_manager.id, - user_group_employee.id, - user_group_account_inv.id, - user_group_sale_manager.id, - user_group_base_partner_manager.id])] - }) - cls.user_hotel_user = Users.create({ - 'name': 'Juancho Hotel User', - 'login': 'juancho', - 'email': 'juancho@example.com', - 'signature': '--\nJuancho', - 'notify_email': 'always', - 'groups_id': [(6, 0, [user_group_hotel_user.id, - user_group_public.id])] - }) - # Create Tests Records - RoomTypes = cls.env['hotel.room.type'] - cls.hotel_room_type_simple = RoomTypes.create({ - 'name': 'Simple', - 'code_type': 'TSMP', - }) - cls.hotel_room_type_double = RoomTypes.create({ - 'name': 'Double', - 'code_type': 'TDBL', - }) + cls.room_type_0 = cls.env.ref('hotel_room_type_0') + cls.room_type_1 = cls.env.ref('hotel_room_type_1') + cls.room_type_2 = cls.env.ref('hotel_room_type_2') + cls.room_type_3 = cls.env.ref('hotel_room_type_3') - VRooms = cls.env['hotel.virtual.room'] - cls.hotel_room_type_budget = VRooms.create({ - 'name': 'Budget Room', - 'virtual_code': '001', - 'list_price': 50, - }) - cls.hotel_room_type_special = VRooms.create({ - 'name': 'Special Room', - 'virtual_code': '002', - 'list_price': 150, - }) - - Rooms = cls.env['hotel.room'] - cls.hotel_room_simple_100 = Rooms.create({ - 'name': '100', - 'sale_price_type': 'room_type', - 'price_room_type': cls.hotel_room_type_budget.id, - 'categ_id': cls.hotel_room_type_simple.cat_id.id, - 'capacity': 1, - }) - cls.hotel_room_simple_101 = Rooms.create({ - 'name': '101', - 'sale_price_type': 'room_type', - 'price_room_type': cls.hotel_room_type_budget.id, - 'categ_id': cls.hotel_room_type_simple.cat_id.id, - 'capacity': 1, - 'sequence': 1, - }) - cls.hotel_room_double_200 = Rooms.create({ - 'name': '200', - 'sale_price_type': 'room_type', - 'price_room_type': cls.hotel_room_type_special.id, - 'categ_id': cls.hotel_room_type_double.cat_id.id, - 'capacity': 2, - }) - - cls.hotel_room_type_budget.write({ - 'room_ids': [(6, False, [cls.hotel_room_simple_100.id, - cls.hotel_room_simple_101.id])], - }) - cls.hotel_room_type_special.write({ - 'room_ids': [(6, False, [cls.hotel_room_double_200.id])], - }) - - # Create a week of fresh data - now_utc_dt = date_utils.now() - cls.avails_tmp = { - cls.hotel_room_type_budget.id: (1, 2, 2, 1, 1, 2, 2), - cls.hotel_room_type_special.id: (1, 1, 1, 1, 1, 1, 1), - } - cls.prices_tmp = { - cls.hotel_room_type_budget.id: (10.0, 80.0, 80.0, 95.0, 90.0, 80.0, - 20.0), - cls.hotel_room_type_special.id: (5.0, 15.0, 15.0, 35.0, 35.0, 10.0, - 10.0), - } - cls.restrictions_min_stay_tmp = { - cls.hotel_room_type_budget.id: (0, 1, 2, 1, 1, 0, 0), - cls.hotel_room_type_special.id: (3, 1, 0, 2, 0, 1, 4), - } - budget_product_id = cls.hotel_room_type_budget.product_id - special_product_id = cls.hotel_room_type_special.product_id - product_tmpl_ids = { - cls.hotel_room_type_budget.id: budget_product_id.product_tmpl_id.id, - cls.hotel_room_type_special.id: special_product_id.product_tmpl_id.id, - } - room_type_avail_obj = cls.env['hotel.room.type.availability'] - room_type_rest_item_obj = cls.env['hotel.room.type.restriction.item'] - pricelist_item_obj = cls.env['product.pricelist.item'] - for k_vr, v_vr in cls.avails_tmp.iteritems(): - for i in range(0, len(v_vr)): - ndate = now_utc_dt + timedelta(days=i) - room_type_avail_obj.create({ - 'room_type_id': k_vr, - 'avail': v_vr[i], - 'date': ndate.strftime(DEFAULT_SERVER_DATE_FORMAT) - }) - room_type_rest_item_obj.create({ - 'room_type_id': k_vr, - 'restriction_id': cls.default_restriction_id, - 'date_start': ndate.strftime(DEFAULT_SERVER_DATE_FORMAT), - 'date_end': ndate.strftime(DEFAULT_SERVER_DATE_FORMAT), - 'applied_on': '0_room_type', - 'min_stay': cls.restrictions_min_stay_tmp[k_vr][i], - }) - pricelist_item_obj.create({ - 'pricelist_id': cls.default_pricelist_id, - 'date_start': ndate.strftime(DEFAULT_SERVER_DATE_FORMAT), - 'date_end': ndate.strftime(DEFAULT_SERVER_DATE_FORMAT), - 'compute_price': 'fixed', - 'applied_on': '1_product', - 'product_tmpl_id': product_tmpl_ids[k_vr], - 'fixed_price': cls.prices_tmp[k_vr][i], - }) + cls.room_0 = cls.env.ref('hotel_room_0') + cls.room_1 = cls.env.ref('hotel_room_1') + cls.room_2 = cls.env.ref('hotel_room_2') + cls.room_3 = cls.env.ref('hotel_room_3') + cls.room_4 = cls.env.ref('hotel_room_4') + cls.room_5 = cls.env.ref('hotel_room_5') + cls.room_6 = cls.env.ref('hotel_room_6') diff --git a/hotel/tests/test_hotel_room_model.py b/hotel/tests/test_hotel_room_model.py new file mode 100644 index 000000000..0e3b73071 --- /dev/null +++ b/hotel/tests/test_hotel_room_model.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2017 Solucións Aloxa S.L. +# Alexandre Díaz +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## +from datetime import timedelta +from .common import TestHotel +from odoo.addons.hotel import date_utils + + +class TestHotelRoom(TestHotel): + + def test_cancel_folio(self): + now_utc_dt = date_utils.now() + + org_reserv_start_utc_dt = now_utc_dt + timedelta(days=3) + org_reserv_end_utc_dt = org_reserv_start_utc_dt + timedelta(days=6) + folio = self.create_folio(self.user_hotel_manager, self.partner_2) + reservation_a = self.create_reservation( + self.user_hotel_manager, + folio, + org_reserv_start_utc_dt, + org_reserv_end_utc_dt, + self.hotel_room_double_200, + "Reservation Test #1") + reservation_b = self.create_reservation( + self.user_hotel_manager, + folio, + org_reserv_start_utc_dt, + org_reserv_end_utc_dt, + self.hotel_room_simple_100, + "Reservation Test #2") + self.assertEqual(len(folio.room_lines), 2, 'Invalid room lines count') + folio.action_cancel() + self.assertEqual(folio.state, 'cancel', 'Invalid folio state') + for rline in folio.room_lines: + self.assertEqual(rline.state, 'cancelled', + 'Invalid reservation state') From c1ac80d846881aa6e3dc4ad2a5c8eb58597d3904 Mon Sep 17 00:00:00 2001 From: Dario Lodeiros Date: Thu, 8 Nov 2018 13:50:46 +0100 Subject: [PATCH 06/13] [WIP] Test cases --- hotel/data/hotel_data.xml | 14 ++++----- hotel/tests/__init__.py | 1 + hotel/tests/test_hotel_room_type_model.py | 36 +++++------------------ 3 files changed, 16 insertions(+), 35 deletions(-) diff --git a/hotel/data/hotel_data.xml b/hotel/data/hotel_data.xml index dbd531704..51343aa87 100644 --- a/hotel/data/hotel_data.xml +++ b/hotel/data/hotel_data.xml @@ -13,31 +13,31 @@ - + Beds - + Connectivity - + Extra - + Twin Beds - + Double Beds - + Extra Bed - + 4G diff --git a/hotel/tests/__init__.py b/hotel/tests/__init__.py index 741b62584..6289c6fab 100644 --- a/hotel/tests/__init__.py +++ b/hotel/tests/__init__.py @@ -22,3 +22,4 @@ ############################################################################## #from . import test_reservation #from . import test_folio +from . import test_hotel_room_type_model diff --git a/hotel/tests/test_hotel_room_type_model.py b/hotel/tests/test_hotel_room_type_model.py index b847e156e..360b47968 100644 --- a/hotel/tests/test_hotel_room_type_model.py +++ b/hotel/tests/test_hotel_room_type_model.py @@ -20,36 +20,16 @@ # along with this program. If not, see . # ############################################################################## -from datetime import timedelta from .common import TestHotel -from odoo.addons.hotel import date_utils - +from odoo.exceptions import ValidationError class TestHotelRoomType(TestHotel): - def test_cancel_folio(self): - now_utc_dt = date_utils.now() + def test_change_room_ids(self): - org_reserv_start_utc_dt = now_utc_dt + timedelta(days=3) - org_reserv_end_utc_dt = org_reserv_start_utc_dt + timedelta(days=6) - folio = self.create_folio(self.user_hotel_manager, self.partner_2) - reservation_a = self.create_reservation( - self.user_hotel_manager, - folio, - org_reserv_start_utc_dt, - org_reserv_end_utc_dt, - self.hotel_room_double_200, - "Reservation Test #1") - reservation_b = self.create_reservation( - self.user_hotel_manager, - folio, - org_reserv_start_utc_dt, - org_reserv_end_utc_dt, - self.hotel_room_simple_100, - "Reservation Test #2") - self.assertEqual(len(folio.room_lines), 2, 'Invalid room lines count') - folio.action_cancel() - self.assertEqual(folio.state, 'cancel', 'Invalid folio state') - for rline in folio.room_lines: - self.assertEqual(rline.state, 'cancelled', - 'Invalid reservation state') + # Avoid the unconscious change of room type_id from room_type + #TODO: use sudo users hotel + with self.assertRaises(ValidationError): + cls.room_type_0.sudo().write({ + 'room_ids':(4, cls.room_type_3.id) + }) From f87a96fc9d3135185953d701632621ad591d7aa0 Mon Sep 17 00:00:00 2001 From: Pablo Date: Thu, 8 Nov 2018 16:04:58 +0100 Subject: [PATCH 07/13] [WIP] Upodating tests --- hotel/models/hotel_room_type.py | 9 ------ hotel/tests/__init__.py | 1 + hotel/tests/common.py | 24 ++++++++-------- hotel/tests/test_hotel_room_model.py | 35 +++++------------------ hotel/tests/test_hotel_room_type_model.py | 13 ++++----- 5 files changed, 26 insertions(+), 56 deletions(-) diff --git a/hotel/models/hotel_room_type.py b/hotel/models/hotel_room_type.py index 26e789eb9..17577d3da 100644 --- a/hotel/models/hotel_room_type.py +++ b/hotel/models/hotel_room_type.py @@ -44,15 +44,6 @@ class HotelRoomType(models.Model): # total number of rooms in this type total_rooms_count = fields.Integer(compute='_compute_total_rooms') - @api.multi - @api.constrains('room_ids') - def _check_capacity(self): - for record in self: - for room in record.room_ids: - if room.room_type_id and room.room_type_id != record.id: - raise ValidationError(_("You need change de room type from de room form")) - - @api.depends('room_ids') def _compute_total_rooms(self): for record in self: diff --git a/hotel/tests/__init__.py b/hotel/tests/__init__.py index 6289c6fab..09be3071d 100644 --- a/hotel/tests/__init__.py +++ b/hotel/tests/__init__.py @@ -23,3 +23,4 @@ #from . import test_reservation #from . import test_folio from . import test_hotel_room_type_model +from . import test_hotel_room_model diff --git a/hotel/tests/common.py b/hotel/tests/common.py index efd4bb8f9..b0b6cb3dd 100644 --- a/hotel/tests/common.py +++ b/hotel/tests/common.py @@ -21,7 +21,7 @@ # ############################################################################## from datetime import timedelta -from odoo import api, fields +from odoo import api, fields from odoo.tests import common from odoo.tools import ( DEFAULT_SERVER_DATE_FORMAT, @@ -81,15 +81,15 @@ class TestHotel(common.SavepointCase): cls._init_mock_hotel() # Create Tests Records - cls.room_type_0 = cls.env.ref('hotel_room_type_0') - cls.room_type_1 = cls.env.ref('hotel_room_type_1') - cls.room_type_2 = cls.env.ref('hotel_room_type_2') - cls.room_type_3 = cls.env.ref('hotel_room_type_3') + cls.room_type_0 = cls.env.ref('hotel.hotel_room_type_0') + cls.room_type_1 = cls.env.ref('hotel.hotel_room_type_1') + cls.room_type_2 = cls.env.ref('hotel.hotel_room_type_2') + cls.room_type_3 = cls.env.ref('hotel.hotel_room_type_3') - cls.room_0 = cls.env.ref('hotel_room_0') - cls.room_1 = cls.env.ref('hotel_room_1') - cls.room_2 = cls.env.ref('hotel_room_2') - cls.room_3 = cls.env.ref('hotel_room_3') - cls.room_4 = cls.env.ref('hotel_room_4') - cls.room_5 = cls.env.ref('hotel_room_5') - cls.room_6 = cls.env.ref('hotel_room_6') + cls.room_0 = cls.env.ref('hotel.hotel_room_0') + cls.room_1 = cls.env.ref('hotel.hotel_room_1') + cls.room_2 = cls.env.ref('hotel.hotel_room_2') + cls.room_3 = cls.env.ref('hotel.hotel_room_3') + cls.room_4 = cls.env.ref('hotel.hotel_room_4') + cls.room_5 = cls.env.ref('hotel.hotel_room_5') + cls.room_6 = cls.env.ref('hotel.hotel_room_6') diff --git a/hotel/tests/test_hotel_room_model.py b/hotel/tests/test_hotel_room_model.py index 0e3b73071..4c28fdb2c 100644 --- a/hotel/tests/test_hotel_room_model.py +++ b/hotel/tests/test_hotel_room_model.py @@ -20,36 +20,15 @@ # along with this program. If not, see . # ############################################################################## -from datetime import timedelta from .common import TestHotel -from odoo.addons.hotel import date_utils +from odoo.exceptions import ValidationError class TestHotelRoom(TestHotel): - def test_cancel_folio(self): - now_utc_dt = date_utils.now() - - org_reserv_start_utc_dt = now_utc_dt + timedelta(days=3) - org_reserv_end_utc_dt = org_reserv_start_utc_dt + timedelta(days=6) - folio = self.create_folio(self.user_hotel_manager, self.partner_2) - reservation_a = self.create_reservation( - self.user_hotel_manager, - folio, - org_reserv_start_utc_dt, - org_reserv_end_utc_dt, - self.hotel_room_double_200, - "Reservation Test #1") - reservation_b = self.create_reservation( - self.user_hotel_manager, - folio, - org_reserv_start_utc_dt, - org_reserv_end_utc_dt, - self.hotel_room_simple_100, - "Reservation Test #2") - self.assertEqual(len(folio.room_lines), 2, 'Invalid room lines count') - folio.action_cancel() - self.assertEqual(folio.state, 'cancel', 'Invalid folio state') - for rline in folio.room_lines: - self.assertEqual(rline.state, 'cancelled', - 'Invalid reservation state') + def test_check_capacity(self): + # TODO Do the test using different users + with self.assertRaises(ValidationError): + self.room_0.sudo().write({ + 'capacity': 0 + }) diff --git a/hotel/tests/test_hotel_room_type_model.py b/hotel/tests/test_hotel_room_type_model.py index 360b47968..59a417298 100644 --- a/hotel/tests/test_hotel_room_type_model.py +++ b/hotel/tests/test_hotel_room_type_model.py @@ -21,15 +21,14 @@ # ############################################################################## from .common import TestHotel -from odoo.exceptions import ValidationError +from psycopg2 import IntegrityError + class TestHotelRoomType(TestHotel): - def test_change_room_ids(self): - - # Avoid the unconscious change of room type_id from room_type + def test_code_type_unique(self): #TODO: use sudo users hotel - with self.assertRaises(ValidationError): - cls.room_type_0.sudo().write({ - 'room_ids':(4, cls.room_type_3.id) + with self.assertRaises(IntegrityError): + self.room_type_0.sudo().write({ + 'code_type': self.room_type_1.code_type }) From 204b76e8ce65bef3f051a539b3e055ee59358014 Mon Sep 17 00:00:00 2001 From: Dario Lodeiros Date: Thu, 8 Nov 2018 17:24:56 +0100 Subject: [PATCH 08/13] [FIX] Travis Odoo Version --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index dc36e45bd..0ec96bcb4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ addons: env: global: - - VERSION="10.0" TESTS="0" LINT_CHECK="0" TRANSIFEX="0" UNIT_TEST="0" + - VERSION="11.0" TESTS="0" LINT_CHECK="0" TRANSIFEX="0" UNIT_TEST="0" # - TRANSIFEX_USER='transbot@odoo-community.org' # - secure: "XLhGdCIh86zcqww9qBpnk8Xqsf1Pcgw9SKr7X0KYBHJofHj4Z6Kq/oVFjpZ1LSjadsaABKbwY7h4hvKEpxZwptCv+fNTOKYy7hXFLGYnDeNeWu4zA4LI7TA5uPvyZjZ+g2xc+9dzR/VbfRHNqjvmgiEidxxqLeOnNFZ5CHdOdCw=" matrix: From 6bdadfa3bddce41a164cc780cce7fd09ca9f2148 Mon Sep 17 00:00:00 2001 From: Dario Lodeiros Date: Thu, 8 Nov 2018 17:24:56 +0100 Subject: [PATCH 09/13] [FIX] Travis Odoo Version --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index dc36e45bd..2e01dfa3a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: python python: - - "2.7" + - "3.5" sudo: false cache: pip @@ -18,7 +18,7 @@ addons: env: global: - - VERSION="10.0" TESTS="0" LINT_CHECK="0" TRANSIFEX="0" UNIT_TEST="0" + - VERSION="11.0" TESTS="0" LINT_CHECK="0" TRANSIFEX="0" UNIT_TEST="0" # - TRANSIFEX_USER='transbot@odoo-community.org' # - secure: "XLhGdCIh86zcqww9qBpnk8Xqsf1Pcgw9SKr7X0KYBHJofHj4Z6Kq/oVFjpZ1LSjadsaABKbwY7h4hvKEpxZwptCv+fNTOKYy7hXFLGYnDeNeWu4zA4LI7TA5uPvyZjZ+g2xc+9dzR/VbfRHNqjvmgiEidxxqLeOnNFZ5CHdOdCw=" matrix: From fa7eec265411abbae4b69d5b621ca6d72b35690b Mon Sep 17 00:00:00 2001 From: Dario Lodeiros Date: Thu, 8 Nov 2018 17:55:59 +0100 Subject: [PATCH 10/13] [ADD] Travis dependencies --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 2e01dfa3a..b6d6f3407 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,6 +37,10 @@ install: - git clone -b ${VERSION} https://github.com/OCA/web.git ${HOME}/dependencies/web --depth=1 - git clone -b ${VERSION} https://github.com/OCA/partner-contact.git ${HOME}/dependencies/partner-contact --depth=1 - git clone -b ${VERSION} https://github.com/OCA/account-payment.git ${HOME}/dependencies/account_payment_return --depth=1 + - git clone -b ${VERSION} https://github.com/OCA/connector.git ${HOME}/dependencies/connector --depth=1 + - git clone -b ${VERSION} https://github.com/OCA/queue.git ${HOME}/dependencies/queue --depth=1 + - pip install odoorpc + - pip install cachetools script: - travis_wait travis_run_tests From ee786792d51dd1671d08b7b78ad2db881aa95e6f Mon Sep 17 00:00:00 2001 From: Dario Lodeiros Date: Thu, 8 Nov 2018 18:04:13 +0100 Subject: [PATCH 11/13] [ADD] Travis pip anybox.testing --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index b6d6f3407..8d91195d8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,9 +12,6 @@ addons: packages: - expect-dev # provides unbuffer utility - python-lxml # because pip installation is slow - # needed because server-tools is loaded in the dependency chain - - unixodbc-dev - - python-mysqldb env: global: @@ -31,6 +28,7 @@ virtualenv: system_site_packages: true install: + - pip install anybox.testing.openerp - git clone https://github.com/OCA/maintainer-quality-tools.git ${HOME}/maintainer-quality-tools --depth=1 - export PATH=${HOME}/maintainer-quality-tools/travis:${PATH} - travis_install_nightly From e2af2ee6ead7d06b3f85176b1c2daef076437ecf Mon Sep 17 00:00:00 2001 From: Dario Lodeiros Date: Thu, 8 Nov 2018 18:08:14 +0100 Subject: [PATCH 12/13] [FIX] Travis --- .travis.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8d91195d8..582828af2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,11 +24,7 @@ env: - TESTS="1" ODOO_REPO="odoo/odoo" - TESTS="1" ODOO_REPO="OCA/OCB" -virtualenv: - system_site_packages: true - install: - - pip install anybox.testing.openerp - git clone https://github.com/OCA/maintainer-quality-tools.git ${HOME}/maintainer-quality-tools --depth=1 - export PATH=${HOME}/maintainer-quality-tools/travis:${PATH} - travis_install_nightly From 90a024a092b8409758482a40fd573d9a4e8b395c Mon Sep 17 00:00:00 2001 From: Dario Lodeiros Date: Thu, 8 Nov 2018 18:19:44 +0100 Subject: [PATCH 13/13] [FIX] del wdb --- hotel_node_helper/models/inherited_hotel_room_type.py | 1 - hotel_node_master/models/hotel_node.py | 1 - hotel_node_master/models/hotel_node_room_type.py | 1 - hotel_node_master/models/hotel_node_user.py | 1 - hotel_node_master/wizards/wizard_hotel_node_reservation.py | 2 -- 5 files changed, 6 deletions(-) diff --git a/hotel_node_helper/models/inherited_hotel_room_type.py b/hotel_node_helper/models/inherited_hotel_room_type.py index 7f2695522..1d82b85de 100644 --- a/hotel_node_helper/models/inherited_hotel_room_type.py +++ b/hotel_node_helper/models/inherited_hotel_room_type.py @@ -3,7 +3,6 @@ # Copyright 2018 Dario Lodeiros # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -import wdb from odoo import models, fields, api diff --git a/hotel_node_master/models/hotel_node.py b/hotel_node_master/models/hotel_node.py index f6863cbb4..b3bed344c 100644 --- a/hotel_node_master/models/hotel_node.py +++ b/hotel_node_master/models/hotel_node.py @@ -3,7 +3,6 @@ # Copyright 2018 Dario Lodeiros # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -import wdb import logging import urllib.error import odoorpc.odoo diff --git a/hotel_node_master/models/hotel_node_room_type.py b/hotel_node_master/models/hotel_node_room_type.py index 1da0ed93b..4c4c5e1f6 100644 --- a/hotel_node_master/models/hotel_node_room_type.py +++ b/hotel_node_master/models/hotel_node_room_type.py @@ -3,7 +3,6 @@ # Copyright 2018 Dario Lodeiros # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -import wdb import logging from odoo import models, fields, api, _ from odoo.exceptions import ValidationError diff --git a/hotel_node_master/models/hotel_node_user.py b/hotel_node_master/models/hotel_node_user.py index d6d0455dd..0cedaec0f 100644 --- a/hotel_node_master/models/hotel_node_user.py +++ b/hotel_node_master/models/hotel_node_user.py @@ -3,7 +3,6 @@ # Copyright 2018 Dario Lodeiros # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -import wdb import logging import urllib.error import odoorpc.odoo diff --git a/hotel_node_master/wizards/wizard_hotel_node_reservation.py b/hotel_node_master/wizards/wizard_hotel_node_reservation.py index f59eb59bf..a736c9e1c 100644 --- a/hotel_node_master/wizards/wizard_hotel_node_reservation.py +++ b/hotel_node_master/wizards/wizard_hotel_node_reservation.py @@ -2,7 +2,6 @@ # Copyright 2018 Alexandre Díaz # Copyright 2018 Dario Lodeiros # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -import wdb import logging import urllib.error import odoorpc.odoo @@ -129,7 +128,6 @@ class HotelNodeReservationWizard(models.TransientModel): # (fields.Date.from_string(rec.checkout) - fields.Date.from_string(rec.checkin)).days, # vals_reservation_lines # ) # [[5, 0, 0], ¿? - wdb.set_trace() room_lines.append((0, False, { 'room_type_id': rec.room_type_id.remote_room_type_id, 'checkin': rec.checkin,