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.

118 lines
4.4 KiB

  1. # -*- coding: utf-8 -*-
  2. # © 2015-2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
  3. # © 2016 Pedro M. Baeza <pedro.baeza@tecnativa.com>
  4. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  5. from odoo import models, api, _
  6. from odoo.exceptions import UserError
  7. import logging
  8. logger = logging.getLogger(__name__)
  9. class ExternalMap(models.AbstractModel):
  10. _name = 'external.map'
  11. @api.multi
  12. def _address_as_string(self):
  13. self.ensure_one()
  14. addr = []
  15. if self.street:
  16. addr.append(self.street)
  17. if self.street2:
  18. addr.append(self.street2)
  19. if self.city:
  20. addr.append(self.city)
  21. if self.state_id:
  22. addr.append(self.state_id.name)
  23. if self.zip:
  24. addr.append(self.zip)
  25. if self.country_id:
  26. addr.append(self.country_id.name)
  27. if not addr:
  28. raise UserError(_("Address missing on partner '%s'.") % self.name)
  29. return ' '.join(addr)
  30. @api.model
  31. def _prepare_url(self, url, replace):
  32. assert url, 'Missing URL'
  33. for key, value in replace.iteritems():
  34. if not isinstance(value, (str, unicode)):
  35. # for latitude and longitude which are floats
  36. value = unicode(value)
  37. url = url.replace(key, value)
  38. logger.debug('Final URL: %s', url)
  39. return url
  40. @api.multi
  41. def open_map(self):
  42. self.ensure_one()
  43. map_website = self.env.user.context_map_website_id
  44. if not map_website:
  45. raise UserError(
  46. _('Missing map provider: '
  47. 'you should set it in your preferences.'))
  48. if (map_website.lat_lon_url and hasattr(self, 'partner_latitude') and
  49. self.partner_latitude and self.partner_longitude):
  50. url = self._prepare_url(
  51. map_website.lat_lon_url, {
  52. '{LATITUDE}': self.partner_latitude,
  53. '{LONGITUDE}': self.partner_longitude})
  54. else:
  55. if not map_website.address_url:
  56. raise UserError(
  57. _("Missing parameter 'URL that uses the address' "
  58. "for map website '%s'.") % map_website.name)
  59. url = self._prepare_url(
  60. map_website.address_url,
  61. {'{ADDRESS}': self._address_as_string()})
  62. return {
  63. 'type': 'ir.actions.act_url',
  64. 'url': url,
  65. 'target': 'new',
  66. }
  67. @api.multi
  68. def open_route_map(self):
  69. self.ensure_one()
  70. if not self.env.user.context_route_map_website_id:
  71. raise UserError(
  72. _('Missing route map website: '
  73. 'you should set it in your preferences.'))
  74. map_website = self.env.user.context_route_map_website_id
  75. if not self.env.user.context_route_start_partner_id:
  76. raise UserError(
  77. _('Missing start address for route map: '
  78. 'you should set it in your preferences.'))
  79. start_partner = self.env.user.context_route_start_partner_id
  80. if (map_website.route_lat_lon_url and
  81. hasattr(self, 'partner_latitude') and
  82. self.partner_latitude and self.partner_longitude and
  83. start_partner.partner_latitude and
  84. start_partner.partner_longitude):
  85. url = self._prepare_url( # pragma: no cover
  86. map_website.route_lat_lon_url, {
  87. '{START_LATITUDE}': start_partner.partner_latitude,
  88. '{START_LONGITUDE}': start_partner.partner_longitude,
  89. '{DEST_LATITUDE}': self.partner_latitude,
  90. '{DEST_LONGITUDE}': self.partner_longitude})
  91. else:
  92. if not map_website.route_address_url:
  93. raise UserError(
  94. _("Missing route URL that uses the addresses "
  95. "for the map website '%s'") % map_website.name)
  96. url = self._prepare_url(
  97. map_website.route_address_url, {
  98. '{START_ADDRESS}': start_partner._address_as_string(),
  99. '{DEST_ADDRESS}': self._address_as_string()})
  100. return {
  101. 'type': 'ir.actions.act_url',
  102. 'url': url,
  103. 'target': 'new',
  104. }
  105. class ResPartner(models.Model):
  106. _name = 'res.partner'
  107. _inherit = ['res.partner', 'external.map']