# Copyright 2018 Alexandre Díaz # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). import odoorpc import logging from odoo.addons.component.core import AbstractComponent from odoo.addons.queue_job.exception import RetryableJobError _logger = logging.getLogger(__name__) class NodeLogin(object): def __init__(self, address, protocol, port, db, user, passwd): self.address = address self.protocol = protocol self.port = port self.db = db self.user = user self.passwd = passwd class NodeServer(object): def __init__(self, login_data): self._server = None self._login_data = login_data def __enter__(self): # we do nothing, api is lazy return self def __exit__(self, type, value, traceback): if self._server is not None: self.close() @property def server(self): if self._server is None: try: self._server = odoorpc.ODOO(self._login_data.address, self._login_data.protocol, self._login_data.port) self._server.login(self._login_data.db, self._login_data.user, self._login_data.passwd) except Exception: self._server = None raise RetryableJobError("Can't connect with channel!") return self._server def close(self): self._server.logout() self._server = None class HotelNodeInterfaceAdapter(AbstractComponent): _name = 'hotel.node.interface.adapter' _inherit = ['base.backend.adapter', 'base.node.connector'] _usage = 'backend.adapter' def create_room_type(self, name, room_ids): raise NotImplementedError def modify_room_type(self, room_type_id, name, room_ids): raise NotImplementedError def delete_room_type(self, room_type_id): raise NotImplementedError def fetch_room_types(self): raise NotImplementedError @property def _server(self): try: node_server = getattr(self.work, 'node_api') except AttributeError: raise AttributeError( 'You must provide a node_api attribute with a ' 'WuBookServer instance to be able to use the ' 'Backend Adapter.' ) return node_server.server class HotelNodeAdapter(AbstractComponent): _name = 'hotel.node.adapter' _inherit = 'hotel.node.interface.adapter' # === ROOMS def create_room_type(self, name, room_ids): return self._server.env['hotel.room.type'].create({ 'name': name }) def modify_room_type(self, room_type_id, name, rooms_id): return self._server.env['hotel.room.type'].write( room_type_id, { 'name': name }) def delete_room_type(self, room_type_id): return self._server.env['hotel.room.type'].unlink(room_type_id) def fetch_room_types(self): return self._server.env['hotel.room.type'].search_read( [], ['name'] )