factory/apps/vm/views.py

148 lines
5.8 KiB
Python

from apps.auth1.services import check_phone_code
from apps.auth1.views import get_tokens_for_user
from apps.hrm.models import Employee
from apps.system.models import User
from apps.utils.tools import ranstr
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
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
from django.contrib.auth.hashers import make_password
from django.db import transaction
from rest_framework.serializers import Serializer
from apps.vm.services import sync_to_visitor, visit_driver_end
# Create your views here.
class VisitViewSet(CustomModelViewSet):
perms_map = {'*': '*'}
queryset = Visit.objects.all()
create_serializer_class = VisitCreateUpdateSerializer
update_serializer_class = VisitCreateUpdateSerializer
serializer_class = VisitSerializer
retrieve_serializer_class = VisitDetailSerializer
filterset_fields = ['state', 'create_by', 'purpose']
select_related_fields = ['ticket', 'receptionist',
'ticket__workflow', 'ticket__state']
def get_queryset(self):
user = self.request.user
queryset = super().get_queryset()
if user.is_authenticated and user.type != 'employee':
queryset = queryset.filter(create_by=user)
return queryset
def create(self, request, *args, **kwargs):
user = self.request.user
if hasattr(user, 'type') and user.type == 'visitor' and user.employee.photo is None:
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)
@transaction.atomic
def destroy(self, request, *args, **kwargs):
obj = self.get_object()
if obj.state in [Visit.V_ENTER, Visit.V_DONE]:
raise ParseError('该项目不可删除')
elif obj.state == Visit.V_WORKING and Visitor.objects.filter(visit=obj).exists():
raise ParseError('该项目人员在厂不可删除')
if obj.ticket:
obj.ticket.delete()
obj.delete()
return Response(status=204)
@action(methods=['get'], detail=False, perms_map={'get': '*'}, serializer_class=Serializer)
def export_excel(self, request, pk=None):
return Response()
class VisitorViewSet(CustomModelViewSet):
queryset = Visitor.objects.all()
perms_map = {'*': '*'}
create_serializer_class = VisitorCreateSerializer
update_serializer_class = VisitorCreateSerializer
serializer_class = VisitorSerializer
def get_queryset(self):
user = self.request.user
queryset = super().get_queryset().filter(create_by=user)
# if user.type == 'visitor':
# queryset = queryset.filter(create_by=user)
return queryset
@action(methods=['post'], detail=False,
authentication_classes=[], permission_classes=[],
serializer_class=VisitorRegisterSerializer)
@transaction.atomic
def register(self, request, *args, **kwargs):
"""访客/司机账户注册
访客/司机账户注册
"""
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
vdata = serializer.validated_data
name = vdata['name']
phone = vdata['phone']
code = vdata['code']
# 校验短信验证码
check_phone_code(phone, code)
# 查询是否已注册
user = User.objects.filter(phone=phone).first()
ep = Employee.objects.get_queryset(all=True).filter(phone=phone, user__isnull=False).first()
if user or ep:
raise ParseError('该手机号已注册,请直接登录')
# 访客/司机账户创建
user = User()
user.type = 'visitor'
if vdata['type'] == 'driver':
user.type = 'driver'
user.name = name
user.username = 'V_' + ranstr(10)
user.phone = phone
user.password = make_password('0000')
user.wx_openid = vdata.get('wx_openid', None)
user.wxmp_openid = vdata.get('wxmp_openid', None)
user.save()
ep2 = Employee.objects.get_queryset(all=True).filter(phone=phone, user__isnull=True).first()
if ep2:
ep2.user = user
ep2.is_deleted = False
ep2.save()
sync_to_visitor(ep2)
else:
ep = Employee()
ep.user = user
ep.name = user.name
ep.phone = user.phone
ep.type = user.type
ep.save()
return Response(get_tokens_for_user(user))
class VpeopleViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, DestroyModelMixin, CustomGenericViewSet):
perms_map = {'*': '*'}
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)