workflow: do not fail on geolocation server errors (#29168)

This commit is contained in:
Thomas NOËL 2018-12-18 11:21:18 +01:00
parent c6eaa44951
commit 14e543ccce
2 changed files with 25 additions and 4 deletions

View File

@ -12,6 +12,7 @@ import zipfile
import mock
from quixote import cleanup, get_response
from qommon.errors import ConnectionError
from quixote.http_request import Upload as QuixoteUpload
from wcs.qommon.http_request import HTTPRequest
from qommon.form import *
@ -2599,6 +2600,20 @@ def test_geolocate_address(pub):
item.perform(formdata)
assert formdata.geolocations == {}
# check for nominatim bad json
formdata.geolocations = None
with mock.patch('wcs.wf.geolocate.http_get_page') as http_get_page:
http_get_page.return_value = (None, 200, 'bad json', None)
item.perform(formdata)
assert formdata.geolocations == {}
# check for nominatim connection error
formdata.geolocations = None
with mock.patch('wcs.wf.geolocate.http_get_page') as http_get_page:
http_get_page.side_effect = ConnectionError
item.perform(formdata)
assert formdata.geolocations == {}
def test_geolocate_image(pub):
formdef = FormDef()
formdef.name = 'baz'

View File

@ -28,6 +28,7 @@ from quixote import get_publisher
from qommon import _
from qommon import get_logger
from qommon.errors import ConnectionError
from qommon.form import RadiobuttonsWidget, ComputedExpressionWidget, CheckboxWidget
from qommon.misc import http_get_page, normalize_geolocation
from wcs.workflows import WorkflowStatusItem, register_item_class
@ -124,11 +125,16 @@ class GeolocateWorkflowStatusItem(WorkflowStatusItem):
url += '&format=json'
url += '&accept-language=%s' % (get_publisher().get_site_language() or 'en')
response, status, data, auth_header = http_get_page(url)
if status != 200:
get_logger().error('error calling geocoding service [%s]', status)
try:
response, status, data, auth_header = http_get_page(url, raise_on_http_errors=True)
except ConnectionError as e:
get_logger().error('error calling geocoding service [%s]', str(e))
return
try:
data = json.loads(data)
except ValueError:
get_logger().error('non-JSON response from geocoding service')
return
data = json.loads(data)
if len(data) == 0:
get_logger().info('error finding location')
return