mirror of https://github.com/openspug/spug
86 lines
3.3 KiB
Python
86 lines
3.3 KiB
Python
from django.core.cache import cache
|
|
from django.views.generic import View
|
|
from libs import JsonParser, Argument, human_time, json_response
|
|
from .models import User
|
|
import time
|
|
import uuid
|
|
|
|
|
|
class UserView(View):
|
|
def get(self, request):
|
|
users = User.objects.filter(is_supper=False, deleted_by_id__isnull=True)
|
|
return json_response([x.to_dict(excludes=('access_token', 'password_hash')) for x in users])
|
|
|
|
def post(self, request):
|
|
form, error = JsonParser(
|
|
Argument('username', help='请输入登录名'),
|
|
Argument('password', help='请输入密码'),
|
|
Argument('nickname', help='请输入姓名'),
|
|
).parse(request.body)
|
|
if error is None:
|
|
form.password_hash = User.make_password(form.pop('password'))
|
|
form.created_by = request.user
|
|
User.objects.create(**form)
|
|
return json_response(error=error)
|
|
|
|
def patch(self, request):
|
|
form, error = JsonParser(
|
|
Argument('id', type=int, help='请指定操作对象'),
|
|
Argument('username', required=False),
|
|
Argument('password', required=False),
|
|
Argument('nickname', required=False),
|
|
Argument('is_active', type=bool, required=False),
|
|
).parse(request.body, True)
|
|
if error is None:
|
|
if form.get('password'):
|
|
form.password_hash = User.make_password(form.pop('password'))
|
|
User.objects.filter(pk=form.pop('id')).update(**form)
|
|
return json_response(error=error)
|
|
|
|
def delete(self, request):
|
|
form, error = JsonParser(
|
|
Argument('id', type=int, help='请指定操作对象')
|
|
).parse(request.GET)
|
|
if error is None:
|
|
User.objects.filter(pk=form.id).update(
|
|
deleted_at=human_time(),
|
|
deleted_by=request.user
|
|
)
|
|
return json_response(error=error)
|
|
|
|
|
|
def login(request):
|
|
form, error = JsonParser(
|
|
Argument('username', help='请输入用户名'),
|
|
Argument('password', help='请输入密码')
|
|
).parse(request.body)
|
|
if error is None:
|
|
user = User.objects.filter(username=form.username).first()
|
|
if user:
|
|
if not user.is_active:
|
|
return json_response(error="账户已被禁用")
|
|
if user.verify_password(form.password):
|
|
cache.delete(form.username)
|
|
token_isvalid = user.access_token and len(user.access_token) == 32 and user.token_expired >= time.time()
|
|
user.access_token = user.access_token if token_isvalid else uuid.uuid4().hex
|
|
user.token_expired = time.time() + 8 * 60 * 60
|
|
user.last_login = human_time()
|
|
user.save()
|
|
return json_response({'access_token': user.access_token, 'nickname': user.nickname})
|
|
|
|
value = cache.get_or_set(form.username, 0, 86400)
|
|
if value >= 3:
|
|
if user and user.is_active:
|
|
user.is_active = False
|
|
user.save()
|
|
return json_response(error='账户已被禁用')
|
|
cache.set(form.username, value + 1, 86400)
|
|
return json_response(error="用户名或密码错误,连续多次错误账户将会被禁用")
|
|
return json_response(error=error)
|
|
|
|
|
|
def logout(request):
|
|
request.user.token_expired = 0
|
|
request.user.save()
|
|
return json_response()
|