2015-06-29 04:43:17 +00:00
# coding=utf-8
2015-10-09 08:17:07 +00:00
import codecs
2015-08-27 14:26:00 +00:00
from django import http
2015-06-29 04:43:17 +00:00
from django . contrib import auth
from django . shortcuts import render
2015-08-07 12:25:58 +00:00
from django . db . models import Q
2015-09-24 06:55:20 +00:00
from django . conf import settings
2015-10-10 11:33:31 +00:00
from django . core . exceptions import MultipleObjectsReturned
2015-08-07 12:25:58 +00:00
2015-06-29 04:43:17 +00:00
from rest_framework . views import APIView
2015-09-17 02:53:33 +00:00
from rest_framework . response import Response
2015-09-24 06:55:20 +00:00
from utils . shortcuts import serializer_invalid_response , error_response , success_response , paginate , rand_str
2015-09-10 07:59:48 +00:00
from utils . captcha import Captcha
2015-10-09 08:17:07 +00:00
from mail . tasks import send_email
from envelopes import Envelope
2015-06-29 04:43:17 +00:00
2015-08-12 14:59:27 +00:00
from . decorators import login_required
2015-06-29 04:43:17 +00:00
from . models import User
2015-08-12 14:59:27 +00:00
from . serializers import ( UserLoginSerializer , UsernameCheckSerializer ,
2015-09-17 02:53:33 +00:00
UserRegisterSerializer , UserChangePasswordSerializer ,
2015-09-24 06:55:20 +00:00
EmailCheckSerializer , UserSerializer , EditUserSerializer ,
ApplyResetPasswordSerializer )
from . decorators import super_admin_required
2015-06-29 04:43:17 +00:00
class UserLoginAPIView ( APIView ) :
def post ( self , request ) :
"""
用户登录json api接口
- - -
request_serializer : UserLoginSerializer
"""
2015-08-07 14:01:16 +00:00
serializer = UserLoginSerializer ( data = request . data )
2015-06-29 04:43:17 +00:00
if serializer . is_valid ( ) :
data = serializer . data
2015-10-09 08:59:49 +00:00
if " captcha " not in data :
return error_response ( u " 请填写验证码! " )
captcha = Captcha ( request )
if not captcha . check ( data [ " captcha " ] ) :
return error_response ( u " 验证码错误 " )
2015-06-29 04:43:17 +00:00
user = auth . authenticate ( username = data [ " username " ] , password = data [ " password " ] )
# 用户名或密码错误的话 返回None
if user :
auth . login ( request , user )
return success_response ( u " 登录成功 " )
else :
return error_response ( u " 用户名或密码错误 " )
else :
return serializer_invalid_response ( serializer )
2015-09-13 13:58:13 +00:00
2015-09-01 11:04:07 +00:00
@login_required
2015-08-28 09:12:41 +00:00
def logout ( request ) :
2015-08-27 14:26:00 +00:00
auth . logout ( request )
return http . HttpResponseRedirect ( " / " )
2015-09-13 13:58:13 +00:00
2015-09-14 03:37:41 +00:00
def index_page ( request ) :
2015-09-13 13:58:13 +00:00
if not request . user . is_authenticated ( ) :
return render ( request , " oj/index.html " )
try :
if request . META [ ' HTTP_REFERER ' ] :
return render ( request , " oj/index.html " )
except KeyError :
return http . HttpResponseRedirect ( ' /problems/ ' )
2015-08-03 10:45:26 +00:00
class UserRegisterAPIView ( APIView ) :
2015-06-29 04:43:17 +00:00
def post ( self , request ) :
2015-08-03 10:45:26 +00:00
"""
用户注册json api接口
- - -
request_serializer : UserRegisterSerializer
"""
2015-08-07 14:01:16 +00:00
serializer = UserRegisterSerializer ( data = request . data )
2015-08-03 10:45:26 +00:00
if serializer . is_valid ( ) :
data = serializer . data
2015-09-17 02:24:01 +00:00
captcha = Captcha ( request )
if not captcha . check ( data [ " captcha " ] ) :
return error_response ( u " 验证码错误 " )
2015-08-03 10:45:26 +00:00
try :
User . objects . get ( username = data [ " username " ] )
return error_response ( u " 用户名已存在 " )
except User . DoesNotExist :
2015-08-05 12:11:25 +00:00
pass
try :
User . objects . get ( email = data [ " email " ] )
return error_response ( u " 该邮箱已被注册,请换其他邮箱进行注册 " )
2015-10-10 11:33:31 +00:00
# 兼容部分老数据,有邮箱重复的
except MultipleObjectsReturned :
return error_response ( u " 该邮箱已被注册,请换其他邮箱进行注册 " )
2015-08-05 12:11:25 +00:00
except User . DoesNotExist :
user = User . objects . create ( username = data [ " username " ] , real_name = data [ " real_name " ] ,
email = data [ " email " ] )
2015-08-03 10:45:26 +00:00
user . set_password ( data [ " password " ] )
user . save ( )
return success_response ( u " 注册成功! " )
else :
return serializer_invalid_response ( serializer )
2015-07-17 03:00:15 +00:00
2015-08-03 11:54:55 +00:00
class UserChangePasswordAPIView ( APIView ) :
2015-09-01 11:04:07 +00:00
@login_required
2015-07-17 03:00:15 +00:00
def post ( self , request ) :
2015-08-03 11:54:55 +00:00
"""
用户修改密码json api接口
- - -
request_serializer : UserChangePasswordSerializer
"""
2015-08-07 14:01:16 +00:00
serializer = UserChangePasswordSerializer ( data = request . data )
2015-08-03 11:54:55 +00:00
if serializer . is_valid ( ) :
data = serializer . data
2015-09-10 07:59:48 +00:00
captcha = Captcha ( request )
if not captcha . check ( data [ " captcha " ] ) :
return error_response ( u " 验证码错误 " )
2015-09-01 11:04:07 +00:00
username = request . user . username
user = auth . authenticate ( username = username , password = data [ " old_password " ] )
2015-08-03 11:54:55 +00:00
if user :
user . set_password ( data [ " new_password " ] )
user . save ( )
return success_response ( u " 用户密码修改成功! " )
else :
return error_response ( u " 密码不正确,请重新修改! " )
else :
return serializer_invalid_response ( serializer )
2015-08-03 08:52:31 +00:00
class UsernameCheckAPIView ( APIView ) :
2015-09-17 02:53:33 +00:00
def get ( self , request ) :
2015-08-03 08:52:31 +00:00
"""
2015-09-17 02:53:33 +00:00
检测用户名是否存在 , 存在返回状态码400 , 不存在返回200
2015-08-03 08:52:31 +00:00
- - -
"""
2015-09-17 02:53:33 +00:00
username = request . GET . get ( " username " , None )
if username :
2015-08-03 08:52:31 +00:00
try :
2015-09-17 02:53:33 +00:00
User . objects . get ( username = username )
return Response ( status = 400 )
2015-08-03 08:52:31 +00:00
except User . DoesNotExist :
2015-09-17 02:53:33 +00:00
return Response ( status = 200 )
return Response ( status = 200 )
2015-08-05 12:11:25 +00:00
2015-08-06 11:07:46 +00:00
2015-08-05 12:11:25 +00:00
class EmailCheckAPIView ( APIView ) :
2015-09-17 02:53:33 +00:00
def get ( self , request ) :
2015-08-05 12:11:25 +00:00
"""
2015-09-17 02:53:33 +00:00
检测邮箱是否存在 , 存在返回状态码400 , 不存在返回200
2015-08-05 12:11:25 +00:00
- - -
"""
2015-09-17 02:53:33 +00:00
email = request . GET . get ( " email " , None )
if email :
2015-08-05 12:11:25 +00:00
try :
2015-09-17 02:53:33 +00:00
User . objects . get ( email = email )
return Response ( status = 400 )
2015-10-10 11:33:31 +00:00
except Exception :
2015-09-17 02:53:33 +00:00
return Response ( status = 200 )
return Response ( status = 200 )
2015-08-07 12:25:58 +00:00
class UserAdminAPIView ( APIView ) :
2015-09-24 06:55:20 +00:00
@super_admin_required
2015-08-07 12:25:58 +00:00
def put ( self , request ) :
"""
用户编辑json api接口
- - -
request_serializer : EditUserSerializer
response_serializer : UserSerializer
"""
2015-08-07 14:01:16 +00:00
serializer = EditUserSerializer ( data = request . data )
2015-08-07 12:25:58 +00:00
if serializer . is_valid ( ) :
data = serializer . data
try :
user = User . objects . get ( id = data [ " id " ] )
except User . DoesNotExist :
return error_response ( u " 该用户不存在! " )
2015-08-14 02:21:50 +00:00
try :
user = User . objects . get ( username = data [ " username " ] )
if user . id != data [ " id " ] :
return error_response ( u " 昵称已经存在 " )
except User . DoesNotExist :
pass
2015-08-07 12:25:58 +00:00
user . username = data [ " username " ]
user . real_name = data [ " real_name " ]
user . email = data [ " email " ]
user . admin_type = data [ " admin_type " ]
if data [ " password " ] :
user . set_password ( data [ " password " ] )
user . save ( )
return success_response ( UserSerializer ( user ) . data )
else :
return serializer_invalid_response ( serializer )
2015-08-12 14:59:27 +00:00
2015-09-24 06:55:20 +00:00
@super_admin_required
2015-08-12 14:59:27 +00:00
def get ( self , request ) :
"""
用户分页json api接口
- - -
response_serializer : UserSerializer
"""
user = User . objects . all ( ) . order_by ( " -create_time " )
admin_type = request . GET . get ( " admin_type " , None )
if admin_type :
try :
user = user . filter ( admin_type__gte = int ( admin_type ) )
except ValueError :
return error_response ( u " 参数错误 " )
keyword = request . GET . get ( " keyword " , None )
if keyword :
user = user . filter ( Q ( username__contains = keyword ) |
Q ( real_name__contains = keyword ) |
Q ( email__contains = keyword ) )
return paginate ( request , user , UserSerializer )
class UserInfoAPIView ( APIView ) :
@login_required
def get ( self , request ) :
"""
返回这个用户的个人信息
- - -
response_serializer : UserSerializer
"""
return success_response ( UserSerializer ( request . user ) . data )
2015-09-17 02:24:01 +00:00
2015-09-24 06:55:20 +00:00
class ApplyResetPasswordAPIView ( APIView ) :
def post ( self , request ) :
2015-10-09 08:17:07 +00:00
"""
提交请求重置密码
- - -
request_serializer : ApplyResetPasswordSerializer
"""
2015-09-24 06:55:20 +00:00
serializer = ApplyResetPasswordSerializer ( data = request . data )
if serializer . is_valid ( ) :
data = serializer . data
captcha = Captcha ( request )
if not captcha . check ( data [ " captcha " ] ) :
return error_response ( u " 验证码错误 " )
try :
user = User . objects . get ( username = data [ " username " ] , email = data [ " email " ] )
except User . DoesNotExist :
return error_response ( u " 用户不存在 " )
user . reset_password_token = rand_str ( )
user . save ( )
2015-10-09 08:17:07 +00:00
email_template = codecs . open ( settings . TEMPLATES [ 0 ] [ " DIRS " ] [ 0 ] + " utils/reset_password_email.html " , " r " , " utf-8 " ) . read ( )
email_template = email_template . replace ( " {{ username }} " , user . username ) . replace ( " {{ link }} " , request . scheme + " :// " + request . META [ ' HTTP_HOST ' ] + " /reset_password/?token= " + user . reset_password_token )
send_email ( user . email , user . username , u " qduoj 密码找回邮件 " , email_template )
2015-09-24 06:55:20 +00:00
return success_response ( u " 邮件发生成功 " )
else :
return serializer_invalid_response ( serializer )
class ResetPasswordAPIView ( APIView ) :
pass
def user_index_page ( request , username ) :
return render ( request , " oj/account/user_index.html " )