mirror of
https://github.com/eitchtee/WYGIWYH.git
synced 2026-07-14 16:52:53 +02:00
feat: internal code for automatic exchange rate fetching
This commit is contained in:
@@ -1,8 +1,12 @@
|
||||
import logging
|
||||
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.core.validators import MaxValueValidator, MinValueValidator
|
||||
from django.db import models
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Currency(models.Model):
|
||||
code = models.CharField(max_length=10, unique=True, verbose_name=_("Currency Code"))
|
||||
@@ -78,3 +82,66 @@ class ExchangeRate(models.Model):
|
||||
raise ValidationError(
|
||||
{"to_currency": _("From and To currencies cannot be the same.")}
|
||||
)
|
||||
|
||||
|
||||
class ExchangeRateService(models.Model):
|
||||
"""Configuration for exchange rate services"""
|
||||
|
||||
class ServiceType(models.TextChoices):
|
||||
SYNTH_FINANCE = "synth_finance", "Synth Finance"
|
||||
COINGECKO = "coingecko", "CoinGecko"
|
||||
|
||||
name = models.CharField(max_length=255, unique=True, verbose_name=_("Service Name"))
|
||||
service_type = models.CharField(
|
||||
max_length=255, choices=ServiceType.choices, verbose_name=_("Service Type")
|
||||
)
|
||||
is_active = models.BooleanField(default=True, verbose_name=_("Active"))
|
||||
api_key = models.CharField(
|
||||
max_length=255,
|
||||
blank=True,
|
||||
null=True,
|
||||
verbose_name=_("API Key"),
|
||||
help_text=_("API key for the service (if required)"),
|
||||
)
|
||||
fetch_interval_hours = models.PositiveIntegerField(
|
||||
default=24,
|
||||
validators=[MinValueValidator(1)],
|
||||
verbose_name=_("Fetch Interval (hours)"),
|
||||
)
|
||||
last_fetch = models.DateTimeField(
|
||||
null=True, blank=True, verbose_name=_("Last Successful Fetch")
|
||||
)
|
||||
|
||||
target_currencies = models.ManyToManyField(
|
||||
Currency,
|
||||
verbose_name=_("Target Currencies"),
|
||||
help_text=_(
|
||||
"Select currencies to fetch exchange rates for. Rates will be fetched for each currency against their set exchange currency."
|
||||
),
|
||||
related_name="exchange_services",
|
||||
blank=True,
|
||||
)
|
||||
|
||||
target_accounts = models.ManyToManyField(
|
||||
"accounts.Account",
|
||||
verbose_name=_("Target Accounts"),
|
||||
help_text=_(
|
||||
"Select accounts to fetch exchange rates for. Rates will be fetched for each account's currency against their set exchange currency."
|
||||
),
|
||||
related_name="exchange_services",
|
||||
blank=True,
|
||||
)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("Exchange Rate Service")
|
||||
verbose_name_plural = _("Exchange Rate Services")
|
||||
ordering = ["name"]
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def get_provider(self):
|
||||
from apps.currencies.exchange_rates.fetcher import PROVIDER_MAPPING
|
||||
|
||||
provider_class = PROVIDER_MAPPING[self.service_type]
|
||||
return provider_class(self.api_key)
|
||||
|
||||
Reference in New Issue
Block a user