You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
4.3 KiB
111 lines
4.3 KiB
# Copyright 2015 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
|
# Copyright 2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
|
# Copyright 2016 Pedro M. Baeza <pedro.baeza@tecnativa.com>
|
|
# 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',
|
|
}
|