pyrunner / core /apps.py
Perspicacious's picture
Deploy PyRunner on Hugging Face
2529305
Raw
History Blame Contribute Delete
2.21 kB
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