factory/apps/vm/views.py

108 lines
4.7 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
if vdata.get('username', None): # 如果是用户名注册
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)
elif vdata.get('wxmp_openid', None): # 如果是微信小程序注册
pass
elif vdata.get('wx_openid', None): # 如果是微信公众号注册
pass
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)