117 lines
4.8 KiB
Python
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)
|