-
- 有效
- 无效
-
+
+
+
@@ -191,7 +190,7 @@ const defaultDict = {
description: '',
sort: 1,
type: null,
- is_deleted: false,
+ is_used: true,
parent:null
}
export default {
diff --git a/server/apps/certset/serializers.py b/server/apps/certset/serializers.py
index be20938..265e277 100644
--- a/server/apps/certset/serializers.py
+++ b/server/apps/certset/serializers.py
@@ -20,13 +20,15 @@ class ImplementRuleListSerializer(serializers.ModelSerializer):
pv_scope = DictSerializer()
pv_class = DictSerializer()
cert_field = DictSerializer()
+ ccc_list = DictSerializer(many=True)
class Meta:
model = ImplementRule
- fields = ['id', 'code', 'name', 'cert_field', 'pv_scope', 'pv_class', 'create_time']
+ fields = ['id', 'code', 'name', 'cert_field', 'pv_scope', 'pv_class', 'create_time', 'ccc_list']
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.select_related('pv_scope','pv_class', 'cert_field')
+ queryset = queryset.prefetch_related('ccc_list',)
return queryset
# def get_cert_field(self, obj):
diff --git a/server/apps/certset/views.py b/server/apps/certset/views.py
index 10f2d3d..c2b00e0 100644
--- a/server/apps/certset/views.py
+++ b/server/apps/certset/views.py
@@ -21,7 +21,7 @@ class ImplementRuleViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelView
queryset = ImplementRule.objects.all()
serializer_class = ImplementRuleSerializer
search_fields = ['name', 'code', 'cert_field']
- filterset_fields = ['pv_scope', 'cert_field']
+ filterset_fields = ['pv_scope', 'cert_field', 'cert_field__code']
ordering = ['-create_time']
def get_serializer_class(self):
diff --git a/server/apps/employee/migrations/0005_auto_20200713_1143.py b/server/apps/employee/migrations/0005_auto_20200713_1143.py
new file mode 100644
index 0000000..02be74a
--- /dev/null
+++ b/server/apps/employee/migrations/0005_auto_20200713_1143.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.7 on 2020-07-13 03:43
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('system', '0022_auto_20200710_1535'),
+ ('employee', '0004_auto_20200710_1535'),
+ ]
+
+ operations = [
+ migrations.AlterUniqueTogether(
+ name='qualification',
+ unique_together={('employee', 'cert_field')},
+ ),
+ ]
diff --git a/server/apps/employee/migrations/0006_auto_20200713_1639.py b/server/apps/employee/migrations/0006_auto_20200713_1639.py
new file mode 100644
index 0000000..52a7ddd
--- /dev/null
+++ b/server/apps/employee/migrations/0006_auto_20200713_1639.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.0.7 on 2020-07-13 08:39
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('employee', '0005_auto_20200713_1143'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='historicalqualification',
+ name='remark',
+ field=models.TextField(blank=True, null=True, verbose_name='备注'),
+ ),
+ migrations.AlterField(
+ model_name='qualification',
+ name='remark',
+ field=models.TextField(blank=True, null=True, verbose_name='备注'),
+ ),
+ ]
diff --git a/server/apps/employee/migrations/0007_auto_20200713_1644.py b/server/apps/employee/migrations/0007_auto_20200713_1644.py
new file mode 100644
index 0000000..674df68
--- /dev/null
+++ b/server/apps/employee/migrations/0007_auto_20200713_1644.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.0.7 on 2020-07-13 08:44
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('employee', '0006_auto_20200713_1639'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='historicalqualification',
+ name='publish_number',
+ field=models.CharField(blank=True, max_length=200, null=True, verbose_name='文号'),
+ ),
+ migrations.AlterField(
+ model_name='qualification',
+ name='publish_number',
+ field=models.CharField(blank=True, max_length=200, null=True, verbose_name='文号'),
+ ),
+ ]
diff --git a/server/apps/employee/migrations/0008_auto_20200713_1741.py b/server/apps/employee/migrations/0008_auto_20200713_1741.py
new file mode 100644
index 0000000..b2be727
--- /dev/null
+++ b/server/apps/employee/migrations/0008_auto_20200713_1741.py
@@ -0,0 +1,21 @@
+# Generated by Django 3.0.7 on 2020-07-13 09:41
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('employee', '0007_auto_20200713_1644'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='qualification',
+ name='is_enabled',
+ field=models.BooleanField(default=True, verbose_name='是否有效'),
+ ),
+ migrations.DeleteModel(
+ name='HistoricalQualification',
+ ),
+ ]
diff --git a/server/apps/employee/migrations/0009_auto_20200715_0924.py b/server/apps/employee/migrations/0009_auto_20200715_0924.py
new file mode 100644
index 0000000..fb37e14
--- /dev/null
+++ b/server/apps/employee/migrations/0009_auto_20200715_0924.py
@@ -0,0 +1,34 @@
+# Generated by Django 3.0.7 on 2020-07-15 01:24
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('system', '0022_auto_20200710_1535'),
+ ('employee', '0008_auto_20200713_1741'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='ability',
+ name='qualification',
+ ),
+ migrations.RemoveField(
+ model_name='historicalability',
+ name='qualification',
+ ),
+ migrations.AlterUniqueTogether(
+ name='qualification',
+ unique_together={('employee', 'cert_field', 'is_enabled')},
+ ),
+ migrations.RemoveField(
+ model_name='qualification',
+ name='major_rules',
+ ),
+ migrations.RemoveField(
+ model_name='qualification',
+ name='majors',
+ ),
+ ]
diff --git a/server/apps/employee/migrations/0010_delete_historicalability.py b/server/apps/employee/migrations/0010_delete_historicalability.py
new file mode 100644
index 0000000..7493e29
--- /dev/null
+++ b/server/apps/employee/migrations/0010_delete_historicalability.py
@@ -0,0 +1,16 @@
+# Generated by Django 3.0.7 on 2020-07-15 02:16
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('employee', '0009_auto_20200715_0924'),
+ ]
+
+ operations = [
+ migrations.DeleteModel(
+ name='HistoricalAbility',
+ ),
+ ]
diff --git a/server/apps/employee/migrations/0011_auto_20200715_1648.py b/server/apps/employee/migrations/0011_auto_20200715_1648.py
new file mode 100644
index 0000000..e0aa390
--- /dev/null
+++ b/server/apps/employee/migrations/0011_auto_20200715_1648.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.0.7 on 2020-07-15 08:48
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('employee', '0010_delete_historicalability'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='ability',
+ name='remark',
+ field=models.TextField(null=True, verbose_name='备注'),
+ ),
+ migrations.AlterField(
+ model_name='qualification',
+ name='is_paused',
+ field=models.BooleanField(default=False, verbose_name='是否暂停审核资格'),
+ ),
+ ]
diff --git a/server/apps/employee/migrations/0012_auto_20200716_1200.py b/server/apps/employee/migrations/0012_auto_20200716_1200.py
new file mode 100644
index 0000000..0622c28
--- /dev/null
+++ b/server/apps/employee/migrations/0012_auto_20200716_1200.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.7 on 2020-07-16 04:00
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('employee', '0011_auto_20200715_1648'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='education',
+ name='remark',
+ field=models.TextField(null=True, verbose_name='备注'),
+ ),
+ ]
diff --git a/server/apps/employee/models.py b/server/apps/employee/models.py
index 224f43b..0957704 100644
--- a/server/apps/employee/models.py
+++ b/server/apps/employee/models.py
@@ -60,18 +60,15 @@ class Qualification(CommonAModel):
expiration_date = models.DateField('到期日期')
auditor_type = models.ForeignKey(
Dict, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='资格类型',related_name='qualification_auditor_type')
- publish_number = models.CharField('文号', max_length=200, unique=True)
- remark = models.TextField('备注')
- majors = models.ManyToManyField(
- Dict, verbose_name='注册专业', through='ability', through_fields=('qualification', 'major'))
- major_rules = models.ManyToManyField(
- ImplementRule, verbose_name='注册专业(ccc)', through='ability', through_fields=('qualification', 'major_rule'),)
- is_paused = models.BooleanField('是否暂停', default=False)
- history = HistoricalRecords()
+ publish_number = models.CharField('文号', max_length=200, null=True, blank=True)
+ remark = models.TextField('备注',null=True,blank=True)
+ is_paused = models.BooleanField('是否暂停审核资格', default=False)
+ is_enabled = models.BooleanField('是否有效', default=True)
class Meta:
verbose_name = '注册资格'
verbose_name_plural = verbose_name
+ unique_together = ('employee', 'cert_field', 'is_enabled')
def __str__(self):
return self.cert_number
@@ -82,14 +79,12 @@ class Ability(CommonAModel):
能力表
"""
employee = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='ability_employee')
- qualification = models.ForeignKey(
- Qualification, on_delete=models.SET_NULL, null=True, blank=True, related_name='ability_qualification')
cert_field = models.ForeignKey(
Dict, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='认证领域', related_name='ability_cert_field')
afrom = models.ForeignKey(
Dict, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='能力来源', related_name='ability_afrom')
access_date = models.DateField('评定时间')
- remark = models.TextField('备注')
+ remark = models.TextField('备注', null=True)
major = models.ForeignKey(
Dict, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='专业代码', related_name='ability_major')
major_rule = models.ForeignKey(
@@ -97,7 +92,6 @@ class Ability(CommonAModel):
auditor_abilitys = models.ManyToManyField(
Dict, verbose_name='能力项', related_name='ability_auditor_abilitys')
is_paused = models.BooleanField('是否暂停', default=False)
- history = HistoricalRecords()
class Meta:
verbose_name = '专业能力'
@@ -123,7 +117,7 @@ class Education(CommonAModel):
major = models.CharField('所学专业', max_length=200)
level = models.ForeignKey(
Dict, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='文化程度', related_name='education_level')
- remark = models.TextField('备注')
+ remark = models.TextField('备注', null=True)
class Meta:
verbose_name = '教育经历'
diff --git a/server/apps/employee/serializers.py b/server/apps/employee/serializers.py
index 2cb872a..c6e0b0e 100644
--- a/server/apps/employee/serializers.py
+++ b/server/apps/employee/serializers.py
@@ -3,7 +3,7 @@ from rest_framework import serializers
from .models import *
from apps.system.serializers import DictSerializer, UserListSerializer
-
+from apps.certset.serializers import ImplementRuleSerializer
class EmployeeSerializer(serializers.ModelSerializer):
"""
@@ -20,26 +20,74 @@ class EmployeeSerializer(serializers.ModelSerializer):
queryset = queryset.select_related('user')
return queryset
+class EmployeeUpdateSerializer(serializers.ModelSerializer):
+ """
+ update序列化
+ """
+ class Meta:
+ model = Employee
+ exclude = ['user']
+
class QualificationSerializer(serializers.ModelSerializer):
"""
普通序列化
"""
+ cert_field_ = DictSerializer(source='cert_field', read_only=True)
+ auditor_type_ = DictSerializer(source='auditor_type', read_only=True)
class Meta:
model = Qualification
fields = '__all__'
+
+ @staticmethod
+ def setup_eager_loading(queryset):
+ """ Perform necessary eager loading of data. """
+ queryset = queryset.select_related('cert_field', 'auditor_type')
+ return queryset
class AbilitySerializer(serializers.ModelSerializer):
"""
普通序列化
"""
+ cert_field_ = DictSerializer(source='cert_field', read_only=True)
+ major_ = DictSerializer(source='major', read_only=True)
+ major_rule_code = serializers.StringRelatedField(source='major_rule')
+ afrom_ = DictSerializer(source='afrom', read_only=True)
+ auditor_abilitys_ = DictSerializer(source='auditor_abilitys', read_only=True, many = True)
class Meta:
model = Ability
fields = '__all__'
+
+ # def get_auditor_abilitys_(self, obj):
+ # return obj.auditor_abilitys.order_by('sort').values_list('name', flat=True)
+
+ @staticmethod
+ def setup_eager_loading(queryset):
+ """ Perform necessary eager loading of data. """
+ queryset = queryset.select_related('cert_field', 'major', 'afrom', 'major_rule')
+ queryset = queryset.prefetch_related('auditor_abilitys',)
+ return queryset
+
+
+ def save(self, **kwargs):
+ validated_data = dict(
+ list(self.validated_data.items()) +
+ list(kwargs.items())
+ )
+ if validated_data['cert_field'] and validated_data['cert_field'].code == 'CCC':
+ validated_data['major'] = None
+ else:
+ validated_data['major_rule'] = None
+ if self.instance is not None:
+ self.instance = self.update(self.instance, validated_data)
+ else:
+ self.instance = self.create(validated_data)
+ return self.instance
class EducationSerializer(serializers.ModelSerializer):
"""
普通序列化
"""
+ level_ = DictSerializer(source='level', read_only=True)
class Meta:
model = Education
fields = '__all__'
diff --git a/server/apps/employee/views.py b/server/apps/employee/views.py
index 625942a..f48b6d2 100644
--- a/server/apps/employee/views.py
+++ b/server/apps/employee/views.py
@@ -17,6 +17,12 @@ class EmployeeViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet):
filterset_fields = ['is_onjob', 'is_fulltime']
ordering = ['-create_time']
+ def get_serializer_class(self):
+ if self.action == 'update':
+ return EmployeeUpdateSerializer
+ else:
+ return self.serializer_class
+
class QualificationViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet):
"""
注册资格-增删改查
@@ -25,8 +31,8 @@ class QualificationViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelView
'put': 'qucalification_update', 'delete': 'qucalification_delete'}
queryset = Qualification.objects.all()
serializer_class = QualificationSerializer
- search_fields = ['cert_number']
- filterset_fields = ['auditor_type']
+ search_fields = ['cert_number', 'auditor_type__name']
+ filterset_fields = ['auditor_type', 'cert_field', 'is_enabled']
ordering = ['-create_time']
class AbilityViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet):
@@ -37,7 +43,7 @@ class AbilityViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet):
'put': 'ability_update', 'delete': 'ability_delete'}
queryset = Ability.objects.all()
serializer_class = AbilitySerializer
- # search_fields = ['name', 'code', 'status', 'implement_date']
+ search_fields = ['major__code', 'major_rule__code']
filterset_fields = ['major', 'major_rule', 'auditor_abilitys']
ordering = ['-create_time']
diff --git a/server/apps/system/migrations/0023_auto_20200715_1608.py b/server/apps/system/migrations/0023_auto_20200715_1608.py
new file mode 100644
index 0000000..d4b0c52
--- /dev/null
+++ b/server/apps/system/migrations/0023_auto_20200715_1608.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.0.7 on 2020-07-15 08:08
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('system', '0022_auto_20200710_1535'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='dict',
+ name='is_used',
+ field=models.BooleanField(default=True, verbose_name='是否有效'),
+ ),
+ migrations.AddField(
+ model_name='historicaldict',
+ name='is_used',
+ field=models.BooleanField(default=True, verbose_name='是否有效'),
+ ),
+ ]
diff --git a/server/apps/system/migrations/0024_auto_20200716_0927.py b/server/apps/system/migrations/0024_auto_20200716_0927.py
new file mode 100644
index 0000000..ef7bf9f
--- /dev/null
+++ b/server/apps/system/migrations/0024_auto_20200716_0927.py
@@ -0,0 +1,27 @@
+# Generated by Django 3.0.7 on 2020-07-16 01:27
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('system', '0023_auto_20200715_1608'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='dict',
+ name='fullname',
+ field=models.CharField(blank=True, max_length=1000, null=True, verbose_name='全名'),
+ ),
+ migrations.AddField(
+ model_name='historicaldict',
+ name='fullname',
+ field=models.CharField(blank=True, max_length=1000, null=True, verbose_name='全名'),
+ ),
+ migrations.AlterUniqueTogether(
+ name='dict',
+ unique_together={('name', 'is_used', 'type')},
+ ),
+ ]
diff --git a/server/apps/system/models.py b/server/apps/system/models.py
index f400616..58594e4 100644
--- a/server/apps/system/models.py
+++ b/server/apps/system/models.py
@@ -149,6 +149,7 @@ class Dict(SoftModel):
"""
name = models.CharField('名称', max_length=1000)
code = models.CharField('编号', max_length=30, null=True, blank=True)
+ fullname = models.CharField('全名', max_length=1000, null=True, blank=True)
description = models.TextField('描述', blank=True, null=True)
other = JSONField('其它信息', blank=True, null=True)
type = models.ForeignKey(
@@ -156,16 +157,24 @@ class Dict(SoftModel):
sort = models.IntegerField('排序', default=1)
parent = models.ForeignKey('self', null=True, blank=True,
on_delete=models.SET_NULL, verbose_name='父')
+ is_used = models.BooleanField('是否有效', default=True)
history = HistoricalRecords()
class Meta:
verbose_name = '字典'
verbose_name_plural = verbose_name
- unique_together = ('name', 'code', 'type')
+ unique_together = ('name', 'is_used', 'type')
def __str__(self):
return self.name
+ def save(self, *args, **kwargs):
+ """
+ 冗余一个字段,方便调用
+ """
+ if self.code and self.code not in self.name:
+ self.fullname = self.code + '-' + self.name
+ super().save(*args, **kwargs)
class CommonAModel(SoftModel):
"""
diff --git a/server/apps/system/permission_data.py b/server/apps/system/permission_data.py
index 5f75f9d..8b7d20f 100644
--- a/server/apps/system/permission_data.py
+++ b/server/apps/system/permission_data.py
@@ -5,7 +5,7 @@ from apps.system.mixins import CreateUpdateModelBMixin
from utils.queryset import get_child_queryset2
-class RbacFilterSet(CreateUpdateModelBMixin, GenericAPIView):
+class RbacFilterSet(CreateUpdateModelBMixin, object):
"""
数据权限控权返回的queryset
在必须的View下继承
diff --git a/server/apps/system/serializers.py b/server/apps/system/serializers.py
index da5b580..8c25ac8 100644
--- a/server/apps/system/serializers.py
+++ b/server/apps/system/serializers.py
@@ -30,15 +30,15 @@ class DictSerializer(serializers.ModelSerializer):
"""
数据字典序列化
"""
- fullname = serializers.SerializerMethodField(read_only=True)
+ # fullname = serializers.SerializerMethodField(read_only=True)
class Meta:
model = Dict
fields = '__all__'
- def get_fullname(self, obj):
- if obj.code:
- return obj.code + obj.name
- return obj.name
+ # def get_fullname(self, obj):
+ # if (obj.code) and (obj.code not in obj.name):
+ # return obj.code + obj.name
+ # return obj.name
class PositionSerializer(serializers.ModelSerializer):
"""
diff --git a/server/apps/system/views.py b/server/apps/system/views.py
index 88812b4..5d604d3 100644
--- a/server/apps/system/views.py
+++ b/server/apps/system/views.py
@@ -74,7 +74,8 @@ class DictViewSet(ModelViewSet):
"""
perms_map = {'get': '*', 'post': 'dict_create',
'put': 'dict_update', 'delete': 'dict_delete'}
- queryset = Dict.objects.get_queryset(all=True) # 获取全部的,包括软删除的
+ # queryset = Dict.objects.get_queryset(all=True) # 获取全部的,包括软删除的
+ queryset = Dict.objects.all()
filterset_fields = ['type', 'is_deleted', 'type__code']
serializer_class = DictSerializer
search_fields = ['name']
@@ -87,11 +88,15 @@ class DictViewSet(ModelViewSet):
"""
if self.paginator is None:
return None
- if (not self.request.query_params.get('page', None)) and ((self.request.query_params.get('type__code', None)) or (self.request.query_params.get('type', None))):
+ elif (not self.request.query_params.get('page', None)) and ((self.request.query_params.get('type__code', None)) or (self.request.query_params.get('type', None))):
return None
return self.paginator.paginate_queryset(queryset, self.request, view=self)
-
+ @action(methods=['get'], detail=False, permission_classes=[], authentication_classes=[],url_name='correct_dict')
+ def correct(self, request, pk=None):
+ for i in Dict.objects.all():
+ i.save()
+ return Response(status=status.HTTP_200_OK)
class PositionViewSet(ModelViewSet):
"""