103 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			4.4 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, VisitDetailSerializer, 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, UpdateModelMixin
 | 
						|
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
 | 
						|
    retrieve_serializer_class = VisitDetailSerializer
 | 
						|
    filterset_fields = ['state']
 | 
						|
    select_related_fields = ['ticket', 'receptionist', 'ticket__workflow', 'ticket__state']
 | 
						|
 | 
						|
    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, UpdateModelMixin,
 | 
						|
                     CustomGenericViewSet):
 | 
						|
    queryset = Visitor.objects.all()
 | 
						|
    create_serializer_class = VisitorCreateSerializer
 | 
						|
    update_serializer_class = VisitorCreateSerializer
 | 
						|
    serializer_class = VisitorSerializer
 | 
						|
 | 
						|
    def get_queryset(self):
 | 
						|
        user = self.request.user
 | 
						|
        queryset = super().get_queryset()
 | 
						|
        if user.type == 'visitor':
 | 
						|
            queryset = queryset.filter(create_by=user)
 | 
						|
        return queryset
 | 
						|
 | 
						|
    @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)
 | 
						|
 | 
						|
 | 
						|
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
 | 
						|
    filterset_fields = ['visit']
 | 
						|
    ordering = ['is_main', 'create_time']
 | 
						|
 | 
						|
    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)
 |