diff --git a/poizonstore/celery.py b/poizonstore/celery.py index ef8dec7..87ade8d 100644 --- a/poizonstore/celery.py +++ b/poizonstore/celery.py @@ -14,6 +14,11 @@ app.conf.beat_schedule = { 'task': 'store.tasks.schedule_cdek_status_update', 'schedule': timedelta(hours=1), }, + + 'update-yuan-rate-every-hour': { + 'task': 'store.tasks.update_yuan_rate', + 'schedule': timedelta(hours=1), + }, } diff --git a/poizonstore/settings.py b/poizonstore/settings.py index 60a6a8e..2a5543e 100644 --- a/poizonstore/settings.py +++ b/poizonstore/settings.py @@ -200,7 +200,6 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' CHECKLIST_ID_LENGTH = 10 COMMISSION_OVER_150K = 1.1 -YUAN_RATE_UPDATE_PERIOD_MINUTES = 60 # Logging SENTRY_DSN = "***REMOVED***" diff --git a/store/models.py b/store/models.py index 12722d9..510bd91 100644 --- a/store/models.py +++ b/store/models.py @@ -68,22 +68,6 @@ class GlobalSettings(models.Model): @property def full_yuan_rate(self): - """ Get rate either from CurrencyAPI or from DB (if fresh enough) """ - if self.yuan_rate_last_updated is not None: - diff_minutes = (timezone.now() - self.yuan_rate_last_updated).total_seconds() / 60 - else: - diff_minutes = None - - if diff_minutes is None or diff_minutes > settings.YUAN_RATE_UPDATE_PERIOD_MINUTES: - # Get fresh rate from API - rate = CurrencyAPIClient.get_cny_rate() - if rate: - # Save rate in DB for future usage - self.yuan_rate = rate - self.yuan_rate_last_updated = timezone.now() - self.save() - - # Default return self.yuan_rate + self.yuan_rate_commission diff --git a/store/tasks.py b/store/tasks.py index 1a0a20c..5245747 100644 --- a/store/tasks.py +++ b/store/tasks.py @@ -1,8 +1,10 @@ from celery import shared_task from django.db.models import Q +from django.utils import timezone from external_api.cdek import client as cdek_client, CDEKStatus -from .models import Checklist +from external_api.currency import client as CurrencyAPIClient +from .models import Checklist, GlobalSettings @shared_task @@ -44,3 +46,21 @@ def schedule_cdek_status_update(): check_cdek_status.delay(order_id=obj.id) return order_count + + +@shared_task(autoretry_for=(Exception,), retry_backoff=True, retry_kwargs={'max_retries': 5}) +def update_yuan_rate(): + # Get fresh rate from API + rate = CurrencyAPIClient.get_cny_rate() + if not rate: + raise Exception("Failed to get yuan rate") + + print(f"Fetched new yuan rate: {rate}") + + # Save rate in DB for future usage + settings = GlobalSettings.load() + settings.yuan_rate = rate + settings.yuan_rate_last_updated = timezone.now() + settings.save() + + return rate