diff --git a/src/backend/InvenTree/InvenTree/tasks.py b/src/backend/InvenTree/InvenTree/tasks.py index 2110fe9475..40ef965de5 100644 --- a/src/backend/InvenTree/InvenTree/tasks.py +++ b/src/backend/InvenTree/InvenTree/tasks.py @@ -19,6 +19,7 @@ from django.core.management import call_command from django.db import DEFAULT_DB_ALIAS, connections, transaction from django.db.migrations.executor import MigrationExecutor from django.db.utils import NotSupportedError, OperationalError, ProgrammingError +from django.dispatch import receiver from django.utils import timezone from django.utils.translation import gettext_lazy as _ @@ -32,6 +33,7 @@ from maintenance_mode.core import ( from opentelemetry import trace from common.settings import get_global_setting, set_global_setting +from common.signals import post_currency_change from plugin import registry from .version import isInvenTreeUpToDate @@ -1095,6 +1097,12 @@ def update_exchange_rates(force: bool = False): logger.exception('Error updating exchange rates: %s', type(e)) +@receiver(post_currency_change, dispatch_uid='receive_update_exchange_rates') +def receive_update_exchange_rates(*args, **kwargs): + """Trigger exchange rate update.""" + update_exchange_rates(True) + + @tracer.start_as_current_span('run_backup') @scheduled_task(ScheduledTask.DAILY) def run_backup(): diff --git a/src/backend/InvenTree/common/currency.py b/src/backend/InvenTree/common/currency.py index ca936c6e2d..876e884bda 100644 --- a/src/backend/InvenTree/common/currency.py +++ b/src/backend/InvenTree/common/currency.py @@ -12,6 +12,7 @@ from moneyed import CURRENCIES import InvenTree.helpers import InvenTree.ready +from common.signals import post_currency_change logger = structlog.get_logger('inventree') @@ -99,24 +100,14 @@ def after_change_currency(setting) -> None: - Update exchange rates - Recalculate prices for all parts """ - import InvenTree.ready - import InvenTree.tasks - if InvenTree.ready.isImportingData(): return if not InvenTree.ready.canAppAccessDatabase(): return - from part import tasks as part_tasks - - # Immediately update exchange rates - InvenTree.tasks.update_exchange_rates(force=True) - - # Offload update of part prices to a background task - InvenTree.tasks.offload_task( - part_tasks.check_missing_pricing, force_async=True, group='pricing' - ) + # trigger signal + post_currency_change.send(setting) def validate_currency_codes(value): diff --git a/src/backend/InvenTree/common/signals.py b/src/backend/InvenTree/common/signals.py new file mode 100644 index 0000000000..d57f86df26 --- /dev/null +++ b/src/backend/InvenTree/common/signals.py @@ -0,0 +1,9 @@ +"""Signals for InvenTree actions. + +These should be used slectevily, mostly to avoid circular imports and tight coupeling with modular/extensible parts of the codebase. +""" + +from django.dispatch import Signal + +post_currency_change = Signal() +"""Send after the default currency was changed.""" diff --git a/src/backend/InvenTree/part/tasks.py b/src/backend/InvenTree/part/tasks.py index 77255a59db..8234d5fd32 100644 --- a/src/backend/InvenTree/part/tasks.py +++ b/src/backend/InvenTree/part/tasks.py @@ -5,6 +5,7 @@ from typing import Optional from django.core.exceptions import ValidationError from django.db.models import Model +from django.dispatch import receiver from django.utils.translation import gettext_lazy as _ import structlog @@ -15,6 +16,7 @@ import common.notifications import InvenTree.helpers import InvenTree.helpers_model from common.settings import get_global_setting +from common.signals import post_currency_change from InvenTree.tasks import ( ScheduledTask, batch_offload_tasks, @@ -314,6 +316,12 @@ def check_missing_pricing(limit=250): pricing.schedule_for_update() +@receiver(post_currency_change, dispatch_uid='dispatch_check_missing_pricing') +def dispatch_check_missing_pricing(*args, **kwargs): + """Trigger pricing update.""" + offload_task(check_missing_pricing, force_async=True, group='pricing') + + @tracer.start_as_current_span('scheduled_stocktake_reports') @scheduled_task(ScheduledTask.DAILY) def scheduled_stocktake_reports():