views_cbv.py
3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# _*_ 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
from utils.util import response
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,)
# def get_object(self):
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)