diff options
Diffstat (limited to 'partner_external_map/models')
| -rw-r--r-- | partner_external_map/models/__init__.py | 3 | ||||
| -rw-r--r-- | partner_external_map/models/__pycache__/__init__.cpython-36.pyc | bin | 0 -> 269 bytes | |||
| -rw-r--r-- | partner_external_map/models/__pycache__/map_website.cpython-36.pyc | bin | 0 -> 1323 bytes | |||
| -rw-r--r-- | partner_external_map/models/__pycache__/res_partner.cpython-36.pyc | bin | 0 -> 2950 bytes | |||
| -rw-r--r-- | partner_external_map/models/__pycache__/res_users.cpython-36.pyc | bin | 0 -> 1910 bytes | |||
| -rw-r--r-- | partner_external_map/models/map_website.py | 34 | ||||
| -rw-r--r-- | partner_external_map/models/res_partner.py | 141 | ||||
| -rw-r--r-- | partner_external_map/models/res_users.py | 66 |
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 Binary files differnew file mode 100644 index 0000000..802099a --- /dev/null +++ b/partner_external_map/models/__pycache__/__init__.cpython-36.pyc diff --git a/partner_external_map/models/__pycache__/map_website.cpython-36.pyc b/partner_external_map/models/__pycache__/map_website.cpython-36.pyc Binary files differnew file mode 100644 index 0000000..5d94491 --- /dev/null +++ b/partner_external_map/models/__pycache__/map_website.cpython-36.pyc diff --git a/partner_external_map/models/__pycache__/res_partner.cpython-36.pyc b/partner_external_map/models/__pycache__/res_partner.cpython-36.pyc Binary files differnew file mode 100644 index 0000000..b7426f2 --- /dev/null +++ b/partner_external_map/models/__pycache__/res_partner.cpython-36.pyc diff --git a/partner_external_map/models/__pycache__/res_users.cpython-36.pyc b/partner_external_map/models/__pycache__/res_users.cpython-36.pyc Binary files differnew file mode 100644 index 0000000..17d0fd3 --- /dev/null +++ b/partner_external_map/models/__pycache__/res_users.cpython-36.pyc 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 |
