diff --git a/server/apps/certset/migrations/0005_implementrule_cert_type.py b/server/apps/certset/migrations/0005_implementrule_cert_type.py new file mode 100644 index 0000000..08ac4ca --- /dev/null +++ b/server/apps/certset/migrations/0005_implementrule_cert_type.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.5 on 2020-06-24 03:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('certset', '0004_unittype_description'), + ] + + operations = [ + migrations.AddField( + model_name='implementrule', + name='cert_type', + field=models.CharField(choices=[('ccc', '强制性产品认证'), ('pv', '自愿性产品认证'), ('sys', '管理体系认证')], default='pv', max_length=50, verbose_name='所属认证类型'), + ), + ] diff --git a/server/apps/certset/migrations/0006_implementrule_path.py b/server/apps/certset/migrations/0006_implementrule_path.py new file mode 100644 index 0000000..ce59c53 --- /dev/null +++ b/server/apps/certset/migrations/0006_implementrule_path.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.5 on 2020-06-24 05:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('certset', '0005_implementrule_cert_type'), + ] + + operations = [ + migrations.AddField( + model_name='implementrule', + name='path', + field=models.CharField(blank=True, max_length=1000, null=True, verbose_name='文件地址'), + ), + ] diff --git a/server/apps/certset/models.py b/server/apps/certset/models.py index 0eb6334..9e72cde 100644 --- a/server/apps/certset/models.py +++ b/server/apps/certset/models.py @@ -27,8 +27,16 @@ class Standard(CommonAModel): class ImplementRule(CommonAModel): + cert_type_choices = ( + ('ccc', '强制性产品认证'), + ('pv', '自愿性产品认证'), + ('sys', '管理体系认证') + ) + name = models.CharField('规则名称', max_length=1000) code = models.CharField('编号', max_length=30, unique=True) + cert_type = models.CharField('所属认证类型', max_length=50, + choices=cert_type_choices, default='pv') standards = models.ManyToManyField(Standard, blank=True, verbose_name='依据标准', related_name='implementrules_standards') ccc_list = models.ManyToManyField(Dict, blank=True, verbose_name='CCC产品认证目录', related_name= 'implementrule_ccc_list') pv_scope = models.ForeignKey(Dict, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='自愿性产品认证领域', related_name= 'implementrule_pv_scope') @@ -36,6 +44,7 @@ class ImplementRule(CommonAModel): cnas_scope = models.ManyToManyField(Dict, blank=True, verbose_name='CNAS业务范围', related_name= 'implementrule_cnas_scope') economy_class = models.ManyToManyField(Dict, blank=True, verbose_name='国民经济分类', related_name= 'implementrule_economy_class') cert_pattern = models.ManyToManyField(Dict, blank=True, verbose_name='认证模式', related_name= 'implementrule_cert_pattern') + path = models.CharField('文件地址', max_length=1000, null=True, blank=True) class Meta: verbose_name = '实施规则' diff --git a/server/apps/certset/serializers.py b/server/apps/certset/serializers.py index ab2fde8..f046e1d 100644 --- a/server/apps/certset/serializers.py +++ b/server/apps/certset/serializers.py @@ -2,6 +2,8 @@ from rest_framework import serializers from .models import Standard, UnitType, ImplementRule +from apps.system.serializers import DictSerializer + class StandardSerializer(serializers.ModelSerializer): class Meta: @@ -13,6 +15,22 @@ class ImplementRuleSerializer(serializers.ModelSerializer): model = ImplementRule fields = '__all__' +class ImplementRuleListSerializer(serializers.ModelSerializer): + pv_scope = DictSerializer() + pv_class = DictSerializer() + cert_type = serializers.SerializerMethodField() + class Meta: + model = ImplementRule + fields = ['id', 'code', 'name', 'cert_type', 'pv_scope', 'pv_class', 'create_time'] + @staticmethod + def setup_eager_loading(queryset): + """ Perform necessary eager loading of data. """ + queryset = queryset.select_related('pv_scope','pv_class') + return queryset + + def get_cert_type(self, obj): + return obj.get_cert_type_display() + class UnitTypeSerializer(serializers.ModelSerializer): class Meta: model = UnitType diff --git a/server/apps/certset/views.py b/server/apps/certset/views.py index 9a95583..0bfad1e 100644 --- a/server/apps/certset/views.py +++ b/server/apps/certset/views.py @@ -1,7 +1,7 @@ from django.shortcuts import render from rest_framework.viewsets import ModelViewSet from .models import Standard, UnitType, ImplementRule -from .serializers import StandardSerializer, ImplementRuleSerializer, UnitTypeSerializer +from .serializers import StandardSerializer, ImplementRuleSerializer, UnitTypeSerializer, ImplementRuleListSerializer # Create your views here. class StandardViewSet(ModelViewSet): @@ -18,10 +18,22 @@ class ImplementRuleViewSet(ModelViewSet): 'put': 'implementrule_update', 'delete': 'implementrule_delete'} queryset = ImplementRule.objects serializer_class = ImplementRuleSerializer - search_fields = ['name', 'code'] - filterset_fields = ['pv_scope'] + search_fields = ['name', 'code', 'cert_type'] + filterset_fields = ['pv_scope', 'cert_type'] ordering = ['-create_time'] + def get_serializer_class(self): + # 根据请求类型动态变更serializer + if self.action == 'list': + return ImplementRuleListSerializer + return ImplementRuleSerializer + + 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) # 性能优化 + return queryset + class UnitTypedViewSet(ModelViewSet): perms_map = {'get': '*', 'post': 'unittype_create', 'put': 'unittype_update', 'delete': 'unittype_delete'} diff --git a/server/apps/system/serializers.py b/server/apps/system/serializers.py index 9d3b723..8cff64f 100644 --- a/server/apps/system/serializers.py +++ b/server/apps/system/serializers.py @@ -30,10 +30,13 @@ class DictSerializer(serializers.ModelSerializer): """ 数据字典序列化 """ + fullname = serializers.SerializerMethodField(read_only=True) class Meta: model = Dict fields = '__all__' + def get_fullname(self, obj): + return obj.code + obj.name class PositionSerializer(serializers.ModelSerializer): """ diff --git a/server/apps/system/views.py b/server/apps/system/views.py index bd08371..d4c0cb7 100644 --- a/server/apps/system/views.py +++ b/server/apps/system/views.py @@ -75,7 +75,7 @@ class DictViewSet(ModelViewSet): perms_map = {'get': '*', 'post': 'dict_create', 'put': 'dict_update', 'delete': 'dict_delete'} queryset = Dict.objects.get_queryset(all=True) # 获取全部的,包括软删除的 - filterset_fields = ['type', 'is_deleted'] + filterset_fields = ['type', 'is_deleted', 'type__code'] serializer_class = DictSerializer search_fields = ['name'] ordering_fields = ['sort'] @@ -83,9 +83,9 @@ class DictViewSet(ModelViewSet): def paginate_queryset(self, queryset): """ - 如果查询参数里有type,则不分页,否则请求分页 + 如果查询参数里有type或type__code,则不分页,否则请求分页 """ - if (self.request.query_params.get('type', None)) or (self.paginator is None): + if (self.request.query_params.get('type__code', None)) or (self.request.query_params.get('type', None)) or (self.paginator is None): return None return self.paginator.paginate_queryset(queryset, self.request, view=self)