diff --git a/apps/dpm/migrations/0001_initial.py b/apps/dpm/migrations/0001_initial.py index 395d9905..23e0d7db 100644 --- a/apps/dpm/migrations/0001_initial.py +++ b/apps/dpm/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.12 on 2023-03-09 05:09 +# Generated by Django 3.2.12 on 2024-06-06 06:46 from django.conf import settings from django.db import migrations, models @@ -12,27 +12,13 @@ class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('wf', '0001_initial'), ('am', '0003_alter_area_access_list'), - ('system', '0001_initial'), + ('system', '0004_auto_20240605_1011'), + ('django_celery_beat', '0016_alter_crontabschedule_timezone'), + ('wf', '0002_alter_state_filter_dept'), ] operations = [ - migrations.CreateModel( - name='CheckItem', - 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='删除标记')), - ('check_time', models.DateTimeField(blank=True, null=True, verbose_name='检查时间')), - ('result', models.PositiveSmallIntegerField(choices=[(10, '未检查'), (20, '合格'), (30, '不合格')], default=10, verbose_name='检查结果')), - ('note', models.TextField(blank=True, null=True, verbose_name='检查备注')), - ], - options={ - 'abstract': False, - }, - ), migrations.CreateModel( name='CheckTaskSet', fields=[ @@ -44,6 +30,8 @@ class Migration(migrations.Migration): ('expire', models.PositiveSmallIntegerField(default=0, help_text='0代表不设限制直到下个任务派发', verbose_name='执行有效期(h)')), ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checktaskset_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='checktaskset_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('myschedule', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.myschedule', verbose_name='周期')), + ('periodictask', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='checktask_periodictask', to='django_celery_beat.periodictask', verbose_name='关联定时任务')), ], options={ 'abstract': False, @@ -61,12 +49,11 @@ class Migration(migrations.Migration): ('type', models.PositiveSmallIntegerField(choices=[(10, '手动'), (20, '派发')], default=10, verbose_name='任务类型')), ('time_start', models.DateTimeField(verbose_name='开启时间')), ('time_end', models.DateTimeField(verbose_name='关闭时间')), - ('enabled', models.BooleanField(default=True, verbose_name='是否可用')), ('note', models.TextField(blank=True, null=True, verbose_name='检查备注')), - ('time_check', models.BooleanField(default=True, verbose_name='最后检查时间')), + ('time_check', models.DateTimeField(blank=True, null=True, verbose_name='开始检查时间')), ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checkwork_belong_dept', to='system.dept', verbose_name='所属部门')), ('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='system.dictionary', verbose_name='工作分类')), - ('checktaskset', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dpm.checktaskset', verbose_name='关联派发任务')), + ('checktaskset', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dpm.checktaskset', verbose_name='关联派发策略')), ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checkwork_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), ], options={ @@ -106,7 +93,7 @@ class Migration(migrations.Migration): ('name', models.TextField(verbose_name='项目/步骤')), ('level', models.PositiveSmallIntegerField(choices=[(10, '低风险'), (20, '一般风险'), (30, '较大风险'), (40, '重大风险')], default=10, verbose_name='风险等级')), ('standard', models.TextField(blank=True, null=True, verbose_name='检查标准')), - ('hazard', models.TextField(blank=True, null=True, verbose_name='危害因素')), + ('hazard_factors', models.TextField(blank=True, null=True, verbose_name='危害因素')), ('sort', models.PositiveSmallIntegerField(default=1, verbose_name='排序')), ('measure_tech', models.TextField(blank=True, null=True, verbose_name='工程技术措施')), ('measure_manage', models.TextField(blank=True, null=True, verbose_name='管理措施')), @@ -146,13 +133,9 @@ class Migration(migrations.Migration): ('correct_deadline', models.DateTimeField(blank=True, null=True, verbose_name='整改期限')), ('correct_description', models.TextField(blank=True, null=True, verbose_name='整改描述')), ('correct_time', models.DateTimeField(blank=True, null=True, verbose_name='整改完成时间')), - ('opinion_access', models.TextField(blank=True, null=True, verbose_name='评估意见')), - ('opinion_check', models.TextField(blank=True, null=True, verbose_name='复查意见')), - ('opinion_audit', models.TextField(blank=True, null=True, verbose_name='审核意见')), ('area', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='am.area', verbose_name='所在区域')), ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='hazard_belong_dept', to='system.dept', verbose_name='所属部门')), ('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='system.dictionary', verbose_name='隐患类别')), - ('checkitem', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='dpm.checkitem', verbose_name='关联检查条目')), ('checkwork', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='dpm.checkwork', verbose_name='关联检查工作')), ('correct_solution', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.file', verbose_name='整改方案')), ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='hazard_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), @@ -162,9 +145,6 @@ class Migration(migrations.Migration): ('photos_done', models.ManyToManyField(blank=True, related_name='hazard_photos_done', to='system.File', verbose_name='整改后照片')), ('ticket', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='hazard_ticket', to='wf.ticket', verbose_name='关联工单')), ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='hazard_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), - ('user_access', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hazard_user_access', to=settings.AUTH_USER_MODEL, verbose_name='评估人')), - ('user_audit', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hazard_user_audit', to=settings.AUTH_USER_MODEL, verbose_name='审核人')), - ('user_check', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hazard_user_check', to=settings.AUTH_USER_MODEL, verbose_name='复查人')), ('user_correct', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='hazard_user_correct', to=settings.AUTH_USER_MODEL, verbose_name='整改责任人')), ('user_discover', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hazard_user_discover', to=settings.AUTH_USER_MODEL, verbose_name='发现人')), ], @@ -187,4 +167,38 @@ class Migration(migrations.Migration): name='user_duty', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='指派人'), ), + migrations.AddField( + model_name='checktaskset', + name='riskpoint', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ctask_riskpoint', to='dpm.riskpoint', verbose_name='关联风险点'), + ), + migrations.AddField( + model_name='checktaskset', + name='update_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checktaskset_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'), + ), + migrations.AddField( + model_name='checktaskset', + name='user_duty', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='指派人'), + ), + migrations.CreateModel( + name='CheckItem', + 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='删除标记')), + ('result', models.PositiveSmallIntegerField(default=10, verbose_name='检查结果')), + ('note', models.TextField(blank=True, null=True, verbose_name='备注')), + ('checkwork', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='citem_checkwork', to='dpm.checkwork', verbose_name='关联检查工作')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checkitem_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('hazard', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='citem_hazard', to='dpm.hazard', verbose_name='关联隐患')), + ('risk', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='citem_risk', to='dpm.risk', verbose_name='关联风险')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checkitem_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), ] diff --git a/apps/dpm/migrations/0002_initial.py b/apps/dpm/migrations/0002_initial.py deleted file mode 100644 index ed1b4f8a..00000000 --- a/apps/dpm/migrations/0002_initial.py +++ /dev/null @@ -1,65 +0,0 @@ -# Generated by Django 3.2.12 on 2023-03-09 05:09 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('dpm', '0001_initial'), - ('system', '0002_myschedule'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('django_celery_beat', '0016_alter_crontabschedule_timezone'), - ] - - operations = [ - migrations.AddField( - model_name='checktaskset', - name='myschedule', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.myschedule', verbose_name='周期'), - ), - migrations.AddField( - model_name='checktaskset', - name='periodictask', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='checktask_periodictask', to='django_celery_beat.periodictask', verbose_name='关联定时任务'), - ), - migrations.AddField( - model_name='checktaskset', - name='riskpoint', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ctask_riskpoint', to='dpm.riskpoint', verbose_name='关联风险点'), - ), - migrations.AddField( - model_name='checktaskset', - name='update_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checktaskset_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'), - ), - migrations.AddField( - model_name='checktaskset', - name='user_duty', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='指派人'), - ), - migrations.AddField( - model_name='checkitem', - name='checkwork', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='citem_checkwork', to='dpm.checkwork', verbose_name='关联检查工作'), - ), - migrations.AddField( - model_name='checkitem', - name='create_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checkitem_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人'), - ), - migrations.AddField( - model_name='checkitem', - name='risk', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='citem_risk', to='dpm.risk', verbose_name='关联风险'), - ), - migrations.AddField( - model_name='checkitem', - name='update_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checkitem_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'), - ), - ] diff --git a/apps/dpm/models.py b/apps/dpm/models.py index c7feea62..19e6c6c0 100644 --- a/apps/dpm/models.py +++ b/apps/dpm/models.py @@ -30,7 +30,7 @@ class RiskPoint(CommonBModel): type = models.PositiveSmallIntegerField('风险点类型', default=10, choices=R_TYPE) manage_level = models.PositiveSmallIntegerField('管控层级', default=10, choices=R_M_LEVEL) dept_res = models.ForeignKey('system.dept', on_delete=models.SET_NULL, verbose_name='责任部门', related_name='riskpoint_dept_res', null=True, blank=True) - user_res = models.ForeignKey('system.user', on_delete=models.CASCADE, verbose_name='责任人', related_name='hazard_user_discover', null=True, blank=True) + user_res = models.ForeignKey('system.user', on_delete=models.CASCADE, verbose_name='责任人', related_name='riskpoint_user_res', null=True, blank=True) class Risk(CommonBModel): """ @@ -40,7 +40,7 @@ class Risk(CommonBModel): level = models.PositiveSmallIntegerField('风险等级', default=10, choices=RiskPoint.R_LEVEL) standard = models.TextField('检查标准', null=True, blank=True) hazard_factors = models.TextField('危害因素', null=True, blank=True) - results = models.ManyToManyField('system.dictionary', verbose_name='可能后果', related_name='risk_results', null=True) + results = models.ManyToManyField('system.dictionary', verbose_name='可能后果', related_name='risk_results', blank=True) sort = models.PositiveSmallIntegerField('排序', default=1) measure_tech = models.TextField('工程技术措施', null=True, blank=True) measure_manage = models.TextField('管理措施', null=True, blank=True) @@ -80,12 +80,11 @@ class CheckWork(CommonBModel): category = models.ForeignKey('system.dictionary', on_delete=models.CASCADE, verbose_name='工作分类', null=True, blank=True) time_start = models.DateTimeField('开启时间') time_end = models.DateTimeField('关闭时间') - enabled = models.BooleanField('是否可用', default=True) user_duty = models.ForeignKey('system.user', verbose_name='指派人', on_delete=models.SET_NULL, null=True, blank=True) riskpoint = models.ForeignKey(RiskPoint, verbose_name='关联风险点', related_name='cwork_riskpoint', on_delete=models.SET_NULL, null=True, blank=True) note = models.TextField('检查备注', null=True, blank=True) - time_check = models.BooleanField('最后检查时间', default=True) - checktaskset = models.ForeignKey(CheckTaskSet, verbose_name='关联派发任务', on_delete=models.CASCADE, null=True, blank=True) + time_check = models.DateTimeField('开始检查时间', null=True, blank=True) + checktaskset = models.ForeignKey(CheckTaskSet, verbose_name='关联派发策略', on_delete=models.CASCADE, null=True, blank=True) class Hazard(CommonBModel): @@ -110,7 +109,7 @@ class Hazard(CommonBModel): (30, '已结束') ) number = models.CharField('编号', max_length=20, null=True, blank=True) - checkwork = models.ForeignKey(CheckWork, verbose_name='关联检查工作', null=True, blank=True) + checkwork = models.ForeignKey(CheckWork, on_delete=models.SET_NULL, verbose_name='关联检查工作', null=True, blank=True) state = models.PositiveSmallIntegerField('隐患流程状态', default=10, choices=H_STATE) time_discover = models.DateTimeField('发现时间') dept_res = models.ForeignKey('system.dept', on_delete=models.SET_NULL, verbose_name='责任部门', related_name='hazard_dept_res', null=True, blank=True) @@ -123,11 +122,11 @@ class Hazard(CommonBModel): description = models.TextField('隐患描述', null=True, blank=True) reason = models.TextField('原因分析', null=True, blank=True) correct_measure = models.TextField('整改措施', null=True, blank=True) - correct_solution = models.ForeignKey('system.file', verbose_name='整改方案', null=True, blank=True) + correct_solution = models.ForeignKey('system.file', verbose_name='整改方案', on_delete=models.SET_NULL, null=True, blank=True) correct_deadline = models.DateTimeField('整改期限', null=True, blank=True) - photos = models.ManyToManyField('system.file', verbose_name='现场照片', related_name='hazard_photos', null=True) + photos = models.ManyToManyField('system.file', verbose_name='现场照片', related_name='hazard_photos', blank=True) correct_description = models.TextField('整改描述', null=True, blank=True) - photos_done = models.ManyToManyField('system.file', verbose_name='整改后照片', related_name='hazard_photos_done', null=True) + photos_done = models.ManyToManyField('system.file', verbose_name='整改后照片', related_name='hazard_photos_done', blank=True) dept_correct = models.ForeignKey('system.dept', on_delete=models.CASCADE, verbose_name='整改部门', related_name='hazard_dept_correct', null=True, blank=True) user_correct = models.ForeignKey('system.user', on_delete=models.SET_NULL, verbose_name='整改责任人', related_name='hazard_user_correct', null=True, blank=True) correct_time = models.DateTimeField('整改完成时间', null=True, blank=True) @@ -153,3 +152,4 @@ class CheckItem(CommonAModel): risk = models.ForeignKey(Risk, verbose_name='关联风险', related_name='citem_risk', on_delete=models.SET_NULL, null=True, blank=True) hazard = models.ForeignKey(Hazard, verbose_name='关联隐患', related_name='citem_hazard', on_delete=models.SET_NULL, null=True, blank=True) result = models.PositiveSmallIntegerField('检查结果', default=10) + note = models.TextField('备注', null=True, blank=True) diff --git a/apps/dpm/serializers.py b/apps/dpm/serializers.py index ab85d9bc..c4818914 100644 --- a/apps/dpm/serializers.py +++ b/apps/dpm/serializers.py @@ -15,6 +15,9 @@ class RiskPointCreateUpdateSerializer(CustomModelSerializer): class RiskPointSerializer(CustomModelSerializer): + area_name = serializers.CharField(source='area.name', read_only=True) + dept_res_name = serializers.CharField(source='dept_res.name', read_only=True) + user_res_name = serializers.CharField(source='user_res.name', read_only=True) class Meta: model = RiskPoint fields = '__all__' diff --git a/apps/dpm/views.py b/apps/dpm/views.py index 51c0fa30..d832c7bc 100644 --- a/apps/dpm/views.py +++ b/apps/dpm/views.py @@ -18,6 +18,7 @@ class RiskPointViewSet(CustomModelViewSet): class RiskViewSet(CustomModelViewSet): + perms_map = {"get": "*", "post": "riskpoint.update", "put": "riskpoint.update", "delete": "riskpoint.update"} queryset = Risk.objects.all() create_serializer_class = RiskCreateUpdateSerializer update_serializer_class = RiskCreateUpdateSerializer diff --git a/apps/system/serializers.py b/apps/system/serializers.py index f2c90bb9..eaddce82 100755 --- a/apps/system/serializers.py +++ b/apps/system/serializers.py @@ -441,7 +441,7 @@ class MyScheduleCreateSerializer(CustomModelSerializer): class MyScheduleSerializer(CustomModelSerializer): interval_ = IntervalScheduleSerializer(source='interval', read_only=True) - crontab = CrontabScheduleSerializer(source='crontab', read_only=True) + crontab_ = CrontabScheduleSerializer(source='crontab', read_only=True) class Meta: model = MySchedule diff --git a/apps/system/urls.py b/apps/system/urls.py index 83150314..d73542a2 100755 --- a/apps/system/urls.py +++ b/apps/system/urls.py @@ -3,7 +3,7 @@ from django.urls import path, include from .views import ApkViewSet, FileViewSet, PTaskViewSet, PTaskResultViewSet, PostRoleViewSet, TaskList, \ UserPostViewSet, UserViewSet, DeptViewSet, \ PermissionViewSet, RoleViewSet, PostViewSet, \ - DictTypeViewSet, DictViewSet, SysConfigView, SysBaseConfigView + DictTypeViewSet, DictViewSet, SysConfigView, SysBaseConfigView, MyScheduleViewSet from rest_framework import routers API_BASE_URL = 'api/system/' @@ -24,6 +24,7 @@ router.register('ptask_result', PTaskResultViewSet, basename="ptask_result") router.register('user_post', UserPostViewSet, basename='user_post') router.register('post_role', PostRoleViewSet, basename='post_role') router.register('apk', ApkViewSet, basename='apk') +router.register('myschedule', MyScheduleViewSet, basename='myschedule') router2 = routers.DefaultRouter() router2.register('file', FileViewSet, basename='file') diff --git a/apps/system/views.py b/apps/system/views.py index ed2b1517..86c7c3c5 100755 --- a/apps/system/views.py +++ b/apps/system/views.py @@ -686,8 +686,8 @@ class ApkViewSet(MyLoggingMixin, ListModelMixin, CreateModelMixin, GenericViewSe class MyScheduleViewSet(ListModelMixin, CreateModelMixin, DestroyModelMixin, CustomGenericViewSet): - perms_map = {'get': '*', 'post': 'myschedule.create', - 'delete': 'myschedule.delete'} + perms_map = {'get': '*', 'post': '*', + 'delete': '*'} serializer_class = MyScheduleSerializer create_serializer_class = MyScheduleCreateSerializer queryset = MySchedule.objects.all() diff --git a/apps/utils/models.py b/apps/utils/models.py index 10a43bd0..4add5eb4 100755 --- a/apps/utils/models.py +++ b/apps/utils/models.py @@ -62,13 +62,19 @@ class ParentModel(models.Model): def init_parent_link(self): link = [] if self.parent is not None: + if self.parent == self: + raise Exception(f'{self.__class__.__name__}-{self.id}-存在循环引用') link = [self.parent.id] # 一级 if self.parent.parent is not None: # 二级 + if self.parent.parent == self: + raise Exception(f'{self.__class__.__name__}-{self.id}-存在循环引用') link.insert(0, self.parent.parent.id) if self.parent.parent.parent is not None: # 三级 + if self.parent.parent.parent == self: + raise Exception(f'{self.__class__.__name__}-{self.id}-存在循环引用') link.insert(0, self.parent.parent.parent.id) if self.parent.parent.parent.parent is not None: - raise Exception('最多支持四级') + raise Exception(f'{self.__class__.__name__}-{self.id}-最多支持四级') return link def handle_parent(self, is_create:bool): @@ -81,7 +87,7 @@ class ParentModel(models.Model): 处理父级关系 """ self.parent_link = self.init_parent_link() - self.__class__.objects.get_queryset(all=True).filter(parent=self.id).update( + self.__class__.objects.filter(parent=self.id).update( parent_link = self.parent_link + [self.id] ) diff --git a/server/settings.py b/server/settings.py index 4aedb490..92604674 100755 --- a/server/settings.py +++ b/server/settings.py @@ -77,7 +77,8 @@ INSTALLED_APPS = [ 'apps.pum', 'apps.pm', 'apps.enp', - 'apps.edu' + 'apps.edu', + 'apps.dpm' ] MIDDLEWARE = [ diff --git a/server/urls.py b/server/urls.py index 4894df5c..2ef416a7 100755 --- a/server/urls.py +++ b/server/urls.py @@ -67,6 +67,7 @@ urlpatterns = [ path('', include('apps.pm.urls')), path('', include('apps.enp.urls')), path('', include('apps.edu.urls')), + path('', include('apps.dpm.urls')), # 前端页面入口 path('', TemplateView.as_view(template_name="index.html")),