From c6ac2434e84c40eec9a9c1b7a6f588729b480362 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 24 Aug 2021 11:13:03 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B5=84=E8=B4=A8=E8=83=BD=E5=8A=9B=E6=8A=A5?= =?UTF-8?q?=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/ability/models.py | 2 +- server/apps/ability/urls.py | 4 +- server/apps/ability/views.py | 134 ++++++++++++++++++ .../migrations/0023_auto_20210824_1112.py | 25 ++++ server/apps/supervision/models.py | 8 +- server/apps/supervision/views.py | 4 +- server/server/settings_dev.py | 22 +-- 7 files changed, 182 insertions(+), 17 deletions(-) create mode 100644 server/apps/supervision/migrations/0023_auto_20210824_1112.py diff --git a/server/apps/ability/models.py b/server/apps/ability/models.py index 27c07fb..f243bb8 100644 --- a/server/apps/ability/models.py +++ b/server/apps/ability/models.py @@ -118,4 +118,4 @@ class Qualification(BaseModel): class Qualificationother(BaseModel): qualification = models.ForeignKey(Qualification, on_delete=models.CASCADE, related_name='other_qualification') name = models.TextField('其他资质', null=True, blank=True) - description = models.TextField('资质范围', null=True, blank=True) \ No newline at end of file + description = models.TextField('资质范围', null=True, blank=True) diff --git a/server/apps/ability/urls.py b/server/apps/ability/urls.py index 2cc4ec7..538a6f8 100644 --- a/server/apps/ability/urls.py +++ b/server/apps/ability/urls.py @@ -1,7 +1,7 @@ from django.db.models import base from django.urls import path, include from rest_framework import routers -from .views import CMAViewSet, CNASViewSet, CorrectViewSet, QualificationViewSet,InspectionViewSet,QualificationotherViewSet, QueryRecordListViewSet, correct_ability, merge_cma, merge_cnas +from .views import AbilityContentViewSet, AbilityRecordViewSet, CMAViewSet, CNASViewSet, CorrectViewSet, QualificationViewSet,InspectionViewSet,QualificationotherViewSet, QueryRecordListViewSet, correct_ability, merge_cma, merge_cnas router = routers.DefaultRouter() router.register('cma', CMAViewSet, basename="cma") @@ -11,6 +11,8 @@ router.register('qualificationother', QualificationotherViewSet, basename="quali router.register('inspection', InspectionViewSet, basename="inspection") router.register('queryrecord', QueryRecordListViewSet, basename="queryrecord") router.register('correct', CorrectViewSet, basename="correct") +router.register('content', AbilityContentViewSet, basename="abilitycontent") +router.register('record', AbilityRecordViewSet, basename="abilityrecord") urlpatterns = [ path('merge/cma/', merge_cma), path('merge/cnas/', merge_cnas), diff --git a/server/apps/ability/views.py b/server/apps/ability/views.py index 043a9d8..89aef5f 100644 --- a/server/apps/ability/views.py +++ b/server/apps/ability/views.py @@ -15,6 +15,12 @@ from openpyxl import Workbook, load_workbook from django.db.models import Count from utils.pagination import PageOrNot from rest_framework.views import APIView +from apps.supervision.models import Content, Record +from apps.supervision.serializers import ContentSerializer, RecordCreateSerializer, RecordSerializer +from apps.system.mixins import CreateUpdateCustomMixin +from utils.queryset import get_child_queryset2 +from django.utils import timezone +from apps.supervision.permission import RecordPermission # Create your views here. import json @@ -31,6 +37,134 @@ class RecordMixin(): QueryRecord.objects.create(user=request.user,path=request.path,ip=request.META.get('HTTP_X_FORWARDED_FOR'),method=\ request.method,search=request.query_params.get('search',None),query=request.query_params) +class AbilityContentViewSet(CreateUpdateCustomMixin, ModelViewSet): + """ + 资质能力报送清单:增删改查 + """ + perms_map = {'get': '*', 'post': 'content', + 'put': 'content', 'delete': 'content'} + queryset = Content.objects.filter(cate=2) + serializer_class = ContentSerializer + pagination_class = None + search_fields = ['name', 'desc'] + filterset_fields = ['type','cate'] + ordering = ['sortnum', 'create_time'] + + def perform_create(self, serializer): + if hasattr(self.queryset.model, 'belong_dept'): + serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept, cate=2) + else: + serializer.save(create_by = self.request.user, cate=2) + def perform_update(self, serializer): + serializer.save(update_by = self.request.user) + +class AbilityRecordViewSet(PageOrNot, CreateUpdateCustomMixin, ModelViewSet): + perms_map = {'get': '*', 'post': 'record_create', + 'put': 'record_update', 'delete': 'record_delete'} + queryset = Record.objects.filter(content__cate=2) + serializer_class = RecordSerializer + search_fields = ['content__name'] + ordering_fields = ['content__sortnum', 'belong_dept__sort'] + ordering = ['-task', 'content__sortnum', '-create_time'] + filterset_fields = ['content','content__cate', 'belong_dept', 'state'] + + def get_queryset(self): + queryset = self.queryset + if hasattr(self.get_serializer_class(), 'setup_eager_loading'): + queryset = self.get_serializer_class().setup_eager_loading(queryset) + if self.request.user.is_superuser: + pass + if hasattr(queryset.model, 'belong_dept'): + user = self.request.user + roles = user.roles + data_range = roles.values_list('datas', flat=True) + if '全部' in data_range: + pass + elif '本级及以下' in data_range: + belong_depts = get_child_queryset2(user.dept) + queryset = queryset.filter(belong_dept__in = belong_depts) + elif '本级' in data_range: + queryset = queryset.filter(belong_dept = user.dept) + return queryset + + def filter_queryset(self, queryset): + if not self.request.query_params.get('pageoff', None): + queryset = queryset.exclude(state='待发布') + return super().filter_queryset(queryset) + + def get_serializer_class(self): + if self.action == 'create': + return RecordCreateSerializer + return super().get_serializer_class() + + @action(methods=['put'], detail=True, perms_map = {'put':'record_up'}) + def up(self, request, *args, **kwargs): + """ + 报送 + """ + obj = self.get_object() + if obj.state in ['待整改','待报送', '已报送']: + obj.files.clear() + obj.files.add(*request.data['files']) + obj.noteb = request.data['noteb'] + obj.state = '已报送' + obj.up_user = request.user + obj.up_date = timezone.now() + obj.save() + return Response(status=status.HTTP_200_OK) + return Response('记录状态错误', status=status.HTTP_400_BAD_REQUEST) + + def create(self, request, *args, **kwargs): + """ + 主动报送 + """ + data = request.data + if data.get('files', None): + serializer = RecordCreateSerializer(data=data) + serializer.is_valid(raise_exception=True) + content = Content.objects.get(pk=data['content']) + if content.cate==2: + sdata = {'belong_dept':request.user.dept, + 'is_self':True, + 'content_name':content.name, + 'content_desc':content.desc, + 'state':'已报送', + 'up_user':request.user, + 'up_date':timezone.now()} + serializer.save(**sdata) + return Response(status=status.HTTP_201_CREATED) + return Response('该材料不是资质能力!', status=status.HTTP_400_BAD_REQUEST) + return Response('未上传文件', status=status.HTTP_400_BAD_REQUEST) + + @action(methods=['put'], detail=True, perms_map = {'put':'record_reject'}, permission_classes=[RecordPermission]) + def reject(self, request, *args, **kwargs): + """ + 驳回 + """ + obj = self.get_object() + if obj.state == '已报送': + if request.data.get('opinion', None): + obj.opinion = request.data['opinion'] + obj.state = '待整改' + obj.save() + return Response(status=status.HTTP_200_OK) + else: + return Response('请填写修改意见', status=status.HTTP_400_BAD_REQUEST) + return Response('记录状态错误', status=status.HTTP_400_BAD_REQUEST) + + @action(methods=['put'], detail=True, perms_map = {'put':'record_confirm'}) + def confirm(self, request, *args, **kwargs): + """ + 确认 + """ + obj = self.get_object() + if obj.state in ['已报送', '待报送']: + obj.state = '已确认' + obj.save() + return Response(status=status.HTTP_200_OK) + return Response('记录状态错误', status=status.HTTP_400_BAD_REQUEST) + + class QueryRecordListViewSet(ListModelMixin, GenericViewSet): perms_map = {'get': 'queryrecord_view'} queryset = QueryRecord.objects.all() diff --git a/server/apps/supervision/migrations/0023_auto_20210824_1112.py b/server/apps/supervision/migrations/0023_auto_20210824_1112.py new file mode 100644 index 0000000..10e17a0 --- /dev/null +++ b/server/apps/supervision/migrations/0023_auto_20210824_1112.py @@ -0,0 +1,25 @@ +# Generated by Django 3.0.5 on 2021-08-24 03:12 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0018_auto_20210430_1156'), + ('supervision', '0022_content_template'), + ] + + operations = [ + migrations.AddField( + model_name='content', + name='cate', + field=models.IntegerField(choices=[(1, '监督'), (2, '资质')], default=1, verbose_name='材料归类'), + ), + migrations.AlterField( + model_name='content', + name='type', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='system.Dict', verbose_name='材料类型'), + ), + ] diff --git a/server/apps/supervision/models.py b/server/apps/supervision/models.py index cc03b55..41f8861 100644 --- a/server/apps/supervision/models.py +++ b/server/apps/supervision/models.py @@ -7,13 +7,17 @@ class Content(CommonAModel): """ 资料清单 """ + cate_choices = ( + (1, '监督'), + (2, '资质') + ) name = models.CharField('名称', max_length=100) desc = models.TextField('详情', null=True, blank=True) - type = models.ForeignKey(Dict, verbose_name='材料类型', on_delete= models.DO_NOTHING) + type = models.ForeignKey(Dict, verbose_name='材料类型', on_delete= models.DO_NOTHING, null=True, blank=True) can_doself = models.BooleanField('可随时主动报送', default=False) sortnum = models.IntegerField('排序号', default=1) template = models.CharField('模板地址', max_length=200, null=True, blank=True) - + cate = models.IntegerField('材料归类', choices=cate_choices, default=1) class Meta: verbose_name = '报送清单' verbose_name_plural = verbose_name diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index ccfaad1..e9f64e5 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -28,7 +28,7 @@ class ContentViewSet(CreateUpdateCustomMixin, ModelViewSet): """ perms_map = {'get': '*', 'post': 'content', 'put': 'content', 'delete': 'content'} - queryset = Content.objects.all() + queryset = Content.objects.filter(cate=1) serializer_class = ContentSerializer pagination_class = None search_fields = ['name', 'desc'] @@ -204,7 +204,7 @@ from .permission import RecordPermission class RecordViewSet(PageOrNot, CreateUpdateCustomMixin, ModelViewSet): perms_map = {'get': '*', 'post': 'record_create', 'put': 'record_update', 'delete': 'record_delete'} - queryset = Record.objects.all() + queryset = Record.objects.filter(content__cate=1) serializer_class = RecordSerializer search_fields = ['content__name','task__name'] ordering_fields = ['content__sortnum', 'belong_dept__sort', 'task'] diff --git a/server/server/settings_dev.py b/server/server/settings_dev.py index c6c83b7..dca12b6 100644 --- a/server/server/settings_dev.py +++ b/server/server/settings_dev.py @@ -1,20 +1,20 @@ from .settings import * DEBUG = True DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql', - 'NAME': 'cma', - 'USER': 'postgres', - 'PASSWORD': 'zctest1234', - 'HOST': '47.95.0.242', - 'PORT': '5432', - } # 'default': { # 'ENGINE': 'django.db.backends.postgresql', # 'NAME': 'cma', - # 'USER': 'cma', - # 'PASSWORD': 'cma123', - # 'HOST': '172.16.80.102', + # 'USER': 'postgres', + # 'PASSWORD': 'zctest1234', + # 'HOST': '47.95.0.242', # 'PORT': '5432', # } + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': 'cma', + 'USER': 'cma', + 'PASSWORD': 'cma123', + 'HOST': '172.16.80.102', + 'PORT': '5432', + } }