factory/apps/opm/views.py

181 lines
7.1 KiB
Python

from rest_framework.response import Response
from apps.opm.models import GasCheck, Operation, Opl, OplCate, OplWorker
from apps.opm.serializers import (GasCheckCreateUpdateSerializer, GasCheckSerializer,
OperationCreateUpdateSerializer, OperationDetailSerializer,
OplCateCreateUpdateSerializer, OplCateDetailSerializer, OplCateSerializer,
OplCreateUpdateSerializer, OplDetailSerializer, OplListSerializer,
OplWorkerCreateSerializer, OplWorkerSerializer, OplWorkerUpdateSerializer,
OperationPartialUpdateSerializer)
from apps.opm.services import close_mtask, start_mtask
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
from rest_framework.exceptions import ParseError
from rest_framework.mixins import CreateModelMixin, ListModelMixin, DestroyModelMixin
from rest_framework.decorators import action
from rest_framework.serializers import Serializer
from apps.wf.models import Ticket
from django.core.cache import cache
from django.db import transaction
# Create your views here.
class OplCateViewSet(CustomModelViewSet):
queryset = OplCate.objects.all()
create_serializer_class = OplCateCreateUpdateSerializer
update_serializer_class = OplCateCreateUpdateSerializer
retrieve_serializer_class = OplCateDetailSerializer
serializer_class = OplCateSerializer
prefetch_related_fields = ['measure_options', 'risk_options', 'close_options']
ordering = 'sort'
class OperationViewSet(CustomModelViewSet):
perms_map = {'get': 'operation.view', 'post': 'operation.create',
'put': 'operation.update', 'delete': 'operation.delete'}
queryset = Operation.objects.all()
create_serializer_class = OperationCreateUpdateSerializer
update_serializer_class = OperationCreateUpdateSerializer
serializer_class = OperationDetailSerializer
retrieve_serializer_class = OperationDetailSerializer
select_related_fields = ['area', 'dept_bus', 'dept_ter', 'coordinator']
prefetch_related_fields = ['cates']
search_fields = ['name']
filterset_fields = ['state', 'cates', 'area', 'create_by']
# data_filter = True
def update(self, request, *args, **kwargs):
obj = self.get_object()
user = request.user
if user.is_superuser:
pass
elif obj.state == Operation.OP_CREATE and user == obj.create_by:
pass
elif user == obj.create_by and kwargs['partial']:
pass
else:
raise ParseError('该作业不可修改')
return super().update(request, *args, **kwargs)
def destroy(self, request, *args, **kwargs):
obj = self.get_object()
if obj.state != Operation.OP_CREATE:
raise ParseError('非创建状态不可删除')
user = request.user
if user == obj.create_by or user.is_superuser:
pass
else:
raise ParseError('非创建人不可删除')
obj.delete()
return Response(status=204)
class OplViewSet(CustomModelViewSet):
queryset = Opl.objects.all()
create_serializer_class = OplCreateUpdateSerializer
update_serializer_class = OplCreateUpdateSerializer
serializer_class = OplListSerializer
retrieve_serializer_class = OplDetailSerializer
select_related_fields = ['cate', 'operation', 'dept_do', 'charger', 'monitor', 'ticket']
filterset_fields = ['operation', 'cate']
@transaction.atomic
def destroy(self, request, *args, **kwargs):
obj = self.get_object()
if obj.ticket and obj.ticket.act_state != Ticket.TICKET_ACT_STATE_DRAFT:
raise ParseError('许可证已处理不可删除')
user = request.user
if user == obj.create_by or user.is_superuser:
pass
else:
raise ParseError('非创建人不可删除')
if obj.ticket:
obj.ticket.delete()
obj.delete()
return Response(status=204)
def update(self, request, *args, **kwargs):
obj = self.get_object()
if obj.ticket and obj.ticket.act_state != Ticket.TICKET_ACT_STATE_DRAFT:
raise ParseError('许可证已处理不可编辑')
user = request.user
if user == obj.create_by or user.is_superuser:
pass
else:
raise ParseError('非创建人不可编辑')
return super().update(request, *args, **kwargs)
@action(methods=['post'], detail=True, perms_map={'post': '*'},
serializer_class=Serializer, logging_methods=[])
def start_mtask(self, request, pk=None):
"""
开启作业监控
开启作业监控
"""
obj = self.get_object()
if obj.operation.state == Operation.OP_DONE:
raise ParseError('作业已关闭,不能开启监控')
res = start_mtask(obj)
return Response(res)
@action(methods=['post'], detail=True, perms_map={'post': '*'},
serializer_class=Serializer, logging_methods=[])
def stop_mtask(self, request, pk=None):
"""
停止作业监控
停止作业监控
"""
obj = self.get_object()
if obj.mtask_uid:
close_mtask(obj.mtask_uid)
from django_celery_results.models import TaskResult
qs = TaskResult.objects.filter(task_args__contains=obj.id, status__in=['PENDING', 'RECEIVED', 'STARTED'])
for i in qs:
close_mtask(i.task_id)
obj.mtask_uid = None
obj.save()
return Response()
class OplWorkerViewSet(CustomModelViewSet):
perms_map = {'get': '*', 'post': 'opl.update', 'put': 'opl.update', 'delete': 'opl.update'}
queryset = OplWorker.objects.all()
create_serializer_class = OplWorkerCreateSerializer
update_serializer_class = OplWorkerUpdateSerializer
serializer_class = OplWorkerSerializer
filterset_fields = ['opl']
# def get_queryset(self):
# if self.request.query_params.get('opl', None):
# raise ParseError('请指定查询许可证')
# return super().get_queryset()
def destroy(self, request, *args, **kwargs):
obj = self.get_object()
if obj.opl.ticket:
raise ParseError('许可证已处理不可删除')
return super().destroy(request, *args, **kwargs)
def update(self, request, *args, **kwargs):
obj = self.get_object()
if obj.opl.ticket:
raise ParseError('许可证已处理不可编辑')
return super().update(request, *args, **kwargs)
class GasCheckViewSet(CreateModelMixin, ListModelMixin, DestroyModelMixin, CustomGenericViewSet):
perms_map = {'get': '*', 'post': 'opl.update', 'delete': 'opl.update'}
queryset = GasCheck.objects.all()
create_serializer_class = GasCheckCreateUpdateSerializer
serializer_class = GasCheckSerializer
filterset_fields = ['opl']
def destroy(self, request, *args, **kwargs):
obj = self.get_object()
if obj.opl.ticket:
raise ParseError('许可证已处理不可删除')
obj.delete()
return Response(status=204)