Browse Source

Merge pull request #134 from akretion/8.0-address-on-map

8.0 add module partner_external_maps (module google_map in better !)
pull/138/head
Pedro M. Baeza 10 years ago
parent
commit
a6ecbcb5e7
  1. 65
      partner_external_maps/README.rst
  2. 4
      partner_external_maps/__init__.py
  3. 43
      partner_external_maps/__openerp__.py
  4. 190
      partner_external_maps/i18n/fr.po
  5. 172
      partner_external_maps/i18n/partner_external_maps.pot
  6. 64
      partner_external_maps/map_website_data.xml
  7. 49
      partner_external_maps/map_website_view.xml
  8. 210
      partner_external_maps/partner_external_maps.py
  9. 31
      partner_external_maps/partner_view.xml
  10. 28
      partner_external_maps/post_install.py
  11. 3
      partner_external_maps/security/ir.model.access.csv
  12. 42
      partner_external_maps/users_view.xml

65
partner_external_maps/README.rst

@ -0,0 +1,65 @@
Partner External Maps
=====================
In the old days of Odoo/OpenERP, back in version 6.1, there was an official *google_map* module ; this module added a *Map* button on the partner form view and, when the user clicked on that button, it would open a new tab on its web browser and go to Google Map with a search on the address of the partner.
This module aims at restoring this feature with several improvements:
* each user can select the map website he wants to use in its preferences
* there are now two buttons on the partner form view: one to open a regular map on the address of the partner, and another one to open an itinerary map from the start address configured in the preferences of the user to the address of the partner.
This module supports several map websites:
* `Google Maps <https://www.google.com/maps>`
* `OpenStreetMap <https://www.openstreetmap.org/>`
* `Bing Maps <https://www.bing.com/maps/>`
* `Here Maps <https://www.here.com/>`
* `MapQuest <http://www.mapquest.com/>`
* `Yahoo! Maps <https://maps.yahoo.com/>`
If the module *base_geolocalize* from the official addons is installed on the system, it will use the latitude and longitude to localize the partner (instead of the address) if this information is present on the partner.
Configuration
=============
If you want to create additionnal map websites, go to the menu *Sales > Configuration > Address Book > Localization > Map Websites*. You are invited to send the configuration information of your additionnal map websites to the author of the module, so that the module can be updated with more pre-configured map websites.
Usage
=====
First, you need to configure in your preferences:
* the map website to use for the regular maps,
* the map website to use for the route maps,
* the start address for the route maps.
Then you can use the two new buttons on the partner form to open a regular map or a route map.
Credits
=======
Contributors
------------
* Alexis de Lattre <alexis.delattre@akretion.com>
Maintainer
----------
.. image:: http://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: http://odoo-community.org
This module is maintained by the OCA.
OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.
To contribute to this module, please visit http://odoo-community.org.

4
partner_external_maps/__init__.py

@ -0,0 +1,4 @@
# -*- encoding: utf-8 -*-
from . import partner_external_maps
from .post_install import set_default_map_settings

43
partner_external_maps/__openerp__.py

@ -0,0 +1,43 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Partner External Maps module for Odoo
# Copyright (C) 2015 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{
'name': 'Partner External Maps',
'version': '0.1',
'category': 'Extra Tools',
'license': 'AGPL-3',
'summary': 'Add Map and Map Routing buttons on partner form to '
'open GMaps, OSM, Bing and others',
'author': 'Akretion,Odoo Community Association (OCA)',
'website': 'http://www.akretion.com',
'depends': ['base'],
'data': [
'partner_view.xml',
'map_website_data.xml',
'map_website_view.xml',
'users_view.xml',
'security/ir.model.access.csv',
],
'post_init_hook': 'set_default_map_settings',
'installable': True,
}

190
partner_external_maps/i18n/fr.po

