From 4548ffd61709941267f36a7463ad1fbf5d56b810 Mon Sep 17 00:00:00 2001 From: hohoTT <609029365@qq.com> Date: Tue, 4 Aug 2015 19:23:10 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=E5=85=AC=E5=91=8AAPI?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=9A=84=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- announcement/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/announcement/tests.py b/announcement/tests.py index ccb8a04..f73805e 100644 --- a/announcement/tests.py +++ b/announcement/tests.py @@ -4,7 +4,7 @@ from django.core.urlresolvers import reverse from rest_framework.test import APITestCase, APIClient -class AbstractAnnouncementAPITest(APITestCase): +class AnnouncementAPITest(APITestCase): def setUp(self): self.client = APIClient() self.url = reverse("announcement_api") From 17b44800ca339d3b5302c1343508f704f17d6614 Mon Sep 17 00:00:00 2001 From: hohoTT <609029365@qq.com> Date: Wed, 5 Aug 2015 10:34:00 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=B0=86announcement=20=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=20setings.py=20=E9=87=8C=E9=9D=A2=E7=9A=84=20INSTALLED=5FAPPS?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E4=B8=94=E5=88=9B=E5=BB=BAannouncement?= =?UTF-8?q?=E8=BF=99=E5=BC=A0=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- announcement/migrations/0001_initial.py | 29 +++++++++++++++++++++++++ oj/settings.py | 1 + 2 files changed, 30 insertions(+) create mode 100644 announcement/migrations/0001_initial.py diff --git a/announcement/migrations/0001_initial.py b/announcement/migrations/0001_initial.py new file mode 100644 index 0000000..24a1d13 --- /dev/null +++ b/announcement/migrations/0001_initial.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Announcement', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(max_length=50)), + ('description', models.TextField()), + ('create_time', models.DateTimeField(auto_now_add=True)), + ('visible', models.BooleanField(default=True)), + ('created_by', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ], + options={ + 'db_table': 'announcement', + }, + ), + ] diff --git a/oj/settings.py b/oj/settings.py index 793f605..910914c 100644 --- a/oj/settings.py +++ b/oj/settings.py @@ -47,6 +47,7 @@ INSTALLED_APPS = ( 'django.contrib.staticfiles', 'account', + 'announcement', 'utils', 'rest_framework', From 117a6d3525b9a5e3dac0b0c6ce413445bec0af11 Mon Sep 17 00:00:00 2001 From: hohoTT <609029365@qq.com> Date: Wed, 5 Aug 2015 20:11:25 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=AF=86=E7=A0=81=E4=BF=AE=E6=94=B9=E6=88=90=E5=8A=9F=E7=9A=84?= =?UTF-8?q?API=E6=B5=8B=E8=AF=95=EF=BC=8C=E4=BB=A5=E5=8F=8A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=94=A8=E6=88=B7=E9=82=AE=E7=AE=B1=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=B9=B6=E5=81=9A=E4=BA=86=E7=9B=B8=E5=BA=94=E7=9A=84API?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=EF=BC=8C=E7=9B=AE=E5=89=8D=E7=9A=84account/v?= =?UTF-8?q?iew.py=E6=B5=8B=E8=AF=95=E8=A6=86=E7=9B=96=E7=8E=87=E4=B8=BA100?= =?UTF-8?q?%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/migrations/0003_user_email.py | 19 +++++++++++ account/models.py | 2 ++ account/serializers.py | 5 +++ account/tests.py | 48 ++++++++++++++++++++++++--- account/views.py | 29 ++++++++++++++-- oj/urls.py | 4 ++- 6 files changed, 99 insertions(+), 8 deletions(-) create mode 100644 account/migrations/0003_user_email.py diff --git a/account/migrations/0003_user_email.py b/account/migrations/0003_user_email.py new file mode 100644 index 0000000..780afc3 --- /dev/null +++ b/account/migrations/0003_user_email.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0002_auto_20150731_2310'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='email', + field=models.EmailField(max_length=254, null=True, blank=True), + ), + ] diff --git a/account/models.py b/account/models.py index 1b8636a..1f02eef 100644 --- a/account/models.py +++ b/account/models.py @@ -19,6 +19,8 @@ class User(AbstractBaseUser): username = models.CharField(max_length=30, unique=True) # 真实姓名 real_name = models.CharField(max_length=30, blank=True, null=True) + # 用户邮箱 + email = models.EmailField(max_length=254, blank=True, null=True) admin_group = models.ForeignKey(AdminGroup, null=True, on_delete=models.SET_NULL) USERNAME_FIELD = 'username' diff --git a/account/serializers.py b/account/serializers.py index 41634b7..209e490 100644 --- a/account/serializers.py +++ b/account/serializers.py @@ -11,10 +11,15 @@ class UsernameCheckSerializer(serializers.Serializer): username = serializers.CharField(max_length=30) +class EmailCheckSerializer(serializers.Serializer): + email = serializers.EmailField(max_length=254) + + class UserRegisterSerializer(serializers.Serializer): username = serializers.CharField(max_length=30) real_name = serializers.CharField(max_length=30) password = serializers.CharField(max_length=30, min_length=6) + email = serializers.EmailField(max_length=254) class UserChangePasswordSerializer(serializers.Serializer): diff --git a/account/tests.py b/account/tests.py index 83226b7..76fbec6 100644 --- a/account/tests.py +++ b/account/tests.py @@ -1,6 +1,8 @@ # coding=utf-8 import json +from django.contrib import auth + from django.core.urlresolvers import reverse from django.test import TestCase, Client from django.http import HttpResponse @@ -63,6 +65,26 @@ class UsernameCheckTest(APITestCase): self.assertEqual(response.data, {"code": 0, "data": False}) +class EmailCheckTest(APITestCase): + def setUp(self): + self.client = APIClient() + self.url = reverse("email_check_api") + User.objects.create(email="11@qq.com") + + def test_invalid_data(self): + response = self.client.post(self.url, data={"email000": "11@qq.com"}) + self.assertEqual(response.data["code"], 1) + self.assertEqual(response.data["code"], 1) + + def test_email_exists(self): + response = self.client.post(self.url, data={"email": "11@qq.com"}) + self.assertEqual(response.data, {"code": 0, "data": True}) + + def test_email_does_not_exist(self): + response = self.client.post(self.url, data={"email": "33@qq.com"}) + self.assertEqual(response.data, {"code": 0, "data": False}) + + class UserRegisterAPITest(APITestCase): def setUp(self): self.client = APIClient() @@ -74,22 +96,35 @@ class UserRegisterAPITest(APITestCase): self.assertEqual(response.data["code"], 1) def test_short_password(self): - data = {"username": "test", "real_name": "TT", "password": "qq"} + data = {"username": "test", "real_name": "TT", "password": "qq", "email": "6060@qq.com"} response = self.client.post(self.url, data=data) self.assertEqual(response.data["code"], 1) def test_same_username(self): - User.objects.create(username="aa", real_name="ww") - data = {"username": "aa", "real_name": "ww", "password": "zzzzzzz"} + User.objects.create(username="aa") + data = {"username": "aa", "real_name": "ww", "password": "zzzzzzz", "email": "6060@qq.com"} response = self.client.post(self.url, data=data) self.assertEqual(response.data, {"code": 1, "data": u"用户名已存在"}) + def test_same_email(self): + User.objects.create(username="bb", email="8080@qq.com") + data = {"username": "aa", "real_name": "ww", "password": "zzzzzzz", "email": "8080@qq.com"} + response = self.client.post(self.url, data=data) + self.assertEqual(response.data, {"code": 1, "data": u"该邮箱已被注册,请换其他邮箱进行注册"}) + + def test_success_email(self): + data = {"username": "cc", "real_name": "dd", "password": "xxxxxx", "email": "9090@qq.com"} + response = self.client.post(self.url, data=data) + self.assertEqual(response.data, {"code": 0, "data": u"注册成功!"}) + class UserChangePasswordAPITest(APITestCase): def setUp(self): self.client = APIClient() self.url = reverse("user_change_password_api") - User.objects.create(username="test", password="aaabbb") + user = User.objects.create(username="test") + user.set_password("aaabbb") + user.save() def test_error_old_password(self): data = {"username": "test", "old_password": "aaaccc", "new_password": "aaaddd"} @@ -106,6 +141,11 @@ class UserChangePasswordAPITest(APITestCase): response = self.client.post(self.url, data=data) self.assertEqual(response.data["code"], 1) + def test_success_change_password(self): + data = {"username": "test", "old_password": "aaabbb", "new_password": "aaaccc"} + response = self.client.post(self.url, data=data) + self.assertEqual(response.data, {"code": 0, "data": u"用户密码修改成功!"}) + @login_required def login_required_FBV_test_without_args(request): diff --git a/account/views.py b/account/views.py index dd05874..ea13663 100644 --- a/account/views.py +++ b/account/views.py @@ -7,7 +7,7 @@ from utils.shortcuts import serializer_invalid_response, error_response, success from .models import User from .serializers import UserLoginSerializer, UsernameCheckSerializer, UserRegisterSerializer, \ - UserChangePasswordSerializer + UserChangePasswordSerializer, EmailCheckSerializer class UserLoginAPIView(APIView): @@ -45,7 +45,13 @@ class UserRegisterAPIView(APIView): User.objects.get(username=data["username"]) return error_response(u"用户名已存在") except User.DoesNotExist: - user = User.objects.create(username=data["username"], real_name=data["real_name"]) + pass + try: + User.objects.get(email=data["email"]) + return error_response(u"该邮箱已被注册,请换其他邮箱进行注册") + except User.DoesNotExist: + user = User.objects.create(username=data["username"], real_name=data["real_name"], + email=data["email"]) user.set_password(data["password"]) user.save() return success_response(u"注册成功!") @@ -89,4 +95,21 @@ class UsernameCheckAPIView(APIView): except User.DoesNotExist: return success_response(False) else: - return serializer_invalid_response(serializer) \ No newline at end of file + return serializer_invalid_response(serializer) + +class EmailCheckAPIView(APIView): + def post(self, request): + """ + 检测邮箱是否存在,存在返回True,不存在返回False + --- + request_serializer: EmailCheckSerializer + """ + serializer = EmailCheckSerializer(data=request.DATA) + if serializer.is_valid(): + try: + User.objects.get(email=serializer.data["email"]) + return success_response(True) + except User.DoesNotExist: + return success_response(False) + else: + return serializer_invalid_response(serializer) diff --git a/oj/urls.py b/oj/urls.py index 0c8ea51..b2b3f12 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -3,7 +3,8 @@ from django.conf.urls import include, url from django.contrib import admin from django.views.generic import TemplateView -from account.views import UserLoginAPIView, UsernameCheckAPIView, UserRegisterAPIView, UserChangePasswordAPIView +from account.views import UserLoginAPIView, UsernameCheckAPIView, UserRegisterAPIView, UserChangePasswordAPIView, \ + EmailCheckAPIView from announcement.views import AnnouncementAPIView urlpatterns = [ @@ -17,6 +18,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/email_check/$', EmailCheckAPIView.as_view(), name="email_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"), From 98f8b650110d71190f13f92696464f0751c19098 Mon Sep 17 00:00:00 2001 From: hohoTT <609029365@qq.com> Date: Wed, 5 Aug 2015 20:23:42 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=9C=A8account/tests.py=E4=B8=AD=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E4=B8=8D=E5=BF=85=E8=A6=81=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/tests.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/account/tests.py b/account/tests.py index 76fbec6..89410da 100644 --- a/account/tests.py +++ b/account/tests.py @@ -1,8 +1,6 @@ # coding=utf-8 import json -from django.contrib import auth - from django.core.urlresolvers import reverse from django.test import TestCase, Client from django.http import HttpResponse @@ -74,7 +72,6 @@ class EmailCheckTest(APITestCase): def test_invalid_data(self): response = self.client.post(self.url, data={"email000": "11@qq.com"}) self.assertEqual(response.data["code"], 1) - self.assertEqual(response.data["code"], 1) def test_email_exists(self): response = self.client.post(self.url, data={"email": "11@qq.com"})