|
@@ -0,0 +1,216 @@
|
|
|
+# coding=utf-8
|
|
|
+
|
|
|
+from django.db import models
|
|
|
+from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager, Group
|
|
|
+from django.utils import timezone
|
|
|
+from rest_framework.utils import model_meta
|
|
|
+
|
|
|
+from .consts import CONTENT_TYPE_SORTING, MENU_TO_MODEL
|
|
|
+from apps.system.models import SysLog
|
|
|
+from utils.exceptions import CustomError
|
|
|
+
|
|
|
+class Department(models.Model):
|
|
|
+ name = models.CharField(max_length=100, verbose_name=u"名称")
|
|
|
+ notes = models.CharField(max_length=500, verbose_name=u"备注",blank=True,null=True)
|
|
|
+ parent_id = models.IntegerField(verbose_name=u"父部门",null=True,blank=True)
|
|
|
+ lft = models.IntegerField(verbose_name=u"左值")
|
|
|
+ rgt = models.IntegerField(verbose_name=u"右值")
|
|
|
+
|
|
|
+ def __str__(self):
|
|
|
+ return self.name
|
|
|
+
|
|
|
+ def __unicode__(self):
|
|
|
+ return self.name
|
|
|
+
|
|
|
+ @staticmethod
|
|
|
+ def getById(id):
|
|
|
+ try:
|
|
|
+ id = int(id)
|
|
|
+ except:
|
|
|
+ raise CustomError(u'无效的部门ID')
|
|
|
+
|
|
|
+ instance = Department.objects.filter(pk=id).first()
|
|
|
+ if not instance:
|
|
|
+ raise CustomError(u'未找到相应的部门')
|
|
|
+ return instance
|
|
|
+
|
|
|
+ def getCompany(self):
|
|
|
+ instance = Department.objects.filter(parent_id__isnull=True, lft__lte=self.lft, rgt__gte=self.rgt).first()
|
|
|
+ if not instance:
|
|
|
+ raise CustomError(u'未找到部门所属的公司')
|
|
|
+ return instance
|
|
|
+
|
|
|
+ @staticmethod
|
|
|
+ def getLft(instance):
|
|
|
+ if instance:
|
|
|
+ return instance.lft
|
|
|
+ return 1
|
|
|
+
|
|
|
+ class Meta:
|
|
|
+ db_table = "staff_department"
|
|
|
+ verbose_name = u"部门管理"
|
|
|
+ ordering = ["parent_id", 'id']
|
|
|
+ default_permissions = ()
|
|
|
+ permissions = (
|
|
|
+ ("view_department", u"浏览"),
|
|
|
+ ("add_department", u"添加"),
|
|
|
+ ("edit_department", u"修改"),
|
|
|
+ ("delete_department", u"删除"),
|
|
|
+ )
|
|
|
+
|
|
|
+class UserManager(BaseUserManager):
|
|
|
+ def create_administrator(self, username, password=None, **extra_fields):
|
|
|
+ return self.create_user(User.ADMINSTRATOR, username, password, **extra_fields)
|
|
|
+
|
|
|
+ def create_staff(self, username, password=None, **extra_fields):
|
|
|
+ return self.create_user(User.STUDENT, username, password, **extra_fields)
|
|
|
+
|
|
|
+ def create_superuser(self, username, password, **extra_fields):
|
|
|
+ u = self.create_administrator(username, password, **extra_fields)
|
|
|
+ u.is_active = True
|
|
|
+ u.is_superuser = True
|
|
|
+ u.save(using=self._db)
|
|
|
+ return u
|
|
|
+
|
|
|
+ def create_user(self, type, username, password=None, **extra_fields):
|
|
|
+ if not username:
|
|
|
+ raise CustomError(u'请输入用户名!')
|
|
|
+ count = User.objects.filter(username=username).count()
|
|
|
+ if count > 0:
|
|
|
+ raise CustomError(u'该用户名已存在!')
|
|
|
+ user = self.model(
|
|
|
+ type=type,
|
|
|
+ username=username,
|
|
|
+ is_superuser=False,
|
|
|
+ last_login=timezone.now(),
|
|
|
+ **extra_fields
|
|
|
+ )
|
|
|
+
|
|
|
+ user.set_password(password)
|
|
|
+ user.save(using=self._db)
|
|
|
+ return user
|
|
|
+
|
|
|
+ def sort_perms(self, perms):
|
|
|
+ def get_index(app_label, model):
|
|
|
+ try:
|
|
|
+ return CONTENT_TYPE_SORTING.index('{}-{}'.format(app_label, model))
|
|
|
+ except:
|
|
|
+ return 9999
|
|
|
+
|
|
|
+ perms = perms.order_by('content_type__model', 'id')
|
|
|
+ perms = sorted(perms, key=lambda n: get_index(n.content_type.app_label, n.content_type.model))
|
|
|
+ return perms
|
|
|
+
|
|
|
+ def get_menuname_of_contenttype(self, app_label, model):
|
|
|
+ for menu in MENU_TO_MODEL:
|
|
|
+ val = '{}-{}'.format(app_label, model)
|
|
|
+ if val in menu[1]:
|
|
|
+ return menu[0]
|
|
|
+ return u'未分类'
|
|
|
+
|
|
|
+ def save_group(self, id, name, permissions, user):
|
|
|
+ name = name.strip(u' ')
|
|
|
+ # old_permissions = None
|
|
|
+ if id == None or id == '':
|
|
|
+ is_exist = Group.objects.filter(name=name).first()
|
|
|
+ if is_exist:
|
|
|
+ raise CustomError(u'名称为[%s]的权限组已存在' % name)
|
|
|
+ group = Group.objects.create(name=name)
|
|
|
+ SysLog.objects.addnew(user, SysLog.INSERT, u"添加权限组[%s],id=%d" % (group.name, group.id))
|
|
|
+ else:
|
|
|
+ is_exist = Group.objects.filter(name=name).exclude(pk=id).first()
|
|
|
+ if is_exist:
|
|
|
+ raise CustomError(u'名称为[%s]的权限组已存在' % name)
|
|
|
+ group = Group.objects.filter(pk=id).first()
|
|
|
+ if not group:
|
|
|
+ raise CustomError(u'未找到相应的权限组')
|
|
|
+ group.name = name
|
|
|
+ group.save()
|
|
|
+ # old_permissions = [p.id for p in group.permissions.all()]
|
|
|
+ SysLog.objects.addnew(user, SysLog.UPDATE, u"修改权限组[%s],id=%d" % (group.name, group.id))
|
|
|
+ group.permissions = permissions
|
|
|
+
|
|
|
+class User(AbstractBaseUser, PermissionsMixin):
|
|
|
+ ADMINSTRATOR = 1
|
|
|
+ STAFF = 2
|
|
|
+
|
|
|
+ type = models.PositiveSmallIntegerField(verbose_name=u"类型", editable=False)
|
|
|
+ department = models.ForeignKey(Department, verbose_name=u"所属部门", null=True, blank=True, on_delete=models.PROTECT)
|
|
|
+ username = models.CharField(verbose_name=u'帐号', max_length=30, unique=True, db_index=True)
|
|
|
+ is_active = models.BooleanField(verbose_name=u'激活', default=True)
|
|
|
+ date_joined = models.DateTimeField(verbose_name=u'注册时间', default=timezone.now, editable=False)
|
|
|
+
|
|
|
+ objects = UserManager()
|
|
|
+
|
|
|
+ USERNAME_FIELD = 'username'
|
|
|
+ REQUIRED_FIELDS = []
|
|
|
+
|
|
|
+ class Meta:
|
|
|
+ db_table = "staff_user"
|
|
|
+ verbose_name = u"账户管理"
|
|
|
+ unique_together = [
|
|
|
+ ('username')
|
|
|
+ ]
|
|
|
+ index_together = (
|
|
|
+ 'date_joined',
|
|
|
+ )
|
|
|
+ ordering = ['-id']
|
|
|
+ default_permissions = ()
|
|
|
+ permissions = (
|
|
|
+ ("view_user", u"浏览"),
|
|
|
+ ("add_user", u"添加"),
|
|
|
+ ("edit_user", u"修改"),
|
|
|
+ ("delete_user", u"删除"),
|
|
|
+ )
|
|
|
+
|
|
|
+ def __unicode__(self):
|
|
|
+ return self.username
|
|
|
+
|
|
|
+ def add_administrator(self):
|
|
|
+ self.type = self.type | self.ADMINSTRATOR
|
|
|
+
|
|
|
+ def add_staff(self):
|
|
|
+ self.type = self.type | self.STAFF
|
|
|
+
|
|
|
+ def is_staff(self):
|
|
|
+ if self.type & self.STAFF:
|
|
|
+ return True
|
|
|
+ return False
|
|
|
+
|
|
|
+ def is_administrator(self):
|
|
|
+ if self.type & self.ADMINSTRATOR:
|
|
|
+ return True
|
|
|
+ return False
|
|
|
+
|
|
|
+ def change_password(self, new_password, confirm_password, old_password):
|
|
|
+ if new_password != confirm_password:
|
|
|
+ raise CustomError(u'两次输入的密码不一致, 请检查')
|
|
|
+ if not self.check_password(old_password):
|
|
|
+ raise CustomError(u'原密码输入错误, 请检查')
|
|
|
+ self.set_password(new_password)
|
|
|
+
|
|
|
+ def update_item(self, validated_data):
|
|
|
+ def update():
|
|
|
+ info = model_meta.get_field_info(self)
|
|
|
+ for attr, value in validated_data.items():
|
|
|
+ if attr in info.relations and info.relations[attr].to_many:
|
|
|
+ field = getattr(self, attr)
|
|
|
+ field.set(value)
|
|
|
+ else:
|
|
|
+ setattr(self, attr, value)
|
|
|
+
|
|
|
+ if not 'username' in validated_data:
|
|
|
+ raise CustomError(u'用户名不能为空!')
|
|
|
+ count = User.objects.filter(username=validated_data['username']).exclude(id=self.id).count()
|
|
|
+ if count > 0:
|
|
|
+ raise CustomError(u'该用户名已存在!')
|
|
|
+
|
|
|
+ if not 'password' in validated_data or not validated_data['password']:
|
|
|
+ validated_data['password'] = self.password
|
|
|
+ update()
|
|
|
+ else:
|
|
|
+ update()
|
|
|
+ self.set_password(validated_data['password'])
|
|
|
+ self.save()
|
|
|
+ return self
|
|
|
+
|