models.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #coding=utf-8
  2. from django.db import models
  3. from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, Group, PermissionsMixin
  4. from django.utils import timezone
  5. from django.conf import settings
  6. from apps.exceptions import CustomError
  7. from apps.foundation.consts import CONTENT_TYPE_SORTING, MENU_TO_MODEL
  8. from apps.foundation.models import BizLog
  9. class UserManager(BaseUserManager):
  10. def sort_perms(self, perms):
  11. def get_index(app_label, model):
  12. try:
  13. return CONTENT_TYPE_SORTING.index('{}-{}'.format(app_label, model))
  14. except:
  15. return 9999
  16. perms = perms.order_by('content_type__model', 'id')
  17. perms = sorted(perms, key=lambda n: get_index(n.content_type.app_label, n.content_type.model))
  18. return perms
  19. def get_menuname_of_contenttype(self, app_label, model):
  20. for menu in MENU_TO_MODEL:
  21. val = '{}-{}'.format(app_label, model)
  22. if val in menu[1]:
  23. return menu[0]
  24. return u'未分类'
  25. def save_group(self, id, name, permissions, user):
  26. name = name.strip(u' ')
  27. #old_permissions = None
  28. if id == None or id == '':
  29. is_exist = Group.objects.filter(name=name).first()
  30. if is_exist:
  31. raise CustomError(u'名称为[%s]的权限组已存在' % name)
  32. group = Group.objects.create(name=name)
  33. BizLog.objects.addnew(user, BizLog.INSERT, u"添加权限组[%s],id=%d" % (group.name, group.id))
  34. else:
  35. is_exist = Group.objects.filter(name=name).exclude(pk=id).first()
  36. if is_exist:
  37. raise CustomError(u'名称为[%s]的权限组已存在' % name)
  38. group = Group.objects.filter(pk=id).first()
  39. if not group:
  40. raise CustomError(u'未找到相应的权限组')
  41. group.name = name
  42. group.save()
  43. # old_permissions = [p.id for p in group.permissions.all()]
  44. BizLog.objects.addnew(user, BizLog.UPDATE, u"修改权限组[%s],id=%d" % (group.name, group.id))
  45. group.permissions = permissions
  46. # 去掉下属创建权限组中的权限
  47. #if old_permissions:
  48. # new_permissions = [p.id for p in group.permissions.all()]
  49. # diff = list(set(old_permissions).difference(set(new_permissions)))
  50. # users = User.objects.filter(groups=group)
  51. # groups = Group.objects.filter(create_user__in=users,permissions__id__in=diff)
  52. # for g in groups:
  53. # for pk in diff:
  54. # g.permissions.remove(pk)
  55. class User(AbstractBaseUser, PermissionsMixin):
  56. DIMISSION = 0
  57. INSERVICE = 1
  58. STATUS_CHOICES = (
  59. (DIMISSION, u'离职'),
  60. (INSERVICE, u'在职'),
  61. )
  62. name = models.CharField(max_length=20, verbose_name=u"姓名")
  63. username = models.CharField(max_length=30, verbose_name=u'账号', unique=True, db_index=True,error_messages={'unique': u'已存在'})
  64. status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u"是否在职", default=INSERVICE)
  65. tel = models.CharField(max_length=15, verbose_name=u"手机号码", null=True, blank=True)
  66. gender = models.PositiveSmallIntegerField(choices=settings.GENDER_CHOICES, verbose_name=u"性别",null=True,blank=True)
  67. ID_card = models.CharField(max_length=18, verbose_name=u"身份证号", null=True, blank=True)
  68. address = models.CharField(max_length=500, verbose_name=u"家庭住址", null=True, blank=True)
  69. department = models.ForeignKey('Department', verbose_name=u"所属部门", null=True, blank=True, on_delete=models.PROTECT)
  70. title = models.CharField(max_length=20, verbose_name=u"工作岗位", null=True, blank=True)
  71. date_joined = models.DateTimeField(verbose_name=u'注册时间', default=timezone.now, null=True)
  72. objects = UserManager()
  73. USERNAME_FIELD = 'username'
  74. REQUIRED_FIELDS = []
  75. @staticmethod
  76. def getById(id):
  77. try:
  78. id = int(id)
  79. except:
  80. raise CustomError(u'无效的员工ID')
  81. instance = User.objects.filter(pk=id).first()
  82. if not instance:
  83. raise CustomError(u'未找到相应的员工')
  84. return instance
  85. def removeSubs(self):
  86. SubDepartment.objects.filter(user=self).delete()
  87. SubEmployee.objects.filter(user=self).delete()
  88. def __str__(self):
  89. return self.name
  90. def __unicode__(self):
  91. return self.name
  92. def getSubDepartmentIds(self):
  93. ids = []
  94. sub_ids = SubDepartment.objects.filter(user=self).values_list('department_id', flat=True)
  95. departments = Department.objects.filter(id__in=sub_ids)
  96. for dept in departments:
  97. rows = Department.objects.filter(lft__gte=dept.lft, rgt__lte=dept.rgt)
  98. for row in rows:
  99. if row.id not in ids:
  100. ids.append(row.id)
  101. return ids
  102. def getSubEmployeeIds(self):
  103. return SubEmployee.objects.filter(user=self).values_list('employee_id', flat=True)
  104. class Meta:
  105. db_table = "auth_user"
  106. verbose_name = u"人员管理"
  107. ordering = ('-id',)
  108. default_permissions = ()
  109. permissions = (
  110. ("view_user", u"浏览"),
  111. ("add_user", u"添加"),
  112. ("delete_user", u"删除"),
  113. )
  114. class SubDepartment(models.Model):
  115. user = models.ForeignKey(User, verbose_name=u"用户", on_delete=models.PROTECT)
  116. department = models.ForeignKey('Department', verbose_name=u"管辖部门", on_delete=models.PROTECT)
  117. class Meta:
  118. db_table = "sub_department"
  119. verbose_name = u"退货查询"
  120. default_permissions = ()
  121. permissions = ( # 管辖部门
  122. ("view_material_godownentry_return_query", u"浏览"),
  123. ("export_material_godownentry_return_query", u"导出"),
  124. ("print_material_godownentry_return_query", u"打印"),
  125. )
  126. class SubEmployee(models.Model):
  127. user = models.ForeignKey(User, verbose_name=u"用户", related_name='sub_employee_ref_user', on_delete=models.PROTECT)
  128. employee = models.ForeignKey(User, verbose_name=u"员工", related_name='sub_employee_ref_employee', on_delete=models.PROTECT)
  129. class Meta:
  130. db_table = "sub_employee"
  131. verbose_name = u"退货查询"
  132. default_permissions = ()
  133. permissions = ( # 管辖员工
  134. ("view_consumable_godownentry_return_query", u"浏览"),
  135. ("export_consumable_godownentry_return_query", u"导出"),
  136. ("print_consumable_godownentry_return_query", u"打印"),
  137. )
  138. class Department(models.Model):
  139. MATERIAL = 1
  140. CONSUMABLE = 2
  141. ALLPRODUCT = 3
  142. PRODUCT_RANGE_CHOICES = (
  143. (MATERIAL, u'原料'),
  144. (CONSUMABLE, u'耗材'),
  145. (ALLPRODUCT, u'全部'),
  146. )
  147. name = models.CharField(max_length=100, verbose_name=u"名称")
  148. notes = models.CharField(max_length=500, verbose_name=u"备注",blank=True,null=True)
  149. parent_id = models.IntegerField(verbose_name=u"父部门",null=True,blank=True)
  150. company = models.ForeignKey('Department', verbose_name=u"公司节点")
  151. product_range = models.IntegerField(verbose_name=u"产品范围",null=True,blank=True)
  152. lft = models.IntegerField(verbose_name=u"左值")
  153. rgt = models.IntegerField(verbose_name=u"右值")
  154. def __str__(self):
  155. return self.name
  156. def __unicode__(self):
  157. return self.name
  158. @staticmethod
  159. def getById(id):
  160. try:
  161. id = int(id)
  162. except:
  163. raise CustomError(u'无效的部门ID')
  164. instance = Department.objects.filter(pk=id).first()
  165. if not instance:
  166. raise CustomError(u'未找到相应的部门')
  167. return instance
  168. def getCompany(self):
  169. instance = Department.objects.filter(parent_id__isnull=True, lft__lte=self.lft, rgt__gte=self.rgt).first()
  170. if not instance:
  171. raise CustomError(u'未找到部门所属的公司')
  172. return instance
  173. @staticmethod
  174. def getLft(instance):
  175. if instance:
  176. return instance.lft
  177. return 1
  178. class Meta:
  179. db_table = "department"
  180. verbose_name = u"组织结构管理"
  181. ordering = ["parent_id", 'id']
  182. default_permissions = ()
  183. permissions = (
  184. ("view_department", u"浏览"),
  185. ("add_department", u"添加"),
  186. ("delete_department", u"删除"),
  187. )