From 6eea371f5098fe45f262a6e845b261d487e3883f Mon Sep 17 00:00:00 2001 From: Lindsay Date: Tue, 2 Jun 2020 15:08:04 +0200 Subject: [PATCH] [FIX] code format and pylint: Squashed commit of the following: commit 527e21551ce785168fdcacd85e949d04b7f4d439 Author: Lindsay Date: Tue Jun 2 14:47:52 2020 +0200 fixing typo commit dd9c3ecc2b870470228b8a65642730cf86b36734 Author: Lindsay Date: Tue Jun 2 14:42:47 2020 +0200 fixing pylint travis commit 7899f9b312da7c6023e6ddf3f007bfb6abe556db Author: Lindsay Date: Tue Jun 2 14:05:25 2020 +0200 fix travis flake8 linting commit 039e8670aa7938876e30efd6307358dd3019c8a4 Author: Lindsay Date: Tue Jun 2 13:54:07 2020 +0200 fix travis pylint commit fcfb09e0e3bddcda01071967d63b4cbc22d7dc15 Author: Lindsay Date: Tue Jun 2 13:45:09 2020 +0200 fixing travis tests commit ff2b39e66ddd6d8b73cd0150f0da527d88186031 Author: Lindsay Date: Tue Jun 2 12:07:45 2020 +0200 fix import commit cdf43dc0b6af7925fa2ac38acddcb93f743daf69 Author: Lindsay Date: Tue Jun 2 11:47:21 2020 +0200 add responses to travis for testing commit 79da0ee02a3ac76d605066f7a5d69ff336fb2bb5 Author: Lindsay Date: Tue Jun 2 11:40:55 2020 +0200 disable pylint warning W0622 commit d6eab49374d01cdff18f4a42c7e01ce0156f90dd Author: Lindsay Date: Tue Jun 2 10:29:58 2020 +0200 formatting for linters --- .travis.yml | 2 +- base_geoengine/fields.py | 28 +++++------ base_geoengine/geo_db.py | 19 ++++---- base_geoengine/geo_operators.py | 4 ++ base_geoengine/tests/test_geoengine.py | 16 +++---- base_geoengine_demo/models/geo_npa.py | 4 +- base_geoengine_demo/models/retail_machine.py | 2 +- .../models/res_partner.py | 28 ++++++----- .../tests/test_geolocalize_openstreetmap.py | 48 +++++++++++-------- .../models/res_partner.py | 22 ++------- geoengine_geoname_geocoder/res_partner.py | 2 +- 11 files changed, 90 insertions(+), 85 deletions(-) diff --git a/.travis.yml b/.travis.yml index f549270598..161f4128b4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,7 +32,7 @@ install: - git clone https://github.com/OCA/maintainer-quality-tools.git ${HOME}/maintainer-quality-tools - export PATH=${HOME}/maintainer-quality-tools/travis:${PATH} - travis_install_nightly - - pip install geojson Shapely sphinx sphinx_bootstrap_theme sphinx-intl odoo-sphinx-autodoc + - pip install geojson Shapely sphinx sphinx_bootstrap_theme sphinx-intl odoo-sphinx-autodoc responses # This is to solve an issue with stdout file descriptor # raising a BlockingIOError while executing pylint and returns an exit -1 # seems related to the numerous lint errors on web_view_google_map module diff --git a/base_geoengine/fields.py b/base_geoengine/fields.py index df2baaf285..f8c1022f7e 100644 --- a/base_geoengine/fields.py +++ b/base_geoengine/fields.py @@ -21,6 +21,7 @@ logger.warning('Shapely or geojson are not available in the sys path') +# pylint: disable=sql-injection, invalid-commit class GeoField(Field): """ The field descriptor contains the field definition common to all specialized fields for geolocalization. Subclasses must define a type @@ -55,8 +56,7 @@ def convert_to_column(self, value, record): shape_to_write = self.entry_to_shape(value, same_type=True) if shape_to_write.is_empty: return None - else: - return shape_to_write.wkt + return shape_to_write.wkt def convert_to_cache(self, value, record, validate=True): val = value @@ -117,7 +117,6 @@ def create_geo_column(self, cr, col_name, table, model): raise finally: cr.commit() - return True def entry_to_shape(self, value, same_type=False): @@ -190,6 +189,7 @@ def update_geo_column(self, cr, col_name, table, model): class GeoLine(GeoField): """Field for POSTGIS geometry Line type""" + type = 'geo_line' geo_type = 'LINESTRING' @@ -261,28 +261,28 @@ def from_latlon(cls, cr, latitude, longitude): def to_latlon(cls, cr, geopoint): """ Convert a UTM coordinate point to (latitude, longitude): """ - # Line to execute to retrieve longitude, latitude from UTM in postgres command line: + # Line to execute to retrieve longitude, latitude from UTM + # in postgres command line: # SELECT ST_X(geom), ST_Y(geom) FROM (SELECT ST_TRANSFORM(ST_SetSRID( - # ST_MakePoint(601179.61612, 6399375,681364), 3847), 4326) as geom) g; + # ST_MakePoint(601179.61612, 6399375,681364), 3847), 4326) as geom) g; if isinstance(geopoint, BaseGeometry): geo_point_instance = geopoint else: geo_point_instance = asShape(geojson.loads(geopoint)) cr.execute(""" - SELECT - ST_TRANSFORM( - ST_SetSRID( - ST_MakePoint( - %(coord_x)s, %(coord_y)s - ), - %(srid)s - ), 4326)""", - {'coord_x': geo_point_instance.x, 'coord_y':geo_point_instance.y, 'srid': cls._slots['srid']}) + SELECT + ST_TRANSFORM( + ST_SetSRID(ST_MakePoint(%(coord_x)s, %(coord_y)s), + %(srid)s), 4326)""", + {'coord_x': geo_point_instance.x, + 'coord_y': geo_point_instance.y, + 'srid': cls._slots['srid']}) res = cr.fetchone() point_latlon = cls.load_geo(res[0]) return point_latlon.x, point_latlon.y + class GeoPolygon(GeoField): """Field for POSTGIS geometry Polygon type""" type = 'geo_polygon' diff --git a/base_geoengine/geo_db.py b/base_geoengine/geo_db.py index 30eab43d03..12b60b6141 100644 --- a/base_geoengine/geo_db.py +++ b/base_geoengine/geo_db.py @@ -4,6 +4,7 @@ """Helper to setup Postgis""" import logging +from odoo import _ from odoo.exceptions import MissingError logger = logging.getLogger('geoengine.sql') @@ -33,12 +34,14 @@ def init_postgis(cr): """) except Exception: raise MissingError( - "Error, can not automatically initialize spatial postgis support. " - "Database user may have to be superuser and postgres/postgis " - "extentions with their devel header have to be installed. " - "If you do not want Odoo to connect with a super user " - "you can manually prepare your database. To do this" - "open a client to your database using a super user and run: \n" - "CREATE EXTENSION postgis;\n" - "CREATE EXTENSION postgis_topology;\n" + _("Error," + "can not automatically initialize spatial postgis support." + "Database user may have to be superuser and postgres/postgis " + "extentions with their devel header have to be installed. " + "If you do not want Odoo to connect with a super user " + "you can manually prepare your database. To do this" + "open a client to your database using a super user and run: \n" + "CREATE EXTENSION postgis;\n" + "CREATE EXTENSION postgis_topology;\n") + ) diff --git a/base_geoengine/geo_operators.py b/base_geoengine/geo_operators.py index 2d105f6b8b..b497bd2bb3 100644 --- a/base_geoengine/geo_operators.py +++ b/base_geoengine/geo_operators.py @@ -45,6 +45,7 @@ def geo_search(model, domain=None, geo_domain=None, offset=0, * geo_contains * geo_intersect """ + cr = model._cr domain = domain or [] geo_domain = geo_domain or [] @@ -114,9 +115,12 @@ def geo_search(model, domain=None, geo_domain=None, offset=0, where_statement = " WHERE %s" % (u' '.join(where_clause_arr)) else: where_statement = u'' + + # pylint: disable=sql-injection sql = 'SELECT "%s".id FROM ' % model._table + from_clause + \ where_statement + order_by + limit_str + offset_str # logger.debug(cursor.mogrify(sql, where_clause_params)) + cr.execute(sql, where_clause_params) res = cr.fetchall() if res: diff --git a/base_geoengine/tests/test_geoengine.py b/base_geoengine/tests/test_geoengine.py index 1932166092..689c6ebc33 100644 --- a/base_geoengine/tests/test_geoengine.py +++ b/base_geoengine/tests/test_geoengine.py @@ -16,9 +16,9 @@ from odoo import fields from odoo.exceptions import MissingError -from odoo.addons.base_geoengine.geo_model import GeoModel -from odoo.addons.base_geoengine import fields as geo_fields -from odoo.addons.base_geoengine.fields import GeoPoint +from ..geo_model import GeoModel +from .. import fields as geo_fields +from ..fields import GeoPoint from .data import MULTIPOLYGON_1, GEO_VIEW, FORM_VIEW from .data import EXPECTED_GEO_COLUMN_MULTIPOLYGON @@ -274,10 +274,9 @@ def test_create_line_from_points(self): self.env.cr, geo_point_1, geo_point_2) self.assertEqual(geo_line, expected_line) - def test_from_lat_lon(self): latitude = 49.72842315886126 - longitude = 5.400488376617026 + longitude = 5.400488376617026 # This is computed with postgis in postgres: @@ -287,13 +286,10 @@ def test_from_lat_lon(self): self.assertAlmostEqual(geo_point.x, expected_coordinates[0], 4) self.assertAlmostEqual(geo_point.y, expected_coordinates[1], 4) - + def test_to_lat_lon(self): - x = 613393.2849222135 - y = 5587677.847237722 - geo_point = Point(601179.61612, 6399375,681364) - expected_lat_lon = [49.72842315886126, 5.400488376617026] + geo_point = Point(601179.61612, 6399375.681364) longitude, latitude = GeoPoint.to_latlon(self.env.cr, geo_point) diff --git a/base_geoengine_demo/models/geo_npa.py b/base_geoengine_demo/models/geo_npa.py index 80b8831e5f..101fe7a5a8 100644 --- a/base_geoengine_demo/models/geo_npa.py +++ b/base_geoengine_demo/models/geo_npa.py @@ -18,12 +18,12 @@ class NPA(geo_model.GeoModel): city = fields.Char('City', size=64, index=True, required=True) the_geom = geo_fields.GeoMultiPolygon('NPA Shape') total_sales = fields.Float( - compute='_get_ZIP_total_sales', + compute='_compute_ZIP_total_sales', string='Spatial! Total Sales', ) @api.multi - def _get_ZIP_total_sales(self): + def _compute_ZIP_total_sales(self): """Return the total of the invoiced sales for this npa""" mach_obj = self.env['geoengine.demo.automatic.retailing.machine'] for rec in self: diff --git a/base_geoengine_demo/models/retail_machine.py b/base_geoengine_demo/models/retail_machine.py index a8ed74d6d8..60db67d214 100644 --- a/base_geoengine_demo/models/retail_machine.py +++ b/base_geoengine_demo/models/retail_machine.py @@ -7,8 +7,8 @@ from odoo.addons.base_geoengine import geo_model from odoo.addons.base_geoengine import fields as geo_fields - logger = logging.getLogger(__name__) + try: import geojson except ImportError: diff --git a/base_geolocalize_openstreetmap/models/res_partner.py b/base_geolocalize_openstreetmap/models/res_partner.py index 3076e37aee..7bbe07b565 100644 --- a/base_geolocalize_openstreetmap/models/res_partner.py +++ b/base_geolocalize_openstreetmap/models/res_partner.py @@ -5,7 +5,7 @@ import logging import requests -from odoo import api, exceptions, models, _ +from odoo import exceptions, models, _ _logger = logging.getLogger(__name__) @@ -16,8 +16,8 @@ class ResPartner(models.AbstractModel): _inherit = 'res.partner' @classmethod - def _geocode_address( - cls, street=None, zip_code=None, city=None, state=None, country=None): + def _geocode_address(cls, street=None, + zip_code=None, city=None, state=None, country=None): """Get the latitude and longitude by requesting Openstreetmap" """ pay_load = { @@ -30,7 +30,7 @@ def _geocode_address( 'country': country or '', } - request_result = requests.get(cls._url, params=pay_load) + request_result = requests.get(cls._url, params=pay_load) try: request_result.raise_for_status() except Exception as e: @@ -38,14 +38,20 @@ def _geocode_address( raise exceptions.Warning( _('Geocoding error. \n %s') % e.message) values = request_result.json() - values = values and values[0] or {} + values = values[0] if values else {} return values @classmethod - def _geo_localize(cls, apikey, street='', zip='', city='', state='', country=''): - result = cls._geocode_address(street=street, zip_code=zip, city=city, state=state, country=country) - + def _geo_localize(cls, + apikey, street='', zip='', + city='', state='', country=''): + # pylint: disable=W0622 + result = cls._geocode_address(street=street, + zip_code=zip, city=city, + state=state, country=country) + if not result: - result = cls._geocode_address(city=city, state=state, country=country) - - return result.get('lat'), result.get('lon') \ No newline at end of file + result = cls._geocode_address(city=city, + state=state, country=country) + + return result.get('lat'), result.get('lon') diff --git a/base_geolocalize_openstreetmap/tests/test_geolocalize_openstreetmap.py b/base_geolocalize_openstreetmap/tests/test_geolocalize_openstreetmap.py index a29016d9bc..e57c0c9b62 100644 --- a/base_geolocalize_openstreetmap/tests/test_geolocalize_openstreetmap.py +++ b/base_geolocalize_openstreetmap/tests/test_geolocalize_openstreetmap.py @@ -2,13 +2,13 @@ # Copyright 2015-2017 ACSONE SA/NV () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). import responses -import requests import odoo.tests.common as common + class TestGeolocalizeOpenstreetmap(common.TransactionCase): def setUp(self): - common.TransactionCase.setUp(self) + super(TestGeolocalizeOpenstreetmap, self).setUp() self.expected_latitude = 50.4311411 self.expected_longitude = 4.6132813 @@ -22,10 +22,10 @@ def setUp(self): 'state': 'Namur' } - self.partner_id_known = self.env['res.partner'].create(vals) - # Second, test a fake street to force the code to go to the second iteration + # Second, test a fake street to force the code to go to + # the second iteration vals2 = { 'name': 'Partner Project', 'street': 'Rue test', @@ -34,7 +34,8 @@ def setUp(self): } self.partner_id_known_second = self.env['res.partner'].create(vals2) - # Third, test a fake street to force the code to go to the second iteration + # Third, test a fake street to force the code to go + # to the second iteration vals3 = { 'name': 'Partner Project', 'street': 'Rue test', @@ -43,35 +44,39 @@ def setUp(self): } self.partner_id_not_known = self.env['res.partner'].create(vals3) - @responses.activate def test_osm_found_lat_long_with_mock(self): responses.add( responses.Response( method='GET', - url ='https://nominatim.openstreetmap.org/search?city=Tamines&format=json&country=Belgium&state=&street=Rue+bois+des+noix&limit=1&postalCode=5060', + url='https://nominatim.openstreetmap.org/search?' + + 'city=Tamines&format=json&country=Belgium&' + + 'state=&street=Rue+bois+des+noix&limit=1&postalCode=5060', match_querystring=True, - json=[{'lat': self.expected_latitude, 'lon': self.expected_longitude}], + json=[{'lat': self.expected_latitude, + 'lon': self.expected_longitude}], status=200 )) self.partner_id_known.geo_localize() - + self.assertEqual(len(responses.calls), 1, 'call does not exist') self.assertAlmostEqual( - self.partner_id_known.partner_latitude, self.expected_latitude, 3, + self.partner_id_known.partner_latitude, self.expected_latitude, 3, 'Latitude Should be equals') self.assertAlmostEqual( - self.partner_id_known.partner_longitude, self.expected_longitude, 3, + self.partner_id_known.partner_longitude, + self.expected_longitude, 3, 'Longitude Should be equals') - @responses.activate def test_osm_found_lat_long_second_time_with_mock(self): responses.add( responses.Response( method='GET', - url ='https://nominatim.openstreetmap.org/search?city=Tamines&format=json&country=Belgium&state=&street=Rue+test&limit=1&postalCode=', + url='https://nominatim.openstreetmap.org/search?city=Tamines' + + '&format=json&country=Belgium&state=&street=Rue+test&' + + 'limit=1&postalCode=', match_querystring=True, json=[{}], status=200 @@ -79,14 +84,16 @@ def test_osm_found_lat_long_second_time_with_mock(self): responses.add( responses.Response( method='GET', - url ='https://nominatim.openstreetmap.org/search?city=Tamines&format=json&country=Belgium&state=&street=&limit=1&postalCode=', + url='https://nominatim.openstreetmap.org/search?city=Tamines' + + '&format=json&country=Belgium&state=&street=&' + + 'limit=1&postalCode=', match_querystring=True, json=[{'lat': 50.825833, 'lon': 4.3475227}], status=200 )) self.partner_id_known_second.geo_localize() - + self.assertAlmostEqual( self.partner_id_known_second.partner_latitude, 50.825833, 3, 'Latitude Should be equals') @@ -100,7 +107,9 @@ def test_osm_loc_not_found_with_mock(self): responses.add( responses.Response( method='GET', - url='https://nominatim.openstreetmap.org/search?city=Tmnss&format=json&country=Belgium&state=&street=Rue+test&limit=1&postalCode=', + url='https://nominatim.openstreetmap.org/search?city=Tmnss&' + + 'format=json&country=Belgium&state=&street=Rue+test&' + + 'limit=1&postalCode=', match_querystring=True, json=[{}] )) @@ -108,15 +117,16 @@ def test_osm_loc_not_found_with_mock(self): responses.add( responses.Response( method='GET', - url='https://nominatim.openstreetmap.org/search?city=Tmnss&format=json&country=Belgium&state=&street=&limit=1&postalCode=', + url='https://nominatim.openstreetmap.org/search?city=Tmnss&' + + 'format=json&country=Belgium&state=&street=&' + + 'limit=1&postalCode=', match_querystring=True, json=[{}] )) self.partner_id_not_known.geo_localize() - self.assertFalse( self.partner_id_not_known.partner_longitude) self.assertFalse( - self.partner_id_not_known.partner_latitude) \ No newline at end of file + self.partner_id_not_known.partner_latitude) diff --git a/geoengine_base_geolocalize/models/res_partner.py b/geoengine_base_geolocalize/models/res_partner.py index b0399647f8..858fedfc76 100644 --- a/geoengine_base_geolocalize/models/res_partner.py +++ b/geoengine_base_geolocalize/models/res_partner.py @@ -2,28 +2,15 @@ # Copyright 2015 ACSONE SA/NV () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -import logging -from odoo import api, fields -from odoo import exceptions -from odoo.tools.translate import _ +from odoo import api from odoo.addons.base_geoengine import geo_model from odoo.addons.base_geoengine import fields as geo_fields -try: - import requests -except ImportError: - logger = logging.getLogger(__name__) - logger.warning('requests is not available in the sys path') - -_logger = logging.getLogger(__name__) - class ResPartner(geo_model.GeoModel): """Add geo_point to partner using a function field""" _inherit = "res.partner" - - @api.multi @api.depends('partner_latitude', 'partner_longitude') def _compute_geo_point(self): @@ -48,8 +35,7 @@ def _compute_geo_point(self): def _inverse_geo_point(self): for rec in self: if not rec.geo_point: - # FIXME: For now, if no coordinates are provided, latitude and longitude are set to false - rec.partner_longitude, rec.partner_latitude = False, False + rec.partner_longitude, rec.partner_latitude = False, False else: - rec.partner_longitude, rec.partner_latitude = geo_fields.GeoPoint.to_latlon(rec.env.cr, rec.geo_point) - \ No newline at end of file + rec.partner_longitude, rec.partner_latitude = \ + geo_fields.GeoPoint.to_latlon(rec.env.cr, rec.geo_point) diff --git a/geoengine_geoname_geocoder/res_partner.py b/geoengine_geoname_geocoder/res_partner.py index 9430ad5899..4f229a1007 100644 --- a/geoengine_geoname_geocoder/res_partner.py +++ b/geoengine_geoname_geocoder/res_partner.py @@ -107,7 +107,7 @@ def geocode_from_geonames(self, srid='900913', url = base_url + urlencode(filters) answer = urlopen(url) add.geo_point = self._get_point_from_reply(answer) - except Exception, exc: + except Exception as exc: logger.exception('error while updating geocodes') if strict: raise except_orm(_('Geoencoding fails'), str(exc))