修复contest announcement的一些问题
This commit is contained in:
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)
|
||||
content = RichTextField()
|
||||
created_by = models.ForeignKey(User)
|
||||
visible = models.BooleanField(default=True)
|
||||
create_time = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
class Meta:
|
||||
|
||||
@@ -54,9 +54,17 @@ class ContestAnnouncementSerializer(serializers.ModelSerializer):
|
||||
|
||||
|
||||
class CreateContestAnnouncementSerializer(serializers.Serializer):
|
||||
contest_id = serializers.IntegerField()
|
||||
title = serializers.CharField(max_length=128)
|
||||
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):
|
||||
|
||||
@@ -60,7 +60,7 @@ class ContestAPITest(APITestCase):
|
||||
self.create_admin()
|
||||
url = self.reverse("contest_admin_api")
|
||||
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):
|
||||
url = self.reverse("contest_list_api")
|
||||
@@ -100,7 +100,7 @@ class ContestAnnouncementAdminAPITest(APITestCase):
|
||||
self.create_super_admin()
|
||||
self.url = self.reverse("contest_announcement_admin_api")
|
||||
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):
|
||||
url = self.reverse("contest_admin_api")
|
||||
|
||||
@@ -6,7 +6,8 @@ from ..models import Contest, ContestAnnouncement
|
||||
from ..serializers import (ContestAnnouncementSerializer, ContestAdminSerializer,
|
||||
CreateConetestSeriaizer,
|
||||
CreateContestAnnouncementSerializer,
|
||||
EditConetestSeriaizer)
|
||||
EditConetestSeriaizer,
|
||||
EditContestAnnouncementSerializer)
|
||||
|
||||
|
||||
class ContestAPI(APIView):
|
||||
@@ -83,6 +84,23 @@ class ContestAnnouncementAPI(APIView):
|
||||
announcement = ContestAnnouncement.objects.create(**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):
|
||||
"""
|
||||
Delete one contest_announcement.
|
||||
|
||||
@@ -17,7 +17,7 @@ class ContestAnnouncementListAPI(APIView):
|
||||
contest_id = request.GET.get("contest_id")
|
||||
if not contest_id:
|
||||
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")
|
||||
if max_id:
|
||||
data = data.filter(id__gt=max_id)
|
||||
@@ -25,9 +25,15 @@ class ContestAnnouncementListAPI(APIView):
|
||||
|
||||
|
||||
class ContestAPI(APIView):
|
||||
@check_contest_permission(check_type="details")
|
||||
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):
|
||||
|
||||
Reference in New Issue
Block a user