131 lines
4.5 KiB
Python
131 lines
4.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
from django.db import models
|
|
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin
|
|
from django.conf import settings
|
|
from django.core.urlresolvers import reverse
|
|
|
|
from imagekit.models import ImageSpecField
|
|
from imagekit.processors import ResizeToFill
|
|
|
|
from social.apps.django_app.default.models import UserSocialAuth
|
|
|
|
class UserManager(BaseUserManager):
|
|
|
|
@classmethod
|
|
def normalize_email(cls, email):
|
|
email = email or ''
|
|
try:
|
|
email_name, domain_part = email.strip().rsplit('@', 1)
|
|
except ValueError:
|
|
pass
|
|
else:
|
|
email = '@'.join([email_name, domain_part.lower()])
|
|
return email
|
|
|
|
def make_random_password(self, length=10,
|
|
allowed_chars='abcdefghjkmnpqrstuvwxyz'
|
|
'ABCDEFGHJKLMNPQRSTUVWXYZ'
|
|
'23456789'):
|
|
return get_random_string(length, allowed_chars)
|
|
|
|
def get_by_natural_key(self, username):
|
|
return self.get(**{self.model.USERNAME_FIELD: username})
|
|
|
|
|
|
def create_user(self, email, gender=0, password=None, request=None, username=None, display_name='New User', *args, **kwargs):
|
|
|
|
if not email:
|
|
msg = 'Users must have an email address'
|
|
raise ValueError(msg)
|
|
if gender is None:
|
|
msg = 'Users must provide Gender'
|
|
raise ValueError(msg)
|
|
|
|
user = self.model(email=self.normalize_email(email), gender=0, username=username, display_name=display_name)
|
|
user.is_active=True
|
|
user.set_password(password)
|
|
user.save(using=self._db)
|
|
|
|
return user
|
|
|
|
def create_superuser(self, email, gender=0, password=None, display_name='Super User'):
|
|
user = self.create_user(email, gender=gender, password=password, display_name=display_name)
|
|
user.is_admin = True
|
|
user.is_staff = True
|
|
user.is_superuser = True
|
|
user.save(using=self._db)
|
|
return user
|
|
|
|
GENDER_CHOICES = [
|
|
(0, 'male'),
|
|
(1, 'female'),
|
|
]
|
|
|
|
class User(AbstractBaseUser, PermissionsMixin):
|
|
|
|
email = models.EmailField(verbose_name='Email Address', max_length=255, unique=True, db_index=True)
|
|
USERNAME_FIELD = 'email'
|
|
|
|
username = models.CharField(max_length=255, blank=True, null=True)
|
|
|
|
is_active = models.BooleanField(default=False)
|
|
is_admin = models.BooleanField(default=False)
|
|
is_staff = models.BooleanField(default=False)
|
|
|
|
gender = models.IntegerField(choices=GENDER_CHOICES)
|
|
display_name = models.CharField(max_length=255, blank=True, null=True)
|
|
|
|
about = models.TextField(max_length=255, blank=True, null=True)
|
|
address = models.CharField(max_length=255, blank=True, null=True)
|
|
phone = models.CharField(max_length=50, blank=True, null=True)
|
|
avatar = models.ImageField(upload_to='avatars/', blank=True, null=True)
|
|
avatar_thumb = ImageSpecField(source='avatar', processors=[ResizeToFill(150, 150)], format='JPEG', options={'quality': 90})
|
|
avatar_ext = models.CharField(max_length=255, blank=True, null=True)
|
|
|
|
date_joined = models.DateTimeField(auto_now_add=True, null=True)
|
|
|
|
objects = UserManager()
|
|
|
|
def get_full_name(self):
|
|
return "%s" % (self.display_name)
|
|
|
|
def get_short_name(self):
|
|
return self.email
|
|
|
|
def __unicode__(self):
|
|
return self.display_name
|
|
|
|
def get_facebook_avatar(self, width, height):
|
|
try:
|
|
connections = UserSocialAuth.objects.all().filter(user = self, provider = 'facebook')
|
|
if connections[0].uid:
|
|
return 'https://graph.facebook.com/%s/picture?type=large&width=%s&height=%s'%(connections[0].uid,width, height)
|
|
except:
|
|
return
|
|
|
|
def get_avatar(self):
|
|
avatar = self.get_facebook_avatar(300,300)
|
|
if avatar:
|
|
return avatar
|
|
elif self.avatar:
|
|
return self.avatar.url
|
|
elif self.avatar_ext:
|
|
return self.avatar_ext
|
|
else:
|
|
return 'http://placehold.it/300x300.png'
|
|
|
|
def get_avatar_thumb(self):
|
|
avatar = self.get_facebook_avatar(140,140)
|
|
if avatar:
|
|
return avatar
|
|
elif self.avatar:
|
|
return self.avatar_thumb.url
|
|
elif self.avatar_ext:
|
|
return self.avatar_ext
|
|
else:
|
|
return 'http://placehold.it/140x140.png'
|
|
|
|
def get_absolute_url(self):
|
|
return reverse('profile', args=[str(self.id)])
|
|
|