mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2024-09-21 00:13:18 +00:00
修复contest announcement的一些问题
This commit is contained in:
parent
cec27407e1
commit
37d6dd84ee
@ -73,7 +73,7 @@ def check_contest_permission(check_type="details"):
|
|||||||
else:
|
else:
|
||||||
contest_id = request.GET.get("contest_id")
|
contest_id = request.GET.get("contest_id")
|
||||||
if not contest_id:
|
if not contest_id:
|
||||||
return self.error("Parameter contest_id not exist.")
|
return self.error("Parameter contest_id doesn't exist.")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# use self.contest to avoid query contest again in view.
|
# use self.contest to avoid query contest again in view.
|
||||||
|
@ -77,13 +77,13 @@ class EditUserSerializer(serializers.Serializer):
|
|||||||
|
|
||||||
|
|
||||||
class EditUserProfileSerializer(serializers.Serializer):
|
class EditUserProfileSerializer(serializers.Serializer):
|
||||||
real_name = serializers.CharField(max_length=32, allow_blank=True)
|
real_name = serializers.CharField(max_length=32, allow_null=True, required=False)
|
||||||
avatar = serializers.CharField(max_length=256, allow_blank=True, required=False)
|
avatar = serializers.CharField(max_length=256, allow_null=True, allow_blank=True, required=False)
|
||||||
blog = serializers.URLField(max_length=256, allow_blank=True, required=False)
|
blog = serializers.URLField(max_length=256, allow_null=True, allow_blank=True, required=False)
|
||||||
mood = serializers.CharField(max_length=256, allow_blank=True, required=False)
|
mood = serializers.CharField(max_length=256, allow_null=True, allow_blank=True, required=False)
|
||||||
github = serializers.CharField(max_length=64, allow_blank=True, required=False)
|
github = serializers.CharField(max_length=64, allow_null=True, allow_blank=True, required=False)
|
||||||
school = serializers.CharField(max_length=64, allow_blank=True, required=False)
|
school = serializers.CharField(max_length=64, allow_null=True, allow_blank=True, required=False)
|
||||||
major = serializers.CharField(max_length=64, allow_blank=True, required=False)
|
major = serializers.CharField(max_length=64, allow_null=True, allow_blank=True, required=False)
|
||||||
|
|
||||||
|
|
||||||
class ApplyResetPasswordSerializer(serializers.Serializer):
|
class ApplyResetPasswordSerializer(serializers.Serializer):
|
||||||
|
20
contest/migrations/0007_contestannouncement_visible.py
Normal file
20
contest/migrations/0007_contestannouncement_visible.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.11.4 on 2017-11-06 09:02
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('contest', '0006_auto_20171011_1214'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='contestannouncement',
|
||||||
|
name='visible',
|
||||||
|
field=models.BooleanField(default=True),
|
||||||
|
),
|
||||||
|
]
|
@ -93,6 +93,7 @@ class ContestAnnouncement(models.Model):
|
|||||||
title = models.CharField(max_length=128)
|
title = models.CharField(max_length=128)
|
||||||
content = RichTextField()
|
content = RichTextField()
|
||||||
created_by = models.ForeignKey(User)
|
created_by = models.ForeignKey(User)
|
||||||
|
visible = models.BooleanField(default=True)
|
||||||
create_time = models.DateTimeField(auto_now_add=True)
|
create_time = models.DateTimeField(auto_now_add=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -54,9 +54,17 @@ class ContestAnnouncementSerializer(serializers.ModelSerializer):
|
|||||||
|
|
||||||
|
|
||||||
class CreateContestAnnouncementSerializer(serializers.Serializer):
|
class CreateContestAnnouncementSerializer(serializers.Serializer):
|
||||||
|
contest_id = serializers.IntegerField()
|
||||||
title = serializers.CharField(max_length=128)
|
title = serializers.CharField(max_length=128)
|
||||||
content = serializers.CharField()
|
content = serializers.CharField()
|
||||||
contest_id = serializers.IntegerField()
|
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):
|
class ContestPasswordVerifySerializer(serializers.Serializer):
|
||||||
|
@ -60,7 +60,7 @@ class ContestAPITest(APITestCase):
|
|||||||
self.create_admin()
|
self.create_admin()
|
||||||
url = self.reverse("contest_admin_api")
|
url = self.reverse("contest_admin_api")
|
||||||
self.contest = self.client.post(url, data=DEFAULT_CONTEST_DATA).data["data"]
|
self.contest = self.client.post(url, data=DEFAULT_CONTEST_DATA).data["data"]
|
||||||
self.url = self.reverse("contest_api") + "?contest_id=" + str(self.contest["id"])
|
self.url = self.reverse("contest_api") + "?id=" + str(self.contest["id"])
|
||||||
|
|
||||||
def test_get_contest_list(self):
|
def test_get_contest_list(self):
|
||||||
url = self.reverse("contest_list_api")
|
url = self.reverse("contest_list_api")
|
||||||
@ -100,7 +100,7 @@ class ContestAnnouncementAdminAPITest(APITestCase):
|
|||||||
self.create_super_admin()
|
self.create_super_admin()
|
||||||
self.url = self.reverse("contest_announcement_admin_api")
|
self.url = self.reverse("contest_announcement_admin_api")
|
||||||
contest_id = self.create_contest().data["data"]["id"]
|
contest_id = self.create_contest().data["data"]["id"]
|
||||||
self.data = {"title": "test title", "content": "test content", "contest_id": contest_id}
|
self.data = {"title": "test title", "content": "test content", "contest_id": contest_id, "visible": True}
|
||||||
|
|
||||||
def create_contest(self):
|
def create_contest(self):
|
||||||
url = self.reverse("contest_admin_api")
|
url = self.reverse("contest_admin_api")
|
||||||
|
@ -6,7 +6,8 @@ from ..models import Contest, ContestAnnouncement
|
|||||||
from ..serializers import (ContestAnnouncementSerializer, ContestAdminSerializer,
|
from ..serializers import (ContestAnnouncementSerializer, ContestAdminSerializer,
|
||||||
CreateConetestSeriaizer,
|
CreateConetestSeriaizer,
|
||||||
CreateContestAnnouncementSerializer,
|
CreateContestAnnouncementSerializer,
|
||||||
EditConetestSeriaizer)
|
EditConetestSeriaizer,
|
||||||
|
EditContestAnnouncementSerializer)
|
||||||
|
|
||||||
|
|
||||||
class ContestAPI(APIView):
|
class ContestAPI(APIView):
|
||||||
@ -83,6 +84,23 @@ class ContestAnnouncementAPI(APIView):
|
|||||||
announcement = ContestAnnouncement.objects.create(**data)
|
announcement = ContestAnnouncement.objects.create(**data)
|
||||||
return self.success(ContestAnnouncementSerializer(announcement).data)
|
return self.success(ContestAnnouncementSerializer(announcement).data)
|
||||||
|
|
||||||
|
@validate_serializer(EditContestAnnouncementSerializer)
|
||||||
|
def put(self, request):
|
||||||
|
"""
|
||||||
|
update contest_announcement
|
||||||
|
"""
|
||||||
|
data = request.data
|
||||||
|
try:
|
||||||
|
contest_announcement = ContestAnnouncement.objects.get(id=data.pop("id"))
|
||||||
|
if request.user.is_admin() and contest_announcement.created_by != request.user:
|
||||||
|
return self.error("Contest announcement does not exist")
|
||||||
|
except ContestAnnouncement.DoesNotExist:
|
||||||
|
return self.error("Contest announcement does not exist")
|
||||||
|
for k, v in data.items():
|
||||||
|
setattr(contest_announcement, k, v)
|
||||||
|
contest_announcement.save()
|
||||||
|
return self.success()
|
||||||
|
|
||||||
def delete(self, request):
|
def delete(self, request):
|
||||||
"""
|
"""
|
||||||
Delete one contest_announcement.
|
Delete one contest_announcement.
|
||||||
|
@ -17,7 +17,7 @@ class ContestAnnouncementListAPI(APIView):
|
|||||||
contest_id = request.GET.get("contest_id")
|
contest_id = request.GET.get("contest_id")
|
||||||
if not contest_id:
|
if not contest_id:
|
||||||
return self.error("Invalid parameter")
|
return self.error("Invalid parameter")
|
||||||
data = ContestAnnouncement.objects.select_related("created_by").filter(contest_id=contest_id)
|
data = ContestAnnouncement.objects.select_related("created_by").filter(contest_id=contest_id, visible=True)
|
||||||
max_id = request.GET.get("max_id")
|
max_id = request.GET.get("max_id")
|
||||||
if max_id:
|
if max_id:
|
||||||
data = data.filter(id__gt=max_id)
|
data = data.filter(id__gt=max_id)
|
||||||
@ -25,9 +25,15 @@ class ContestAnnouncementListAPI(APIView):
|
|||||||
|
|
||||||
|
|
||||||
class ContestAPI(APIView):
|
class ContestAPI(APIView):
|
||||||
@check_contest_permission(check_type="details")
|
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
return self.success(ContestSerializer(self.contest).data)
|
id = request.GET.get("id")
|
||||||
|
if not id:
|
||||||
|
return self.error("Invalid parameter")
|
||||||
|
try:
|
||||||
|
contest = Contest.objects.get(id=id)
|
||||||
|
return self.success(ContestSerializer(contest).data)
|
||||||
|
except Contest.DoesNotExist:
|
||||||
|
return self.error("Contest does not exist")
|
||||||
|
|
||||||
|
|
||||||
class ContestListAPI(APIView):
|
class ContestListAPI(APIView):
|
||||||
|
@ -59,7 +59,7 @@ _cpp_lang_config = {
|
|||||||
"exe_name": "main",
|
"exe_name": "main",
|
||||||
"max_cpu_time": 3000,
|
"max_cpu_time": 3000,
|
||||||
"max_real_time": 5000,
|
"max_real_time": 5000,
|
||||||
"max_memory": 256 * 1024 * 1024,
|
"max_memory": 512 * 1024 * 1024,
|
||||||
"compile_command": "/usr/bin/g++ -DONLINE_JUDGE -O2 -w -fmax-errors=3 -std=c++11 {src_path} -lm -o {exe_path}",
|
"compile_command": "/usr/bin/g++ -DONLINE_JUDGE -O2 -w -fmax-errors=3 -std=c++11 {src_path} -lm -o {exe_path}",
|
||||||
},
|
},
|
||||||
"run": {
|
"run": {
|
||||||
|
@ -361,4 +361,3 @@ class MakeContestProblemPublicAPIView(APIView):
|
|||||||
problem.save()
|
problem.save()
|
||||||
problem.tags.set(tags)
|
problem.tags.set(tags)
|
||||||
return self.success()
|
return self.success()
|
||||||
|
|
||||||
|
@ -137,6 +137,7 @@ class SubmissionListAPI(APIView):
|
|||||||
problem_id = request.GET.get("problem_id")
|
problem_id = request.GET.get("problem_id")
|
||||||
myself = request.GET.get("myself")
|
myself = request.GET.get("myself")
|
||||||
result = request.GET.get("result")
|
result = request.GET.get("result")
|
||||||
|
username = request.GET.get("username")
|
||||||
if problem_id:
|
if problem_id:
|
||||||
try:
|
try:
|
||||||
problem = Problem.objects.get(_id=problem_id, contest_id__isnull=True, visible=True)
|
problem = Problem.objects.get(_id=problem_id, contest_id__isnull=True, visible=True)
|
||||||
@ -145,6 +146,8 @@ class SubmissionListAPI(APIView):
|
|||||||
submissions = submissions.filter(problem=problem)
|
submissions = submissions.filter(problem=problem)
|
||||||
if myself and myself == "1":
|
if myself and myself == "1":
|
||||||
submissions = submissions.filter(user_id=request.user.id)
|
submissions = submissions.filter(user_id=request.user.id)
|
||||||
|
elif username:
|
||||||
|
submissions = submissions.filter(username=username)
|
||||||
if result:
|
if result:
|
||||||
submissions = submissions.filter(result=result)
|
submissions = submissions.filter(result=result)
|
||||||
data = self.paginate_data(request, submissions)
|
data = self.paginate_data(request, submissions)
|
||||||
@ -163,6 +166,7 @@ class ContestSubmissionListAPI(APIView):
|
|||||||
problem_id = request.GET.get("problem_id")
|
problem_id = request.GET.get("problem_id")
|
||||||
myself = request.GET.get("myself")
|
myself = request.GET.get("myself")
|
||||||
result = request.GET.get("result")
|
result = request.GET.get("result")
|
||||||
|
username = request.GET.get("username")
|
||||||
if problem_id:
|
if problem_id:
|
||||||
try:
|
try:
|
||||||
problem = Problem.objects.get(_id=problem_id, contest_id=contest.id, visible=True)
|
problem = Problem.objects.get(_id=problem_id, contest_id=contest.id, visible=True)
|
||||||
@ -172,6 +176,8 @@ class ContestSubmissionListAPI(APIView):
|
|||||||
|
|
||||||
if myself and myself == "1":
|
if myself and myself == "1":
|
||||||
submissions = submissions.filter(user_id=request.user.id)
|
submissions = submissions.filter(user_id=request.user.id)
|
||||||
|
elif username:
|
||||||
|
submissions = submissions.filter(username=username)
|
||||||
if result:
|
if result:
|
||||||
submissions = submissions.filter(result=result)
|
submissions = submissions.filter(result=result)
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ class APIView(View):
|
|||||||
limit = int(request.GET.get("limit", "10"))
|
limit = int(request.GET.get("limit", "10"))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
limit = 10
|
limit = 10
|
||||||
if limit < 0 or limit > 100:
|
if limit < 0 or limit > 250:
|
||||||
limit = 10
|
limit = 10
|
||||||
try:
|
try:
|
||||||
offset = int(request.GET.get("offset", "0"))
|
offset = int(request.GET.get("offset", "0"))
|
||||||
|
Loading…
Reference in New Issue
Block a user