diff --git a/contest/serializers.py b/contest/serializers.py index d5bbb936..9795f1c9 100644 --- a/contest/serializers.py +++ b/contest/serializers.py @@ -25,3 +25,14 @@ class ContestSerializer(serializers.ModelSerializer): class Meta: model = Contest + + +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, max_length=32) + visible = serializers.BooleanField() + real_time_rank = serializers.BooleanField() diff --git a/contest/views/admin.py b/contest/views/admin.py index 70ea2cb1..7a64240e 100644 --- a/contest/views/admin.py +++ b/contest/views/admin.py @@ -3,7 +3,7 @@ import dateutil.parser from utils.api import APIView, validate_serializer from ..models import Contest -from ..serializers import ContestSerializer, CreateConetestSeriaizer +from ..serializers import ContestSerializer, CreateConetestSeriaizer, EditConetestSeriaizer class ContestAPI(APIView): @@ -20,6 +20,26 @@ class ContestAPI(APIView): Contest.objects.create(**data) return self.success() + @validate_serializer(EditConetestSeriaizer) + def put(self, request): + data = request.data + try: + contest = Contest.objects.get(id=data.pop("id")) + if request.user.is_admin_role(): + contest = contest.get(created_by=request.user) + except Contest.DoesNotExist: + return self.error("Contest does not exist") + data["start_time"] = dateutil.parser.parse(data["start_time"]) + data["end_time"] = dateutil.parser.parse(data["end_time"]) + if data["end_time"] <= data["start_time"]: + return self.error("Start time must occur earlier than end time") + if not data["password"]: + data["password"] = None + for k, v in data.items(): + setattr(contest, k, v) + contest.save() + return self.success(ContestSerializer(contest).data) + def get(self, request): contest_id = request.GET.get("id") if contest_id: