summaryrefslogtreecommitdiff
path: root/partner_external_map/models
diff options
context:
space:
mode:
Diffstat (limited to 'partner_external_map/models')
-rw-r--r--partner_external_map/models/__init__.py3
-rw-r--r--partner_external_map/models/__pycache__/__init__.cpython-36.pycbin0 -> 269 bytes
-rw-r--r--partner_external_map/models/__pycache__/map_website.cpython-36.pycbin0 -> 1323 bytes
-rw-r--r--partner_external_map/models/__pycache__/res_partner.cpython-36.pycbin0 -> 2950 bytes
-rw-r--r--partner_external_map/models/__pycache__/res_users.cpython-36.pycbin0 -> 1910 bytes
-rw-r--r--partner_external_map/models/map_website.py34
-rw-r--r--partner_external_map/models/res_partner.py141
-rw-r--r--partner_external_map/models/res_users.py66
8 files changed, 244 insertions, 0 deletions
diff --git a/partner_external_map/models/__init__.py b/partner_external_map/models/__init__.py
new file mode 100644
index 0000000..d8cc7d7
--- /dev/null
+++ b/partner_external_map/models/__init__.py
@@ -0,0 +1,3 @@
+from . import map_website
+from . import res_partner
+from . import res_users
diff --git a/partner_external_map/models/__pycache__/__init__.cpython-36.pyc b/partner_external_map/models/__pycache__/__init__.cpython-36.pyc
new file mode 100644
index 0000000..802099a
--- /dev/null
+++ b/partner_external_map/models/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/partner_external_map/models/__pycache__/map_website.cpython-36.pyc b/partner_external_map/models/__pycache__/map_website.cpython-36.pyc
new file mode 100644
index 0000000..5d94491
--- /dev/null
+++ b/partner_external_map/models/__pycache__/map_website.cpython-36.pyc
Binary files differ
diff --git a/partner_external_map/models/__pycache__/res_partner.cpython-36.pyc b/partner_external_map/models/__pycache__/res_partner.cpython-36.pyc
new file mode 100644
index 0000000..b7426f2
--- /dev/null
+++ b/partner_external_map/models/__pycache__/res_partner.cpython-36.pyc
Binary files differ
diff --git a/partner_external_map/models/__pycache__/res_users.cpython-36.pyc b/partner_external_map/models/__pycache__/res_users.cpython-36.pyc
new file mode 100644
index 0000000..17d0fd3
--- /dev/null
+++ b/partner_external_map/models/__pycache__/res_users.cpython-36.pyc
Binary files differ
diff --git a/partner_external_map/models/map_website.py b/partner_external_map/models/map_website.py
new file mode 100644
index 0000000..6b34e6b
--- /dev/null
+++ b/partner_external_map/models/map_website.py
@@ -0,0 +1,34 @@
+# 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 fields, models
+
+
+class MapWebsite(models.Model):
+ _name = "map.website"
+ _description = "Map Website"
+
+ name = fields.Char(string="Map Website Name", required=True)
+ address_url = fields.Char(
+ string="URL that uses the address",
+ 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} 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').",
+ )
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",
+ }
diff --git a/partner_external_map/models/res_users.py b/partner_external_map/models/res_users.py
new file mode 100644
index 0000000..248f397
--- /dev/null
+++ b/partner_external_map/models/res_users.py
@@ -0,0 +1,66 @@
+# 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, fields, models
+
+logger = logging.getLogger(__name__)
+
+
+class ResUsers(models.Model):
+ _inherit = "res.users"
+
+ @api.model
+ def _default_map_website(self):
+ return self.env["map.website"].search(
+ ["|", ("address_url", "!=", False), ("lat_lon_url", "!=", False)], limit=1
+ )
+
+ @api.model
+ def _default_route_map_website(self):
+ return self.env["map.website"].search(
+ [
+ "|",
+ ("route_address_url", "!=", False),
+ ("route_lat_lon_url", "!=", False),
+ ],
+ limit=1,
+ )
+
+ # begin with context_ to allow user to change it by himself
+ context_map_website_id = fields.Many2one(
+ "map.website",
+ string="Map Website",
+ default=_default_map_website,
+ domain=["|", ("address_url", "!=", False), ("lat_lon_url", "!=", False)],
+ )
+ # We want to give the possibility to the user to have one map provider for
+ # regular maps and another one for routing
+ context_route_map_website_id = fields.Many2one(
+ "map.website",
+ string="Route Map Website",
+ domain=[
+ "|",
+ ("route_address_url", "!=", False),
+ ("route_lat_lon_url", "!=", False),
+ ],
+ default=_default_route_map_website,
+ help="Map provided used when you click on the car icon on the partner "
+ "form to display an itinerary.",
+ )
+ context_route_start_partner_id = fields.Many2one(
+ "res.partner", string="Start Address for Route Map"
+ )
+
+ @api.model
+ def create(self, vals):
+ """On creation, if no starting partner is provided, assign the current
+ created one.
+ """
+ user = super(ResUsers, self).create(vals)
+ if not vals.get("context_route_start_partner_id"):
+ user.context_route_start_partner_id = user.partner_id.id
+ return user