cma_search/server/apps/system/models.py

264 lines
9.4 KiB
Python

from django.db import models
from django.contrib.auth.models import AbstractUser
import django.utils.timezone as timezone
from django.db.models.query import QuerySet
from utils.model import SoftModel, BaseModel
class Province(models.Model):
id = models.CharField('id', primary_key=True, max_length=20)
name = models.CharField(max_length=20)
class City(models.Model):
id = models.CharField('id', primary_key=True, max_length=20)
name = models.CharField(max_length=20)
parent = models.ForeignKey(Province, on_delete=models.CASCADE)
class Position(BaseModel):
"""
职位/岗位
"""
name = models.CharField('名称', max_length=32, unique=True)
desc = models.CharField('描述', max_length=50, blank=True, null=True)
class Meta:
verbose_name = '职位/岗位'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Permission(SoftModel):
"""
功能权限:目录,菜单,接口
"""
menu_type_choices = (
('目录', '目录'),
('菜单', '菜单'),
('接口', '接口')
)
name = models.CharField('名称', max_length=30)
type = models.CharField('类型', max_length=20,
choices=menu_type_choices, default='接口')
is_frame = models.BooleanField('外部链接', default=False)
sort = models.IntegerField('排序标记', default=1)
pid = models.ForeignKey('self', null=True, blank=True,
on_delete=models.SET_NULL, verbose_name='')
method = models.CharField('方法/代号', max_length=50,
unique=True, null=True, blank=True)
def __str__(self):
return self.name
class Meta:
verbose_name = '功能权限表'
verbose_name_plural = verbose_name
ordering = ['sort']
class Organization(SoftModel):
"""
组织架构
"""
name = models.CharField('名称', max_length=60)
full_name = models.CharField('全称', max_length=100, null=True, blank=True)
type = models.ForeignKey('system.dict', verbose_name='组织类型', null=True, blank=True, on_delete=models.SET_NULL)
pid = models.ForeignKey('self', null=True, blank=True,
on_delete=models.SET_NULL, verbose_name='')
sort = models.CharField('排序', null=True, blank=True, max_length=100)
can_supervision = models.BooleanField('是否可监督', default=False)
service = models.TextField('提供服务', null=True, blank=True)
class Meta:
verbose_name = '组织架构'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Role(SoftModel):
"""
角色
"""
data_type_choices = (
('全部', '全部'),
('自定义', '自定义'),
('同级及以下', '同级及以下'),
('本级及以下', '本级及以下'),
('本级', '本级'),
('仅本人', '仅本人')
)
name = models.CharField('角色', max_length=32, unique=True)
perms = models.ManyToManyField(Permission, blank=True, verbose_name='功能权限')
datas = models.CharField('数据权限', max_length=50,
choices=data_type_choices, default='本级及以下')
depts = models.ManyToManyField(
Organization, blank=True, verbose_name='权限范围')
desc = models.CharField('描述', max_length=50, blank=True, null=True)
class Meta:
verbose_name = '角色'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class User(AbstractUser):
"""
用户
"""
name = models.CharField('姓名', max_length=20, null=True, blank=True)
phone = models.CharField('手机号码', max_length=11,
null=True, blank=True, unique=True)
avatar = models.CharField(
'头像', default='/media/default/avatar.png', max_length=1000, null=True, blank=True)
dept = models.ForeignKey(
Organization, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='组织')
position = models.ManyToManyField(Position, blank=True, verbose_name='岗位')
superior = models.ForeignKey(
'self', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='上级主管')
roles = models.ManyToManyField(Role, blank=True, verbose_name='角色')
class Meta:
verbose_name = '用户信息'
verbose_name_plural = verbose_name
ordering = ['id']
def __str__(self):
return self.username
class DictType(SoftModel):
"""
数据字典类型
"""
name = models.CharField('名称', max_length=30)
code = models.CharField('代号', unique=True, max_length=30)
pid = models.ForeignKey('self', null=True, blank=True,
on_delete=models.SET_NULL, verbose_name='')
class Meta:
verbose_name = '字典类型'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Dict(SoftModel):
"""
数据字典
"""
name = models.CharField('名称', max_length=30, unique=True)
code = models.CharField('代码', max_length=30, null=True, blank=True)
desc = models.TextField('描述', blank=True, null=True)
type = models.ForeignKey(
DictType, on_delete=models.CASCADE, verbose_name='类型')
sort = models.IntegerField('排序', default=1)
pid = models.ForeignKey('self', null=True, blank=True,
on_delete=models.SET_NULL, verbose_name='')
is_used = models.BooleanField('是否有效', default=True)
class Meta:
verbose_name = '字典'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class CommonADModel(BaseModel):
"""
业务用基本表A,包含create_by, update_by字段,物理删除
"""
create_by = models.ForeignKey(
User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='创建人', related_name='%(class)s_create_by')
update_by = models.ForeignKey(
User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='最后编辑人', related_name='%(class)s_update_by')
class Meta:
abstract = True
class CommonAModel(SoftModel):
"""
业务用基本表A,包含create_by, update_by字段
"""
create_by = models.ForeignKey(
User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='创建人', related_name='%(class)s_create_by')
update_by = models.ForeignKey(
User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='最后编辑人', related_name='%(class)s_update_by')
class Meta:
abstract = True
class CommonBModel(SoftModel):
"""
业务用基本表B,包含create_by, update_by, belong_dept字段
"""
create_by = models.ForeignKey(
User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='创建人', related_name='%(class)s_create_by')
update_by = models.ForeignKey(
User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='最后编辑人', related_name='%(class)s_update_by')
belong_dept = models.ForeignKey(
Organization, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='所属部门', related_name='%(class)s_belong_dept')
class Meta:
abstract = True
class CommonBDModel(BaseModel):
"""
业务用基本表B,包含create_by, update_by, belong_dept字段,物理删除
"""
create_by = models.ForeignKey(
User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='创建人', related_name='%(class)s_create_by')
update_by = models.ForeignKey(
User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='最后编辑人', related_name='%(class)s_update_by')
belong_dept = models.ForeignKey(
Organization, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='所属部门', related_name='%(class)s_belong_dept')
class Meta:
abstract = True
class File(CommonAModel):
"""
文件存储表,业务表根据具体情况选择是否外键关联
"""
name = models.CharField('名称', max_length=200, null=True, blank=True)
size = models.IntegerField('文件大小', default=1, null=True, blank=True)
file = models.FileField('文件', upload_to='%Y/%m/%d/')
type_choices = (
('文档', '文档'),
('视频', '视频'),
('音频', '音频'),
('图片', '图片'),
('其它', '其它')
)
mime = models.CharField('文件格式', max_length=200, null=True, blank=True)
type = models.CharField('文件类型', max_length=200, choices=type_choices, default='文档')
path = models.CharField('地址', max_length=2000, null=True, blank=True)
class Meta:
verbose_name = '文件库'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Message(BaseModel):
mail = models.CharField('发送邮箱', max_length=200)
msg = models.CharField('验证码', max_length=200)
class UserThird(models.Model):
"""
第三方账户
"""
type_choices = (
('wx_mp', '微信小程序'),
)
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='关联账户', related_name='third_user')
type = models.CharField('类型', max_length=50, choices=type_choices, default='wx_mp')
openid = models.CharField('第三方账号', max_length=200, unique=True)