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 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)