diff --git a/partner_address_on_map/map_url_data.xml b/partner_address_on_map/map_url_data.xml
index 500a71aee..891631c93 100644
--- a/partner_address_on_map/map_url_data.xml
+++ b/partner_address_on_map/map_url_data.xml
@@ -10,33 +10,37 @@
Google Maps
- https://www.google.com/maps?ie=UTF8&q=
+ https://www.google.com/maps?ie=UTF8&q={ADDRESS}https://www.google.com/maps?z=15&q={LATITUDE},{LONGITUDE}
+ https://www.google.com/maps?saddr={START_ADDRESS}&daddr={DEST_ADDRESS}&directionsmode=driving
+ https://www.google.com/maps?saddr={START_LATITUDE},{START_LONGITUDE}&daddr={DEST_LATITUDE},{DEST_LONGITUDE}&directionsmode=drivingOpenStreetMap
- https://nominatim.openstreetmap.org/search?q=
+ https://nominatim.openstreetmap.org/search?q={ADDRESS}https://www.openstreetmap.org/?zoom=15&mlat={LATITUDE}&mlon={LONGITUDE}
+ https://www.openstreetmap.org/directions/?engine=orsm_car&route={START_LATITUDE},{START_LONGITUDE};{DEST_LATITUDE},{DEST_LONGITUDE}OpenStreetMap FR
- http://tile.openstreetmap.fr/?q=
+ http://tile.openstreetmap.fr/?q={ADDRESS}http://tile.openstreetmap.fr/?zoom=15&lat={LATITUDE}&lon={LONGITUDE}Bing Maps
- https://www.bing.com/maps/default.aspx?rtp=adr.
+ https://www.bing.com/maps/default.aspx?where1={ADDRESS}https://www.bing.com/maps/default.aspx?cp={LATITUDE}~{LONGITUDE}&lvl=15Here Maps
- https://here.com/search/
+ https://here.com/search/{ADDRESS}https://www.here.com/?map={LATITUDE},{LONGITUDE},15,normal
+ https://www.here.com/directions/drive/:{START_LATITUDE},{START_LONGITUDE}/:{DEST_LATITUDE},{DEST_LONGITUDE}
diff --git a/partner_address_on_map/map_url_view.xml b/partner_address_on_map/map_url_view.xml
index b7d2c445c..75e529866 100644
--- a/partner_address_on_map/map_url_view.xml
+++ b/partner_address_on_map/map_url_view.xml
@@ -17,6 +17,8 @@
+
+
@@ -29,7 +31,6 @@
-
diff --git a/partner_address_on_map/partner_address_on_map.py b/partner_address_on_map/partner_address_on_map.py
index 63e54745d..3eeebbd45 100644
--- a/partner_address_on_map/partner_address_on_map.py
+++ b/partner_address_on_map/partner_address_on_map.py
@@ -31,20 +31,32 @@ class MapUrl(models.Model):
name = fields.Char(string='Map Provider', required=True)
address_url = fields.Char(
string='URL that uses the address',
- help="Odoo will add the address as string at the end of this URL.")
+ help="In this URL, {ADDRESS} will be replaced by the address.")
lat_lon_url = fields.Char(
string='URL that uses latitude and longitude',
- help="In this URL, {LATITUDE} will be replaced by the latitude and "
- "{LONGITUDE} will be replaced by the longitude (requires the module "
- "base_geolocalize)")
+ help="In this URL, {LATITUDE} and {LONGITUDE} will be replaced by "
+ "the latitude and longitude (requires the module 'base_geolocalize')")
+ route_address_url = fields.Char(
+ string='Route URL that uses the addresses',
+ help="In this URL, {START_ADDRESS} and {DEST_ADDRESS} will be "
+ "replaced by the start and destination addresses.")
+ route_lat_lon_url = fields.Char(
+ string='Route URL that uses latitude and longitude',
+ help="In this URL, {START_LATITUDE}, {START_LONGITUDE}, "
+ "{DEST_LATITUDE} and {DEST_LONGITUDE} will be replaced by the "
+ "latitude and longitude of the start and destination adresses "
+ "(requires the module 'base_geolocalize').")
class ResUsers(models.Model):
_inherit = 'res.users'
# begin with context_ to allow user to change it by himself
- context_map_url_id = fields.Many2one(
- 'map.url', string='Map Provider')
+ context_map_url_id = fields.Many2one('map.url', string='Map Provider')
+ # IDEA : should we add the ability to have 1 map provider for map
+ # and another one for routing ?
+ context_route_start_partner_id = fields.Many2one(
+ 'res.partner', string='Start Address for Route Map')
# called from post-install script
# I can't use a default method on the field, because it would be executed
@@ -59,6 +71,21 @@ class ResUsers(models.Model):
class ResPartner(models.Model):
_inherit = 'res.partner'
+ @api.model
+ def address_as_string(self):
+ addr = u''
+ if self.street:
+ addr += self.street
+ if self.street2:
+ addr += u' ' + self.street2
+ if self.city:
+ addr += u' ' + self.city
+ if self.state_id:
+ addr += u' ' + self.state_id.name
+ if self.country_id:
+ addr += u' ' + self.country_id.name
+ return addr
+
@api.multi
def open_map(self):
if not self.env.user.context_map_url_id:
@@ -78,17 +105,59 @@ class ResPartner(models.Model):
raise Warning(
_("Missing parameter 'URL that uses the address' "
"for map provider '%s'.") % map_url.name)
- url = map_url.address_url
- if self.street:
- url += self.street
- if self.street2:
- url += ' ' + self.street2
- if self.city:
- url += ' ' + self.city
- if self.state_id:
- url += ' ' + self.state_id.name
- if self.country_id:
- url += ' ' + self.country_id.name
+ url = map_url.address_url.replace(
+ '{ADDRESS}', self.address_as_string())
+ return {
+ 'type': 'ir.actions.act_url',
+ 'url': url,
+ 'target': 'new',
+ }
+
+ @api.multi
+ def open_route_map(self):
+ if not self.env.user.context_map_url_id:
+ raise Warning(
+ _('Missing map provider: '
+ 'you should set it in your preferences.'))
+ map_url = self.env.user.context_map_url_id
+ if not self.env.user.context_route_start_partner_id:
+ raise Warning(
+ _('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_url.route_address_url:
+ start_address = start_partner.address_as_string()
+ dest_address = self.address_as_string()
+ url = map_url.route_address_url
+ url = url.replace('{START_ADDRESS}', start_address)
+ url = url.replace('{DEST_ADDRESS}', dest_address)
+ else:
+ if not hasattr(self, 'partner_latitude'):
+ raise Warning(
+ _("Missing module 'base_geolocalize'"))
+ if not map_url.route_lat_lon_url:
+ raise Warning(
+ _("No route URL that uses latitude and longitude "
+ "on map provider '%s'.") % map_url.name)
+ url = map_url.route_lat_lon_url
+ if (
+ not start_partner.partner_latitude or
+ not start_partner.partner_longitude):
+ raise Warning(
+ _("Missing geo-localization information on "
+ "start partner '%s'."))
+ if not self.partner_latitude or not self.partner_longitude:
+ raise Warning(
+ _("Missing geo-localization information on destination "
+ "partner '%s'.") % self.name)
+ url = url.replace(
+ '{START_LATITUDE}', unicode(start_partner.partner_latitude))
+ url = url.replace(
+ '{START_LONGITUDE}', unicode(start_partner.partner_longitude))
+ url = url.replace(
+ '{DEST_LATITUDE}', unicode(self.partner_latitude))
+ url = url.replace(
+ '{DEST_LONGITUDE}', unicode(self.partner_longitude))
return {
'type': 'ir.actions.act_url',
'url': url,
diff --git a/partner_address_on_map/partner_view.xml b/partner_address_on_map/partner_view.xml
index 2884473cd..b4d62f3f7 100644
--- a/partner_address_on_map/partner_view.xml
+++ b/partner_address_on_map/partner_view.xml
@@ -19,6 +19,10 @@
name="open_map" type="object" string="Map"
attrs="{'invisible': [('street', '=', False), ('city', '=', False)]}"
icon="fa-map-marker"/>
+
diff --git a/partner_address_on_map/users_view.xml b/partner_address_on_map/users_view.xml
index 0852d77a5..65bb1e47f 100644
--- a/partner_address_on_map/users_view.xml
+++ b/partner_address_on_map/users_view.xml
@@ -15,6 +15,7 @@
+
@@ -26,6 +27,7 @@
+