models.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. # coding=utf-8
  2. from django.db import models
  3. from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager, Group
  4. from django.utils import timezone
  5. from rest_framework.utils import model_meta
  6. from .consts import CONTENT_TYPE_SORTING, MENU_TO_MODEL
  7. from apps.system.models import SysLog
  8. from utils.exceptions import CustomError
  9. class Department(models.Model):
  10. name = models.CharField(max_length=100, verbose_name=u"名称")
  11. notes = models.CharField(max_length=500, verbose_name=u"备注",blank=True,null=True)
  12. parent_id = models.IntegerField(verbose_name=u"父部门",null=True,blank=True)
  13. lft = models.IntegerField(verbose_name=u"左值")
  14. rgt = models.IntegerField(verbose_name=u"右值")
  15. def __str__(self):
  16. return self.name
  17. def __unicode__(self):
  18. return self.name
  19. @staticmethod
  20. def getById(id):
  21. try:
  22. id = int(id)
  23. except:
  24. raise CustomError(u'无效的部门ID')
  25. instance = Department.objects.filter(pk=id).first()
  26. if not instance:
  27. raise CustomError(u'未找到相应的部门')
  28. return instance
  29. def getCompany(self):
  30. instance = Department.objects.filter(parent_id__isnull=True, lft__lte=self.lft, rgt__gte=self.rgt).first()
  31. if not instance:
  32. raise CustomError(u'未找到部门所属的公司')
  33. return instance
  34. @staticmethod
  35. def getLft(instance):
  36. if instance:
  37. return instance.lft
  38. return 1
  39. class Meta:
  40. db_table = "staff_department"
  41. verbose_name = u"部门管理"
  42. ordering = ["parent_id", 'id']
  43. default_permissions = ()
  44. permissions = (
  45. ("view_department", u"浏览"),
  46. ("add_department", u"添加"),
  47. ("edit_department", u"修改"),
  48. ("delete_department", u"删除"),
  49. )
  50. class UserManager(BaseUserManager):
  51. def create_administrator(self, username, password=None, **extra_fields):
  52. return self.create_user(User.ADMINSTRATOR, username, password, **extra_fields)
  53. def create_staff(self, username, password=None, **extra_fields):
  54. return self.create_user(User.STUDENT, username, password, **extra_fields)
  55. def create_superuser(self, username, password, **extra_fields):
  56. u = self.create_administrator(username, password, **extra_fields)
  57. u.is_active = True
  58. u.is_superuser = True
  59. u.save(using=self._db)
  60. return u
  61. def create_user(self, type, username, password=None, **extra_fields):
  62. if not username:
  63. raise CustomError(u'请输入用户名!')
  64. count = User.objects.filter(username=username).count()
  65. if count > 0:
  66. raise CustomError(u'该用户名已存在!')
  67. user = self.model(
  68. type=type,
  69. username=username,
  70. is_superuser=False,
  71. last_login=timezone.now(),
  72. **extra_fields
  73. )
  74. user.set_password(password)
  75. user.save(using=self._db)
  76. return user
  77. def sort_perms(self, perms):
  78. def get_index(app_label, model):
  79. try:
  80. return CONTENT_TYPE_SORTING.index('{}-{}'.format(app_label, model))
  81. except:
  82. return 9999
  83. perms = perms.order_by('content_type__model', 'id')
  84. perms = sorted(perms, key=lambda n: get_index(n.content_type.app_label, n.content_type.model))
  85. return perms
  86. def get_menuname_of_contenttype(self, app_label, model):
  87. for menu in MENU_TO_MODEL:
  88. val = '{}-{}'.format(app_label, model)
  89. if val in menu[1]:
  90. return menu[0]
  91. return u'未分类'
  92. def save_group(self, id, name, permissions, user):
  93. name = name.strip(u' ')
  94. # old_permissions = None
  95. if id == None or id == '':
  96. is_exist = Group.objects.filter(name=name).first()
  97. if is_exist:
  98. raise CustomError(u'名称为[%s]的权限组已存在' % name)
  99. group = Group.objects.create(name=name)
  100. SysLog.objects.addnew(user, SysLog.INSERT, u"添加权限组[%s],id=%d" % (group.name, group.id))
  101. else:
  102. is_exist = Group.objects.filter(name=name).exclude(pk=id).first()
  103. if is_exist:
  104. raise CustomError(u'名称为[%s]的权限组已存在' % name)
  105. group = Group.objects.filter(pk=id).first()
  106. if not group:
  107. raise CustomError(u'未找到相应的权限组')
  108. group.name = name
  109. group.save()
  110. # old_permissions = [p.id for p in group.permissions.all()]
  111. SysLog.objects.addnew(user, SysLog.UPDATE, u"修改权限组[%s],id=%d" % (group.name, group.id))
  112. group.permissions = permissions
  113. class User(AbstractBaseUser, PermissionsMixin):
  114. ADMINSTRATOR = 1
  115. STAFF = 2
  116. type = models.PositiveSmallIntegerField(verbose_name=u"类型", editable=False)
  117. department = models.ForeignKey(Department, verbose_name=u"所属部门", null=True, blank=True, on_delete=models.PROTECT)
  118. username = models.CharField(verbose_name=u'帐号', max_length=30, unique=True, db_index=True)
  119. is_active = models.BooleanField(verbose_name=u'激活', default=True)
  120. date_joined = models.DateTimeField(verbose_name=u'注册时间', default=timezone.now, editable=False)
  121. objects = UserManager()
  122. USERNAME_FIELD = 'username'
  123. REQUIRED_FIELDS = []
  124. class Meta:
  125. db_table = "staff_user"
  126. verbose_name = u"账户管理"
  127. unique_together = [
  128. ('username')
  129. ]
  130. index_together = (
  131. 'date_joined',
  132. )
  133. ordering = ['-id']
  134. default_permissions = ()
  135. permissions = (
  136. ("view_user", u"浏览"),
  137. ("add_user", u"添加"),
  138. ("edit_user", u"修改"),
  139. ("delete_user", u"删除"),
  140. )
  141. def __unicode__(self):
  142. return self.username
  143. def add_administrator(self):
  144. self.type = self.type | self.ADMINSTRATOR
  145. def add_staff(self):
  146. self.type = self.type | self.STAFF
  147. def is_staff(self):
  148. if self.type & self.STAFF:
  149. return True
  150. return False
  151. def is_administrator(self):
  152. if self.type & self.ADMINSTRATOR:
  153. return True
  154. return False
  155. def change_password(self, new_password, confirm_password, old_password):
  156. if new_password != confirm_password:
  157. raise CustomError(u'两次输入的密码不一致, 请检查')
  158. if not self.check_password(old_password):
  159. raise CustomError(u'原密码输入错误, 请检查')
  160. self.set_password(new_password)
  161. def update_item(self, validated_data):
  162. def update():
  163. info = model_meta.get_field_info(self)
  164. for attr, value in validated_data.items():
  165. if attr in info.relations and info.relations[attr].to_many:
  166. field = getattr(self, attr)
  167. field.set(value)
  168. else:
  169. setattr(self, attr, value)
  170. if not 'username' in validated_data:
  171. raise CustomError(u'用户名不能为空!')
  172. count = User.objects.filter(username=validated_data['username']).exclude(id=self.id).count()
  173. if count > 0:
  174. raise CustomError(u'该用户名已存在!')
  175. if not 'password' in validated_data or not validated_data['password']:
  176. validated_data['password'] = self.password
  177. update()
  178. else:
  179. update()
  180. self.set_password(validated_data['password'])
  181. self.save()
  182. return self