From aea87735034acb48b7284f9c63d63ac0a3538771 Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Sat, 15 May 2021 12:23:05 +0530 Subject: [PATCH 1/6] feat: Increase number of supported currency exchanges Switch from frankfurter.app to exchangerate.host to accomodate more currency usage. Closes #25603 --- erpnext/setup/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py index ffd5ab1e840..e66b1b5331a 100644 --- a/erpnext/setup/utils.py +++ b/erpnext/setup/utils.py @@ -98,10 +98,10 @@ def get_exchange_rate(from_currency, to_currency, transaction_date=None, args=No if not value: import requests - api_url = "https://frankfurter.app/{0}".format(transaction_date) + api_url = "https://api.exchangerate.host/latest" response = requests.get(api_url, params={ - "base": from_currency, - "symbols": to_currency + "symbols": from_currency+","+to_currency, + "base": from_currency }) # expire in 6 hours response.raise_for_status() From 5cced71ce41cdb10cd633830db20a034dec002af Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Sun, 16 May 2021 12:43:57 +0530 Subject: [PATCH 2/6] fix: Get the exchange rate based on date. --- erpnext/setup/utils.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py index e66b1b5331a..33af28687c6 100644 --- a/erpnext/setup/utils.py +++ b/erpnext/setup/utils.py @@ -93,19 +93,20 @@ def get_exchange_rate(from_currency, to_currency, transaction_date=None, args=No try: cache = frappe.cache() - key = "currency_exchange_rate_{0}:{1}:{2}".format(transaction_date,from_currency, to_currency) + key = "currency_exchange_rate_{0}:{1}:{2}".format(transaction_date, from_currency, to_currency) value = cache.get(key) if not value: import requests - api_url = "https://api.exchangerate.host/latest" + api_url = "https://api.exchangerate.host/convert" response = requests.get(api_url, params={ - "symbols": from_currency+","+to_currency, - "base": from_currency + "date": transaction_date, + "from": from_currency, + "to": to_currency }) # expire in 6 hours response.raise_for_status() - value = response.json()["rates"][to_currency] + value = response.json()["result"] cache.setex(key, value, 6 * 60 * 60) return flt(value) except: From 6ec804d77fd899da5abbaf78c3b78f9f78405715 Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Fri, 21 May 2021 18:16:21 +0530 Subject: [PATCH 3/6] fix: Update hard coded exchange rate values for testing --- .../currency_exchange/test_currency_exchange.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py b/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py index c5c01c57758..51bd1c4d535 100644 --- a/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py +++ b/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py @@ -63,11 +63,11 @@ class TestCurrencyExchange(unittest.TestCase): exchange_rate = get_exchange_rate("USD", "INR", "2016-01-30", "for_selling") self.assertEqual(exchange_rate, 62.9) - # Exchange rate as on 15th Dec, 2015, should be fetched from fixer.io + # Exchange rate as on 15th Dec, 2015 self.clear_cache() exchange_rate = get_exchange_rate("USD", "INR", "2015-12-15", "for_selling") self.assertFalse(exchange_rate == 60) - self.assertEqual(flt(exchange_rate, 3), 66.894) + self.assertEqual(flt(exchange_rate, 3), 66.999) def test_exchange_rate_strict(self): # strict currency settings @@ -77,15 +77,14 @@ class TestCurrencyExchange(unittest.TestCase): exchange_rate = get_exchange_rate("USD", "INR", "2016-01-01", "for_buying") self.assertEqual(exchange_rate, 60.0) - # Will fetch from fixer.io self.clear_cache() exchange_rate = get_exchange_rate("USD", "INR", "2016-01-15", "for_buying") - self.assertEqual(flt(exchange_rate, 3), 67.79) + self.assertEqual(flt(exchange_rate, 3), 67.235) exchange_rate = get_exchange_rate("USD", "INR", "2016-01-30", "for_selling") self.assertEqual(exchange_rate, 62.9) - # Exchange rate as on 15th Dec, 2015, should be fetched from fixer.io + # Exchange rate as on 15th Dec, 2015 self.clear_cache() exchange_rate = get_exchange_rate("USD", "INR", "2015-12-15", "for_buying") self.assertEqual(flt(exchange_rate, 3), 66.894) @@ -111,4 +110,4 @@ class TestCurrencyExchange(unittest.TestCase): # Will fetch from fixer.io self.clear_cache() exchange_rate = get_exchange_rate("USD", "INR", "2016-01-15", "for_buying") - self.assertEqual(flt(exchange_rate, 3), 67.79) + self.assertEqual(flt(exchange_rate, 3), 67.235) From 88bab1e3ad83dd0584ca4f32b55ae1d5afb66855 Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Fri, 21 May 2021 23:02:55 +0530 Subject: [PATCH 4/6] fix: update test suite --- .../test_currency_exchange.py | 24 ++++++------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py b/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py index 51bd1c4d535..5170d35ce28 100644 --- a/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py +++ b/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py @@ -55,13 +55,13 @@ class TestCurrencyExchange(unittest.TestCase): # Start with allow_stale is True exchange_rate = get_exchange_rate("USD", "INR", "2016-01-01", "for_buying") - self.assertEqual(flt(exchange_rate, 3), 60.0) + self.assertEqual(flt(exchange_rate, 3), 65.444) exchange_rate = get_exchange_rate("USD", "INR", "2016-01-15", "for_buying") - self.assertEqual(exchange_rate, 65.1) + self.assertEqual(exchange_rate, 67.2) exchange_rate = get_exchange_rate("USD", "INR", "2016-01-30", "for_selling") - self.assertEqual(exchange_rate, 62.9) + self.assertEqual(exchange_rate, 68.0) # Exchange rate as on 15th Dec, 2015 self.clear_cache() @@ -75,34 +75,24 @@ class TestCurrencyExchange(unittest.TestCase): frappe.db.set_value("Accounts Settings", None, "stale_days", 1) exchange_rate = get_exchange_rate("USD", "INR", "2016-01-01", "for_buying") - self.assertEqual(exchange_rate, 60.0) + self.assertEqual(exchange_rate, 65.4) self.clear_cache() exchange_rate = get_exchange_rate("USD", "INR", "2016-01-15", "for_buying") self.assertEqual(flt(exchange_rate, 3), 67.235) exchange_rate = get_exchange_rate("USD", "INR", "2016-01-30", "for_selling") - self.assertEqual(exchange_rate, 62.9) + self.assertEqual(exchange_rate, 68.0) # Exchange rate as on 15th Dec, 2015 self.clear_cache() exchange_rate = get_exchange_rate("USD", "INR", "2015-12-15", "for_buying") - self.assertEqual(flt(exchange_rate, 3), 66.894) - - exchange_rate = get_exchange_rate("INR", "NGN", "2016-01-10", "for_selling") - self.assertEqual(exchange_rate, 65.1) - - # NGN is not available on fixer.io so these should return 0 - exchange_rate = get_exchange_rate("INR", "NGN", "2016-01-09", "for_selling") - self.assertEqual(exchange_rate, 0) - - exchange_rate = get_exchange_rate("INR", "NGN", "2016-01-11", "for_selling") - self.assertEqual(exchange_rate, 0) + self.assertEqual(flt(exchange_rate, 3), 66.999) def test_exchange_rate_strict_switched(self): # Start with allow_stale is True exchange_rate = get_exchange_rate("USD", "INR", "2016-01-15", "for_buying") - self.assertEqual(exchange_rate, 65.1) + self.assertEqual(exchange_rate, 67.2) frappe.db.set_value("Accounts Settings", None, "allow_stale", 0) frappe.db.set_value("Accounts Settings", None, "stale_days", 1) From 5271ce36de5b4c499e2e1e28db89e3325356258e Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Sat, 22 May 2021 11:22:02 +0530 Subject: [PATCH 5/6] fix: Update test values --- .../currency_exchange/test_currency_exchange.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py b/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py index 5170d35ce28..4ff2dd7e0e9 100644 --- a/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py +++ b/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py @@ -55,14 +55,14 @@ class TestCurrencyExchange(unittest.TestCase): # Start with allow_stale is True exchange_rate = get_exchange_rate("USD", "INR", "2016-01-01", "for_buying") - self.assertEqual(flt(exchange_rate, 3), 65.444) + self.assertEqual(flt(exchange_rate, 3), 60.0) exchange_rate = get_exchange_rate("USD", "INR", "2016-01-15", "for_buying") - self.assertEqual(exchange_rate, 67.2) + self.assertEqual(exchange_rate, 65.1) exchange_rate = get_exchange_rate("USD", "INR", "2016-01-30", "for_selling") - self.assertEqual(exchange_rate, 68.0) - + self.assertEqual(exchange_rate, 62.9) + # Exchange rate as on 15th Dec, 2015 self.clear_cache() exchange_rate = get_exchange_rate("USD", "INR", "2015-12-15", "for_selling") @@ -75,14 +75,14 @@ class TestCurrencyExchange(unittest.TestCase): frappe.db.set_value("Accounts Settings", None, "stale_days", 1) exchange_rate = get_exchange_rate("USD", "INR", "2016-01-01", "for_buying") - self.assertEqual(exchange_rate, 65.4) + self.assertEqual(exchange_rate, 60.0) self.clear_cache() exchange_rate = get_exchange_rate("USD", "INR", "2016-01-15", "for_buying") self.assertEqual(flt(exchange_rate, 3), 67.235) exchange_rate = get_exchange_rate("USD", "INR", "2016-01-30", "for_selling") - self.assertEqual(exchange_rate, 68.0) + self.assertEqual(exchange_rate, 62.9) # Exchange rate as on 15th Dec, 2015 self.clear_cache() @@ -92,7 +92,7 @@ class TestCurrencyExchange(unittest.TestCase): def test_exchange_rate_strict_switched(self): # Start with allow_stale is True exchange_rate = get_exchange_rate("USD", "INR", "2016-01-15", "for_buying") - self.assertEqual(exchange_rate, 67.2) + self.assertEqual(exchange_rate, 65.1) frappe.db.set_value("Accounts Settings", None, "allow_stale", 0) frappe.db.set_value("Accounts Settings", None, "stale_days", 1) From 239974c73eb3c25f2a7b1d8cfaacbf91e5a98eec Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Thu, 29 Jul 2021 16:00:35 +0530 Subject: [PATCH 6/6] fix issue with cache.setex --- erpnext/setup/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py index 33af28687c6..27237bf2cbe 100644 --- a/erpnext/setup/utils.py +++ b/erpnext/setup/utils.py @@ -107,7 +107,7 @@ def get_exchange_rate(from_currency, to_currency, transaction_date=None, args=No # expire in 6 hours response.raise_for_status() value = response.json()["result"] - cache.setex(key, value, 6 * 60 * 60) + cache.setex(name=key, time=21600, value=flt(value)) return flt(value) except: frappe.log_error(title="Get Exchange Rate")