diff --git a/announcement/__init__.py b/announcement/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/announcement/admin.py b/announcement/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/announcement/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/announcement/migrations/__init__.py b/announcement/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/announcement/models.py b/announcement/models.py new file mode 100644 index 00000000..a47eba60 --- /dev/null +++ b/announcement/models.py @@ -0,0 +1,20 @@ +# coding=utf-8 +from django.db import models + +from account.models import User + + +class Announcement(models.Model): + # 标题 + title = models.CharField(max_length=50) + # 公告的描述 HTML 格式 + description = models.TextField() + # 创建时间 + create_time = models.DateTimeField(auto_now_add=True) + # 这个公告是谁创建的 + created_by = models.ForeignKey(User) + # 是否可见 false的话相当于删除 + visible = models.BooleanField(default=True) + + class Meta: + db_table = "announcement" diff --git a/announcement/serializers.py b/announcement/serializers.py new file mode 100644 index 00000000..a1525b94 --- /dev/null +++ b/announcement/serializers.py @@ -0,0 +1,8 @@ +# coding=utf-8 +from rest_framework import serializers + + +class AnnouncementSerializer(serializers.Serializer): + title = serializers.CharField(max_length=50) + description = serializers.CharField(max_length=10000) + diff --git a/announcement/tests.py b/announcement/tests.py new file mode 100644 index 00000000..ccb8a043 --- /dev/null +++ b/announcement/tests.py @@ -0,0 +1,16 @@ +# coding=utf-8 +from django.core.urlresolvers import reverse + +from rest_framework.test import APITestCase, APIClient + + +class AbstractAnnouncementAPITest(APITestCase): + def setUp(self): + self.client = APIClient() + self.url = reverse("announcement_api") + + def test_invalid_format(self): + # todo 判断用户是否登录 + data = {"title": "test1"} + response = self.client.post(self.url, data=data) + self.assertEqual(response.data["code"], 1) diff --git a/announcement/views.py b/announcement/views.py new file mode 100644 index 00000000..220e8065 --- /dev/null +++ b/announcement/views.py @@ -0,0 +1,28 @@ +# coding=utf-8 +from rest_framework.views import APIView + +from utils.shortcuts import serializer_invalid_response, error_response, success_response + +from account.models import User + +from .models import Announcement +from .serializers import AnnouncementSerializer + + +class AnnouncementAPIView(APIView): + # todo 判断用户是否需要登录 + def post(self, request): + """ + 公告发布json api接口 + --- + request_serializer: AnnouncementSerializer + """ + serializer = AnnouncementSerializer(data=request.DATA) + if serializer.is_valid(): + data = serializer.data + Announcement.objects.create(title=data["title"], + description=data["description"], + created_by=request.user) + return success_response(u"公告发布成功!") + else: + return serializer_invalid_response(serializer) \ No newline at end of file diff --git a/oj/urls.py b/oj/urls.py index fc652b32..19da5893 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -4,6 +4,7 @@ from django.contrib import admin from django.views.generic import TemplateView from account.views import UserLoginAPIView, UsernameCheckAPIView, UserRegisterAPIView, UserChangePasswordAPIView +from announcement.views import AnnouncementAPIView urlpatterns = [ url("^$", TemplateView.as_view(template_name="oj/index.html"), name="index_page"), @@ -14,6 +15,7 @@ urlpatterns = [ url(r'^api/register/$', UserRegisterAPIView.as_view(), name="user_register_api"), url(r'^api/change_password/$', UserChangePasswordAPIView.as_view(), name="user_change_password_api"), url(r'^api/username_check/$', UsernameCheckAPIView.as_view(), name="username_check_api"), + url(r'^api/admin/announcement/$', AnnouncementAPIView.as_view(), name="announcement_api"), url(r'^problem/(?P\d+)/$', "problem.views.problem_page", name="problem_page"), url(r'^admin/contest/$', TemplateView.as_view(template_name="admin/contest/add_contest.html"), name="add_contest_page"),