Spaces:
Paused
Paused
| from django.apps import AppConfig | |
| from django.utils import timezone | |
| # Module-level variable to store app start time | |
| APP_START_TIME = None | |
| class CoreConfig(AppConfig): | |
| name = "core" | |
| def ready(self): | |
| global APP_START_TIME | |
| APP_START_TIME = timezone.now() | |
| # Register signal handlers for worker heartbeat | |
| self._register_worker_signals() | |
| # Use post_migrate signal to ensure heartbeat schedule exists after migrations | |
| # This avoids database access during app initialization | |
| from django.db.models.signals import post_migrate | |
| post_migrate.connect(self._on_post_migrate, sender=self) | |
| def _on_post_migrate(self, sender, **kwargs): | |
| """Run after migrations are complete to set up heartbeat schedule.""" | |
| self._ensure_heartbeat_schedule() | |
| def _register_worker_signals(self): | |
| """Register django-q2 signals for worker heartbeat.""" | |
| try: | |
| from django_q.signals import post_execute | |
| def update_heartbeat(sender, task, **kwargs): | |
| """Update heartbeat timestamp after each task execution.""" | |
| try: | |
| from core.models import GlobalSettings | |
| settings = GlobalSettings.get_settings() | |
| settings.worker_heartbeat_at = timezone.now() | |
| settings.save(update_fields=["worker_heartbeat_at"]) | |
| except Exception: | |
| pass # Fail silently - don't break task execution | |
| post_execute.connect(update_heartbeat, dispatch_uid="worker_heartbeat") | |
| except Exception: | |
| pass # django-q signals not available | |
| def _ensure_heartbeat_schedule(self): | |
| """Ensure the worker heartbeat schedule exists in database.""" | |
| try: | |
| # Only run if database tables exist (not during migrations) | |
| from django.db import connection | |
| if "django_q_schedule" in connection.introspection.table_names(): | |
| from core.services.schedule_service import ScheduleService | |
| ScheduleService.ensure_heartbeat_schedule() | |
| except Exception: | |
| pass # Database not ready yet | |