mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[ADD] Hotel Management using Odoo Connector
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from . import node_backend
|
||||
from . import node_binding
|
||||
from . import hotel_node
|
||||
from . import hotel_node_user
|
||||
from . import hotel_node_group
|
||||
@@ -7,3 +9,5 @@ from . import hotel_node_group_remote
|
||||
from . import hotel_node_room
|
||||
from . import hotel_node_room_type
|
||||
from . import inherited_res_partner
|
||||
from . import hotel_room_type
|
||||
|
||||
|
||||
6
hotel_node_master/models/hotel_room_type/__init__.py
Normal file
6
hotel_node_master/models/hotel_room_type/__init__.py
Normal file
@@ -0,0 +1,6 @@
|
||||
# Copyright 2018 Alexandre Díaz <dev@redneboa.es>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from . import common
|
||||
from . import exporter
|
||||
from . import importer
|
||||
83
hotel_node_master/models/hotel_room_type/common.py
Normal file
83
hotel_node_master/models/hotel_room_type/common.py
Normal file
@@ -0,0 +1,83 @@
|
||||
# Copyright 2018 Alexandre Díaz <dev@redneboa.es>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
import logging
|
||||
from odoo import api, models, fields, _
|
||||
from odoo.addons.queue_job.job import job, related_action
|
||||
from odoo.addons.component.core import Component
|
||||
from odoo.addons.component_event import skip_if
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class NodeRoomType(models.Model):
|
||||
_name = 'node.room.type'
|
||||
_inherit = 'node.binding'
|
||||
_description = 'Node Hotel Room Type'
|
||||
|
||||
name = fields.Char(required=True, translate=True)
|
||||
room_ids = fields.Integer()
|
||||
# fields.One2many('node.room', 'room_type_id', 'Rooms')
|
||||
active = fields.Boolean(default=True)
|
||||
sequence = fields.Integer(default=0)
|
||||
|
||||
@job(default_channel='root.channel')
|
||||
@api.model
|
||||
def create_room_type(self):
|
||||
with self.backend_id.work_on(self._name) as work:
|
||||
exporter = work.component(usage='node.room.type.exporter')
|
||||
return exporter.create_room_type(self)
|
||||
|
||||
@job(default_channel='root.channel')
|
||||
@api.model
|
||||
def modify_room_type(self):
|
||||
with self.backend_id.work_on(self._name) as work:
|
||||
exporter = work.component(usage='node.room.type.exporter')
|
||||
return exporter.modify_room_type(self)
|
||||
|
||||
@job(default_channel='root.channel')
|
||||
@api.model
|
||||
def delete_room_type(self):
|
||||
with self.backend_id.work_on(self._name) as work:
|
||||
exporter = work.component(usage='node.room.type.exporter')
|
||||
return exporter.delete_room_type(self)
|
||||
|
||||
@job(default_channel='root.channel')
|
||||
@api.model
|
||||
def fetch_room_types(self, backend):
|
||||
with backend.work_on(self._name) as work:
|
||||
importer = work.component(usage='node.room.type.importer')
|
||||
return importer.fetch_room_types()
|
||||
|
||||
class NodeRoomTypeAdapter(Component):
|
||||
_name = 'node.room.type.adapter'
|
||||
_inherit = 'hotel.node.adapter'
|
||||
_apply_on = 'node.room.type'
|
||||
|
||||
def create_room_type(self, name, room_ids):
|
||||
return super().create_room_type(name, room_ids)
|
||||
|
||||
def modify_room_type(self, room_type_id, name, room_ids):
|
||||
return super().modify_room_type(room_type_id, name, room_ids)
|
||||
|
||||
def delete_room_type(self, room_type_id):
|
||||
return super().delete_room_type(room_type_id)
|
||||
|
||||
def fetch_room_types(self):
|
||||
return super().fetch_room_types()
|
||||
|
||||
|
||||
class ChannelBindingRoomTypeListener(Component):
|
||||
_name = 'node.binding.room.type.listener'
|
||||
_inherit = 'base.connector.listener'
|
||||
_apply_on = ['node.hotel.room.type']
|
||||
|
||||
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
|
||||
def on_record_create(self, record, fields=None):
|
||||
record.create_room_type()
|
||||
|
||||
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
|
||||
def on_record_unlink(self, record, fields=None):
|
||||
record.delete_room_type()
|
||||
|
||||
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
|
||||
def on_record_write(self, record, fields=None):
|
||||
record.modify_room_type()
|
||||
33
hotel_node_master/models/hotel_room_type/exporter.py
Normal file
33
hotel_node_master/models/hotel_room_type/exporter.py
Normal file
@@ -0,0 +1,33 @@
|
||||
# Copyright 2018 Alexandre Díaz <dev@redneboa.es>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
import logging
|
||||
from odoo.addons.component.core import Component
|
||||
from odoo import api, _
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class NodeRoomTypeExporter(Component):
|
||||
_name = 'node.room.type.exporter'
|
||||
_inherit = 'node.exporter'
|
||||
_apply_on = ['node.room.type']
|
||||
_usage = 'node.room.type.exporter'
|
||||
|
||||
@api.model
|
||||
def modify_room(self, binding):
|
||||
return self.backend_adapter.modify_room(
|
||||
binding.room_type_id,
|
||||
binding.name,
|
||||
binding.room_ids
|
||||
)
|
||||
|
||||
@api.model
|
||||
def delete_room(self, binding):
|
||||
return self.backend_adapter.delete_room(binding.room_type_id)
|
||||
|
||||
@api.model
|
||||
def create_room(self, binding):
|
||||
external_id = self.backend_adapter.create_room(
|
||||
binding.name,
|
||||
binding.room_ids
|
||||
)
|
||||
self.binder.bind(external_id, binding)
|
||||
46
hotel_node_master/models/hotel_room_type/importer.py
Normal file
46
hotel_node_master/models/hotel_room_type/importer.py
Normal file
@@ -0,0 +1,46 @@
|
||||
# Copyright 2018 Alexandre Díaz <dev@redneboa.es>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
import logging
|
||||
from odoo.addons.component.core import Component
|
||||
from odoo.addons.connector.components.mapper import mapping
|
||||
from odoo import fields, api, _
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class HotelRoomTypeImporter(Component):
|
||||
_name = 'node.room.type.importer'
|
||||
_inherit = 'node.importer'
|
||||
_apply_on = ['node.room.type']
|
||||
_usage = 'node.room.type.importer'
|
||||
|
||||
@api.model
|
||||
def fetch_room_types(self):
|
||||
results = self.backend_adapter.fetch_room_types()
|
||||
room_type_mapper = self.component(usage='import.mapper',
|
||||
model_name='node.room.type')
|
||||
|
||||
node_room_type_obj = self.env['node.room.type']
|
||||
for rec in results:
|
||||
map_record = room_type_mapper.map_record(rec)
|
||||
room_bind = node_room_type_obj.search([('external_id', '=', rec['id'])],
|
||||
limit=1)
|
||||
if room_bind:
|
||||
room_bind.write(map_record.values())
|
||||
else:
|
||||
room_bind.create(map_record.values(for_create=True))
|
||||
|
||||
|
||||
class NodeRoomTypeImportMapper(Component):
|
||||
_name = 'node.room.type.import.mapper'
|
||||
_inherit = 'node.import.mapper'
|
||||
_apply_on = 'node.room.type'
|
||||
|
||||
direct = [
|
||||
('id', 'external_id'),
|
||||
('name', 'name'),
|
||||
]
|
||||
|
||||
@mapping
|
||||
def backend_id(self, record):
|
||||
return {'backend_id': self.backend_record.id}
|
||||
4
hotel_node_master/models/node_backend/__init__.py
Normal file
4
hotel_node_master/models/node_backend/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
# Copyright 2018 Alexandre Díaz <dev@redneboa.es>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from . import common
|
||||
52
hotel_node_master/models/node_backend/common.py
Normal file
52
hotel_node_master/models/node_backend/common.py
Normal file
@@ -0,0 +1,52 @@
|
||||
# Copyright 2018 Alexandre Díaz <dev@redneboa.es>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from contextlib import contextmanager
|
||||
from odoo import models, api, fields
|
||||
from ...components.backend_adapter import NodeLogin, NodeServer
|
||||
|
||||
class NodeBackend(models.Model):
|
||||
_name = 'node.backend'
|
||||
_description = 'Hotel Node Backend'
|
||||
_inherit = 'connector.backend'
|
||||
|
||||
name = fields.Char('Name')
|
||||
address = fields.Char('Host', required=True,
|
||||
help='Full URL to the host.')
|
||||
db = fields.Char('Database Name',
|
||||
help='Odoo database name.')
|
||||
user = fields.Char('Username',
|
||||
help='Odoo administration user.')
|
||||
passwd = fields.Char('Password',
|
||||
help='Odoo password.')
|
||||
port = fields.Integer(string='TCP Port', default=443,
|
||||
help='Specify the TCP port for the XML-RPC protocol.')
|
||||
protocol = fields.Selection([('jsonrpc', 'jsonrpc'), ('jsonrpc+ssl', 'jsonrpc+ssl')],
|
||||
'Protocol', required=True, default='jsonrpc+ssl')
|
||||
odoo_version = fields.Char()
|
||||
|
||||
@contextmanager
|
||||
@api.multi
|
||||
def work_on(self, model_name, **kwargs):
|
||||
self.ensure_one()
|
||||
node_login = NodeLogin(
|
||||
self.address,
|
||||
self.protocol,
|
||||
self.port,
|
||||
self.db,
|
||||
self.user,
|
||||
self.passwd)
|
||||
with NodeServer(node_login) as node_api:
|
||||
_super = super(NodeBackend, self)
|
||||
with _super.work_on(model_name, node_api=node_api, **kwargs) as work:
|
||||
yield work
|
||||
|
||||
@api.multi
|
||||
def test_connection(self):
|
||||
pass
|
||||
|
||||
@api.multi
|
||||
def import_room_types(self):
|
||||
node_room_type_obj = self.env['node.room.type']
|
||||
for backend in self:
|
||||
node_room_type_obj.with_delay().fetch_room_types(backend)
|
||||
4
hotel_node_master/models/node_binding/__init__.py
Normal file
4
hotel_node_master/models/node_binding/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
# Copyright 2018 Alexandre Díaz <dev@redneboa.es>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from . import common
|
||||
22
hotel_node_master/models/node_binding/common.py
Normal file
22
hotel_node_master/models/node_binding/common.py
Normal file
@@ -0,0 +1,22 @@
|
||||
# Copyright 2018 Alexandre Díaz <dev@redneboa.es>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import models, fields, api
|
||||
|
||||
|
||||
class NodeBinding(models.AbstractModel):
|
||||
_name = 'node.binding'
|
||||
_inherit = 'external.binding'
|
||||
_description = 'Hotel Node Connector Binding (abstract)'
|
||||
|
||||
external_id = fields.Integer()
|
||||
backend_id = fields.Many2one(
|
||||
comodel_name='node.backend',
|
||||
string='Hotel Node Connector Backend',
|
||||
required=True,
|
||||
ondelete='restrict')
|
||||
|
||||
_sql_constraints = [
|
||||
('backend_external_id_uniq', 'unique(backend_id, external_id)',
|
||||
'A binding already exists with the same Backend ID.'),
|
||||
]
|
||||
Reference in New Issue
Block a user