From 121d6ec15cb3eb819dbb155f6f9bec00d387bcf6 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 7 Apr 2023 15:06:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=96=B9=E9=BB=91=E5=90=8D=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/rpm/migrations/0010_blacklist.py | 36 +++++++++++++++++++++++++++ apps/rpm/models.py | 8 ++++++ apps/rpm/serializers.py | 28 +++++++++++++++++++-- apps/rpm/urls.py | 3 ++- apps/rpm/views.py | 18 +++++++++++--- apps/utils/serializers.py | 1 + 6 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 apps/rpm/migrations/0010_blacklist.py diff --git a/apps/rpm/migrations/0010_blacklist.py b/apps/rpm/migrations/0010_blacklist.py new file mode 100644 index 00000000..53a47a2a --- /dev/null +++ b/apps/rpm/migrations/0010_blacklist.py @@ -0,0 +1,36 @@ +# Generated by Django 3.2.12 on 2023-04-07 01:32 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('system', '0002_myschedule'), + ('rpm', '0009_auto_20230323_1745'), + ] + + operations = [ + migrations.CreateModel( + name='BlackList', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=20, verbose_name='名称')), + ('number', models.CharField(max_length=50, verbose_name='信用代码')), + ('reason', models.TextField(verbose_name='原因')), + ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='blacklist_belong_dept', to='system.dept', verbose_name='所属部门')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='blacklist_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='blacklist_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/rpm/models.py b/apps/rpm/models.py index 0867e0df..231fb38d 100644 --- a/apps/rpm/models.py +++ b/apps/rpm/models.py @@ -24,6 +24,14 @@ class Rparty(CommonBModel): admin = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) +class BlackList(CommonBDModel): + """黑名单 + """ + name = models.CharField('名称', max_length=20) + number = models.CharField('信用代码', max_length=50) + reason = models.TextField('原因') + + class Rfile(CommonBDModel): """ 相关方文件库 diff --git a/apps/rpm/serializers.py b/apps/rpm/serializers.py index c97961b0..9afea63a 100644 --- a/apps/rpm/serializers.py +++ b/apps/rpm/serializers.py @@ -1,6 +1,6 @@ from apps.hrm.models import Employee -from apps.rpm.models import Rcertificate, Remployee, Rfile, Rparty, Rpjcertificate, Rpjfile, Rpjmember, Rpj +from apps.rpm.models import Rcertificate, Remployee, Rfile, Rparty, Rpjcertificate, Rpjfile, Rpjmember, Rpj, BlackList from apps.system.models import Dept from apps.system.services import sync_dahua_dept from apps.utils.constants import EXCLUDE_FIELDS @@ -17,6 +17,7 @@ from apps.wf.serializers import TicketSimpleSerializer from apps.rpm.services import rpj_member_come, rpj_certificate_in from apps.rpm.models import RpjLog from django.conf import settings +from django.db.models import Q class RpartyCreateUpdateSerializer(CustomModelSerializer): @@ -30,6 +31,8 @@ class RpartyCreateUpdateSerializer(CustomModelSerializer): @transaction.atomic def create(self, validated_data): + if BlackList.objects.filter(Q(name=validated_data['name'])|Q(number=validated_data['number'])).exists(): + raise ParseError('该相关方在黑名单中') dept = Dept() dept.name = validated_data['name'] dept.parent = validated_data['belong_dept'] @@ -330,4 +333,25 @@ class RpjfileSerializer(CustomModelSerializer): class RpjfileUpdateSerializer(CustomModelSerializer): class Meta: model = Rpjfile - fields = ['files'] \ No newline at end of file + fields = ['files'] + + +class BlackListCreateSerializer(CustomModelSerializer): + class Meta: + model = BlackList + fields = ['name', 'number', 'reason'] + + +class BlackListUpdateSerializer(CustomModelSerializer): + class Meta: + model = BlackList + fields = ['reason'] + + +class BlackListSerializer(CustomModelSerializer): + create_by_ = UserSimpleSerializer(source='create_by', read_only=True) + update_by_ = UserSimpleSerializer(source='update_by', read_only=True) + + class Meta: + model = BlackList + fields = '__all__' \ No newline at end of file diff --git a/apps/rpm/urls.py b/apps/rpm/urls.py index e53aed9c..5028be89 100644 --- a/apps/rpm/urls.py +++ b/apps/rpm/urls.py @@ -1,4 +1,4 @@ -from apps.rpm.views import (RcertificateViewSet, RpartyViewSet, RemployeeViewSet, RfileViewSet, RpjViewSet, +from apps.rpm.views import (RcertificateViewSet, RpartyViewSet, RemployeeViewSet, RfileViewSet, RpjViewSet, BlackListViewSet, RpjfileViewSet, RpjmemberViewSet, RpjLogViewSet) from django.urls import path, include from rest_framework.routers import DefaultRouter @@ -15,6 +15,7 @@ router.register('rpj', RpjViewSet, basename='rpj') router.register('rpj_member', RpjmemberViewSet, basename='rpj_member') router.register('rpj_log', RpjLogViewSet, basename='rpj_log') router.register('rpj_file', RpjfileViewSet, basename='rpj_file') +router.register('blacklist', BlackListViewSet, basename='blacklist') urlpatterns = [ path(API_BASE_URL, include(router.urls)), ] diff --git a/apps/rpm/views.py b/apps/rpm/views.py index 7dc2339a..5278e8b4 100644 --- a/apps/rpm/views.py +++ b/apps/rpm/views.py @@ -1,11 +1,12 @@ from apps.rpm.filters import RpjFilterSet -from apps.rpm.models import Rcertificate, Remployee, Rparty, Rfile, Rpjfile, Rpjmember, Rpj, RpjLog +from apps.rpm.models import Rcertificate, Remployee, Rparty, Rfile, Rpjfile, Rpjmember, Rpj, RpjLog, BlackList from apps.rpm.serializers import (RcertificateCreateUpdateSerializer, RcertificateSerializer, RemployeeCreateSerializer, RemployeeSerializer, RemployeeUpdateSerializer, RpartyAssignSerializer, RpartyCreateUpdateSerializer, RfileListSerializer, RpartySerializer, RpjListSerializer, RpjfileSerializer, RpjfileUpdateSerializer, RpjmemberCreateSerializer, RpjLogSerializer, - RpjCreateSerializer, RpjUpdateSerializer, RpjmemberSerializer, RpjmemberUpdateSerializer) + RpjCreateSerializer, RpjUpdateSerializer, RpjmemberSerializer, RpjmemberUpdateSerializer, + BlackListCreateSerializer, BlackListUpdateSerializer, BlackListSerializer) from apps.rpm.services import sync_to_rep, rpj_member_leave from apps.system.models import Dictionary, Post, User, UserPost from apps.system.serializers import UserCreateSerializer @@ -26,7 +27,7 @@ class RpartyViewSet(CustomModelViewSet): create_serializer_class = RpartyCreateUpdateSerializer update_serializer_class = RpartyCreateUpdateSerializer serializer_class = RpartySerializer - select_related_fields = ['admin', 'belong_dept'] + select_related_fields = ['admin', 'belong_dept', 'create_by'] search_fields = ['name'] data_filter = True @@ -192,6 +193,8 @@ class RpjViewSet(CustomModelViewSet): vdata['rparty'] = self.request.user.belong_dept.rparty if not vdata.get('rparty', None): raise ParseError('请指定相关方') + if BlackList.objects.filter(Q(name=vdata['rparty'].name)|Q(number=vdata['rparty'].number)).exists(): + raise ParseError('该相关方在黑名单中') if not vdata.get('belong_dept', None): vdata['belong_dept'] = vdata['rparty'].belong_dept ins = serializer.save() @@ -283,3 +286,12 @@ class RpjfileViewSet(UpdateModelMixin, DestroyModelMixin, ListModelMixin, Custom if obj.rpj.state != Rpj.RPJ_CREATE: raise ParseError('项目非创建状态不可删除') return super().destroy(request, *args, **kwargs) + + +class BlackListViewSet(CustomModelViewSet): + queryset = BlackList.objects.all() + create_serializer_class = BlackListCreateSerializer + update_serializer_class = BlackListUpdateSerializer + serializer_class = BlackListSerializer + select_related_fields = ['create_by', 'update_by'] + search_fields = ['name', 'number'] \ No newline at end of file diff --git a/apps/utils/serializers.py b/apps/utils/serializers.py index c3d128ff..39ac2b01 100755 --- a/apps/utils/serializers.py +++ b/apps/utils/serializers.py @@ -27,6 +27,7 @@ class CustomModelSerializer(DynamicFieldsMixin, serializers.ModelSerializer): if getattr(self.request, 'user', None): if getattr(self.Meta.model, 'create_by', None): validated_data['create_by'] = self.request.user + validated_data['update_by'] = self.request.user if 'belong_dept' in validated_data: pass elif getattr(self.request.user, 'belong_dept', None):