diff --git a/apps/system/migrations/0004_auto_20240605_1011.py b/apps/system/migrations/0004_auto_20240605_1011.py new file mode 100644 index 00000000..42882cd7 --- /dev/null +++ b/apps/system/migrations/0004_auto_20240605_1011.py @@ -0,0 +1,53 @@ +# Generated by Django 3.2.12 on 2024-06-05 02:11 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0003_alter_permission_parent'), + ] + + operations = [ + migrations.RemoveField( + model_name='post', + name='parent', + ), + migrations.AddField( + model_name='dept', + name='parent_link', + field=models.JSONField(blank=True, default=list, editable=False, verbose_name='父级关联'), + ), + migrations.AddField( + model_name='dictionary', + name='parent_link', + field=models.JSONField(blank=True, default=list, editable=False, verbose_name='父级关联'), + ), + migrations.AddField( + model_name='dicttype', + name='parent_link', + field=models.JSONField(blank=True, default=list, editable=False, verbose_name='父级关联'), + ), + migrations.AddField( + model_name='permission', + name='parent_link', + field=models.JSONField(blank=True, default=list, editable=False, verbose_name='父级关联'), + ), + migrations.AlterField( + model_name='dept', + name='parent', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.dept', verbose_name='父'), + ), + migrations.AlterField( + model_name='dictionary', + name='parent', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.dictionary', verbose_name='父'), + ), + migrations.AlterField( + model_name='dicttype', + name='parent', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.dicttype', verbose_name='父'), + ), + ] diff --git a/apps/system/models.py b/apps/system/models.py index 155d2936..abad4aa8 100755 --- a/apps/system/models.py +++ b/apps/system/models.py @@ -1,7 +1,7 @@ from django.contrib.auth.models import UserManager from django.db import models from django.contrib.auth.models import AbstractUser -from apps.utils.models import CommonADModel, CommonAModel, CommonBModel, BaseModel, SoftDeletableManagerMixin +from apps.utils.models import ParentModel, CommonADModel, CommonAModel, CommonBModel, BaseModel, SoftDeletableManagerMixin from django_celery_beat.models import IntervalSchedule, CrontabSchedule @@ -13,7 +13,7 @@ class DataFilter(models.IntegerChoices): MYSELF = 60, '仅本人' -class Permission(BaseModel): +class Permission(ParentModel, BaseModel): """ 功能权限:目录,菜单,按钮 """ @@ -29,8 +29,6 @@ class Permission(BaseModel): type = models.PositiveSmallIntegerField( '类型', choices=menu_type_choices, default=30) sort = models.PositiveSmallIntegerField('排序标记', default=1) - parent = models.ForeignKey('self', null=True, blank=True, - on_delete=models.SET_NULL, verbose_name='父', db_constraint=False) codes = models.JSONField('权限标识', default=list, null=True, blank=True) def __str__(self): @@ -42,14 +40,12 @@ class Permission(BaseModel): ordering = ['sort'] -class Dept(CommonAModel): +class Dept(ParentModel, CommonAModel): """ 部门 """ name = models.CharField('名称', max_length=60) type = models.CharField('类型', max_length=20, default='dept') - parent = models.ForeignKey('self', null=True, blank=True, - on_delete=models.SET_NULL, verbose_name='父') sort = models.PositiveSmallIntegerField('排序标记', default=1) third_info = models.JSONField('三方系统信息', default=dict) @@ -61,7 +57,6 @@ class Dept(CommonAModel): def __str__(self): return self.name - class Role(CommonADModel): """ 角色 @@ -88,8 +83,6 @@ class Post(CommonADModel): name = models.CharField('名称', max_length=32) code = models.CharField('岗位标识', max_length=32, null=True, blank=True) description = models.CharField('描述', max_length=50, blank=True, null=True) - parent = models.ForeignKey('self', null=True, blank=True, - on_delete=models.SET_NULL, verbose_name='父') min_hour = models.PositiveSmallIntegerField('最小在岗时间', default=0) max_hour = models.PositiveSmallIntegerField('最长在岗时间', default=12) @@ -178,14 +171,12 @@ class UserPost(BaseModel): unique_together = ('user', 'post', 'dept') -class DictType(CommonAModel): +class DictType(ParentModel, CommonAModel): """ 数据字典类型 """ name = models.CharField('名称', max_length=30) code = models.CharField('标识', max_length=30) - parent = models.ForeignKey('self', null=True, blank=True, - on_delete=models.SET_NULL, verbose_name='父') class Meta: verbose_name = '字典类型' @@ -196,7 +187,7 @@ class DictType(CommonAModel): return self.name -class Dictionary(CommonAModel): +class Dictionary(ParentModel, CommonAModel): """ 数据字典 """ @@ -207,8 +198,6 @@ class Dictionary(CommonAModel): type = models.ForeignKey( DictType, on_delete=models.CASCADE, verbose_name='类型') sort = models.PositiveSmallIntegerField('排序', default=1) - parent = models.ForeignKey('self', null=True, blank=True, - on_delete=models.SET_NULL, verbose_name='父') is_used = models.BooleanField('是否有效', default=True) class Meta: diff --git a/apps/utils/models.py b/apps/utils/models.py index 3e724bab..66b406aa 100755 --- a/apps/utils/models.py +++ b/apps/utils/models.py @@ -53,6 +53,20 @@ class SoftDeletableManager(SoftDeletableManagerMixin, models.Manager): pass +class ParentModel(models.Model): + parent = models.ForeignKey('self', null=True, blank=True, + on_delete=models.SET_NULL, verbose_name='父', db_constraint=False) + parent_link = models.JSONField('父级关联', default=list, blank=True, editable=False) + + def handle_parent(self): + if hasattr(self, "parent_link") and self.parent: + new_link = self.parent.parent_link + new_link.append(self.parent.id) + self.parent_link = new_link + + class Meta: + abstract = True + class BaseModel(models.Model): """ 基本表 @@ -69,12 +83,19 @@ class BaseModel(models.Model): class Meta: abstract = True + def handle_parent(self): + pass + def save(self, *args, **kwargs) -> None: # 出现了雪花ID重复,不知道怎么处理,先这样异常处理一下;已经修改了snowflake, 以防万一, 这里依然保留 gen_id = False if not self.id: gen_id = True self.id = idWorker.get_id() + + # 处理父级 + self.handle_parent() + try: return super().save(*args, **kwargs) except IntegrityError as e: