diff --git a/pms/__init__.py b/pms/__init__.py index 36176c52..7e8befd2 100644 --- a/pms/__init__.py +++ b/pms/__init__.py @@ -4,3 +4,5 @@ from . import wizards from . import controllers from .init_hook import post_init_hook +from . import services +from . import datamodels diff --git a/pms/__manifest__.py b/pms/__manifest__.py index 2d76a791..acb9d28c 100644 --- a/pms/__manifest__.py +++ b/pms/__manifest__.py @@ -24,6 +24,8 @@ # "email_template_qweb", "sale", "multi_pms_properties", + "base_rest", + "base_rest_datamodel", ], "data": [ "security/pms_security.xml", diff --git a/pms/controllers/__init__.py b/pms/controllers/__init__.py index 52d463f1..20df2977 100644 --- a/pms/controllers/__init__.py +++ b/pms/controllers/__init__.py @@ -1 +1,2 @@ from . import pms_portal +from . import pms_rest diff --git a/pms/controllers/pms_rest.py b/pms/controllers/pms_rest.py new file mode 100644 index 00000000..3ff692bd --- /dev/null +++ b/pms/controllers/pms_rest.py @@ -0,0 +1,7 @@ +from odoo.addons.base_rest.controllers import main + + +class BaseRestDemoPublicApiController(main.RestController): + _root_path = "/api/" + _collection_name = "pms.services" + _default_auth = "public" diff --git a/pms/datamodels/__init__.py b/pms/datamodels/__init__.py new file mode 100644 index 00000000..d1e04124 --- /dev/null +++ b/pms/datamodels/__init__.py @@ -0,0 +1,5 @@ +from . import pms_reservation_short_info +from . import pms_reservation_long_info +from . import pms_reservation_search_param +from . import pms_reservation_patch_param +from . import pms_room_type_short_info diff --git a/pms/datamodels/pms_reservation_long_info.py b/pms/datamodels/pms_reservation_long_info.py new file mode 100644 index 00000000..eee19352 --- /dev/null +++ b/pms/datamodels/pms_reservation_long_info.py @@ -0,0 +1,17 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsReservationLongInfo(Datamodel): + _name = "pms.reservation.long.info" + + id = fields.Integer(required=True, allow_none=False) + partner = fields.String(required=True, allow_none=False) + checkin = fields.String(required=True, allow_none=False) + checkout = fields.String(required=True, allow_none=False) + preferred_room_id = fields.String(required=True, allow_none=False) + room_type_id = fields.String(required=True, allow_none=False) + price = fields.Float(required=True, allow_none=False) + partner_requests = fields.String(required=False, allow_none=True) + name = fields.String(required=True, allow_none=False) diff --git a/pms/datamodels/pms_reservation_patch_param.py b/pms/datamodels/pms_reservation_patch_param.py new file mode 100644 index 00000000..86968abf --- /dev/null +++ b/pms/datamodels/pms_reservation_patch_param.py @@ -0,0 +1,8 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsReservationPatchParam(Datamodel): + _name = "pms.reservation.patch.param" + partner_requests = fields.String(required=True, allow_none=False) diff --git a/pms/datamodels/pms_reservation_search_param.py b/pms/datamodels/pms_reservation_search_param.py new file mode 100644 index 00000000..ca2a5df1 --- /dev/null +++ b/pms/datamodels/pms_reservation_search_param.py @@ -0,0 +1,10 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsReservationSearchParam(Datamodel): + _name = "pms.reservation.search.param" + + id = fields.Integer(required=False, allow_none=False) + name = fields.String(required=False, allow_none=False) diff --git a/pms/datamodels/pms_reservation_short_info.py b/pms/datamodels/pms_reservation_short_info.py new file mode 100644 index 00000000..4ee49442 --- /dev/null +++ b/pms/datamodels/pms_reservation_short_info.py @@ -0,0 +1,15 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsReservationShortInfo(Datamodel): + _name = "pms.reservation.short.info" + + id = fields.Integer(required=True, allow_none=False) + partner = fields.String(required=True, allow_none=False) + checkin = fields.String(required=True, allow_none=False) + checkout = fields.String(required=True, allow_none=False) + preferred_room_id = fields.String(required=True, allow_none=False) + room_type_id = fields.String(required=True, allow_none=False) + name = fields.String(required=True, allow_none=False) diff --git a/pms/datamodels/pms_room_type_short_info.py b/pms/datamodels/pms_room_type_short_info.py new file mode 100644 index 00000000..f37b475e --- /dev/null +++ b/pms/datamodels/pms_room_type_short_info.py @@ -0,0 +1,10 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsRoomTypeShortInfo(Datamodel): + _name = "pms.room.type.short.info" + + id = fields.Integer(required=False, allow_none=False) + name = fields.String(required=False, allow_none=False) diff --git a/pms/services/__init__.py b/pms/services/__init__.py new file mode 100644 index 00000000..5b0382af --- /dev/null +++ b/pms/services/__init__.py @@ -0,0 +1,2 @@ +from . import reservation_services +from . import room_type_services diff --git a/pms/services/reservation_services.py b/pms/services/reservation_services.py new file mode 100644 index 00000000..1fb7ceef --- /dev/null +++ b/pms/services/reservation_services.py @@ -0,0 +1,147 @@ +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_datamodel.restapi import Datamodel +from odoo.addons.component.core import Component + + +class PmsReservationService(Component): + _inherit = "base.rest.service" + _name = "pms.service" + _usage = "reservations" + _collection = "pms.services" + _description = """ + Reservation API Services + Services developed with the new api provided by base_rest + """ + + @restapi.method( + [(["/"], "GET")], + input_param=Datamodel("pms.reservation.search.param"), + output_param=Datamodel("pms.reservation.short.info", is_list=True), + auth="public", + ) + def search(self, reservation_search_param): + """ + Devuelve un listado de todas las reservas, + admite parámetros de búsqueda 'id' y 'name' + (ejs.: "/reservations", "/reservations?id=1&name=R/21003449") + """ + domain = [] + if reservation_search_param.name: + domain.append(("name", "like", reservation_search_param.name)) + if reservation_search_param.id: + domain.append(("id", "=", reservation_search_param.id)) + res = [] + PmsReservationShortInfo = self.env.datamodels["pms.reservation.short.info"] + for reservation in self.env["pms.reservation"].sudo().search(domain): + res.append( + PmsReservationShortInfo( + id=reservation.id, + partner=reservation.partner_id.name, + checkin=str(reservation.checkin), + checkout=str(reservation.checkout), + preferred_room_id=reservation.preferred_room_id.name + if reservation.preferred_room_id + else "", + room_type_id=reservation.room_type_id.name + if reservation.room_type_id + else "", + name=reservation.name, + ) + ) + return res + + @restapi.method( + [(["/"], "GET")], + output_param=Datamodel("pms.reservation.long.info"), + auth="public", + ) + def search_by_id(self, reservation_id): + """ + Devuelve la reserva que se corresponde con el 'id' indicado + (ej.: /reservations/34) + """ + reservation = self.env["pms.reservation"].sudo().browse(reservation_id) + if reservation: + PmsReservationLongInfo = self.env.datamodels["pms.reservation.long.info"] + return PmsReservationLongInfo( + id=reservation.id, + partner=reservation.partner_id.name, + checkin=str(reservation.checkin), + checkout=str(reservation.checkout), + preferred_room_id=reservation.preferred_room_id.name + if reservation.preferred_room_id + else "", + room_type_id=reservation.room_type_id.name + if reservation.room_type_id + else "", + name=reservation.name, + price=reservation.price_room_services_set, + partner_requests=reservation.partner_requests + if reservation.partner_requests + else "", + ) + + @restapi.method( + [(["//partner-requests"], "PATCH")], + input_param=Datamodel("pms.reservation.patch.param"), + output_param=Datamodel("pms.reservation.short.info"), + auth="public", + ) + def update_partner_requests(self, reservation_id, reservation_patch_params): + """ + Actualiza el campo de peticiones de huéspedes para la reserva + indicada con el id (ej.: /reservations/34) + """ + reservation = self.env["pms.reservation"].sudo().browse(reservation_id) + reservation.partner_requests = reservation_patch_params.partner_requests + if reservation: + PmsReservationShortInfo = self.env.datamodels["pms.reservation.short.info"] + return PmsReservationShortInfo( + id=reservation.id, + partner=reservation.partner_id.name, + checkin=str(reservation.checkin), + checkout=str(reservation.checkout), + preferred_room_id=reservation.preferred_room_id.name + if reservation.preferred_room_id + else "", + room_type_id=reservation.room_type_id.name + if reservation.room_type_id + else "", + name=reservation.name, + price=reservation.price_room_services_set, + partner_requests=reservation.partner_requests + if reservation.partner_requests + else "", + ) + + @restapi.method( + [(["/"], "DELETE")], + output_param=Datamodel("pms.reservation.short.info"), + auth="public", + ) + def delete_reservation(self, reservation_id): + """ + Borra la reserva indicada con el id (ej.: /reservations/34) + """ + reservation = self.env["pms.reservation"].sudo().browse(reservation_id) + if reservation: + PmsReservationShortInfo = self.env.datamodels["pms.reservation.short.info"] + result = PmsReservationShortInfo( + id=reservation.id, + partner=reservation.partner_id.name, + checkin=str(reservation.checkin), + checkout=str(reservation.checkout), + preferred_room_id=reservation.preferred_room_id.name + if reservation.preferred_room_id + else "", + room_type_id=reservation.room_type_id.name + if reservation.room_type_id + else "", + name=reservation.name, + price=reservation.price_room_services_set, + partner_requests=reservation.partner_requests + if reservation.partner_requests + else "", + ) + reservation.sudo().unlink() + return result diff --git a/pms/services/room_type_services.py b/pms/services/room_type_services.py new file mode 100644 index 00000000..dc6c9537 --- /dev/null +++ b/pms/services/room_type_services.py @@ -0,0 +1,42 @@ +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_datamodel.restapi import Datamodel +from odoo.addons.component.core import Component + + +class PmsRoomTypeServices(Component): + _inherit = "base.rest.service" + _name = "pms.room.type.service" + _usage = "room-types" + _collection = "pms.services" + _description = """ + Room type API Services + Services developed with the new api provided by base_rest + """ + + @restapi.method( + [(["/"], "GET")], + input_param=Datamodel("pms.room.type.short.info"), + output_param=Datamodel("pms.room.type.short.info", is_list=True), + auth="public", + ) + def search(self, room_type_search_param): + """ + Devuelve un listado de todos los tipos de habitación, + admite parámetros de búsqueda 'id' y 'name' + (ejs.: "/room-types", "/room-types?id=1&name=R/21003449") + """ + domain = [] + if room_type_search_param.name: + domain.append(("name", "like", room_type_search_param.name)) + if room_type_search_param.id: + domain.append(("id", "=", room_type_search_param.id)) + res = [] + PmsReservationShortInfo = self.env.datamodels["pms.room.type.short.info"] + for room_type in self.env["pms.room.type"].sudo().search(domain): + res.append( + PmsReservationShortInfo( + id=room_type.id, + name=room_type.name, + ) + ) + return res