@ -0,0 +1,190 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * partner_external_maps
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-06-19 19:42+0000\n"
"PO-Revision-Date: 2015-06-19 19:42+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: partner_external_maps
#: code:addons/partner_external_maps/partner_external_maps.py:115
#, python-format
msgid "Address missing on partner '%s'."
msgstr "Adresse manquante sur le partenaire '%s'."
#. module: partner_external_maps
#: field:map.website,create_uid:0
msgid "Created by"
msgstr "Créé par"
#. module: partner_external_maps
#: field:map.website,create_date:0
msgid "Created on"
msgstr "Créé le"
#. module: partner_external_maps
#: field:map.website,id:0
msgid "ID"
msgstr "ID"
#. module: partner_external_maps
#: help:map.website,address_url:0
msgid "In this URL, {ADDRESS} will be replaced by the address."
msgstr ""
#. module: partner_external_maps
#: help:map.website,lat_lon_url:0
msgid "In this URL, {LATITUDE} and {LONGITUDE} will be replaced by the latitude and longitude (requires the module 'base_geolocalize')"
msgstr ""
#. module: partner_external_maps
#: help:map.website,route_address_url:0
msgid "In this URL, {START_ADDRESS} and {DEST_ADDRESS} will be replaced by the start and destination addresses."
msgstr ""
#. module: partner_external_maps
#: help:map.website,route_lat_lon_url:0
msgid "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')."
msgstr ""
#. module: partner_external_maps
#: field:map.website,write_uid:0
msgid "Last Updated by"
msgstr ""
#. module: partner_external_maps
#: field:map.website,write_date:0
msgid "Last Updated on"
msgstr ""
#. module: partner_external_maps
#: view:res.partner:partner_external_maps.view_partner_form
msgid "Map"
msgstr "Carte"
#. module: partner_external_maps
#: model:ir.model,name:partner_external_maps.model_map_website
#: view:map.website:partner_external_maps.map_website_form
#: field:res.users,context_map_website_id:0
msgid "Map Website"
msgstr "Site de carte"
#. module: partner_external_maps
#: field:map.website,name:0
msgid "Map Website Name"
msgstr "Nom du site de carte"
#. module: partner_external_maps
#: model:ir.actions.act_window,name:partner_external_maps.map_website_action
#: model:ir.ui.menu,name:partner_external_maps.map_website_menu
#: view:map.website:partner_external_maps.map_website_tree
msgid "Map Websites"
msgstr "Sites de carte"
#. module: partner_external_maps
#: help:res.users,context_route_map_website_id:0
msgid "Map provided used when you click on the car icon on the partner form to display an itinerary."
msgstr ""
#. module: partner_external_maps
#: code:addons/partner_external_maps/partner_external_maps.py:191
#, python-format
msgid "Missing geo-localization information on destination partner '%s'."
msgstr ""
#. module: partner_external_maps
#: code:addons/partner_external_maps/partner_external_maps.py:187
#, python-format
msgid "Missing geo-localization information on start partner '%s'."
msgstr ""
#. module: partner_external_maps
#: code:addons/partner_external_maps/partner_external_maps.py:133
#, python-format
msgid "Missing map provider: you should set it in your preferences."
msgstr ""
#. module: partner_external_maps
#: code:addons/partner_external_maps/partner_external_maps.py:178
#, python-format
msgid "Missing module 'base_geolocalize'"
msgstr "Module 'base_geolocalize' manquant"
#. module: partner_external_maps
#: code:addons/partner_external_maps/partner_external_maps.py:147
#, python-format
msgid "Missing parameter 'URL that uses the address' for map website '%s'."
msgstr ""
#. module: partner_external_maps
#: code:addons/partner_external_maps/partner_external_maps.py:162
#, python-format
msgid "Missing route map website: you should set it in your preferences."
msgstr ""
#. module: partner_external_maps
#: code:addons/partner_external_maps/partner_external_maps.py:167
#, python-format
msgid "Missing start address for route map: you should set it in your preferences."
msgstr ""
#. module: partner_external_maps
#: code:addons/partner_external_maps/partner_external_maps.py:181
#, python-format
msgid "No route URL that uses latitude and longitude on map provider '%s'."
msgstr ""
#. module: partner_external_maps
#: model:ir.model,name:partner_external_maps.model_res_partner
msgid "Partner"
msgstr "Partenaire"
#. module: partner_external_maps
#: view:res.partner:partner_external_maps.view_partner_form
msgid "Route Map"
msgstr "Itinéraire"
#. module: partner_external_maps
#: field:res.users,context_route_map_website_id:0
msgid "Route Map Website"
msgstr "Site web pour les itinéraires"
#. module: partner_external_maps
#: field:map.website,route_lat_lon_url:0
msgid "Route URL that uses latitude and longitude"
msgstr ""
#. module: partner_external_maps
#: field:map.website,route_address_url:0
msgid "Route URL that uses the addresses"
msgstr ""
#. module: partner_external_maps
#: field:res.users,context_route_start_partner_id:0
msgid "Start Address for Route Map"
msgstr "Adresse de départ pour les itinéraires"
#. module: partner_external_maps
#: field:map.website,lat_lon_url:0
msgid "URL that uses latitude and longitude"
msgstr ""
#. module: partner_external_maps
#: field:map.website,address_url:0
msgid "URL that uses the address"
msgstr ""
#. module: partner_external_maps
#: model:ir.model,name:partner_external_maps.model_res_users
msgid "Users"
msgstr "Utilisateurs"

