UnisKB/apps/users/views/login.py

77 lines
2.8 KiB
Python
Raw Normal View History

2025-04-14 12:11:23 +00:00
# coding=utf-8
"""
@project: MaxKB
@Author虎虎
@file user.py
@date2025/4/14 10:22
@desc:
"""
2025-06-07 11:03:18 +00:00
from django.core.cache import cache
2025-04-14 12:11:23 +00:00
from django.utils.translation import gettext_lazy as _
from drf_spectacular.utils import extend_schema
from rest_framework.request import Request
from rest_framework.views import APIView
from common import result
2025-06-07 11:03:18 +00:00
from common.auth import TokenAuth
from common.constants.cache_version import Cache_Version
2025-06-05 06:08:24 +00:00
from common.log.log import log
from common.utils.common import encryption
2025-06-07 11:03:18 +00:00
from models_provider.api.model import DefaultModelResponse
2025-04-17 11:16:54 +00:00
from users.api.login import LoginAPI, CaptchaAPI
from users.serializers.login import LoginSerializer, CaptchaSerializer
2025-04-14 12:11:23 +00:00
2025-06-05 11:47:47 +00:00
2025-06-05 06:08:24 +00:00
def _get_details(request):
path = request.path
body = request.data
query = request.query_params
return {
2025-06-05 11:47:47 +00:00
'path': path,
'body': {**body, 'password': encryption(body.get('password', ''))},
2025-06-05 06:08:24 +00:00
'query': query
}
2025-04-14 12:11:23 +00:00
2025-06-05 11:47:47 +00:00
2025-04-14 12:11:23 +00:00
class LoginView(APIView):
@extend_schema(methods=['POST'],
description=_("Log in"),
2025-04-28 09:36:56 +00:00
summary=_("Log in"),
operation_id=_("Log in"), # type: ignore
2025-05-15 04:07:07 +00:00
tags=[_("User Management")], # type: ignore
2025-04-14 12:11:23 +00:00
request=LoginAPI.get_request(),
responses=LoginAPI.get_response())
2025-06-05 06:08:24 +00:00
@log(menu='User management', operate='Log in', get_user=lambda r: {'username': r.data.get('username', None)},
get_details=_get_details,
2025-06-05 11:47:47 +00:00
get_operation_object=lambda r, k: {'name': r.data.get('username')})
2025-04-14 12:11:23 +00:00
def post(self, request: Request):
return result.success(LoginSerializer().login(request.data))
2025-04-17 11:16:54 +00:00
2025-06-07 11:03:18 +00:00
class Logout(APIView):
authentication_classes = [TokenAuth]
@extend_schema(methods=['POST'],
summary=_("Sign out"),
description=_("Sign out"),
operation_id=_("Sign out"), # type: ignore
tags=[_("User Management")], # type: ignore
responses=DefaultModelResponse.get_response())
@log(menu='User management', operate='Sign out',
get_operation_object=lambda r, k: {'name': r.user.username})
def post(self, request: Request):
version, get_key = Cache_Version.TOKEN.value
cache.delete(get_key(token=request.auth), version=version)
return result.success(True)
2025-04-17 11:16:54 +00:00
class CaptchaView(APIView):
@extend_schema(methods=['GET'],
2025-04-28 09:36:56 +00:00
summary=_("Get captcha"),
2025-04-17 11:16:54 +00:00
description=_("Get captcha"),
operation_id=_("Get captcha"), # type: ignore
2025-05-15 04:07:07 +00:00
tags=[_("User Management")], # type: ignore
2025-04-17 11:16:54 +00:00
responses=CaptchaAPI.get_response())
def get(self, request: Request):
return result.success(CaptchaSerializer().generate())