Files
holy-flavor-rater/backend/api/serializers/system.py
T
2026-04-24 18:42:53 +02:00

82 lines
2.1 KiB
Python

from datetime import timedelta
from rest_framework import serializers
from api.models import Banner, Job, SystemConfig
_INTERVAL_PERIOD_TO_TIMEDELTA = {
"days": lambda every: timedelta(days=every),
"hours": lambda every: timedelta(hours=every),
"minutes": lambda every: timedelta(minutes=every),
"seconds": lambda every: timedelta(seconds=every),
}
class SystemConfigSerializer(serializers.ModelSerializer):
class Meta:
model = SystemConfig
fields = [
"site_name",
"maintenance_mode",
"allow_new_signups",
"require_email_verification",
"updated_at",
]
class JobSerializer(serializers.ModelSerializer):
name_display = serializers.CharField(source="get_name_display", read_only=True)
next_run = serializers.SerializerMethodField()
def get_next_run(self, obj):
from django_celery_beat.models import PeriodicTask
task = PeriodicTask.objects.filter(name=f"job:{obj.name}", enabled=True).first()
if not task or not task.interval:
return None
base = task.last_run_at or obj.last_run
if not base:
return None
delta_fn = _INTERVAL_PERIOD_TO_TIMEDELTA.get(task.interval.period)
if not delta_fn:
return None
return base + delta_fn(task.interval.every)
class Meta:
model = Job
fields = [
"id",
"name",
"name_display",
"status",
"last_run",
"next_run",
"interval_hours",
"last_output",
"error_message",
]
read_only_fields = [
"status",
"last_run",
"next_run",
"last_output",
"error_message",
]
class BannerSerializer(serializers.ModelSerializer):
class Meta:
model = Banner
fields = [
"id",
"name",
"slug",
"description",
"is_active",
"is_enabled",
"settings",
"schema",
"created_at",
"updated_at",
]