mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
75 lines
2.6 KiB
Python
75 lines
2.6 KiB
Python
from urllib.request import urlopen, quote
|
|
from urllib.error import HTTPError
|
|
from ssl import _create_unverified_context
|
|
from logging import getLogger
|
|
|
|
from odoo.exceptions import ValidationError
|
|
|
|
_logger = getLogger(__name__)
|
|
|
|
|
|
class WATaxRequest(object):
|
|
def __init__(self):
|
|
pass
|
|
|
|
def get_rate(self, partner):
|
|
# https://webgis.dor.wa.gov/webapi/addressrates.aspx/?output=text\&addr=test\&city=Marysville\&zip=98270
|
|
if not all((partner.street, partner.city, partner.zip)):
|
|
raise ValidationError('WATaxRequest impossible without Street, City and ZIP.')
|
|
url = 'https://webgis.dor.wa.gov/webapi/addressrates.aspx?output=text&addr=' + quote(partner.street) + \
|
|
'&city=' + quote(partner.city) + '&zip=' + quote(partner.zip)
|
|
_logger.info(url)
|
|
try:
|
|
response = urlopen(url, context=_create_unverified_context())
|
|
response_body = response.read()
|
|
_logger.info(response_body)
|
|
except HTTPError as e:
|
|
_logger.warn('Error on request: ' + str(e))
|
|
response_body = ''
|
|
|
|
return self._parse_rate(response_body)
|
|
|
|
def is_success(self, result):
|
|
'''
|
|
ADDRESS = 0,
|
|
LATLON = 0,
|
|
PLUS4 = 1,
|
|
ADDRESS_STANARDIZED = 2,
|
|
PLUS4_STANARDIZED = 3,
|
|
ADDRESS_CHANGED = 4,
|
|
ZIPCODE = 5,
|
|
ADDRESS_NOT_FOUND = 6,
|
|
LATLON_NOT_FOUND = 7,
|
|
POI = 8,
|
|
ERROR = 9
|
|
internal parse_error = 100
|
|
'''
|
|
if 'result_code' not in result or result['result_code'] >= 9 or result['result_code'] < 0:
|
|
return False
|
|
return True
|
|
|
|
def _parse_rate(self, response_body):
|
|
# 'LocationCode=1704 Rate=0.100 ResultCode=0'
|
|
# {
|
|
# 'result_code': 0,
|
|
# 'location_code': '1704',
|
|
# 'rate': '10.00',
|
|
# }
|
|
|
|
res = {'result_code': 100}
|
|
if len(response_body) > 200:
|
|
# this likely means that they returned an HTML page
|
|
return res
|
|
|
|
body_parts = response_body.decode().split(' ')
|
|
for part in body_parts:
|
|
if part.find('ResultCode=') >= 0:
|
|
res['result_code'] = int(part[len('ResultCode='):])
|
|
elif part.find('Rate=') >= 0:
|
|
res['rate'] = '%.2f' % (float(part[len('Rate='):]) * 100.0)
|
|
elif part.find('LocationCode=') >= 0:
|
|
res['location_code'] = part[len('LocationCode='):]
|
|
elif part.find('debughint=') >= 0:
|
|
res['debug_hint'] = part[len('debughint='):]
|
|
return res
|