172
partner_external_maps/i18n/partner_external_maps.pot

@ -0,0 +1,172 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * partner_external_maps
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-06-19 19:55+0000\n"
"PO-Revision-Date: 2015-06-19 19:55+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: partner_external_maps
#: code:addons/partner_external_maps/partner_external_maps.py:116
#, python-format
msgid "Address missing on partner '%s'."
msgstr ""
#. module: partner_external_maps
#: field:map.website,create_uid:0
msgid "Created by"
msgstr ""
#. module: partner_external_maps
#: field:map.website,create_date:0
msgid "Created on"
msgstr ""
#. module: partner_external_maps
#: field:map.website,id:0
msgid "ID"
msgstr ""
#. module: partner_external_maps
#: help:map.website,address_url:0
msgid "In this URL, {ADDRESS} will be replaced by the address."
msgstr ""
#. module: partner_external_maps
#: help:map.website,lat_lon_url:0
msgid "In this URL, {LATITUDE} and {LONGITUDE} will be replaced by the latitude and longitude (requires the module 'base_geolocalize')"
msgstr ""
#. module: partner_external_maps
#: help:map.website,route_address_url:0
msgid "In this URL, {START_ADDRESS} and {DEST_ADDRESS} will be replaced by the start and destination addresses."
msgstr ""
#. module: partner_external_maps
#: help:map.website,route_lat_lon_url:0
msgid "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')."
msgstr ""
#. module: partner_external_maps
#: field:map.website,write_uid:0
msgid "Last Updated by"
msgstr ""
#. module: partner_external_maps
#: field:map.website,write_date:0
msgid "Last Updated on"
msgstr ""
#. module: partner_external_maps
#: view:res.partner:partner_external_maps.view_partner_form
msgid "Map"
msgstr ""
#. module: partner_external_maps
#: model:ir.model,name:partner_external_maps.model_map_website
#: view:map.website:partner_external_maps.map_website_form
#: field:res.users,context_map_website_id:0
msgid "Map Website"
msgstr ""
#. module: partner_external_maps
#: field:map.website,name:0
msgid "Map Website Name"
msgstr ""
#. module: partner_external_maps
#: model:ir.actions.act_window,name:partner_external_maps.map_website_action
#: model:ir.ui.menu,name:partner_external_maps.map_website_menu
#: view:map.website:partner_external_maps.map_website_tree
msgid "Map Websites"
msgstr ""
#. module: partner_external_maps
#: help:res.users,context_route_map_website_id:0
msgid "Map provided used when you click on the car icon on the partner form to display an itinerary."
msgstr ""
#. module: partner_external_maps
#: code:addons/partner_external_maps/partner_external_maps.py:134
#, python-format
msgid "Missing map provider: you should set it in your preferences."
msgstr ""
#. module: partner_external_maps
#: code:addons/partner_external_maps/partner_external_maps.py:148
#, python-format
msgid "Missing parameter 'URL that uses the address' for map website '%s'."
msgstr ""
#. module: partner_external_maps
#: code:addons/partner_external_maps/partner_external_maps.py:187
#, python-format
msgid "Missing route URL that uses the addresses for the map website '%s'"
msgstr ""
#. module: partner_external_maps
#: code:addons/partner_external_maps/partner_external_maps.py:163
#, python-format
msgid "Missing route map website: you should set it in your preferences."
msgstr ""
#. module: partner_external_maps
#: code:addons/partner_external_maps/partner_external_maps.py:168
#, python-format
msgid "Missing start address for route map: you should set it in your preferences."
msgstr ""
#. module: partner_external_maps
#: model:ir.model,name:partner_external_maps.model_res_partner
msgid "Partner"
msgstr ""
#. module: partner_external_maps
#: view:res.partner:partner_external_maps.view_partner_form
msgid "Route Map"
msgstr ""
#. module: partner_external_maps
#: field:res.users,context_route_map_website_id:0
msgid "Route Map Website"
msgstr ""
#. module: partner_external_maps
#: field:map.website,route_lat_lon_url:0
msgid "Route URL that uses latitude and longitude"
msgstr ""
#. module: partner_external_maps
#: field:map.website,route_address_url:0
msgid "Route URL that uses the addresses"
msgstr ""
#. module: partner_external_maps
#: field:res.users,context_route_start_partner_id:0
msgid "Start Address for Route Map"
msgstr ""
#. module: partner_external_maps
#: field:map.website,lat_lon_url:0
msgid "URL that uses latitude and longitude"
msgstr ""
#. module: partner_external_maps
#: field:map.website,address_url:0
msgid "URL that uses the address"
msgstr ""
#. module: partner_external_maps
#: model:ir.model,name:partner_external_maps.model_res_users
msgid "Users"
msgstr ""

