253 lines
11 KiB
Python
253 lines
11 KiB
Python
from apps.rpm.filters import RpjFilterSet
|
|
from apps.rpm.models import Rcertificate, Remployee, Rparty, Rfile, Rpjfile, Rpjmember, Rpj
|
|
from apps.rpm.serializers import (RcertificateCreateUpdateSerializer,
|
|
RcertificateSerializer, RemployeeCreateSerializer, RemployeeSerializer,
|
|
RemployeeUpdateSerializer, RpartyAssignSerializer, RpartyCreateUpdateSerializer,
|
|
RfileListSerializer, RpartySerializer, RpjListSerializer, RpjfileSerializer,
|
|
RpjfileUpdateSerializer, RpjmemberCreateSerializer,
|
|
RpjCreateSerializer, RpjUpdateSerializer, RpjmemberSerializer, RpjmemberUpdateSerializer)
|
|
from apps.rpm.services import sync_to_rep
|
|
from apps.system.models import Dictionary, Post, User, UserPost
|
|
from apps.system.serializers import UserCreateSerializer
|
|
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
|
|
from rest_framework.mixins import ListModelMixin, DestroyModelMixin, UpdateModelMixin
|
|
from rest_framework.decorators import action
|
|
from rest_framework.response import Response
|
|
from django.contrib.auth.hashers import make_password
|
|
from django.db import transaction
|
|
from rest_framework.exceptions import ParseError
|
|
from django.db.models import Q
|
|
|
|
|
|
# Create your views here.
|
|
class RpartyViewSet(CustomModelViewSet):
|
|
perms_map = {'get': 'rparty.view', 'post': 'rparty.create', 'put': 'rparty.update', 'delete': 'rparty.delete'}
|
|
queryset = Rparty.objects.all()
|
|
create_serializer_class = RpartyCreateUpdateSerializer
|
|
update_serializer_class = RpartyCreateUpdateSerializer
|
|
serializer_class = RpartySerializer
|
|
select_related_fields = ['admin', 'belong_dept']
|
|
search_fields = ['name']
|
|
data_filter = True
|
|
|
|
def get_queryset(self):
|
|
queryset = super().get_queryset()
|
|
# 防止越权,加入的逻辑,可以通过岗位控权实现
|
|
user = self.request.user
|
|
if user.is_authenticated and user.type == 'remployee':
|
|
queryset = queryset.filter(dept=user.belong_dept)
|
|
return queryset
|
|
|
|
@action(methods=['post'], detail=True, perms_map={'post': 'rparty:assgin'}, serializer_class=RpartyAssignSerializer)
|
|
@transaction.atomic
|
|
def assign(self, request, *args, **kwargs):
|
|
"""
|
|
分配账号
|
|
"""
|
|
obj = self.get_object()
|
|
post = Post.objects.get(code='remployee')
|
|
serializer = RpartyAssignSerializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
vdata = serializer.validated_data
|
|
if vdata['admin']:
|
|
ins = vdata['admin']
|
|
elif User.objects.get_queryset(all=True).filter(Q(phone=vdata['phone']) | Q(username=vdata['username'])).exists():
|
|
raise ParseError('该账号已存在,请直接选择')
|
|
else:
|
|
serializer = UserCreateSerializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
ins = serializer.save(type='remployee', password=make_password('0000'))
|
|
obj.admin = ins
|
|
obj.save()
|
|
# 岗位设置为相关方岗位
|
|
UserPost.objects.get_or_create(user=ins, dept=obj.dept,
|
|
defaults={
|
|
'user': ins,
|
|
'dept': obj.dept,
|
|
'post': post,
|
|
'sort': 99
|
|
})
|
|
up = UserPost.objects.filter(user=ins).order_by('sort', 'create_time').first()
|
|
if up:
|
|
ins.belong_dept = up.dept
|
|
ins.post = up.post
|
|
ins.update_by = self.request.user
|
|
ins.save()
|
|
# 同步设置rep
|
|
# sync_to_rep(ins.employee)
|
|
return Response()
|
|
|
|
|
|
class RfileViewSet(ListModelMixin, CustomGenericViewSet):
|
|
perms_map = {'get': 'rfile.view'}
|
|
queryset = Rfile.objects.all()
|
|
list_serializer_class = RfileListSerializer
|
|
filterset_fields = ['file_cate']
|
|
ordering = ['file_cate__sort', 'file_cate__create_time']
|
|
data_filter = True
|
|
data_filter_field = 'rparty__dept'
|
|
|
|
def get_queryset(self):
|
|
queryset = super().get_queryset()
|
|
# 防止越权,加入的逻辑,可以通过岗位控权实现
|
|
user = self.request.user
|
|
if user.is_authenticated and user.type == 'remployee':
|
|
queryset = queryset.filter(rparty__dept=user.belong_dept)
|
|
return queryset
|
|
|
|
|
|
class RemployeeViewSet(CustomModelViewSet):
|
|
perms_map = {'get': 'remployee.view', 'post': 'remployee.create',
|
|
'put': 'remployee.update', 'delete': 'remployee.update'}
|
|
queryset = Remployee.objects.all()
|
|
create_serializer_class = RemployeeCreateSerializer
|
|
update_serializer_class = RemployeeUpdateSerializer
|
|
serializer_class = RemployeeSerializer
|
|
search_fields = ['name', 'phone', 'id_number']
|
|
filterset_fields = ['rparty']
|
|
data_filter = True
|
|
data_filter_field = 'rparty__dept'
|
|
|
|
def get_queryset(self):
|
|
queryset = super().get_queryset()
|
|
user = self.request.user
|
|
if user.is_authenticated and user.type == 'remployee':
|
|
queryset = queryset.filter(rparty__dept=user.belong_dept)
|
|
return queryset
|
|
|
|
@transaction.atomic
|
|
def create(self, request, *args, **kwargs):
|
|
"""
|
|
添加人员
|
|
"""
|
|
user = self.request.user
|
|
# ep = user.employee
|
|
# if ep.id_number and ep.photo:
|
|
# pass
|
|
# else:
|
|
# raise ParseError('请先完善个人信息')
|
|
serializer = self.get_serializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
vdata = serializer.validated_data
|
|
if user.type == 'remployee': # 如果是相关方账号
|
|
ins = serializer.save(rparty=user.belong_dept.rparty)
|
|
else:
|
|
if 'rparty' not in vdata:
|
|
raise ParseError('未指定相关方')
|
|
ins = serializer.save()
|
|
return Response({"id": ins.id}, status=201)
|
|
|
|
|
|
class RcertificateViewSet(CustomModelViewSet):
|
|
perms_map = {'get': 'rcertificate.view', 'post': 'rcertificate.create',
|
|
'put': 'rcertificate.update', 'delete': 'rcertificate.update'}
|
|
queryset = Rcertificate.objects.all()
|
|
create_serializer_class = RcertificateCreateUpdateSerializer
|
|
update_serializer_class = RcertificateCreateUpdateSerializer
|
|
serializer_class = RcertificateSerializer
|
|
filterset_fields = ['remployee', 'remployee__rparty']
|
|
data_filter = True
|
|
data_filter_field = 'remployee__rparty__dept'
|
|
|
|
def get_queryset(self):
|
|
queryset = super().get_queryset()
|
|
user = self.request.user
|
|
if user.is_authenticated and user.type == 'remployee':
|
|
queryset = queryset.filter(remployee__rparty__dept=user.belong_dept)
|
|
return queryset
|
|
|
|
|
|
class RpjViewSet(CustomModelViewSet):
|
|
perms_map = {'get': 'rpj.view', 'post': 'rpj.create', 'put': 'rpj.update', 'delete': 'rpj.update'}
|
|
queryset = Rpj.objects.all()
|
|
create_serializer_class = RpjCreateSerializer
|
|
update_serializer_class = RpjUpdateSerializer
|
|
serializer_class = RpjListSerializer
|
|
select_related_fields = ['rparty', 'belong_dept', 'ticket', 'ticket__state']
|
|
search_fields = ['name']
|
|
filterset_class = RpjFilterSet
|
|
data_filter = True
|
|
data_filter_field = 'rparty__dept'
|
|
|
|
def get_queryset(self):
|
|
queryset = super().get_queryset()
|
|
user = self.request.user
|
|
if user.is_authenticated and user.type == 'remployee':
|
|
queryset = queryset.filter(rparty__dept=user.belong_dept)
|
|
return queryset
|
|
|
|
@transaction.atomic
|
|
def create(self, request, *args, **kwargs):
|
|
serializer = self.get_serializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
vdata = serializer.validated_data
|
|
if self.request.user.type == 'remployee':
|
|
vdata['rparty'] = self.request.user.belong_dept.rparty
|
|
if not vdata.get('rparty', None):
|
|
raise ParseError('请指定相关方')
|
|
if not vdata.get('belong_dept', None):
|
|
vdata['belong_dept'] = vdata['rparty'].belong_dept
|
|
ins = serializer.save()
|
|
# 同步创建需要提交的资料
|
|
for i in Dictionary.objects.filter(type__code='rparty_file_cate').order_by('sort'):
|
|
Rpjfile.objects.create(rpj=ins, file_cate=i)
|
|
return Response(status=201, data=serializer.data)
|
|
|
|
def update(self, request, *args, **kwargs):
|
|
obj = self.get_object()
|
|
if obj.state != Rpj.RPJ_CREATE:
|
|
raise ParseError('项目非创建状态不可更改')
|
|
return super().update(request, *args, **kwargs)
|
|
|
|
@transaction.atomic
|
|
def destroy(self, request, *args, **kwargs):
|
|
obj = self.get_object()
|
|
if obj.state in [Rpj.RPJ_ENTER, Rpj.RPJ_DONE]:
|
|
raise ParseError('该项目不可删除')
|
|
elif obj.state == Rpj.RPJ_WORKING and Remployee.objects.filter(rpj=obj).exists():
|
|
raise ParseError('该项目人员在厂不可删除')
|
|
if obj.ticket:
|
|
obj.ticket.delete()
|
|
obj.delete()
|
|
return Response(status=204)
|
|
|
|
|
|
class RpjmemberViewSet(CustomModelViewSet):
|
|
perms_map = {'get': '*', 'post': 'rpj.update', 'put': 'rpj.update', 'delete': 'rpj.update'}
|
|
queryset = Rpjmember.objects.all()
|
|
create_serializer_class = RpjmemberCreateSerializer
|
|
update_serializer_class = RpjmemberUpdateSerializer
|
|
serializer_class = RpjmemberSerializer
|
|
select_related_fields = ['remployee']
|
|
prefetch_related_fields = ['rcertificates']
|
|
filterset_fields = ['rpj']
|
|
|
|
def destroy(self, request, *args, **kwargs):
|
|
obj = self.get_object()
|
|
if obj.rpj.state != Rpj.RPJ_CREATE:
|
|
raise ParseError('项目非创建状态不可删除')
|
|
return super().destroy(request, *args, **kwargs)
|
|
|
|
|
|
class RpjfileViewSet(UpdateModelMixin, DestroyModelMixin, ListModelMixin, CustomGenericViewSet):
|
|
perms_map = {'get': '*', 'put': 'rpj.update', 'delete': 'rpj.update'}
|
|
queryset = Rpjfile.objects.all()
|
|
update_serializer_class = RpjfileUpdateSerializer
|
|
serializer_class = RpjfileSerializer
|
|
select_related_fields = ['rpj']
|
|
prefetch_related_fields = ['files']
|
|
filterset_fields = ['rpj']
|
|
ordering = ['file_cate__sort']
|
|
|
|
def update(self, request, *args, **kwargs):
|
|
obj = self.get_object()
|
|
if obj.rpj.state != Rpj.RPJ_CREATE:
|
|
raise ParseError('项目非创建状态不可修改')
|
|
return super().update(request, *args, **kwargs)
|
|
|
|
def destroy(self, request, *args, **kwargs):
|
|
obj = self.get_object()
|
|
if obj.rpj.state != Rpj.RPJ_CREATE:
|
|
raise ParseError('项目非创建状态不可删除')
|
|
return super().destroy(request, *args, **kwargs)
|