|
|
# _*_ coding: utf-8 _*_
|
|
|
# @Time : 2020/10/7 10:40
|
|
|
# @Author vanwhebin
|
|
|
from rest_framework.generics import CreateAPIView, RetrieveAPIView, UpdateAPIView, ListAPIView
|
|
|
from rest_framework.permissions import IsAuthenticated, IsAdminUser
|
|
|
from rest_framework.exceptions import ValidationError
|
|
|
from django.urls import reverse
|
|
|
from rest_framework.response import Response
|
|
|
|
|
|
from .serializers import ProjectSerializer
|
|
|
from .models import Auditor, Project, Result
|
|
|
from utils.helpers import WxPushHelper
|
|
|
from utils.pagination import MyPageNumberPagination
|
|
|
|
|
|
|
|
|
class CreateProject(CreateAPIView):
|
|
|
serializer_class = ProjectSerializer
|
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
|
super(CreateProject, self).__init__()
|
|
|
wx_client = WxPushHelper()
|
|
|
serializer = ProjectSerializer(data=request.data)
|
|
|
if not serializer.is_valid():
|
|
|
raise ValidationError
|
|
|
else:
|
|
|
serializer.save(creator=request.user, auditor=Auditor.objects.order_by('-order').all())
|
|
|
# 企业微信推送
|
|
|
obj_dict = serializer.data
|
|
|
wx_client.push_card(request.user.wx_token,
|
|
|
reverse("project:retrieve_project", kwargs={"pk": obj_dict['id']}), u"流程创建成功")
|
|
|
return Response(obj_dict)
|
|
|
|
|
|
|
|
|
class ProjectDetail(RetrieveAPIView):
|
|
|
queryset = Project.objects.all()
|
|
|
serializer_class = ProjectSerializer
|
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
|
|
|
|
|
class AuditProject(UpdateAPIView):
|
|
|
queryset = Project.objects.all()
|
|
|
serializer_class = ProjectSerializer
|
|
|
permission_classes = (IsAuthenticated, IsAdminUser)
|
|
|
|
|
|
@staticmethod
|
|
|
def _check_audit(project_obj):
|
|
|
# 查看是否已经全部审核完毕 进行更新project表
|
|
|
# 所有的审核人员, 是否有result记录
|
|
|
aud_result_len = Result.objects.filter(project=project_obj).count()
|
|
|
auditor_len = Project.objects.filter(pk=project_obj.id).values('auditor__user_id').count()
|
|
|
return aud_result_len == auditor_len
|
|
|
|
|
|
def partial_update(self, request, *args, **kwargs):
|
|
|
# 对项目进行更新
|
|
|
obj = self.get_object()
|
|
|
accept_choices = (
|
|
|
('accept', '通过'),
|
|
|
('reject', '否决')
|
|
|
)
|
|
|
accept_param = accept_choices[0][0] if request.data.get('is_accept') else accept_choices[1][0]
|
|
|
target = Project.objects.filter(auditor__user_id=request.user.id, pk=obj.id)
|
|
|
if not target:
|
|
|
raise PermissionError
|
|
|
else:
|
|
|
auditor = Auditor.objects.get(user=request.user)
|
|
|
result = Result.objects.filter(auditor=auditor, project=obj).first()
|
|
|
if not result:
|
|
|
Result.objects.create(
|
|
|
auditor=auditor,
|
|
|
project=obj,
|
|
|
is_accept=accept_param,
|
|
|
memo=request.data.get('memo', '')
|
|
|
)
|
|
|
else:
|
|
|
result.is_accept = accept_param
|
|
|
result.save()
|
|
|
|
|
|
wx_client = WxPushHelper()
|
|
|
full_audit_done = self._check_audit(obj)
|
|
|
desc = "产品立项流程所有审批已完成" if full_audit_done else f"{request.user.username}已审批完成"
|
|
|
if full_audit_done:
|
|
|
obj.is_done = True
|
|
|
obj.is_pass = request.data.get('is_accept')
|
|
|
else:
|
|
|
if not accept_param:
|
|
|
obj.is_done = True
|
|
|
obj.is_pass = False
|
|
|
obj.save()
|
|
|
wx_client.push_card(obj.creator.wx_token, reverse("project:retrieve_project", kwargs={"pk": obj.id}), desc)
|
|
|
|
|
|
return Response(ProjectSerializer(obj).data)
|
|
|
|
|
|
|
|
|
class AuditProjectsList(ListAPIView):
|
|
|
serializer_class = ProjectSerializer
|
|
|
pagination_class = MyPageNumberPagination
|
|
|
permission_classes = (IsAuthenticated, IsAdminUser)
|
|
|
|
|
|
def get_queryset(self, **kwargs):
|
|
|
return Project.objects.filter(auditor__user_id=kwargs['user'].id)
|
|
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
|
qs = self.get_queryset(user=request.user)
|
|
|
return Response(ProjectSerializer(qs, many=True).data) |
...
|
...
|
|