64
partner_external_maps/map_website_data.xml

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 Akretion (www.akretion.com)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
The licence is in the file __openerp__.py
-->
<openerp>
<data>
<!-- Interesting source of information: http://northwestspatial.com/wp/?p=38 -->
<record id="google_maps" model="map.website">
<field name="name">Google Maps</field>
<field name="address_url">https://www.google.com/maps?ie=UTF8&amp;q={ADDRESS}</field>
<field name="lat_lon_url">https://www.google.com/maps?z=15&amp;q={LATITUDE},{LONGITUDE}</field>
<field name="route_address_url">https://www.google.com/maps?saddr={START_ADDRESS}&amp;daddr={DEST_ADDRESS}&amp;directionsmode=driving</field>
<field name="route_lat_lon_url">https://www.google.com/maps?saddr={START_LATITUDE},{START_LONGITUDE}&amp;daddr={DEST_LATITUDE},{DEST_LONGITUDE}&amp;directionsmode=driving</field>
</record>
<record id="openstreetmap" model="map.website">
<field name="name">OpenStreetMap</field>
<field name="address_url">https://nominatim.openstreetmap.org/search?q={ADDRESS}</field>
<field name="lat_lon_url">https://www.openstreetmap.org/?zoom=15&amp;mlat={LATITUDE}&amp;mlon={LONGITUDE}</field>
<field name="route_lat_lon_url">https://www.openstreetmap.org/directions/?engine=orsm_car&amp;route={START_LATITUDE},{START_LONGITUDE};{DEST_LATITUDE},{DEST_LONGITUDE}</field>
</record>
<record id="openstreetmap_fr" model="map.website">
<field name="name">OpenStreetMap FR</field>
<field name="address_url">http://tile.openstreetmap.fr/?q={ADDRESS}</field>
<field name="lat_lon_url">http://tile.openstreetmap.fr/?zoom=15&amp;lat={LATITUDE}&amp;lon={LONGITUDE}</field>
</record>
<record id="bing_maps" model="map.website">
<field name="name">Bing Maps</field>
<field name="address_url">https://www.bing.com/maps/default.aspx?where1={ADDRESS}</field>
<field name="lat_lon_url">https://www.bing.com/maps/default.aspx?where1={LATITUDE},{LONGITUDE}&amp;lvl=15</field>
</record>
<record id="here" model="map.website">
<field name="name">Here Maps</field>
<field name="address_url">https://here.com/search/{ADDRESS}</field>
<field name="lat_lon_url">https://www.here.com/?map={LATITUDE},{LONGITUDE},15,normal</field>
<!-- TODO : for here maps, try to find a lat_lon_url with dot -->
<field name="route_lat_lon_url">https://www.here.com/directions/drive/:{START_LATITUDE},{START_LONGITUDE}/:{DEST_LATITUDE},{DEST_LONGITUDE}</field>
</record>
<record id="mapquest" model="map.website">
<field name="name">MapQuest</field>
<field name="address_url">http://mapq.st/?q={ADDRESS}</field>
<field name="lat_lon_url">http://mapq.st/?q={LATITUDE},{LONGITUDE}</field>
<field name="route_address_url">http://mapq.st/directions?saddr={START_ADDRESS}&amp;daddr={DEST_ADDRESS}</field>
<field name="route_lat_lon_url">http://mapq.st/directions?saddr={START_LATITUDE},{START_LONGITUDE}&amp;daddr={DEST_LATITUDE},{DEST_LONGITUDE}</field>
</record>
<record id="yahoo_maps" model="map.website">
<field name="name">Yahoo! Maps</field>
<field name="address_url">https://maps.yahoo.com/place/?addr={ADDRESS}</field>
<field name="lat_lon_url">https://maps.yahoo.com/place/?lat={LATITUDE}&amp;lon={LONGITUDE}</field>
<field name="route_address_url">https://maps.yahoo.com/directions/?o={START_ADDRESS}&amp;d={DEST_ADDRESS}</field>
</record>
</data>
</openerp>

