import re from django.http import request from rest_framework.views import APIView from django.shortcuts import render from rest_framework.serializers import ModelSerializer from rest_framework.viewsets import ModelViewSet, GenericViewSet from rest_framework.response import Response from rest_framework import status from .models import * from .serializers import * from apps.crm.models import Certunit from apps.system.models import Dict from apps.laboratory.models import TestOrg from apps.system.permission_data import RbacFilterSet from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin import random from rest_framework.decorators import action from rest_framework.generics import ListAPIView from .filters import * from utils.pagination import PageOrNot from rest_framework.exceptions import ParseError, NotAuthenticated from django.utils import timezone from rest_framework.mixins import ListModelMixin # Create your views here. # class ApplicationViewSet(RbacFilterSet, ModelViewSet): # """ # 认证申请 # """ # perms_map = {'get': 'application_view', 'post':'application_create', 'put':'application_update','delete': 'application_delete'} # queryset = Application.objects.all() # serializer_class = ApplicationCreateSerializer # ordering = ['-create_time'] # def get_serializer_class(self): # if self.action == 'create': # return ApplicationCreateSerializer # else: # return ApplicationUpdateSerializer # def perform_create(self, serializer): # serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept, number=random.randrange(1000,2000)) # class SubApplicationViewSet(RbacFilterSet, ModelViewSet): # """ # 子认证申请 # """ # perms_map = {'get': 'application_view', 'post':'application_create', 'put':'application_update','delete': 'application_delete'} # queryset = SubApplication.objects.all() # serializer_class = SubApplicationCreateSerializer # filterset_fields = ['application'] # ordering = ['-create_time'] # def get_serializer_class(self): # if self.action == 'create': # return SubApplicationCreateSerializer # else: # return SubApplicationUpdateSerializer # def create(self, request, *args, **kwargs): # postdata = request.data # postdata['number'] = random.randrange(1000,2000) # serializer = self.get_serializer(data=postdata) # serializer.is_valid(raise_exception=True) # self.perform_create(serializer) # headers = self.get_success_headers(serializer.data) # return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) # def paginate_queryset(self, queryset): # if ((not self.request.query_params.get('page', None)) and (self.request.query_params.get('application', None))) or (self.paginator is None): # return None # return self.paginator.paginate_queryset(queryset, self.request, view=self) class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet): """ 申请受理 """ perms_map = {'get': 'certapp_view', 'post':'certapp_create', 'put':'certapp_update','delete': 'certapp_delete'} queryset = CertApp.objects.all() serializer_class = CertappSerializer ordering = ['-create_time'] filterset_fields = ['state', 'project', 'certappunit_certapp__teststate', 'cert_field'] # filterset_class = CertAppFilter def filter_queryset(self, queryset): for backend in list(self.filter_backends): queryset = backend().filter_queryset(self.request, queryset, self).distinct() return queryset def perform_destroy(self, instance): instance.delete(soft=False) def create(self, request, *args, **kwargs): postdata = request.data postdata['number'] = random.randrange(1000,2000) if postdata.get('field_code', None): postdata['cert_field'] = Dict.objects.get(code=postdata['field_code']).id serializer = self.get_serializer(data=postdata) serializer.is_valid(raise_exception=True) # self.perform_create(serializer) obj = serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept, state='受理') CertAppFlow.objects.create(certapp = obj, handler=self.request.user, data=serializer.data, operation='创建申请', state='申请') headers = self.get_success_headers(serializer.data) if postdata.field_code=='QMS': instance,_ = Certunit.objects.get_or_create(enterprise = Enterprise.objects.get(pk=request.data['enterprise'])) Certappunit.objects.create(certunit=instance, certapp=obj) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) @action(methods=['put'], detail=True, perms_map={'put':'certapp_complete'}, url_name='complete_certapp') def complete(self, request, pk=None): """ 完成受理 """ obj = self.get_object() if obj.state == '受理': obj.state = '策划' obj.save() CertAppFlow.objects.create(certapp = obj, handler=self.request.user, operation='完成受理', state='受理') return Response(status=status.HTTP_200_OK) return Response('业务状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST) @action(methods=['put'], detail=False, perms_map={'put':'certapp_review'}, url_name='review_certapp') def review(self, request, pk=None): """ 完成评审 """ certapps = request.data['certapps'] rlist = request.data['rlist'] for i in rlist: obj = EvaluationDetail.objects.create(item=Evaluations.objects.get(id=i['id']),item_v=i['content'], create_by=request.user, result=i['result'] if 'result' in i and i['result'] else None) obj.cert_app.add(*certapps) return Response(status=status.HTTP_200_OK) @action(methods=['put'], detail=True, perms_map={'put':'certapp_access'}, url_name='certapp_access') def access(self, request, pk=None): """ 评定 """ # obj, ok = Certaccess.objects.get_or_create(certapp=self.get_object(), defaults={'certapp':self.get_object() # , 'conclusion':Dict.objects.get(pk=request.data['conclusion']), 'score':request.data['score']}) # if not ok: obj = self.get_object() oldstate = obj.state obj.conclusion = Dict.objects.get(pk=request.data['conclusion']) obj.score = request.data['score'] obj.state = '出证' obj.save() obj.nonitems.clear() obj.nonitems.add(*request.data['nonitems']) CertAppFlow.objects.create(certapp = obj, handler=self.request.user, operation='提交评定结论', state=oldstate) return Response({'state':obj.state}, status=status.HTTP_200_OK) @action(methods=['put'], detail=True, perms_map={'put':'certapp_feedback'}, url_name='certapp_feedback') def feedback(self, request, *args, **kwargs): """ 业务反馈 """ obj = self.get_object() if obj.state in ['现场审核', '产品检测']: oldstate = obj.state if obj.cert_field.parent.code == 'PRO': obj.state = '产品检测' else: obj.state = '评定' obj.save() CertAppFlow.objects.create(certapp = obj, handler=self.request.user, operation='提交现场审核反馈', state=oldstate) return Response({'state':obj.state}, status=status.HTTP_200_OK) return Response('业务状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST) @action(methods=['get'], detail=True, perms_map={'get':'*'}, url_name='certapp_flow') def flow(self, request, *args, **kwargs): """ 业务流程进度 """ objs = CertAppFlow.objects.filter(certapp__pk=kwargs['pk']) serializer = CertappflowSerializer(objs, many=True) return Response(serializer.data) @action(methods=['put'], detail=False, perms_map={'put':'certapp_bind'}, url_name='certapp_bind') def bind(self, request, *args, **kwargs): """ 绑定至项目 """ ids = request.data['ids'] project = Project.objects.get(pk=request.data['project']) CertApp.objects.filter(pk__in=ids, is_deleted=False, project__isnull=True).update(project=project) return Response(status=status.HTTP_200_OK) @action(methods=['put'], detail=True, perms_map={'put':'certapp_unbind'}, url_name='certapp_unbind') def unbind(self, request, *args, **kwargs): """ 与项目解绑 """ obj = self.get_object() if obj.state == '策划': obj.project = None obj.save() return Response(status=status.HTTP_200_OK) return Response('业务状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST) class EvaluationDetailViewset(CreateUpdateCustomMixin, PageOrNot, ModelViewSet): """ 受理信息 """ perms_map = {'get': '*', 'post': 'EvaluationDetail_create', 'put': 'EvaluationDetail_update', 'delete': 'EvaluationDetail_delete'} queryset = EvaluationDetail.objects serializer_class = EvaluationDetailSerializer filterset_fields = ['cert_app'] ordering = ['-create_time'] def reviewupdate(self, request, pk=None): """ 完成评审 """ rlist = request.data['rlist'] for i in rlist: obj = EvaluationDetail.objects.update(item=Evaluations.objects.get(id=i['id']),item_v=i['content'], update_by=request.user, result=i['result'] ) return Response(status=status.HTTP_200_OK) class CertappunitViewset(PageOrNot, ModelViewSet): perms_map={'get': '*', '*':'certapp_view'} queryset = Certappunit.objects.all() serializer_class = CertappunitSerializer filterset_fields = ['certapp','teststate','id','inspectionstate'] ordering= ['-id'] @action(methods=['put'], detail=True, perms_map={'put':'certapp_access'}, url_name='certappunit_access') def access(self, request, pk=None): """ 单元评定 """ obj = self.get_object() if obj.teststate == '待评定': if request.data['decision']: obj.decision = Dict.objects.get(pk=request.data['decision']) else: obj.decision = None obj.teststate = '已评定' obj.save() return Response(status=status.HTTP_200_OK) else: return Response('认证单元状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST) @action(methods=['put'], detail=True, perms_map={'put':'certapp_testtask'}, url_name='certappunit_testtask') def testtask(self, request, pk=None): """ 检测任务 """ obj = self.get_object() obj.testorg = TestOrg.objects.get(pk=request.data['testorg']) obj.remark = request.data['remark'] obj.sampledec = request.data['sampledec'] obj.detnumber = request.data['detnumber'] obj.testitem = request.data['testitem'] obj.charge = request.data['charge'] obj.save() return Response(status=status.HTTP_200_OK) @action(methods=['put'], detail=True, perms_map={'put':'certapp_teststate'}, url_name='certappunit_teststate') def teststate(self, request, pk=None): """ 修改检测任务状态 """ obj = self.get_object() if obj.teststate == "待CTC下达": obj.teststate = request.data['teststate'] obj.inspectionstate = "待检验" obj.save() return Response(status=status.HTTP_200_OK) elif obj.teststate == "待提交CTC": obj.teststate = request.data['teststate'] obj.save() return Response(status=status.HTTP_200_OK) else: return Response('检测任务异常,操作失败', status=status.HTTP_400_BAD_REQUEST) @action(methods=['put'], detail=True, perms_map={'put':'certapp_createsamples'}, url_name='certappunit_createsamples') def createsamples(self, request, pk=None): """ 实验室任务反馈 """ obj = self.get_object() obj.teststate = '到样检测中' obj.inspectionstate = "在检验" obj.sampledate = request.data['sampledate'] obj.save() return Response(status=status.HTTP_200_OK) @action(methods=['put'], detail=True, perms_map={'put':'certapp_createcomplete'}, url_name='certappunit_createcomplete') def createcomplete(self, request, pk=None): """ 实验室任务反馈 """ obj = self.get_object() obj.teststate = '待提取报告' obj.path = request.data['path'] obj.inspectionstate = "已检验" obj.conclusion = request.data['conclusion'] obj.completedate = request.data['completedate'] obj.issuancedate = request.data['issuancedate'] obj.resultremark = request.data['resultremark'] obj.remarks = request.data['remarks'] obj.save() return Response(status=status.HTTP_200_OK) class TaskList(ListAPIView): """ 实验室任务 """ perms_map = {'get': 'certapptasklist_view'} serializer_class = CertappunitSerializerx filterset_fields = ['certapp','teststate','id','inspectionstate'] ordering= ['-id'] def get_queryset(self): queryset = Certappunit.objects.filter(teststate__in=['待实验室检验', '到样检测中']) if hasattr(self.get_serializer_class(), 'setup_eager_loading'): queryset = self.get_serializer_class().setup_eager_loading(queryset) return queryset from apps.plan.models import Member class ProjectViewSet(RbacFilterSet, ModelViewSet): perms_map = {'get': 'project_view', 'post':'project_create', 'put':'project_update','delete': 'project_delete'} queryset = Project.objects.all() serializer_class = ProjectSerializer ordering = ['pk'] filterset_class = ProjectFilter search_fields = ['auditee__name', 'plan__name'] def get_serializer_class(self): if self.action == 'update': return ProjectUpdateSerializer return ProjectSerializer def perform_destroy(self, instance): instance.delete(soft=False) def create(self, request, *args, **kwargs): postdata = request.data postdata['number'] = random.randrange(8000,9000) serializer = self.get_serializer(data=postdata) serializer.is_valid(raise_exception=True) obj = serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept) obj.state = '创建中' #空项目 if 'certapps' in postdata and postdata['certapps']: CertApp.objects.filter(pk__in = postdata['certapps']).update(project=obj) obj.save() headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) @action(methods=['put'], detail=True, perms_map={'put':'project_assgin'}, url_name='project_assgin') def assgin(self, request, pk=None): """ 审核任务下达 """ obj = self.get_object() if obj.state == '策划中': obj.state = '审核任务已下达' obj.save() return Response(status=status.HTTP_200_OK) return Response('项目状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST) @action(methods=['put'], detail=True, perms_map={'put':'project_toplan'}, url_name='project_toplan') def toplan(self, request, *args, **kwargs): """ 转入策划 """ obj = self.get_object() if CertApp.objects.filter(project=obj, is_deleted=False).exists(): obj.state = '待策划' obj.save() return Response(status=status.HTTP_200_OK) else: return Response('该项目没有业务信息,操作失败', status=status.HTTP_400_BAD_REQUEST) @action(methods=['put'], detail=False, perms_map={'put':'project_plan'}, url_name='project_plan') def plan(self, request, *args, **kwargs): """ 加入计划 """ projects = request.data['projects'] plan = request.data['plan'] if projects: objs = Project.objects.filter(pk__in=projects) for i in objs: i.plan=Plan.objects.get(pk=plan) if i.state == '待策划': i.state = '策划中' i.save() return Response(status=status.HTTP_200_OK) @action(methods=['put'], detail=True, perms_map={'put':'project_edate'}, url_name='project_edate') def edate(self, request, *args, **kwargs): """ 制定预期审核时间 """ obj = self.get_object() if obj.state == '审核任务已接受': obj.edate0 = request.data['edate0'] obj.edate1 = request.data['edate1'] obj.state = '待现场审核' obj.save() for i in obj.certapp_project.all(): CertAppFlow.objects.create(certapp = i, handler=self.request.user, operation='已安排现场审核时间', state='现场审核') return Response({'edate0':obj.edate0, 'edate1':obj.edate1, 'state':obj.state}, status=status.HTTP_200_OK) else: return Response('项目状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST) @action(methods=['put'], detail=True, perms_map={'put':'project_start'}, url_name='project_start') def start(self, request, *args, **kwargs): """ 开始审核 """ obj = self.get_object() if obj.state == '待现场审核': obj.start_date = request.data['start_date'] obj.state = '现场审核中' obj.save() for i in obj.certapp_project.all(): CertAppFlow.objects.create(certapp = i, handler=self.request.user, operation='现场审核中', state='现场审核') return Response({'start_date':obj.start_date,'state':obj.state}, status=status.HTTP_200_OK) else: return Response('项目状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST) @action(methods=['put'], detail=True, perms_map={'put':'audit_accept'},url_name='audit_accept') def accept(self, request, *args, **kwargs): """ 接受项目审核任务 """ obj = self.get_object() if obj.state == '审核任务已下达': obj.state = '审核任务已接受' obj.save() Member.objects.filter(certapp__project=obj).update(is_accepted=True) obj.certapp_project.all().update(state='现场审核') for i in obj.certapp_project.all(): CertAppFlow.objects.create(certapp = i, handler=self.request.user, operation='审核任务已接受', state='策划') return Response(status=status.HTTP_200_OK) return Response('项目状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST) @action(methods=['put'], detail=True, perms_map={'put':'project_feedback'}, url_name='project_feedback') def feedback(self, request, *args, **kwargs): """ 项目反馈 """ obj = self.get_object() if obj.state == '现场审核中': obj.start_date = request.data['start_date'] obj.end_date = request.data['end_date'] obj.feedback_remark = request.data['feedback_remark'] obj.state = '任务已反馈' obj.save() return Response({'start_date':obj.start_date, 'end_date':obj.end_date,'state':obj.state}, status=status.HTTP_200_OK) else: return Response('项目状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST)