# Copyright 2015 Akretion (Alexis de Lattre ) # Copyright 2016 Akretion (Alexis de Lattre ) # Copyright 2016 Pedro M. Baeza # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import models, api, _ from odoo.exceptions import UserError import logging logger = logging.getLogger(__name__) class ResPartner(models.Model): _inherit = 'res.partner' @api.multi def _address_as_string(self): self.ensure_one() addr = [] if self.street: addr.append(self.street) if self.street2: addr.append(self.street2) if self.city: addr.append(self.city) if self.state_id: addr.append(self.state_id.name) if self.country_id: addr.append(self.country_id.name) if not addr: raise UserError(_("Address missing on partner '%s'.") % self.name) return ' '.join(addr) @api.model def _prepare_url(self, url, replace): assert url, 'Missing URL' for key, value in replace.items(): if not isinstance(value, str): # for latitude and longitude which are floats value = str(value) url = url.replace(key, value) logger.debug('Final URL: %s', url) return url @api.multi def open_map(self): self.ensure_one() map_website = self.env.user.context_map_website_id if not map_website: raise UserError( _('Missing map provider: ' 'you should set it in your preferences.')) if (map_website.lat_lon_url and hasattr(self, 'partner_latitude') and self.partner_latitude and self.partner_longitude): url = self._prepare_url( map_website.lat_lon_url, { '{LATITUDE}': self.partner_latitude, '{LONGITUDE}': self.partner_longitude}) else: if not map_website.address_url: raise UserError( _("Missing parameter 'URL that uses the address' " "for map website '%s'.") % map_website.name) url = self._prepare_url( map_website.address_url, {'{ADDRESS}': self._address_as_string()}) return { 'type': 'ir.actions.act_url', 'url': url, 'target': 'new', } @api.multi def open_route_map(self): self.ensure_one() if not self.env.user.context_route_map_website_id: raise UserError( _('Missing route map website: ' 'you should set it in your preferences.')) map_website = self.env.user.context_route_map_website_id if not self.env.user.context_route_start_partner_id: raise UserError( _('Missing start address for route map: ' 'you should set it in your preferences.')) start_partner = self.env.user.context_route_start_partner_id if (map_website.route_lat_lon_url and hasattr(self, 'partner_latitude') and self.partner_latitude and self.partner_longitude and start_partner.partner_latitude and start_partner.partner_longitude): url = self._prepare_url( # pragma: no cover map_website.route_lat_lon_url, { '{START_LATITUDE}': start_partner.partner_latitude, '{START_LONGITUDE}': start_partner.partner_longitude, '{DEST_LATITUDE}': self.partner_latitude, '{DEST_LONGITUDE}': self.partner_longitude}) else: if not map_website.route_address_url: raise UserError( _("Missing route URL that uses the addresses " "for the map website '%s'") % map_website.name) url = self._prepare_url( map_website.route_address_url, { '{START_ADDRESS}': start_partner._address_as_string(), '{DEST_ADDRESS}': self._address_as_string()}) return { 'type': 'ir.actions.act_url', 'url': url, 'target': 'new', }