views_cbv.py 5.4 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 usercenter.models import User
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 = (
	(2, '邓望明'),
	(3, '杜波')
)


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 = User.objects.filter(pk=AUDITORS[0][0]).first()
			wx_client.push_card(first_auditor.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()
		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 = request.data.get('is_accept')
			else:
				if not accept_param:
					obj.is_done = True
					obj.is_pass = False
				else:
					second_auditor = User.objects.filter(pk=AUDITORS[1][0]).first()
					wx_client.push_card(second_auditor.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):
		# auditor = Auditor.objects.get(user=self.request.user)
		# sql = Project.objects.filter(
		# 	auditor__user_id=self.request.user.id,
		# 	auditor__result_auditor__exact=auditor) \
		# 	.order_by('-is_done')
		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.result = result['is_accept'] if result else False
		# print(data.query)
		return data
#
# def get(self, request, *args, **kwargs):
# 	qs = self.get_queryset(user=request.user, **kwargs)
# 	return response(ProjectSerializer(qs, many=True).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)