This commit is contained in:
shilixia 2021-08-25 09:13:25 +08:00
commit 47371679f0
9 changed files with 183 additions and 12 deletions

View File

@ -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)
description = models.TextField('资质范围', null=True, blank=True)

View File

@ -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),

View File

@ -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()

View File

@ -6,9 +6,10 @@ class RecordFilter(filters.FilterSet):
date_lt = filters.DateFilter(field_name='up_date',lookup_expr="lt")
date_gt = filters.DateFilter(field_name='up_date',lookup_expr="gt")
belong_dept=filters.NumberFilter(field_name='belong_dept')
content_name = filters.CharFilter(field_name='content__name')
content__name = filters.CharFilter(field_name='content__name')
content__candoself = filters.BooleanFilter(field_name='content__candoself')
state = filters.CharFilter(field_name='state',lookup_expr='icontains')
isself = filters.BooleanFilter(field_name='is_self', lookup_expr='isnull')
is_self = filters.BooleanFilter(field_name='is_self', lookup_expr='isnull')
class Meta:
model = Record
fields = ['up_date','content__name','belong_dept','state','is_self','task', 'content']
fields = ['up_date','content__name','belong_dept','state','is_self','task', 'content', 'content__candoself']

View File

@ -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='材料类型'),
),
]

View File

@ -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

View File

@ -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']

View File

@ -19,6 +19,11 @@ class VRecordSerializer(serializers.ModelSerializer):
class Meta:
model = ViewRecord
fields = '__all__'
@staticmethod
def setup_eager_loading(queryset):
queryset = queryset.select_related('user', 'video')
return queryset
class VRecordUpdateSerializer(serializers.ModelSerializer):
class Meta:

View File

@ -55,9 +55,9 @@ class VideoViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
queryset = ViewRecord.objects.filter(user=request.user)
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
serializer = VRecordSerializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
serializer = VRecordSerializer(queryset, many=True)
return Response(serializer.data)
@ -81,7 +81,7 @@ class MyViewRecordAPIView(APIView):
video = Video.objects.get(pk=id)
except:
return Response('视频不存在', status=HTTP_400_BAD_REQUEST)
record = ViewRecord.objects.get_or_create(video=video, user=request.user, defaults={'video':video, 'user':request.user})
record, _ = ViewRecord.objects.get_or_create(video=video, user=request.user, defaults={'video':video, 'user':request.user})
serializer = VRecordSerializer(instance=record)
return Response(serializer.data)