views_cbv.py 5.5 KB
# _*_ coding: utf-8 _*_
# @Time     :   2020/10/7 10:40
# @Author       vanwhebin
import re
from urllib import parse
from rest_framework.generics import CreateAPIView, RetrieveAPIView, UpdateAPIView, ListAPIView
from rest_framework.permissions import IsAuthenticated, IsAdminUser
from rest_framework.exceptions import ValidationError
from rest_framework.views import APIView
from rest_framework.response import Response
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_http_methods

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
from wxProject.settings import FRONT_URL

AUDITORS = (
	(1, '邓望明'),
	(2, '杜波')
)


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(serializer.errors)
		else:
			serializer.save(creator=request.user, auditor=Auditor.objects.order_by('-order').all())
			# 企业微信推送
			obj_dict = serializer.data
			url = re.sub("PK", str(obj_dict['id']), FRONT_URL['flow_detail'])
			url = re.sub("REDIRECT_URL", parse.quote(url, safe=''), FRONT_URL['wx_authorize'])
			first_auditor = Auditor.objects.filter(pk=AUDITORS[0][0]).first()

			wx_client.push_card(first_auditor.user.wx_token, url, f"{request.user.username}提交了一个产品立项申请")
			wx_client.push_card(request.user.wx_token, url, u"流程创建成功")
			return response(obj_dict)


class ProjectDetail(RetrieveAPIView):
	queryset = Project.objects.all()
	serializer_class = ProjectSerializer
	permission_classes = (IsAuthenticated,)

	def get(self, request, *args, **kwargs):
		obj = self.get_object()
		obj.creator_name = obj.creator.username
		obj.result = []
		auditors = Auditor.objects.all()
		# result = Result.objects.filter(project=obj)
		for i in auditors:
			obj.result.append({
				"auditor": i.user.username,
				"is_accept": i.result_auditor.filter(project=obj).values_list('is_accept', flat=True).first()
			})
		# auditor_len = Result.objects.filter(project=obj).count()
		# if auditor_len == 2:
		# 	obj.cur_auditor = "已完结"
		# elif auditor_len == 1:
		# 	obj.cur_auditor = AUDITORS[1][1]
		# else:
		# 	obj.cur_auditor = AUDITORS[0][1]
		return response(ProjectSerializer(obj).data)


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)
			url = re.sub("PK", str(obj.id), FRONT_URL['flow_detail'])
			url = re.sub("REDIRECT_URL", parse.quote(url, safe=''), FRONT_URL['wx_authorize'])
			desc = "产品立项流程所有审批已完成" if full_audit_done else f"{request.user.username}已审批完成"
			if full_audit_done:
				obj.is_done = True
				obj.is_pass = bool(request.data.get('is_accept'))
			else:
				if not accept_param:
					obj.is_done = True
					obj.is_pass = False
				else:
					second_auditor = Auditor.objects.filter(pk=AUDITORS[1][0]).first()
					wx_client.push_card(second_auditor.user.wx_token, url, f"{request.user.username}提交了一个产品立项申请")
			obj.save()
			wx_client.push_card(obj.creator.wx_token, url, desc)

		return response(ProjectSerializer(obj).data)


class AuditProjectsList(ListAPIView):
	queryset = Project.objects.all()
	serializer_class = ProjectSerializer
	pagination_class = MyPageNumberPagination
	permission_classes = (IsAuthenticated, IsAdminUser)

	def get_queryset(self):
		data = Project.objects.filter(auditor__user_id=self.request.user.id).order_by('-is_done')
		for item in data:
			result = item.result_project.filter(auditor__user_id=self.request.user.id).values('is_accept').first()
			item.creator_name = item.creator.username
			item.result = True if result else False
		return data


class CheckAuth(APIView):
	""" 检查是否有权限进行审批 """
	allowed_methods = ('GET',)
	permission_classes = (IsAuthenticated, IsAdminUser)

	@staticmethod
	def get(request, *args, **kwargs):
		project_auditor = Project.objects.filter(pk=kwargs['pk'], auditor__user_id=request.user.id)
		return response(True) if project_auditor else response(False)