models.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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 django.conf import settings
  6. from rest_framework.utils import model_meta
  7. from utils.exceptions import CustomError
  8. class UserManager(BaseUserManager):
  9. def create_administrator(self, username, password=None, **extra_fields):
  10. return self.create_user(User.ADMINSTRATOR, username, password, **extra_fields)
  11. def create_customer(self, username, password=None, **extra_fields):
  12. return self.create_user(User.CUSTOMER, username, password, **extra_fields)
  13. def create_superuser(self, username, password, **extra_fields):
  14. u = self.create_administrator(username, password, **extra_fields)
  15. u.is_active = True
  16. u.is_superuser = True
  17. u.save(using=self._db)
  18. return u
  19. def create_user(self, type, username, password=None, **extra_fields):
  20. if not username:
  21. raise CustomError(u'请输入用户名!')
  22. count = User.objects.filter(username=username).count()
  23. if count > 0:
  24. raise CustomError(u'该用户名已存在!')
  25. user = self.model(
  26. type=type,
  27. username=username,
  28. is_superuser=False,
  29. last_login=timezone.now(),
  30. **extra_fields
  31. )
  32. user.set_password(password)
  33. user.save(using=self._db)
  34. return user
  35. class User(AbstractBaseUser, PermissionsMixin):
  36. ADMINSTRATOR = 1
  37. CUSTOMER = 2
  38. type = models.PositiveSmallIntegerField(verbose_name=u"类型", editable=False)
  39. username = models.CharField(verbose_name=u'帐号', max_length=30, unique=True, db_index=True)
  40. is_active = models.BooleanField(verbose_name=u'激活', default=True)
  41. date_joined = models.DateTimeField(verbose_name=u'注册时间', default=timezone.now, editable=False)
  42. name = models.CharField(max_length=20, verbose_name=u"姓名", null=True, blank=True)
  43. gender = models.PositiveSmallIntegerField(choices=settings.GENDER_CHOICES, verbose_name=u'性别', null=True, blank=True)
  44. face = models.CharField(max_length=200, verbose_name=u'头像', null=True, blank=True)
  45. tel = models.CharField(max_length=15, verbose_name=u"手机", null=True, blank=True)
  46. objects = UserManager()
  47. USERNAME_FIELD = 'username'
  48. REQUIRED_FIELDS = []
  49. class Meta:
  50. db_table = "auth_user"
  51. verbose_name = u"用户"
  52. unique_together = [
  53. ('username')
  54. ]
  55. index_together = (
  56. 'date_joined',
  57. )
  58. ordering = ['-id']
  59. default_permissions = ()
  60. def __unicode__(self):
  61. return self.username
  62. def addAdministrator(self):
  63. self.type = self.type | self.ADMINSTRATOR
  64. def addCustomer(self):
  65. self.type = self.type | self.CUSTOMER
  66. def is_customer(self):
  67. if self.type & self.CUSTOMER:
  68. return True
  69. return False
  70. def is_administrator(self):
  71. if self.type & self.ADMINSTRATOR:
  72. return True
  73. return False
  74. def change_password(self, new_password, confirm_password, old_password):
  75. if new_password != confirm_password:
  76. raise CustomError(u'两次输入的密码不一致, 请检查')
  77. if not self.check_password(old_password):
  78. raise CustomError(u'原密码输入错误, 请检查')
  79. self.set_password(new_password)
  80. def update_item(self, validated_data):
  81. def update():
  82. info = model_meta.get_field_info(self)
  83. for attr, value in validated_data.items():
  84. if attr in info.relations and info.relations[attr].to_many:
  85. field = getattr(self, attr)
  86. field.set(value)
  87. else:
  88. setattr(self, attr, value)
  89. if not 'username' in validated_data:
  90. raise CustomError(u'用户名不能为空!')
  91. count = User.objects.filter(username=validated_data['username']).exclude(id=self.id).count()
  92. if count > 0:
  93. raise CustomError(u'该用户名已存在!')
  94. if not 'password' in validated_data or not validated_data['password']:
  95. validated_data['password'] = self.password
  96. update()
  97. else:
  98. update()
  99. self.set_password(validated_data['password'])
  100. self.save()
  101. return self