mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-06 05:39:12 +00:00
fix: conflicts
This commit is contained in:
@@ -1,119 +0,0 @@
|
|||||||
# Copyright (c) 2022, Frappe Technologies Pvt. Ltd. and contributors
|
|
||||||
# For license information, please see license.txt
|
|
||||||
|
|
||||||
import frappe
|
|
||||||
import requests
|
|
||||||
from frappe import _
|
|
||||||
from frappe.model.document import Document
|
|
||||||
from frappe.utils import nowdate
|
|
||||||
|
|
||||||
|
|
||||||
class CurrencyExchangeSettings(Document):
|
|
||||||
# begin: auto-generated types
|
|
||||||
# This code is auto-generated. Do not modify anything in this block.
|
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
|
||||||
from frappe.types import DF
|
|
||||||
|
|
||||||
from erpnext.accounts.doctype.currency_exchange_settings_details.currency_exchange_settings_details import (
|
|
||||||
CurrencyExchangeSettingsDetails,
|
|
||||||
)
|
|
||||||
from erpnext.accounts.doctype.currency_exchange_settings_result.currency_exchange_settings_result import (
|
|
||||||
CurrencyExchangeSettingsResult,
|
|
||||||
)
|
|
||||||
|
|
||||||
access_key: DF.Data | None
|
|
||||||
api_endpoint: DF.Data
|
|
||||||
disabled: DF.Check
|
|
||||||
req_params: DF.Table[CurrencyExchangeSettingsDetails]
|
|
||||||
result_key: DF.Table[CurrencyExchangeSettingsResult]
|
|
||||||
service_provider: DF.Literal["frankfurter.app", "exchangerate.host", "Custom"]
|
|
||||||
url: DF.Data | None
|
|
||||||
use_http: DF.Check
|
|
||||||
# end: auto-generated types
|
|
||||||
|
|
||||||
def validate(self):
|
|
||||||
self.set_parameters_and_result()
|
|
||||||
if frappe.flags.in_test or frappe.flags.in_install or frappe.flags.in_setup_wizard:
|
|
||||||
return
|
|
||||||
response, value = self.validate_parameters()
|
|
||||||
self.validate_result(response, value)
|
|
||||||
|
|
||||||
def set_parameters_and_result(self):
|
|
||||||
if self.service_provider == "exchangerate.host":
|
|
||||||
if not self.access_key:
|
|
||||||
frappe.throw(
|
|
||||||
_("Access Key is required for Service Provider: {0}").format(
|
|
||||||
frappe.bold(self.service_provider)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
self.set("result_key", [])
|
|
||||||
self.set("req_params", [])
|
|
||||||
|
|
||||||
self.api_endpoint = get_api_endpoint(self.service_provider, self.use_http)
|
|
||||||
self.append("result_key", {"key": "result"})
|
|
||||||
self.append("req_params", {"key": "access_key", "value": self.access_key})
|
|
||||||
self.append("req_params", {"key": "amount", "value": "1"})
|
|
||||||
self.append("req_params", {"key": "date", "value": "{transaction_date}"})
|
|
||||||
self.append("req_params", {"key": "from", "value": "{from_currency}"})
|
|
||||||
self.append("req_params", {"key": "to", "value": "{to_currency}"})
|
|
||||||
elif self.service_provider == "frankfurter.app":
|
|
||||||
self.set("result_key", [])
|
|
||||||
self.set("req_params", [])
|
|
||||||
|
|
||||||
self.api_endpoint = get_api_endpoint(self.service_provider, self.use_http)
|
|
||||||
self.append("result_key", {"key": "rates"})
|
|
||||||
self.append("result_key", {"key": "{to_currency}"})
|
|
||||||
self.append("req_params", {"key": "base", "value": "{from_currency}"})
|
|
||||||
self.append("req_params", {"key": "symbols", "value": "{to_currency}"})
|
|
||||||
|
|
||||||
def validate_parameters(self):
|
|
||||||
params = {}
|
|
||||||
for row in self.req_params:
|
|
||||||
params[row.key] = row.value.format(
|
|
||||||
transaction_date=nowdate(), to_currency="INR", from_currency="USD"
|
|
||||||
)
|
|
||||||
|
|
||||||
api_url = self.api_endpoint.format(transaction_date=nowdate(), to_currency="INR", from_currency="USD")
|
|
||||||
|
|
||||||
try:
|
|
||||||
response = requests.get(api_url, params=params)
|
|
||||||
except requests.exceptions.RequestException as e:
|
|
||||||
frappe.throw("Error: " + str(e))
|
|
||||||
|
|
||||||
response.raise_for_status()
|
|
||||||
value = response.json()
|
|
||||||
|
|
||||||
return response, value
|
|
||||||
|
|
||||||
def validate_result(self, response, value):
|
|
||||||
try:
|
|
||||||
for key in self.result_key:
|
|
||||||
value = value[
|
|
||||||
str(key.key).format(transaction_date=nowdate(), to_currency="INR", from_currency="USD")
|
|
||||||
]
|
|
||||||
except Exception:
|
|
||||||
frappe.throw(_("Invalid result key. Response:") + " " + response.text)
|
|
||||||
if not isinstance(value, int | float):
|
|
||||||
frappe.throw(_("Returned exchange rate is neither integer not float."))
|
|
||||||
|
|
||||||
self.url = response.url
|
|
||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
|
||||||
def get_api_endpoint(service_provider: str | None = None, use_http: bool = False):
|
|
||||||
if service_provider and service_provider in ["exchangerate.host", "frankfurter.app"]:
|
|
||||||
if service_provider == "exchangerate.host":
|
|
||||||
api = "api.exchangerate.host/convert"
|
|
||||||
elif service_provider == "frankfurter.app":
|
|
||||||
api = "api.frankfurter.app/{transaction_date}"
|
|
||||||
|
|
||||||
protocol = "https://"
|
|
||||||
if use_http:
|
|
||||||
protocol = "http://"
|
|
||||||
|
|
||||||
return protocol + api
|
|
||||||
return None
|
|
||||||
@@ -46,42 +46,6 @@ def save_new_records(test_records):
|
|||||||
curr_exchange.insert()
|
curr_exchange.insert()
|
||||||
|
|
||||||
|
|
||||||
<<<<<<< HEAD
|
|
||||||
=======
|
|
||||||
test_exchange_values = {"2015-12-15": "66.999", "2016-01-15": "65.1"}
|
|
||||||
|
|
||||||
|
|
||||||
# Removing API call from get_exchange_rate
|
|
||||||
def patched_requests_get(*args, **kwargs):
|
|
||||||
class PatchResponse:
|
|
||||||
def __init__(self, json_data, status_code):
|
|
||||||
self.json_data = json_data
|
|
||||||
self.status_code = status_code
|
|
||||||
|
|
||||||
def raise_for_status(self):
|
|
||||||
if self.status_code != 200:
|
|
||||||
raise frappe.DoesNotExistError
|
|
||||||
|
|
||||||
def json(self):
|
|
||||||
return self.json_data
|
|
||||||
|
|
||||||
if args[0] == "https://api.exchangerate.host/convert" and kwargs.get("params"):
|
|
||||||
if kwargs["params"].get("date") and kwargs["params"].get("from") and kwargs["params"].get("to"):
|
|
||||||
if test_exchange_values.get(kwargs["params"]["date"]):
|
|
||||||
return PatchResponse({"result": test_exchange_values[kwargs["params"]["date"]]}, 200)
|
|
||||||
elif args[0].startswith("https://api.frankfurter.app") and kwargs.get("params"):
|
|
||||||
if kwargs["params"].get("base") and kwargs["params"].get("symbols"):
|
|
||||||
date = args[0].replace("https://api.frankfurter.app/", "")
|
|
||||||
if test_exchange_values.get(date):
|
|
||||||
return PatchResponse(
|
|
||||||
{"rates": {kwargs["params"].get("symbols"): test_exchange_values.get(date)}}, 200
|
|
||||||
)
|
|
||||||
|
|
||||||
return PatchResponse({"rates": None}, 404)
|
|
||||||
|
|
||||||
|
|
||||||
@mock.patch("requests.get", side_effect=patched_requests_get)
|
|
||||||
>>>>>>> c444de017a (test: update test for API change)
|
|
||||||
class TestCurrencyExchange(unittest.TestCase):
|
class TestCurrencyExchange(unittest.TestCase):
|
||||||
def clear_cache(self):
|
def clear_cache(self):
|
||||||
cache = frappe.cache()
|
cache = frappe.cache()
|
||||||
|
|||||||
@@ -72,30 +72,9 @@ def set_single_defaults():
|
|||||||
frappe.db.set_default("date_format", "dd-mm-yyyy")
|
frappe.db.set_default("date_format", "dd-mm-yyyy")
|
||||||
|
|
||||||
|
|
||||||
<<<<<<< HEAD
|
|
||||||
def create_compact_item_print_custom_field():
|
def create_compact_item_print_custom_field():
|
||||||
create_custom_field(
|
create_custom_field(
|
||||||
"Print Settings",
|
"Print Settings",
|
||||||
=======
|
|
||||||
def setup_currency_exchange():
|
|
||||||
ces = frappe.get_single("Currency Exchange Settings")
|
|
||||||
try:
|
|
||||||
ces.set("result_key", [])
|
|
||||||
ces.set("req_params", [])
|
|
||||||
|
|
||||||
ces.api_endpoint = "https://api.frankfurter.app/{transaction_date}"
|
|
||||||
ces.append("result_key", {"key": "rates"})
|
|
||||||
ces.append("result_key", {"key": "{to_currency}"})
|
|
||||||
ces.append("req_params", {"key": "base", "value": "{from_currency}"})
|
|
||||||
ces.append("req_params", {"key": "symbols", "value": "{to_currency}"})
|
|
||||||
ces.save()
|
|
||||||
except frappe.ValidationError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def create_print_setting_custom_fields():
|
|
||||||
create_custom_fields(
|
|
||||||
>>>>>>> 33e72111c7 (fix: Fix API endpoint for Frankfurter)
|
|
||||||
{
|
{
|
||||||
"label": _("Compact Item Print"),
|
"label": _("Compact Item Print"),
|
||||||
"fieldname": "compact_item_print",
|
"fieldname": "compact_item_print",
|
||||||
|
|||||||
Reference in New Issue
Block a user