添加contest权限验证、contest密码验证api
添加problem、contest单元测试。
This commit is contained in:
@@ -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')
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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"),
|
||||
|
||||
]
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user