from django.shortcuts import render from rest_framework.mixins import ListModelMixin from rest_framework.viewsets import GenericViewSet, ModelViewSet from .models import * from .serializers import * from rest_framework.decorators import action from django.conf import settings from rest_framework import status from rest_framework.response import Response from apps.system.models import Organization from django.db.models import Count from utils.pagination import PageOrNot from apps.system.mixins import OptimizationMixin from apps.system.mixins import CreateUpdateCustomMixin from django.utils import timezone from .filters import RecordFilter # Create your views here. class ContentViewSet(CreateUpdateCustomMixin, ModelViewSet): """ 资料清单:增删改查 """ perms_map = {'get': '*', 'post': 'content_create', 'put': 'content_update', 'delete': 'content_delete'} queryset = Content.objects.all() serializer_class = ContentSerializer pagination_class = None search_fields = ['name', 'desc'] filterset_fields = ['type'] ordering = ['type__sort', 'create_time'] class TaskViewSet(CreateUpdateCustomMixin, ModelViewSet): perms_map = {'get': '*', 'post': 'task_create', 'put': 'task_update', 'delete': 'task_delete'} queryset = Task.objects.all() search_fields = ['name'] ordering = ['-create_time'] def get_serializer_class(self): if self.action in ['create', 'update']: return TaskCreateUpdateSerializer elif self.action == 'retrieve': return TaksDetailSerializer return TaskListSerializer @action(methods=['post'], detail=False, perms_map = {'post':'task_createself'}) def createself(self, request): """ 主动报送 """ serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) serializer.save(is_self=True, create_by=request.user, belong_dept=request.user.dept) return Response(serializer.data, status=status.HTTP_201_CREATED) @action(methods=['post'], detail=True, perms_map = {'post':'task_init'}) def init(self, request, *args, **kwargs): """ 初始化任务,生成记录 """ obj = self.get_object() depts = request.data['depts'] contents = request.data['contents'] if depts and contents: record_list = [] for m in depts: for n in contents: data={} data['content'] = Content.objects.get(pk=n) data['belong_dept'] = Organization.objects.get(pk=m) data['task'] = obj data['end_date'] = obj.end_date data['create_by'] = request.user record_list.append(Record(**data)) Record.objects.bulk_create(record_list) obj.state = '执行中' obj.save() return Response(status=status.HTTP_200_OK) return Response('单位或清单不能为空', status=status.HTTP_400_BAD_REQUEST) @action(methods=['get'], detail=True, perms_map = {'get':'*'}) def contents(self, request, *args, **kwargs): """ 聚合 """ obj = self.get_object() serializer = ContentListSerializer(obj.contents.distinct(), many=True) return Response(serializer.data) @action(methods=['get'], detail=True, perms_map = {'get':'*'}) def depts(self, request, *args, **kwargs): """ 聚合 """ obj = self.get_object() serializer = OrganizationSimpleSerializer(obj.depts.distinct(), many=True) return Response(serializer.data) class RecordViewSet(OptimizationMixin,PageOrNot, CreateUpdateCustomMixin, ModelViewSet): perms_map = {'get': '*', 'post': 'record_create', 'put': 'record_update', 'delete': 'record_delete'} queryset = Record.objects.all() serializer_class = RecordSerializer search_fields = ['content__name','task__name'] ordering = ['-create_time'] filter_class = RecordFilter # 过滤类 def update(self, request, *args, **kwargs): instance = self.get_object() instance.note = request.data.get('note', None) instance.save() return Response(status=status.HTTP_200_OK) @action(methods=['put'], detail=True, perms_map = {'post':'record_up'}) def up(self, request, *args, **kwargs): """ 上报 """ obj = self.get_object() if obj.state == '待上报' or obj.state == '待整改': if request.data.get('files', None): obj.files = request.data['files'] if request.data.get('noteb', None): obj.noteb = request.data['noteb'] if request.data.get('is_yes', True): obj.is_yes = request.data.get('is_yes') obj.state = '已上报' obj.up_user = request.user obj.up_date = timezone.now() obj.save() return Response(status=status.HTTP_200_OK) return Response('记录状态错误', status=status.HTTP_400_BAD_REQUEST) @action(methods=['put'], detail=True, perms_map = {'post':'record_reject'}) def reject(self, request, *args, **kwargs): """ 驳回 """ obj = self.get_object() if obj.state == '已上报': if request.data.get('note', None): obj.note = request.data['note'] obj.save() return Response(status=status.HTTP_200_OK) else: return Response('请填写备注', status=status.HTTP_200_OK) return Response('记录状态错误', status=status.HTTP_400_BAD_REQUEST) @action(methods=['put'], detail=True, perms_map = {'post':'record_confirm'}) def confirm(self, request, *args, **kwargs): """ 确认 """ 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)