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, RpjCreateUpdateSerializer, RpjmemberSerializer, RpjmemberUpdateSerializer) from apps.rpm.services import sync_to_rep from apps.system.models import Dictionary, Post, 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 # 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'] def get_queryset(self): queryset = super().get_queryset() # 防止越权,加入的逻辑,可以通过岗位控权实现 if self.request.user.type == 'remployee': queryset = queryset.filter(dept=self.request.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') if obj.admin: ins = obj.admin 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 }) 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'] def get_queryset(self): queryset = super().get_queryset() # 防止越权,加入的逻辑,可以通过岗位控权实现 if self.request.user.type == 'remployee': queryset = queryset.filter(rparty__dept=self.request.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 def get_queryset(self): queryset = super().get_queryset() if self.request.user.type == 'remployee': queryset = queryset.filter(rparty__dept=self.request.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': # 如果是相关方账号 serializer.save(rparty=user.belong_dept.rparty) else: if 'rparty' not in vdata: raise ParseError('未指定相关方') serializer.save() return Response(serializer.data, status=201) class RcertificateViewSet(CustomModelViewSet): perms_map = {'get': 'rcetificate.view', 'post': 'rcetificate.create', 'put': 'rcetificate.update', 'delete': 'rcetificate.update'} queryset = Rcertificate.objects.all() create_serializer_class = RcertificateCreateUpdateSerializer update_serializer_class = RcertificateCreateUpdateSerializer serializer_class = RcertificateSerializer filterset_fields = ['remployee', 'remployee__rparty'] def get_queryset(self): queryset = super().get_queryset() if self.request.user.type == 'remployee': queryset = queryset.filter(remployee__rparty__dept=self.request.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 = RpjCreateUpdateSerializer update_serializer_class = RpjCreateUpdateSerializer serializer_class = RpjListSerializer select_related_fields = ['rparty', 'belong_dept', 'ticket', 'ticket__state'] search_fields = ['name'] filterset_class = RpjFilterSet def get_queryset(self): queryset = super().get_queryset() if self.request.user.type == 'remployee': queryset = queryset.filter(rparty__dept=self.request.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) def update(self, request, *args, **kwargs): obj = self.get_object() if obj.state != Rpj.RPJ_CREATE: raise ParseError('项目非创建状态不可更改') return super().update(request, *args, **kwargs) def destroy(self, request, *args, **kwargs): obj = self.get_object() if obj.state != Rpj.RPJ_CREATE: raise ParseError('项目非创建状态不可删除') return super().destroy(request, *args, **kwargs) 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)