HimoolERP/apps/manage/views.py
2022-05-15 15:56:06 +08:00

107 lines
3.8 KiB
Python

from rest_framework.viewsets import ViewSet, ModelViewSet
from extensions.common.schema import *
from extensions.common.base import *
from extensions.permissions import *
from extensions.exceptions import *
from extensions.paginations import *
from apps.manage.serializers import *
from apps.manage.schemas import *
from apps.manage.models import *
from apps.system.models import *
from django.contrib import auth
from django.middleware.csrf import get_token
from django.contrib.auth.hashers import make_password
class SuperUserActionViewSet(ViewSet):
"""管理员操作"""
@extend_schema(responses={200: CSRFTokenResponse})
@action(detail=False, methods=['get'])
def get_csrf_token(self, request, *args, **kwargs):
"""获取csrf令牌"""
return Response({'token': get_token(request)})
@extend_schema(request=LoginRequest, responses={204: None})
@action(detail=False, methods=['post'])
def login(self, request, *args, **kwargs):
"""登录"""
serializer = LoginRequest(data=request.data)
serializer.is_valid(raise_exception=True)
validated_data = serializer.validated_data
username = validated_data['username']
password = validated_data['password']
if not (super_user := auth.authenticate(username=username, password=password)):
raise ValidationError('账号密码错误')
auth.login(request, super_user)
return Response(status=status.HTTP_204_NO_CONTENT)
@extend_schema(responses={204: None})
@action(detail=False, methods=['post'])
def logout(self, request, *args, **kwargs):
"""登出"""
auth.logout(request)
return Response(status=status.HTTP_204_NO_CONTENT)
@extend_schema(responses={200: SuperUserInfoResponse})
@action(detail=False, methods=['get'], permission_classes=[IsSuperUser])
def info(self, request, *args, **kwargs):
"""用户信息"""
warning_date = pendulum.today().add(days=30).to_datetime_string()
results = Team.objects.filter(expiry_time__lte=warning_date).values('number', 'expiry_time',
'create_time', 'remark')
serializer = SuperUserInfoResponse(instance=request.user)
data = serializer.data
data['warning_list'] = results
return Response(data=data, status=status.HTTP_200_OK)
class TeamViewSet(ModelViewSet):
serializer_class = TeamSerializer
pagination_class = LimitedPagination
permission_classes = [IsSuperUser]
search_fields = ['number', 'remark']
ordering_fields = ['id', 'number', 'expiry_time', 'create_time']
queryset = Team.objects.all()
@transaction.atomic
def perform_create(self, serializer):
team_serializer = TeamCreateRequest(data=self.request.data)
team_serializer.is_valid(raise_exception=True)
validated_data = team_serializer.validated_data
username = validated_data['username']
password = validated_data['password']
password = make_password(password)
name = validated_data['name']
team = serializer.save()
User.objects.create(username=username, password=password, name=name, is_manager=True, team=team)
@extend_schema(request=TeamCreateRequest, responses={200: TeamSerializer})
def create(self, request, *args, **kwargs):
return super().create(request, *args, **kwargs)
class DeviceViewSet(ModelViewSet):
serializer_class = DeviceSerializer
pagination_class = LimitedPagination
permission_classes = [IsSuperUser]
search_fields = ['number', 'name', 'serial_number']
ordering_fields = ['id', 'number', 'name', 'serial_number']
queryset = Device.objects.all()
__all__ = [
'SuperUserActionViewSet', 'TeamViewSet', 'DeviceViewSet',
]