factory/apps/vm/views.py

117 lines
4.8 KiB
Python

from django.shortcuts import render
from apps.hrm.models import Employee
from apps.system.models import User
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet, GenericViewSet
from apps.vm.models import Visit, Visitor, Vpeople
from apps.vm.serializers import VisitCreateUpdateSerializer, VisitSerializer, VisitorCreateSerializer, VisitorRegisterSerializer, VisitorSerializer, VpeopleCreateSerializer, VpeopleSerializer
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.exceptions import ParseError
from rest_framework.mixins import ListModelMixin, RetrieveModelMixin, CreateModelMixin, DestroyModelMixin
from apps.utils.mixins import CustomDestoryModelMixin
from django.contrib.auth.hashers import make_password
from rest_framework.permissions import IsAuthenticated
from django.db import transaction
# Create your views here.
class VisitViewSet(CustomModelViewSet):
queryset = Visit.objects.all()
create_serializer_class = VisitCreateUpdateSerializer
update_serializer_class = VisitCreateUpdateSerializer
serializer_class = VisitSerializer
def get_queryset(self):
user = self.request.user
queryset = super().get_queryset()
if user.type == 'visitor':
queryset = queryset.filter(create_by=user)
return queryset
def create(self, request, *args, **kwargs):
user = self.request.user
if user.type == 'visitor' and not user.employee:
raise ParseError('请先完善个人信息')
return super().create(request, *args, **kwargs)
def update(self, request, *args, **kwargs):
obj = self.get_object()
if obj.state != Visit.V_CREATE:
raise ParseError('项目非创建状态不可更改')
return super().update(request, *args, **kwargs)
def destroy(self, request, *args, **kwargs):
obj = self.get_object()
if obj.state != Visit.V_CREATE:
raise ParseError('项目非创建状态不可删除')
return super().destroy(request, *args, **kwargs)
class VisitorViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, CustomDestoryModelMixin,
CustomGenericViewSet):
queryset = Visitor.objects.all()
create_serializer_class = VisitorCreateSerializer
serializer_class = VisitorSerializer
@action(methods=['post'], detail=False,
authentication_classes=[], permission_classes=[],
serializer_class=VisitorRegisterSerializer)
def register(self, request, *args, **kwargs):
"""访客账户注册
访客账户注册
"""
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
vdata = serializer.validated_data
user = User.objects.get_queryset(all=True).filter(username=vdata['username']).first()
if user:
raise ParseError('账号已存在或禁用不可注册')
else:
password = make_password('0000')
user = User.objects.create(name=vdata['name'],
username=vdata['username'],
type='visitor',
password=password)
return Response({'user': user.id}, status=201)
@action(methods=['post'], detail=False, permission_classes=[IsAuthenticated],
serializer_class=VisitorCreateSerializer)
@transaction.atomic
def improve_info(self, request, *args, **kwargs):
"""完善个人信息
完善个人信息
"""
user = self.request.user
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
vdata = serializer.validated_data
epdata = vdata
epdata['type'] = 'visitor'
epdata['user'] = user
ep = Employee(**epdata)
ep.save()
vdata['employee'] = ep
Visitor(**vdata).save()
return Response()
class VpeopleViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, DestroyModelMixin, CustomGenericViewSet):
perms_map = {'get': '*', 'post': 'visit:update', 'put': 'visit:update', 'delete': 'visit:update'}
queryset = Vpeople.objects.all()
create_serializer_class = VpeopleCreateSerializer
serializer_class = VpeopleSerializer
def create(self, request, *args, **kwargs):
obj = self.get_object()
if obj.visit.state != Visit.V_CREATE:
raise ParseError('项目非创建状态不可新增成员')
return super().create(request, *args, **kwargs)
def destroy(self, request, *args, **kwargs):
obj = self.get_object()
if obj.visit.state != Visit.V_CREATE:
raise ParseError('项目非创建状态不可新增成员')
return super().destroy(request, *args, **kwargs)