添加contest权限验证、contest密码验证api

添加problem、contest单元测试。
This commit is contained in:
zemal
2017-07-18 11:18:18 +08:00
parent 53d0cae8ea
commit ee49d0a815
9 changed files with 136 additions and 19 deletions

View File

@@ -27,7 +27,7 @@ class EditConetestSeriaizer(serializers.Serializer):
real_time_rank = serializers.BooleanField()
class ContestSerializer(serializers.ModelSerializer):
class ContestAdminSerializer(serializers.ModelSerializer):
start_time = DateTimeTZField()
end_time = DateTimeTZField()
create_time = DateTimeTZField()
@@ -36,6 +36,11 @@ class ContestSerializer(serializers.ModelSerializer):
status = serializers.CharField()
contest_type = serializers.CharField()
class Meta:
model = Contest
class ContestSerializer(ContestAdminSerializer):
class Meta:
model = Contest
exclude = ('password', 'visible')

View File

@@ -74,6 +74,16 @@ class ContestAPITest(APITestCase):
response = self.client.get("{}?id={}".format(self.url, contest_id))
self.assertSuccess(response)
def test_contest_password(self):
contest_id = self.create_contest().data["data"]["id"]
self.create_user("test", "test123")
url = self.reverse("contest_password_api")
resp = self.client.post(url, {"contest_id": contest_id, "password": "error_password"})
self.assertFailed(resp)
resp = self.client.post(url, {"contest_id": contest_id, "password": DEFAULT_CONTEST_DATA["password"]})
self.assertSuccess(resp)
class ContestAnnouncementAPITest(APITestCase):
def setUp(self):

View File

@@ -1,9 +1,11 @@
from django.conf.urls import url
from ..views.oj import ContestAnnouncementListAPI, ContestAPI
from ..views.oj import ContestPasswordVerifyAPI
urlpatterns = [
url(r"^contest/?$", ContestAPI.as_view(), name="contest_api"),
url(r"^contest/password/?$", ContestPasswordVerifyAPI.as_view(), name="contest_password_api"),
url(r"^contest/announcement/?$", ContestAnnouncementListAPI.as_view(), name="contest_announcement_api"),
]

View File

@@ -3,7 +3,7 @@ import dateutil.parser
from utils.api import APIView, validate_serializer
from ..models import Contest, ContestAnnouncement
from ..serializers import (ContestAnnouncementSerializer, ContestSerializer,
from ..serializers import (ContestAnnouncementSerializer, ContestAdminSerializer,
CreateConetestSeriaizer,
CreateContestAnnouncementSerializer,
EditConetestSeriaizer)
@@ -21,7 +21,7 @@ class ContestAPI(APIView):
if not data["password"]:
data["password"] = None
contest = Contest.objects.create(**data)
return self.success(ContestSerializer(contest).data)
return self.success(ContestAdminSerializer(contest).data)
@validate_serializer(EditConetestSeriaizer)
def put(self, request):
@@ -41,7 +41,7 @@ class ContestAPI(APIView):
for k, v in data.items():
setattr(contest, k, v)
contest.save()
return self.success(ContestSerializer(contest).data)
return self.success(ContestAdminSerializer(contest).data)
def get(self, request):
contest_id = request.GET.get("id")
@@ -50,7 +50,7 @@ class ContestAPI(APIView):
contest = Contest.objects.get(id=contest_id)
if request.user.is_admin() and contest.created_by != request.user:
return self.error("Contest does not exist")
return self.success(ContestSerializer(contest).data)
return self.success(ContestAdminSerializer(contest).data)
except Contest.DoesNotExist:
return self.error("Contest does not exist")
@@ -62,7 +62,7 @@ class ContestAPI(APIView):
if request.user.is_admin():
contests = contests.filter(created_by=request.user)
return self.success(self.paginate_data(request, contests, ContestSerializer))
return self.success(self.paginate_data(request, contests, ContestAdminSerializer))
class ContestAnnouncementAPI(APIView):

View File

@@ -38,7 +38,7 @@ class ContestAPI(APIView):
class ContestPasswordVerifyAPI(APIView):
@validate_serializer(ContestPasswordVerifySerializer)
@login_required
def get(self, request):
def post(self, request):
data = request.data
try:
contest = Contest.objects.get(id=data["contest_id"], visible=True, password__isnull=False)