from apps.auth1.services import check_phone_code from apps.auth1.views import get_tokens_for_user 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 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'] select_related_fields = ['ticket', 'receptionist', 'ticket__workflow', 'ticket__state'] def get_queryset(self): user = self.request.user queryset = super().get_queryset() if hasattr(user, 'type') and user.type == 'visitor': 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) def destroy(self, request, *args, **kwargs): obj = self.get_object() if obj.state != Visit.V_CREATE: raise ParseError('项目非创建状态不可删除') return super().destroy(request, *args, **kwargs) @action(methods=['post'], detail=True, permission_classes=[], serializer_class=Serializer) @transaction.atomic def submit(self, request, *args, **kwargs): """司机直接提交不走工单 司机直接提交不走工单 """ obj = self.get_object() visit_driver_end(obj) 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() if user: 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() 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)