Merge pull request #2604 from SchrodingersGat/currency-timeout

Handle errors when connecting to currency exchange
This commit is contained in:
Oliver 2022-02-07 13:54:25 +11:00 committed by GitHub
commit c906cc5cfa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 14 deletions

View File

@ -100,7 +100,7 @@ class InvenTreeConfig(AppConfig):
try:
from djmoney.contrib.exchange.models import ExchangeBackend
from datetime import datetime, timedelta
from InvenTree.tasks import update_exchange_rates
from common.settings import currency_code_default
except AppRegistryNotReady:
@ -115,23 +115,18 @@ class InvenTreeConfig(AppConfig):
last_update = backend.last_update
if last_update is not None:
delta = datetime.now().date() - last_update.date()
if delta > timedelta(days=1):
print(f"Last update was {last_update}")
update = True
else:
if last_update is None:
# Never been updated
print("Exchange backend has never been updated")
logger.info("Exchange backend has never been updated")
update = True
# Backend currency has changed?
if not base_currency == backend.base_currency:
print(f"Base currency changed from {backend.base_currency} to {base_currency}")
logger.info(f"Base currency changed from {backend.base_currency} to {base_currency}")
update = True
except (ExchangeBackend.DoesNotExist):
print("Exchange backend not found - updating")
logger.info("Exchange backend not found - updating")
update = True
except:
@ -139,4 +134,7 @@ class InvenTreeConfig(AppConfig):
return
if update:
try:
update_exchange_rates()
except Exception as e:
logger.error(f"Error updating exchange rates: {e}")

View File

@ -1,3 +1,7 @@
import certifi
import ssl
from urllib.request import urlopen
from common.settings import currency_code_default, currency_codes
from urllib.error import URLError
@ -24,6 +28,22 @@ class InvenTreeExchange(SimpleExchangeBackend):
return {
}
def get_response(self, **kwargs):
"""
Custom code to get response from server.
Note: Adds a 5-second timeout
"""
url = self.get_url(**kwargs)
try:
context = ssl.create_default_context(cafile=certifi.where())
response = urlopen(url, timeout=5, context=context)
return response.read()
except:
# Returning None here will raise an error upstream
return None
def update_rates(self, base_currency=currency_code_default()):
symbols = ','.join(currency_codes())

View File

@ -269,10 +269,13 @@ def update_exchange_rates():
logger.info(f"Using base currency '{base}'")
try:
backend.update_rates(base_currency=base)
# Remove any exchange rates which are not in the provided currencies
Rate.objects.filter(backend="InvenTreeExchange").exclude(currency__in=currency_codes()).delete()
except Exception as e:
logger.error(f"Error updating exchange rates: {e}")
def send_email(subject, body, recipients, from_email=None, html_message=None):