from utils.api import UsernameSerializer, serializers from .models import Contest, ContestAnnouncement, ContestRuleType from .models import ACMContestRank, OIContestRank class CreateConetestSeriaizer(serializers.Serializer): title = serializers.CharField(max_length=128) description = serializers.CharField() start_time = serializers.DateTimeField() end_time = serializers.DateTimeField() rule_type = serializers.ChoiceField(choices=[ContestRuleType.ACM, ContestRuleType.OI]) password = serializers.CharField(allow_blank=True, max_length=32) visible = serializers.BooleanField() real_time_rank = serializers.BooleanField() allowed_ip_ranges = serializers.ListField(child=serializers.CharField(max_length=32), allow_empty=True) class EditConetestSeriaizer(serializers.Serializer): id = serializers.IntegerField() title = serializers.CharField(max_length=128) description = serializers.CharField() start_time = serializers.DateTimeField() end_time = serializers.DateTimeField() password = serializers.CharField(allow_blank=True, allow_null=True, max_length=32) visible = serializers.BooleanField() real_time_rank = serializers.BooleanField() allowed_ip_ranges = serializers.ListField(child=serializers.CharField(max_length=32)) class ContestAdminSerializer(serializers.ModelSerializer): created_by = UsernameSerializer() status = serializers.CharField() contest_type = serializers.CharField() class Meta: model = Contest fields = "__all__" class ContestSerializer(ContestAdminSerializer): class Meta: model = Contest exclude = ("password", "visible", "allowed_ip_ranges") class ContestAnnouncementSerializer(serializers.ModelSerializer): created_by = UsernameSerializer() class Meta: model = ContestAnnouncement fields = "__all__" class CreateContestAnnouncementSerializer(serializers.Serializer): contest_id = serializers.IntegerField() title = serializers.CharField(max_length=128) content = serializers.CharField() visible = serializers.BooleanField() class EditContestAnnouncementSerializer(serializers.Serializer): id = serializers.IntegerField() title = serializers.CharField(max_length=128, required=False) content = serializers.CharField(required=False, allow_blank=True) visible = serializers.BooleanField(required=False) class ContestPasswordVerifySerializer(serializers.Serializer): contest_id = serializers.IntegerField() password = serializers.CharField(max_length=30, required=True) class ACMContestRankSerializer(serializers.ModelSerializer): user = serializers.SerializerMethodField() class Meta: model = ACMContestRank fields = "__all__" def __init__(self, *args, **kwargs): self.is_admin_role = kwargs.pop("is_admin_role", False) super().__init__(*args, **kwargs) def get_user(self, obj): return UsernameSerializer(obj.user, is_admin_role=self.is_admin_role).data class OIContestRankSerializer(serializers.ModelSerializer): user = serializers.SerializerMethodField() class Meta: model = OIContestRank fields = "__all__" def __init__(self, *args, **kwargs): self.is_admin_role = kwargs.pop("is_admin_role", False) super().__init__(*args, **kwargs) def get_user(self, obj): return UsernameSerializer(obj.user, is_admin_role=self.is_admin_role).data