From 7f5bedfb08a9717c35edd82c60331d68cd263963 Mon Sep 17 00:00:00 2001 From: Pablo Date: Mon, 8 Oct 2018 18:20:01 +0200 Subject: [PATCH] [WIP] Synchronize manually from a remote node --- hotel_node_master/models/hotel_node.py | 39 ++++++++++++--------- hotel_node_master/models/hotel_node_user.py | 33 ++++++----------- 2 files changed, 34 insertions(+), 38 deletions(-) diff --git a/hotel_node_master/models/hotel_node.py b/hotel_node_master/models/hotel_node.py index c059c4ae0..c19757d10 100644 --- a/hotel_node_master/models/hotel_node.py +++ b/hotel_node_master/models/hotel_node.py @@ -57,9 +57,8 @@ class HotelNode(models.Model): """ for node in self: domain = [('id', 'in', node.group_ids.ids), ('odoo_version', '!=', node.odoo_version)] - # TODO Use search_count - invalid_groups = self.env["hotel.node.group"].search(domain) - if len(invalid_groups) > 0: + invalid_groups = self.env["hotel.node.group"].search_count(domain) + if invalid_groups > 0: msg = _("At least one group is not within the node version.") + " " + \ _("Odoo version of the node: %s") % node.odoo_version _logger.warning(msg) @@ -98,13 +97,14 @@ class HotelNode(models.Model): noderpc.login(self.odoo_db, self.odoo_user, self.odoo_password) except (odoorpc.error.RPCError, odoorpc.error.InternalError, urllib.error.URLError) as err: raise ValidationError(err) + # TODO synchronize only if write_date in remote node is newer ¿? try: vals = {} # import remote groups - domain = [('model', '=', 'res.groups')] - fields = ['complete_name', 'display_name'] - remote_groups = noderpc.env['ir.model.data'].search_read(domain, fields) + remote_groups = noderpc.env['ir.model.data'].search_read( + [('model', '=', 'res.groups')], + ['complete_name', 'display_name']) master_groups = self.env["hotel.node.group"].search_read( [('odoo_version', '=', self.odoo_version)], ['xml_id']) @@ -129,15 +129,14 @@ class HotelNode(models.Model): except (odoorpc.error.RPCError, odoorpc.error.InternalError, urllib.error.URLError) as err: 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) + remote_users = noderpc.env['res.users'].search_read( + [('login', '!=', 'admin')], + ['name', 'login', 'email', 'is_company', 'partner_id', 'groups_id', 'active']) master_users = self.env["hotel.node.user"].search_read( [('node_id', '=', self.id)], ['remote_user_id']) @@ -157,12 +156,21 @@ class HotelNode(models.Model): 'remote_user_id': user['id'], })) else: + partner = self.env['res.partner'].search([('email', '=', user['email'])]) + if not partner: + partner = self.env['res.partner'].create({ + 'name': user['name'], + 'is_company': False, + 'email': user['email'], + }) + user_ids.append((0, 0, { 'name': user['name'], 'login': user['login'], 'email': user['email'], 'active': user['active'], 'remote_user_id': user['id'], + 'partner_id': partner.id, })) vals.update({'user_ids': user_ids}) @@ -170,7 +178,6 @@ class HotelNode(models.Model): 'is_synchronizing': True, }).write(vals) - except (odoorpc.error.RPCError, odoorpc.error.InternalError, urllib.error.URLError) as err: raise ValidationError(err) @@ -185,8 +192,8 @@ class HotelNode(models.Model): 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) + remote_room_types = noderpc.env['hotel.room.type'].search_read( + [], ['name', 'active', 'sequence', 'room_ids']) master_room_types = self.env["hotel.node.room.type"].search_read( [('node_id', '=', self.id)], ['remote_room_type_id']) @@ -222,8 +229,9 @@ class HotelNode(models.Model): 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) + remote_rooms = noderpc.env['hotel.room'].search_read( + [], + ['name', 'active', 'sequence', 'capacity', 'room_type_id']) master_rooms = self.env["hotel.node.room"].search_read( [('node_id', '=', self.id)], ['remote_room_id']) @@ -268,6 +276,5 @@ class HotelNode(models.Model): except (odoorpc.error.RPCError, odoorpc.error.InternalError, urllib.error.URLError) as err: raise ValidationError(err) - noderpc.logout() return True diff --git a/hotel_node_master/models/hotel_node_user.py b/hotel_node_master/models/hotel_node_user.py index bd513c7d5..a3a042a63 100644 --- a/hotel_node_master/models/hotel_node_user.py +++ b/hotel_node_master/models/hotel_node_user.py @@ -29,10 +29,10 @@ 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) + name = fields.Char(related='partner_id.name') email = fields.Char(related='partner_id.email', readonly=True) - login = fields.Char(require=True, + login = fields.Char(related='partner_id.email', require=True, help="Used to log into the hotel") password = fields.Char(default='', invisible=True, copy=False, help="Keep empty if you don't want the user to be able to connect on the hotel.") @@ -48,9 +48,8 @@ class HotelNodeUser(models.Model): def _check_group_ids(self): # TODO ensure all group_ids are within the node version domain = [('id', 'in', self.group_ids.ids), ('odoo_version', '!=', self.node_id.odoo_version)] - # TODO Use search_count - invalid_groups = self.env["hotel.node.group"].search(domain) - if len(invalid_groups) > 0: + invalid_groups = self.env["hotel.node.group"].search_count(domain) + if invalid_groups > 0: msg = _("At least one group is not within the node version.") + " " + \ _("Odoo version of the node: %s") % self.node_id.odoo_version _logger.warning(msg) @@ -76,9 +75,8 @@ class HotelNodeUser(models.Model): if 'group_ids' in vals: domain = [('id', 'in', vals['group_ids'][0][2]), ('odoo_version', '!=', node.odoo_version)] - invalid_groups = self.env["hotel.node.group"].search(domain) - # TODO Use search_count - if len(invalid_groups) > 0: + invalid_groups = self.env["hotel.node.group"].search_count(domain) + if invalid_groups > 0: msg = _("At least one group is not within the node version.") + " " + \ _("Odoo version in node: %s") % node.odoo_version _logger.error(msg) @@ -86,16 +84,6 @@ class HotelNodeUser(models.Model): try: if 'is_synchronizing' not in self._context: - 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) @@ -141,14 +129,13 @@ class HotelNodeUser(models.Model): if 'group_ids' in vals: domain = [('id', 'in', vals['group_ids'][0][2]), ('odoo_version', '!=', node.odoo_version)] - invalid_groups = self.env["hotel.node.group"].search(domain) - # TODO Use search_count - if len(invalid_groups) > 0: + invalid_groups = self.env["hotel.node.group"].search_count(domain) + if invalid_groups > 0: msg = _("At least one group is not within the node version.") + " " + \ _("Odoo version in node: %s") % node.odoo_version _logger.error(msg) raise ValidationError(msg) - + try: if 'is_synchronizing' not in self._context: noderpc = odoorpc.ODOO(node.odoo_host, node.odoo_protocol, node.odoo_port) @@ -203,6 +190,8 @@ class HotelNodeUser(models.Model): self._context.get('uid'), rec.remote_user_id) noderpc.logout() + # TODO How to manage the relationship with the partner? Also deleted? + except (odoorpc.error.RPCError, odoorpc.error.InternalError, urllib.error.URLError) as err: _logger.error(err) raise ValidationError(err)