feat: base 增加parentmodel

This commit is contained in:
caoqianming 2024-06-05 10:24:38 +08:00
parent 2d7f1152ff
commit a590eb298b
3 changed files with 79 additions and 16 deletions

View File

@ -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=''),
),
]

View File

@ -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:

View File

@ -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: