From 2bf0389e7be0285288709fc53aa0a22519223642 Mon Sep 17 00:00:00 2001 From: hohoTT <609029365@qq.com> Date: Thu, 6 Aug 2015 11:08:02 +0800 Subject: [PATCH 1/3] =?UTF-8?q?announcement=20model.py=20=E9=87=8C?= =?UTF-8?q?=E9=9D=A2=E7=9A=84=20description=20=E6=94=B9=E5=90=8D=E4=B8=BA?= =?UTF-8?q?=20content,=E5=B9=B6=E4=BF=AE=E6=94=B9=E5=85=B6=E5=AF=B9?= =?UTF-8?q?=E5=BA=94=E7=9A=84serializers=E5=92=8Cviews?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0002_auto_20150806_1104.py | 19 +++++++++++++++++++ announcement/models.py | 4 ++-- announcement/serializers.py | 2 +- announcement/views.py | 2 +- 4 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 announcement/migrations/0002_auto_20150806_1104.py diff --git a/announcement/migrations/0002_auto_20150806_1104.py b/announcement/migrations/0002_auto_20150806_1104.py new file mode 100644 index 0000000..2768cc6 --- /dev/null +++ b/announcement/migrations/0002_auto_20150806_1104.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('announcement', '0001_initial'), + ] + + operations = [ + migrations.RenameField( + model_name='announcement', + old_name='description', + new_name='content', + ), + ] diff --git a/announcement/models.py b/announcement/models.py index a47eba6..a3574b8 100644 --- a/announcement/models.py +++ b/announcement/models.py @@ -7,8 +7,8 @@ from account.models import User class Announcement(models.Model): # 标题 title = models.CharField(max_length=50) - # 公告的描述 HTML 格式 - description = models.TextField() + # 公告的内容 HTML 格式 + content = models.TextField() # 创建时间 create_time = models.DateTimeField(auto_now_add=True) # 这个公告是谁创建的 diff --git a/announcement/serializers.py b/announcement/serializers.py index a1525b9..3878e14 100644 --- a/announcement/serializers.py +++ b/announcement/serializers.py @@ -4,5 +4,5 @@ from rest_framework import serializers class AnnouncementSerializer(serializers.Serializer): title = serializers.CharField(max_length=50) - description = serializers.CharField(max_length=10000) + content = serializers.CharField(max_length=10000) diff --git a/announcement/views.py b/announcement/views.py index 220e806..e3766e8 100644 --- a/announcement/views.py +++ b/announcement/views.py @@ -21,7 +21,7 @@ class AnnouncementAPIView(APIView): if serializer.is_valid(): data = serializer.data Announcement.objects.create(title=data["title"], - description=data["description"], + content=data["content"], created_by=request.user) return success_response(u"公告发布成功!") else: From 96c8d28c6460c6e208b47e8fd0b70f7f3beace25 Mon Sep 17 00:00:00 2001 From: hohoTT <609029365@qq.com> Date: Thu, 6 Aug 2015 13:17:15 +0800 Subject: [PATCH 2/3] =?UTF-8?q?announcement=20model.py=20=E9=87=8C?= =?UTF-8?q?=E9=9D=A2=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=B8=AA=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=EF=BC=88=E6=9C=80=E5=90=8E=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=97=B6=E9=97=B4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/migrations/0004_auto_20150806_1251.py | 23 +++++++++++++++++++ announcement/migrations/0001_initial.py | 3 ++- .../migrations/0002_auto_20150806_1104.py | 19 --------------- announcement/models.py | 2 ++ 4 files changed, 27 insertions(+), 20 deletions(-) create mode 100644 account/migrations/0004_auto_20150806_1251.py delete mode 100644 announcement/migrations/0002_auto_20150806_1104.py diff --git a/account/migrations/0004_auto_20150806_1251.py b/account/migrations/0004_auto_20150806_1251.py new file mode 100644 index 0000000..d3d2225 --- /dev/null +++ b/account/migrations/0004_auto_20150806_1251.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0003_user_email'), + ] + + operations = [ + migrations.RemoveField( + model_name='user', + name='admin_group', + ), + migrations.AddField( + model_name='user', + name='admin_type', + field=models.IntegerField(default=0), + ), + ] diff --git a/announcement/migrations/0001_initial.py b/announcement/migrations/0001_initial.py index 24a1d13..7e8d583 100644 --- a/announcement/migrations/0001_initial.py +++ b/announcement/migrations/0001_initial.py @@ -17,8 +17,9 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('title', models.CharField(max_length=50)), - ('description', models.TextField()), + ('content', models.TextField()), ('create_time', models.DateTimeField(auto_now_add=True)), + ('last_update_time', models.DateTimeField(auto_now=True)), ('visible', models.BooleanField(default=True)), ('created_by', models.ForeignKey(to=settings.AUTH_USER_MODEL)), ], diff --git a/announcement/migrations/0002_auto_20150806_1104.py b/announcement/migrations/0002_auto_20150806_1104.py deleted file mode 100644 index 2768cc6..0000000 --- a/announcement/migrations/0002_auto_20150806_1104.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('announcement', '0001_initial'), - ] - - operations = [ - migrations.RenameField( - model_name='announcement', - old_name='description', - new_name='content', - ), - ] diff --git a/announcement/models.py b/announcement/models.py index a3574b8..491c219 100644 --- a/announcement/models.py +++ b/announcement/models.py @@ -13,6 +13,8 @@ class Announcement(models.Model): create_time = models.DateTimeField(auto_now_add=True) # 这个公告是谁创建的 created_by = models.ForeignKey(User) + # 最后更新时间 + last_update_time = models.DateTimeField(auto_now=True) # 是否可见 false的话相当于删除 visible = models.BooleanField(default=True) From 844e9702764c36d60bd0dac9ba0f1f944f96c51a Mon Sep 17 00:00:00 2001 From: hohoTT <609029365@qq.com> Date: Thu, 6 Aug 2015 16:28:59 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=85=AC?= =?UTF-8?q?=E5=91=8A=E5=8F=91=E5=B8=83=E6=88=90=E5=8A=9F=E7=9A=84=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=EF=BC=8C=E4=BB=A5=E5=8F=8A=E5=85=AC=E5=91=8A=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E7=9A=84APIview?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- announcement/serializers.py | 18 +++++++++++++++++- announcement/tests.py | 15 +++++++++++++-- announcement/views.py | 24 +++++++++++++++++------- oj/urls.py | 6 ++++-- 4 files changed, 51 insertions(+), 12 deletions(-) diff --git a/announcement/serializers.py b/announcement/serializers.py index 3878e14..a195b2e 100644 --- a/announcement/serializers.py +++ b/announcement/serializers.py @@ -1,8 +1,24 @@ # coding=utf-8 from rest_framework import serializers +from account.models import User +from .models import Announcement -class AnnouncementSerializer(serializers.Serializer): + +class CreateAnnouncementSerializer(serializers.Serializer): title = serializers.CharField(max_length=50) content = serializers.CharField(max_length=10000) + +class AnnouncementSerializer(serializers.ModelSerializer): + + class UserSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ["username"] + + created_by = UserSerializer() + + class Meta: + model = Announcement + diff --git a/announcement/tests.py b/announcement/tests.py index f73805e..f337a9c 100644 --- a/announcement/tests.py +++ b/announcement/tests.py @@ -3,14 +3,25 @@ from django.core.urlresolvers import reverse from rest_framework.test import APITestCase, APIClient +from account.models import User + class AnnouncementAPITest(APITestCase): def setUp(self): self.client = APIClient() - self.url = reverse("announcement_api") + self.url = reverse("announcement_admin_api") + user = User.objects.create(username="test") + user.set_password("test") + user.save() def test_invalid_format(self): - # todo 判断用户是否登录 + self.client.login(username="test", password="test") data = {"title": "test1"} response = self.client.post(self.url, data=data) self.assertEqual(response.data["code"], 1) + + def test_success_announcement(self): + self.client.login(username="test", password="test") + data = {"title": "title0", "content": "content0"} + response = self.client.post(self.url, data=data) + self.assertEqual(response.data, {"code": 0, "data": u"公告发布成功!"}) \ No newline at end of file diff --git a/announcement/views.py b/announcement/views.py index e3766e8..b01af7f 100644 --- a/announcement/views.py +++ b/announcement/views.py @@ -4,20 +4,19 @@ from rest_framework.views import APIView from utils.shortcuts import serializer_invalid_response, error_response, success_response from account.models import User - +from utils.shortcuts import paginate from .models import Announcement -from .serializers import AnnouncementSerializer +from .serializers import CreateAnnouncementSerializer, AnnouncementSerializer -class AnnouncementAPIView(APIView): - # todo 判断用户是否需要登录 +class AnnouncementAdminAPIView(APIView): def post(self, request): """ 公告发布json api接口 --- - request_serializer: AnnouncementSerializer + request_serializer: CreateAnnouncementSerializer """ - serializer = AnnouncementSerializer(data=request.DATA) + serializer = CreateAnnouncementSerializer(data=request.DATA) if serializer.is_valid(): data = serializer.data Announcement.objects.create(title=data["title"], @@ -25,4 +24,15 @@ class AnnouncementAPIView(APIView): created_by=request.user) return success_response(u"公告发布成功!") else: - return serializer_invalid_response(serializer) \ No newline at end of file + return serializer_invalid_response(serializer) + + +class AnnouncementAPIView(APIView): + def get(self, request): + """ + 公告分页json api接口 + --- + request_serializer: AnnouncementSerializer + """ + announcement = Announcement.objects.all().order_by("last_update_time") + return paginate(request, announcement, AnnouncementSerializer) diff --git a/oj/urls.py b/oj/urls.py index 82ecafb..2586cb6 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -5,7 +5,7 @@ from django.views.generic import TemplateView from account.views import UserLoginAPIView, UsernameCheckAPIView, UserRegisterAPIView, UserChangePasswordAPIView, \ EmailCheckAPIView -from announcement.views import AnnouncementAPIView +from announcement.views import AnnouncementAPIView, AnnouncementAdminAPIView from admin.views import AdminTemplateView urlpatterns = [ @@ -20,9 +20,11 @@ urlpatterns = [ 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/email_check/$', EmailCheckAPIView.as_view(), name="email_check_api"), - url(r'^api/admin/announcement/$', AnnouncementAPIView.as_view(), name="announcement_api"), + url(r'^api/admin/announcement/$', AnnouncementAdminAPIView.as_view(), name="announcement_admin_api"), url(r'^problem/(?P\d+)/$', "problem.views.problem_page", name="problem_page"), + url(r'^announcements/$', AnnouncementAPIView.as_view()), + url(r'^admin/contest/$', TemplateView.as_view(template_name="admin/contest/add_contest.html"), name="add_contest_page"), url(r'^problems/$', TemplateView.as_view(template_name="oj/problem/problem_list.html"), name="problem_list_page"), url(r'^admin/template/(?P\w+)/(?P\w+).html', AdminTemplateView.as_view(), name="admin_template")