123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- # coding=utf-8
- from django.db import models
- from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager, Group
- from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager, Group, AbstractUser
- from django.utils import timezone
- from rest_framework.utils import model_meta
- from utils.exceptions import CustomError
- from django.conf import settings
- from apps.agent.models import Store
- class UserManager(BaseUserManager):
- 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
- class User(AbstractBaseUser, PermissionsMixin):
- WAITING_JOIN = 1
- INSERVICE = 2
- DIMISSION = 3
- STATUS_CHOICES = (
- (WAITING_JOIN, u'待入职'),
- (INSERVICE, u'在职'),
- (DIMISSION, u'离职'),
- )
- username = models.CharField(verbose_name=u'用户名', max_length=30, unique=True, db_index=True,
- help_text=u'不多于20个字符。只能用字母、数字和字符。')
- is_active = models.BooleanField(verbose_name=u'是否可用', default=True, editable=False)
- date_joined = models.DateTimeField(verbose_name=u'注册时间', auto_now_add=True, editable=False)
- name = models.CharField(max_length=20, verbose_name=u"姓名")
- gender = models.PositiveSmallIntegerField(choices=settings.GENDER_CHOICES, verbose_name=u"性别")
- ID_card = models.CharField(max_length=18, verbose_name=u"身份证号", null=True, blank=True)
- address = models.CharField(max_length=100, verbose_name=u"家庭住址", null=True, blank=True)
- tel = models.CharField(max_length=15, verbose_name=u"手机")
- store = models.ForeignKey(Store, verbose_name=u"所属门店", null=True, blank=True, on_delete=models.PROTECT)
- status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u"是否在职", default=INSERVICE)
- check_user = models.ForeignKey('User', verbose_name=u'审核人', related_name='user_check_user', null=True,
- on_delete=models.PROTECT)
- check_time = models.DateTimeField(verbose_name=u'审核时间', editable=False, null=True)
- objects = UserManager()
- USERNAME_FIELD = 'username'
- REQUIRED_FIELDS = []
- class Meta:
- db_table = "auth_user"
- verbose_name = u"权限管理"
- unique_together = [
- ('username')
- ]
- ordering = ['-id']
- default_permissions = ()
- permissions = [
- ('browse_user', u'查看'),
- ('add_user', u'添加'),
- ('delete_user', u'删除'),
- ]
- def __unicode__(self):
- return self.username
- 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
- Group.add_to_class('display_name', models.CharField(verbose_name=u'名称显示', max_length=80))
- Group.add_to_class('create_user', models.ForeignKey(User, verbose_name=u"创建人", on_delete=models.PROTECT, editable=False))
|