models.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  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.STAFF, username, password, **extra_fields)
  55. def create_superuser(self, username, password, **extra_fields):
  56. extra_fields['name'] = username
  57. u = self.create_administrator(username, password, **extra_fields)
  58. u.is_active = True
  59. u.is_superuser = True
  60. u.save(using=self._db)
  61. return u
  62. def create_user(self, type, username, password=None, **extra_fields):
  63. if not username:
  64. raise CustomError(u'请输入用户名!')
  65. count = User.objects.filter(username=username).count()
  66. if count > 0:
  67. raise CustomError(u'该用户名已存在!')
  68. user = self.model(
  69. type=type,
  70. username=username,
  71. is_superuser=False,
  72. last_login=timezone.now(),
  73. **extra_fields
  74. )
  75. user.set_password(password)
  76. user.save(using=self._db)
  77. return user
  78. def sort_perms(self, perms):
  79. def get_index(app_label, model):
  80. try:
  81. return CONTENT_TYPE_SORTING.index('{}-{}'.format(app_label, model))
  82. except:
  83. return 9999
  84. perms = perms.order_by('content_type__model', 'id')
  85. perms = sorted(perms, key=lambda n: get_index(n.content_type.app_label, n.content_type.model))
  86. return perms
  87. def get_menuname_of_contenttype(self, app_label, model):
  88. for menu in MENU_TO_MODEL:
  89. val = '{}-{}'.format(app_label, model)
  90. if val in menu[1]:
  91. return menu[0]
  92. return u'未分类'
  93. def save_group(self, id, name, permissions, user):
  94. name = name.strip(u' ')
  95. # old_permissions = None
  96. if id == None or id == '':
  97. is_exist = Group.objects.filter(name=name).first()
  98. if is_exist:
  99. raise CustomError(u'名称为[%s]的权限组已存在' % name)
  100. group = Group.objects.create(name=name)
  101. SysLog.objects.addnew(user, SysLog.INSERT, u"添加权限组[%s],id=%d" % (group.name, group.id))
  102. else:
  103. is_exist = Group.objects.filter(name=name).exclude(pk=id).first()
  104. if is_exist:
  105. raise CustomError(u'名称为[%s]的权限组已存在' % name)
  106. group = Group.objects.filter(pk=id).first()
  107. if not group:
  108. raise CustomError(u'未找到相应的权限组')
  109. group.name = name
  110. group.save()
  111. # old_permissions = [p.id for p in group.permissions.all()]
  112. SysLog.objects.addnew(user, SysLog.UPDATE, u"修改权限组[%s],id=%d" % (group.name, group.id))
  113. group.permissions = permissions
  114. class User(AbstractBaseUser, PermissionsMixin):
  115. ADMINSTRATOR = 1
  116. STAFF = 2
  117. OFFLINE = 0
  118. ONLINE = 1
  119. STATUS_CHOICES = (
  120. (OFFLINE, u'离线'),
  121. (ONLINE, u'在线'),
  122. )
  123. type = models.PositiveSmallIntegerField(verbose_name=u"类型")
  124. department = models.ForeignKey(Department, verbose_name=u"所属部门", null=True, blank=True, on_delete=models.PROTECT)
  125. username = models.CharField(verbose_name=u'帐号', max_length=30, unique=True, db_index=True)
  126. name = models.CharField(verbose_name=u'姓名', max_length=30)
  127. is_active = models.BooleanField(verbose_name=u'激活', default=True, editable=False, blank=True)
  128. date_joined = models.DateTimeField(verbose_name=u'注册时间', default=timezone.now, editable=False)
  129. last_refresh = models.DateTimeField(verbose_name=u'刷新时间', null=True, editable=False)
  130. status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u"状态", default=OFFLINE)
  131. objects = UserManager()
  132. USERNAME_FIELD = 'username'
  133. REQUIRED_FIELDS = []
  134. class Meta:
  135. db_table = "staff_user"
  136. verbose_name = u"账户管理"
  137. unique_together = [
  138. ('username')
  139. ]
  140. index_together = (
  141. 'date_joined',
  142. )
  143. ordering = ['-id']
  144. default_permissions = ()
  145. permissions = (
  146. ("view_user", u"浏览"),
  147. ("add_user", u"添加"),
  148. ("edit_user", u"修改"),
  149. ("delete_user", u"删除"),
  150. )
  151. def __unicode__(self):
  152. return self.username
  153. def add_administrator(self):
  154. self.type = self.type | self.ADMINSTRATOR
  155. def add_staff(self):
  156. self.type = self.type | self.STAFF
  157. def is_staff(self):
  158. if self.type & self.STAFF:
  159. return True
  160. return False
  161. def is_administrator(self):
  162. if self.type & self.ADMINSTRATOR:
  163. return True
  164. return False
  165. def change_password(self, new_password, confirm_password, old_password):
  166. if new_password != confirm_password:
  167. raise CustomError(u'两次输入的密码不一致, 请检查')
  168. if not self.check_password(old_password):
  169. raise CustomError(u'原密码输入错误, 请检查')
  170. if len(new_password) < 6:
  171. raise CustomError(u'密码长度不能少于6位字符!')
  172. if new_password == self.username:
  173. raise CustomError(u'密码不能和用户名相同!')
  174. self.set_password(new_password)
  175. def update_item(self, validated_data):
  176. def update():
  177. info = model_meta.get_field_info(self)
  178. for attr, value in validated_data.items():
  179. if attr in info.relations and info.relations[attr].to_many:
  180. field = getattr(self, attr)
  181. field.set(value)
  182. else:
  183. setattr(self, attr, value)
  184. if not 'username' in validated_data:
  185. raise CustomError(u'用户名不能为空!')
  186. count = User.objects.filter(username=validated_data['username']).exclude(id=self.id).count()
  187. if count > 0:
  188. raise CustomError(u'该用户名已存在!')
  189. if not 'password' in validated_data or not validated_data['password']:
  190. validated_data['password'] = self.password
  191. update()
  192. else:
  193. if len(validated_data['password']) < 6:
  194. raise CustomError(u'密码长度不能少于6位字符!')
  195. if validated_data['password'] == validated_data['username']:
  196. raise CustomError(u'密码不能和用户名相同!')
  197. update()
  198. self.set_password(validated_data['password'])
  199. self.save()
  200. return self