from django_celery_beat.models import IntervalSchedule, CrontabSchedule, PeriodicTask
from rest_framework import serializers

from ..op_drf.serializers import CustomModelSerializer
from ..utils.exceptions import APIException


class IntervalScheduleSerializer(CustomModelSerializer):
    class Meta:
        model = IntervalSchedule
        fields = '__all__'


class CrontabScheduleSerializer(CustomModelSerializer):

    def save(self, **kwargs):
        queryset = CrontabSchedule.objects.filter(**self.validated_data)
        if queryset.count() and (
                queryset.count() == 1 and self.initial_data.get('id', None) not in queryset.values_list('id',
                                                                                                        flat=True)):
            raise APIException(message='值已存在!!!')
        super().save(**kwargs)

    class Meta:
        model = CrontabSchedule
        exclude = ('timezone',)


class PeriodicTaskSerializer(CustomModelSerializer):
    interval_list = serializers.SerializerMethodField(read_only=True)
    crontab_list = serializers.SerializerMethodField(read_only=True)

    def get_interval_list(self, obj):
        return IntervalScheduleSerializer(obj.interval).data if obj.interval else {}

    def get_crontab_list(self, obj):
        return CrontabScheduleSerializer(obj.crontab).data if obj.crontab else {}

    class Meta:
        model = PeriodicTask
        fields = '__all__'