49
partner_external_maps/map_website_view.xml

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 Akretion France (www.akretion.com)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
The licence is in the file __openerp__.py
-->
<openerp>
<data>
<record id="map_website_form" model="ir.ui.view">
<field name="name">map.website.form</field>
<field name="model">map.website</field>
<field name="arch" type="xml">
<form string="Map Website">
<group name="main">
<field name="name"/>
<field name="address_url"/>
<field name="lat_lon_url"/>
<field name="route_address_url"/>
<field name="route_lat_lon_url"/>
</group>
</form>
</field>
</record>
<record id="map_website_tree" model="ir.ui.view">
<field name="name">map.website.tree</field>
<field name="model">map.website</field>
<field name="arch" type="xml">
<tree string="Map Websites">
<field name="name"/>
<field name="address_url"/>
</tree>
</field>
</record>
<record id="map_website_action" model="ir.actions.act_window">
<field name="name">Map Websites</field>
<field name="res_model">map.website</field>
<field name="view_mode">tree,form</field>
</record>
<!-- Menu entry under Sales > Config > Address Book > Localization -->
<menuitem id="map_website_menu" action="map_website_action"
parent="base.menu_localisation" sequence="50"/>
</data>
</openerp>

210
partner_external_maps/partner_external_maps.py

@ -0,0 +1,210 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Partner External Maps module for Odoo
# Copyright (C) 2015 Akretion (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import models, fields, api, _
from openerp.exceptions import Warning
import logging
logger = logging.getLogger(__name__)
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').")
class ResUsers(models.Model):
_inherit = 'res.users'
@api.model
def _default_map_website(self):
map_website = self.env['map.website'].search([
'|', ('address_url', '!=', False), ('lat_lon_url', '!=', False)],
limit=1)
return map_website
@api.model
def _default_route_map_website(self):
map_route_website = self.env['map.website'].search([
'|',
('route_address_url', '!=', False),
('route_lat_lon_url', '!=', False)], limit=1)
return map_route_website
# begin with context_ to allow user to change it by himself
context_map_website_id = fields.Many2one(
'map.website', string='Map Website',
domain=[
'|', ('address_url', '!=', False), ('lat_lon_url', '!=', False)],
default=_default_map_website)
# 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 _default_map_settings(self):
"""Method called from post-install script
I can't use a default method on the field, because it would be executed
before loading map_website_data.xml, so it would not be able to set a
value"""
users = self.env['res.users'].search([])
map_website = self._default_map_website()
map_route_website = self._default_route_map_website()
logger.info('Updating user settings for maps...')
for user in users:
user.write({
'context_map_website_id': map_website.id or False,
'context_route_map_website_id': map_route_website.id or False,
'context_route_start_partner_id': user.partner_id.id or False,
})
class ResPartner(models.Model):
_inherit = 'res.partner'
@api.model
def _address_as_string(self):
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 Warning(
_("Address missing on partner '%s'.") % self.name)
address = ' '.join(addr)
return address
@api.model
def _prepare_url(self, url, replace):
assert url, 'Missing URL'
for key, value in replace.iteritems():
if not isinstance(value, (str, unicode)):
# for latitude and longitude which are floats
value = unicode(value)
url = url.replace(key, value)
logger.debug('Final URL: %s', url)
return url
@api.multi
def open_map(self):
if not self.env.user.context_map_website_id:
raise Warning(
_('Missing map provider: '
'you should set it in your preferences.'))
map_website = self.env.user.context_map_website_id
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 Warning(
_("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',
}
@api.multi
def open_route_map(self):
if not self.env.user.context_route_map_website_id:
raise Warning(
_('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 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_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(
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 Warning(
_("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',
}

31
partner_external_maps/partner_view.xml

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 Akretion France (www.akretion.com)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
The licence is in the file __openerp__.py
-->
<openerp>
<data>
<!-- Inherit partner view to add 'Map' button -->
<record id="view_partner_form" model="ir.ui.view">
<field name="name">map.button.res.partner.form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
<button class="oe_inline oe_stat_button"
name="open_map" type="object" string="Map"
attrs="{'invisible': [('city', '=', False)]}"
icon="fa-map-marker"/>
<button class="oe_inline oe_stat_button"
name="open_route_map" type="object" string="Route Map"
attrs="{'invisible': [('city', '=', False)]}"
icon="fa-car"/>
</xpath>
</field>
</record>
</data>
</openerp>

28
partner_external_maps/post_install.py

@ -0,0 +1,28 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Partner Address on Map module for Odoo
# Copyright (C) 2015 Akretion (http://www.akretion.com)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import SUPERUSER_ID
def set_default_map_settings(cr, pool):
pool['res.users']._default_map_settings(cr, SUPERUSER_ID)
return

3
partner_external_maps/security/ir.model.access.csv

@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_map_website_read,Read access on map.website to everybody,model_map_website,,1,0,0,0
access_map_website_full,Full access on map.website to System user,model_map_website,base.group_system,1,1,1,1

42
partner_external_maps/users_view.xml

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 Akretion France (www.akretion.com)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
The licence is in the file __openerp__.py
-->
<openerp>
<data>
<record id="view_users_form" model="ir.ui.view">
<field name="name">map.res.users.form</field>
<field name="model">res.users</field>
<field name="inherit_id" ref="base.view_users_form"/>
<field name="arch" type="xml">
<group name="messaging" position="after">
<group name="maps" string="Maps">
<field name="context_map_website_id" widget="selection"/>
<field name="context_route_map_website_id" widget="selection"/>
<field name="context_route_start_partner_id"/>
</group>
</group>
</field>
</record>
<record id="view_users_form_simple_modif" model="ir.ui.view">
<field name="name">map.preferences.res.users.form</field>
<field name="model">res.users</field>
<field name="inherit_id" ref="base.view_users_form_simple_modif"/>
<field name="arch" type="xml">
<group name="preferences" position="inside">
<field name="context_map_website_id"
readonly="0" widget="selection"/>
<field name="context_route_map_website_id"
readonly="0" widget="selection"/>
<field name="context_route_start_partner_id" readonly="0"/>
</group>
</field>
</record>
</data>
</openerp>
Loading…
Cancel
Save