summaryrefslogtreecommitdiff
path: root/partner_external_map/models/res_partner.py
diff options
context:
space:
mode:
Diffstat (limited to 'partner_external_map/models/res_partner.py')
-rw-r--r--partner_external_map/models/res_partner.py141
1 files changed, 141 insertions, 0 deletions
diff --git a/partner_external_map/models/res_partner.py b/partner_external_map/models/res_partner.py
new file mode 100644
index 0000000..ec2b3bb
--- /dev/null
+++ b/partner_external_map/models/res_partner.py
@@ -0,0 +1,141 @@
+# 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).
+
+import logging
+
+from odoo import _, api, models
+from odoo.exceptions import UserError
+
+logger = logging.getLogger(__name__)
+
+
+class ResPartner(models.Model):
+ _inherit = "res.partner"
+
+ 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
+ if isinstance(value, float):
+ value = "%.5f" % value
+ else:
+ value = ""
+ url = url.replace(key, value)
+ logger.debug("Final URL: %s", url)
+ return url
+
+ 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",
+ }
+
+ 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",
+ }