From 9aa3d50cc2474b7b5f4c2800574224bb9fa3b5de Mon Sep 17 00:00:00 2001 From: Pablo Quesada Barriuso Date: Wed, 3 Oct 2018 19:25:20 +0200 Subject: [PATCH] [WIP] Synchronize manually from a remote node --- hotel_node_master/models/hotel_node.py | 54 ++++++++++++ hotel_node_master/models/hotel_node_user.py | 95 ++++++++++++--------- 2 files changed, 109 insertions(+), 40 deletions(-) diff --git a/hotel_node_master/models/hotel_node.py b/hotel_node_master/models/hotel_node.py index 2cb8adb3c..dfeaa0fad 100644 --- a/hotel_node_master/models/hotel_node.py +++ b/hotel_node_master/models/hotel_node.py @@ -131,9 +131,62 @@ class HotelNode(models.Model): raise ValidationError(err) # TODO logout from node in any case. Take into account each try / except block + try: + vals = {} + # import remote users + # TODO Restrict users to hootel users + domain = [('login', '!=', 'admin')] + fields = ['name', 'login', 'email', 'is_company', 'partner_id', 'groups_id', 'active'] + remote_users = noderpc.env['res.users'].search_read(domain, fields) + + master_users = self.env["hotel.node.user"].search_read( + [('node_id', '=', self.id)], ['remote_user_id']) + + master_ids = [r['id'] for r in master_users] + remote_ids = [r['remote_user_id'] for r in master_users] + + user_ids = [] + for user in remote_users: + if user['id'] in remote_ids: + idx = remote_ids.index(user['id']) + user_ids.append((1, master_ids[idx], { + 'name': user['name'], + 'login': user['login'], + 'email': user['email'], + 'active': user['active'], + 'remote_user_id': user['id'], + 'is_synchronizing': True, + })) + else: + user_ids.append((0, 0, { + 'name': user['name'], + 'login': user['login'], + 'email': user['email'], + 'active': user['active'], + 'remote_user_id': user['id'], + 'is_synchronizing': True, + })) + vals.update({'user_ids': user_ids}) + + wdb.set_trace() + + self.write(vals) + + + except (odoorpc.error.RPCError, odoorpc.error.InternalError, urllib.error.URLError) as err: + raise ValidationError(err) + + try: + vals = {} + # import remote partners (exclude unconfirmed using DNI) + + except (odoorpc.error.RPCError, odoorpc.error.InternalError, urllib.error.URLError) as err: + raise ValidationError(err) + try: vals = {} # import remote room types + # TODO Actually only work for hootel v2 fields = ['name', 'active', 'sequence', 'room_ids'] remote_room_types = noderpc.env['hotel.room.type'].search_read([], fields) @@ -170,6 +223,7 @@ class HotelNode(models.Model): try: vals = {} # import remote rooms + # TODO Actually only work for hootel v2 fields = ['name', 'active', 'sequence', 'capacity', 'room_type_id'] remote_rooms = noderpc.env['hotel.room'].search_read([], fields) diff --git a/hotel_node_master/models/hotel_node_user.py b/hotel_node_master/models/hotel_node_user.py index 7da26092a..d78a76a0e 100644 --- a/hotel_node_master/models/hotel_node_user.py +++ b/hotel_node_master/models/hotel_node_user.py @@ -29,6 +29,9 @@ class HotelNodeUser(models.Model): node_id = fields.Many2one('project.project', 'Hotel', required=True) # remote users are managed as partners into the central node partner_id = fields.Many2one('res.partner', required=True) + name = fields.Char(related='partner_id.name', readonly=True) + email = fields.Char(related='partner_id.email', readonly=True) + login = fields.Char(require=True, help="Used to log into the hotel") password = fields.Char(default='', invisible=True, copy=False, @@ -82,28 +85,39 @@ class HotelNodeUser(models.Model): raise ValidationError(msg) try: - noderpc = odoorpc.ODOO(node.odoo_host, node.odoo_protocol, node.odoo_port) - noderpc.login(node.odoo_db, node.odoo_user, node.odoo_password) + if 'is_synchronizing' in vals: + partner = self.env["res.partner"].search([('email', '=', vals['login'])]) + if partner.id: + vals['partner_id'] = partner.id + else: + partner = partner.create({ + 'name': vals['name'], + 'email': vals['login'], + }) + vals['partner_id'] = partner.id + else: + noderpc = odoorpc.ODOO(node.odoo_host, node.odoo_protocol, node.odoo_port) + noderpc.login(node.odoo_db, node.odoo_user, node.odoo_password) - partner = self.env["res.partner"].browse(vals['partner_id']) - remote_vals = { - 'name': partner.name, - 'login': vals['login'], - } + partner = self.env["res.partner"].browse(vals['partner_id']) + remote_vals = { + 'name': partner.name, + 'login': vals['login'], + } - if 'group_ids' in vals: - groups = self.env["hotel.node.group"].browse(vals['group_ids'][0][2]) - # TODO Improve one rpc call per remote group for better performance - remote_groups = [noderpc.env.ref(r.xml_id).id for r in groups] - remote_vals.update({'groups_id': [[6, False, remote_groups]]}) + if 'group_ids' in vals: + groups = self.env["hotel.node.group"].browse(vals['group_ids'][0][2]) + # TODO Improve one rpc call per remote group for better performance + remote_groups = [noderpc.env.ref(r.xml_id).id for r in groups] + remote_vals.update({'groups_id': [[6, False, remote_groups]]}) - # create user and delegate in remote node the default values for the user - remote_user_id = noderpc.env['res.users'].create(remote_vals) - _logger.info('User #%s created remote res.users with ID: [%s]', - self._context.get('uid'), remote_user_id) - vals.update({'remote_user_id': remote_user_id}) + # create user and delegate in remote node the default values for the user + remote_user_id = noderpc.env['res.users'].create(remote_vals) + _logger.info('User #%s created remote res.users with ID: [%s]', + self._context.get('uid'), remote_user_id) + vals.update({'remote_user_id': remote_user_id}) - noderpc.logout() + noderpc.logout() except (odoorpc.error.RPCError, odoorpc.error.InternalError, urllib.error.URLError) as err: _logger.error(err) @@ -136,32 +150,33 @@ class HotelNodeUser(models.Model): raise ValidationError(msg) try: - noderpc = odoorpc.ODOO(node.odoo_host, node.odoo_protocol, node.odoo_port) - noderpc.login(node.odoo_db, node.odoo_user, node.odoo_password) + if 'is_synchronizing' not in vals: + noderpc = odoorpc.ODOO(node.odoo_host, node.odoo_protocol, node.odoo_port) + noderpc.login(node.odoo_db, node.odoo_user, node.odoo_password) - remote_vals = {} + remote_vals = {} - if 'active' in vals: - remote_vals.update({'active': vals['active']}) + if 'active' in vals: + remote_vals.update({'active': vals['active']}) - if 'password' in vals: - remote_vals.update({'password': vals['password']}) + if 'password' in vals: + remote_vals.update({'password': vals['password']}) - if 'partner_id' in vals: - partner = self.env["res.partner"].browse(vals['partner_id']) - remote_vals.update({'name': partner.name}) + if 'partner_id' in vals: + partner = self.env["res.partner"].browse(vals['partner_id']) + remote_vals.update({'name': partner.name}) - if 'group_ids' in vals: - groups = self.env["hotel.node.group"].browse(vals['group_ids'][0][2]) - # TODO Improve one rpc call per remote group for better performance - remote_groups = [noderpc.env.ref(r.xml_id).id for r in groups] - remote_vals.update({'groups_id': [[6, False, remote_groups]]}) + if 'group_ids' in vals: + groups = self.env["hotel.node.group"].browse(vals['group_ids'][0][2]) + # TODO Improve one rpc call per remote group for better performance + remote_groups = [noderpc.env.ref(r.xml_id).id for r in groups] + remote_vals.update({'groups_id': [[6, False, remote_groups]]}) - noderpc.env['res.users'].write([rec.remote_user_id], remote_vals) - _logger.info('User #%s updated remote res.users with ID: [%s]', - self._context.get('uid'), rec.remote_user_id) + noderpc.env['res.users'].write([rec.remote_user_id], remote_vals) + _logger.info('User #%s updated remote res.users with ID: [%s]', + self._context.get('uid'), rec.remote_user_id) - noderpc.logout() + noderpc.logout() except (odoorpc.error.RPCError, odoorpc.error.InternalError, urllib.error.URLError) as err: _logger.error(err) @@ -175,15 +190,15 @@ class HotelNodeUser(models.Model): """ :raise: ValidationError """ - # TODO In production users are archived instead of removed for rec in self: try: node = rec.node_id noderpc = odoorpc.ODOO(node.odoo_host, node.odoo_protocol, node.odoo_port) noderpc.login(node.odoo_db, node.odoo_user, node.odoo_password) - - noderpc.env['res.users'].unlink([rec.remote_user_id]) + # TODO In production users are archived instead of removed + # noderpc.env['res.users'].unlink([rec.remote_user_id]) + noderpc.env['res.users'].write([rec.remote_user_id], {'active': False}) _logger.info('User #%s deleted remote res.users with ID: [%s]', self._context.get('uid'), rec.remote_user_id) noderpc.logout()