Exemple #1
0
class User(auth_models.AbstractUser):
    objects = auth_models.UserManager()
    avatar = models.ImageField(upload_to='photos', blank=True)
    status = models.CharField(max_length=1000, blank=True, default="")
    city = models.CharField(max_length=50, blank=True, default="")
    birthday = models.DateField(blank=True, null=True)
    gender = models.CharField(max_length=1,
                              blank=True,
                              default='',
                              choices=(('M', 'Male'), ('F', 'Female'),
                                       ('', '---')))
    about = models.TextField(blank=True, default="")
    friends = models.ManyToManyField('self', symmetrical=False)

    def get_friends(self, check_common_with=None):
        friends = self.friends.filter(friends=self)
        if isinstance(check_common_with, auth_models.AbstractUser) \
            and check_common_with.id != self.id:
            user = check_common_with
            friends = friends.annotate(
                is_common=Count('friends', filter=Q(
                    id__in=user.get_friends())))
        return friends

    def get_posted_photos(self):
        return self.posted_photos.select_related('photo').all()

    def get_posted_videos(self):
        return self.posted_videos.select_related('video').all()

    def sent_friend_request_to(self, user):
        return self.friends.filter(id=user.id).exists()
Exemple #2
0
class CustomUser(AbstractBaseUser, auth_models.PermissionsMixin):
    username_validator = ASCIIUsernameValidator()

    """カスタムユーザーモデル."""
    class Meta:
        db_table = 'custom_user'

    #ユーザ基本情報
    username = models.CharField(max_length=10,unique=True)
    email = models.EmailField(unique=False, blank=True)
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=150, blank=True)

    #ユーザプロフィール詳細
    profile = models.CharField(max_length=10000, blank=True)

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

    # Default Permission
    is_staff = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_superuser = models.BooleanField(default=False)

    objects = auth_models.UserManager()

    def __str__(self):
        return self.username
Exemple #3
0
class User(AbstractUser):
    belongs = models.ManyToManyField(Grade, through='Belong')
    objects = auth_models.UserManager()
    avatar = models.ImageField(upload_to="avatar", null=True, blank=True)
    avatar_thumbnail = ImageSpecField(source="avatar",
                                      processors=[ResizeToFill(100, 100)],
                                      format='PNG',
                                      options={'quality': 80})

    def get_full_name(self):
        self.get_username()
        return '%s %s' % (self.last_name, self.first_name)
Exemple #4
0
class Muser(auth_models.User):
    objects = auth_models.UserManager()

    gender = models.PositiveSmallIntegerField(blank=True, default=0) # 1: male, 2: female
    birthdate = models.DateField(blank=True, null=True)

    push_token = models.CharField(max_length=200, blank=True, null=True)
    cluster = models.PositiveSmallIntegerField(blank=True, null=True)

    recommended = models.ManyToManyField('chatbot.Music')

    class Meta:
        verbose_name = 'Muser'

    def __str__(self):
        return self.username
Exemple #5
0
class User(auth_models.PermissionsMixin, auth_models.AbstractBaseUser):
    username = models.CharField(
        _('username'),
        max_length=30,
        unique=True,
        help_text=_('Required. 30 characters or fewer. Letters, numbers and '
                    '@/./+/-/_ characters'),
        validators=[
            validators.RegexValidator(re.compile(r'^[\w.@+-]+$', re.U),
                                      _('Enter a valid username.'), 'invalid')
        ])
    email = models.EmailField(_('email address'), blank=True)
    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_('Designates whether the user can log into this admin '
                    'site.'))
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_('Designates whether this user should be treated as '
                    'active. Unselect this instead of deleting accounts.'))
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    avatar = models.ImageField(upload_to='avatars', blank=True, null=True)
    rank = models.CharField(max_length=255,
                            default='',
                            blank=True,
                            null=True,
                            verbose_name=_('rank'))
    show_played_games = models.BooleanField(
        default=True, verbose_name=_('show played games'))
    show_played_characters = models.BooleanField(
        default=True, verbose_name=_('show played characters'))
    show_online_status = models.BooleanField(
        default=True, verbose_name=_('show on-line status'))
    hide_trustmarks = models.BooleanField(default=False,
                                          verbose_name=_('hide trustmarks'))
    signature = models.TextField(max_length=400,
                                 default='',
                                 blank=True,
                                 verbose_name=_('signature'))
    compact_text = models.BooleanField(default=False,
                                       verbose_name=_('compact text'))
    icq = models.CharField(default='',
                           blank=True,
                           max_length=12,
                           verbose_name=_('ICQ'))
    skype = models.CharField(default='',
                             blank=True,
                             max_length=50,
                             verbose_name=_('skype'))
    sex = models.SmallIntegerField(
        default=USER_SEX_UNDEFINED,
        verbose_name=_(u'sex'),
        choices=USER_SEX_CHOICES,
    )

    game_inline = models.SmallIntegerField(
        default=USER_GAME_INLINE_TIME,
        blank=False,
        verbose_name=_(u'Show in game'),
        choices=USER_GAME_INLINE_CHOICES,
    )
    animation_speed = models.PositiveIntegerField(
        default=1000,
        blank=False,
        verbose_name=_(u'Animation speed'),
    )

    vk_profile = models.ForeignKey(VK_Profile,
                                   models.PROTECT,
                                   blank=True,
                                   null=True)

    not_readed_messages = models.SmallIntegerField(
        default=0,
        blank=False,
        editable=False,
        verbose_name=_(u'Show in game'),
    )

    last_read_pm_id = models.PositiveIntegerField(
        default=0,
        blank=False,
        editable=False,
    )
    stories_author = models.PositiveIntegerField(
        default=0,
        blank=False,
        editable=False,
    )
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

    objects = auth_models.UserManager()

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')

    def __str__(self):
        v = self.username
        return u'%s' % (v, )

    def get_absolute_url(self):
        return urls.reverse('players:player_details',
                            kwargs={'player_id': self.pk})

    def get_full_name(self):
        return self.username

    def get_short_name(self):
        return self.username

    def email_user(self, subject, message, from_email=None):
        send_mail(subject, message, from_email, [self.email])

    def full_stars(self):
        from tulius.stories.models import Variation, Role
        from tulius.games import models as game_models
        from tulius.players.models import stars

        self.full_stars_cache = getattr(self, 'full_stars_cache', None)
        if self.full_stars_cache is not None:
            return self.full_stars_cache
        self.full_stars_cache = 0
        variation_ids = [
            role['variation'] for role in Role.objects.filter(
                user=self).values('variation').distinct()
        ]
        variations = Variation.objects.filter(id__in=variation_ids)
        games_played = variations.filter(game__status__in=[
            game_models.GAME_STATUS_COMPLETED,
            game_models.GAME_STATUS_COMPLETED_OPEN
        ]).count()
        big_stars = int(games_played / 100)
        games_played -= big_stars * 100
        small_stars = 0
        for star in stars.stars_list:
            if star <= games_played:
                small_stars += 1
            else:
                break
        self.full_stars_cache = 'b' * big_stars + 's' * small_stars + 'e' * (
            stars.stars_count - small_stars)
        return self.full_stars_cache

    new_invites_cache = None

    def new_invites(self):
        from tulius.games.models import GAME_INVITE_STATUS_NEW, GameInvite
        if self.new_invites_cache is None:
            self.new_invites_cache = GameInvite.objects.filter(
                user=self, status=GAME_INVITE_STATUS_NEW)
        return self.new_invites_cache

    def send_pm(self, sender, body):
        from tulius.pm.models import PrivateMessage
        pm = PrivateMessage(sender=sender, receiver=self, body=body)
        pm.save()

    def update_not_readed(self):
        from tulius.pm.models import PrivateMessage
        count = PrivateMessage.objects.filter(
            receiver=self, is_read=False, removed_by_receiver=False).count()
        self.not_readed_messages = count
        last = PrivateMessage.objects.filter(receiver=self,
                                             is_read=True).order_by('-id')[:1]
        if last:
            self.last_read_pm_id = last[0].pk
        self.save()

    def to_json(self, detailed=False):
        data = {
            'id': self.pk,
            'title': html.escape(self.username),
            'url': self.get_absolute_url(),
        }
        if detailed:
            data.update({
                'sex': self.sex,
                'avatar': self.avatar.url if self.avatar else '',
                'full_stars': self.full_stars(),  # TODO optimize it
                'rank': html.escape(self.rank),
                'stories_author': self.stories_author,
                'signature': bbcodes.bbcode(self.signature),
            })
        signals.user_to_json.send(User,
                                  instance=self,
                                  response=data,
                                  detailed=detailed)
        return data
Exemple #6
0
class CustomUser(auth_models.AbstractBaseUser, auth_models.PermissionsMixin,
                 mixins.DirtyMixin):
    """
    A custom user class that basically mirrors Django's `AbstractUser` class
    and doesn't force `first_name` or `last_name` with sensibilities for
    international names.

    http://www.w3.org/International/questions/qa-personal-names
    """
    username = models.CharField(
        _('username'),
        max_length=30,
        unique=True,
        help_text=_('Required. 30 characters or fewer. Letters, numbers and '
                    '@/./+/-/_ characters'),
        validators=[
            validators.RegexValidator(re.compile(r'^[a-zA-Z0-9_.@+-]+$'),
                                      _('Enter a valid username.'), 'invalid')
        ])
    full_name = models.CharField(_('full name'), max_length=254, blank=True)
    # FIXME: This field looks unused
    short_name = models.CharField(_('short name'), max_length=30, blank=True)
    email = models.EmailField(_('email address'), max_length=254, unique=True)
    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_('Designates whether the user can log into '
                    'this admin site.'))
    is_active = models.BooleanField(
        _('active'),
        default=True,
        db_index=True,
        help_text=_('Designates whether this user should be treated as '
                    'active. Unselect this instead of deleting accounts.'))
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
    avatar_url = models.CharField(_('avatar URL'), max_length=256, blank=True)

    objects = auth_models.UserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')

    def __str__(self):
        return self.username

    # FIXME: replace with django.urls.reverse(..)
    def get_absolute_url(self):
        return "/users/%s/" % urlquote(self.username)

    # FIXME: This method implementation is optional since Django 2.0
    def get_full_name(self):
        return self.full_name.strip()

    # FIXME: This method implementation is optional since Django 2.0
    def get_short_name(self):
        return self.short_name.strip()

    def get_subscriptions(self):
        return [{
            'id': g.id,
            'github_user': g.github_user,
            'github_repo': g.github_repo,
        } for g in self.subscriptions.all()]

    def get_starred(self):
        return [{
            'id': g.id,
            'github_user': g.repository.github_user,
            'github_repo': g.repository.github_repo,
        } for g in self.starred.select_related('repository').all()]
Exemple #7
0
class User(auth_models.AbstractBaseUser, auth_models.PermissionsMixin):
    username = models.CharField(_('username'),
                                max_length=60,
                                unique=True,
                                help_text=USERNAME_HELP,
                                validators=[USERNAME_VALIDATOR],
                                error_messages={
                                    'unique': _(USERNAME_NOT_UNIQUE),
                                })

    email = models.EmailField(_('email address'),
                              unique=True,
                              error_messages={
                                  'unique': EMAIL_NOT_UNIQUE,
                              })
    is_staff = models.BooleanField(_('staff status'),
                                   default=False,
                                   help_text=IS_STAFF_HELP)
    is_active = models.BooleanField(_('active'),
                                    default=True,
                                    help_text=IS_ACTIVE_HELP)
    date_joined = models.DateTimeField(editable=False, default=timezone.now)

    get_notifications = models.BooleanField(
        verbose_name=_('Send me email notifications'),
        default=True,
        help_text=GET_NOTIFICATIONS_HELP)
    _avatar = fields.ConfiguredImageField(
        'avatar',
        upload_to='users/images',
        blank=True,
        verbose_name=_('Avatar picture'),
    )

    description = models.CharField(
        blank=True,
        max_length=250,
        verbose_name=_('Short description about yourself'),
        help_text=_('Write a little bit about yourself. '
                    '(max. 250 characters)'))

    twitter_handle = models.CharField(
        blank=True,
        max_length=15,
        verbose_name=_('Twitter name'),
    )

    facebook_handle = models.CharField(
        blank=True,
        max_length=50,
        verbose_name=_('Facebook name'),
    )

    instagram_handle = models.CharField(
        blank=True,
        max_length=30,
        verbose_name=_('Instagram name'),
    )

    country = countries_fields.CountryField(
        blank=True,
        verbose_name=_('Country of residence'),
    )

    city = models.CharField(
        blank=True,
        max_length=80,
        verbose_name=_('City of residence'),
    )

    birthdate = models.DateField(
        blank=True,
        null=True,
        verbose_name=_('Date of birth'),
    )

    gender = models.CharField(
        blank=True,
        verbose_name=_('Gender'),
        max_length=2,
        choices=[
            ('M', _('Male')),
            ('F', _('Female')),
            ('T', _('Transgender')),
            ('TF', _('Transgender Female')),
            ('TM', _('Transgender Male')),
            ('I', _('Intersex')),
            ('GF', _('Gender Fluid')),
            ('O', _('Other')),
        ],
    )

    languages = models.CharField(
        blank=True,
        verbose_name=_('Languages'),
        max_length=150,
        help_text=_('Enter the languages you’re speaking.'))

    timezone = models.CharField(blank=True,
                                verbose_name=_('Time zone'),
                                max_length=100,
                                choices=[(t, t) for t in common_timezones])

    objects = auth_models.UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    class Meta:
        verbose_name = _("User")
        verbose_name_plural = _("Users")

    def get_absolute_url(self):
        from django.core.urlresolvers import reverse
        return reverse('profile', kwargs={'slug': str(self.username)})

    def __str__(self):
        return self.get_full_name()

    @property
    def has_social_share(self):
        return (self.twitter_handle or self.facebook_handle
                or self.instagram_handle)

    @property
    def organisations(self):
        return self.organisation_set.all()

    @property
    def avatar(self):
        if self._avatar:
            return self._avatar

    @property
    def default_avatar(self):
        id = self.pk % 6
        return static('images/penguin_{}.png'.format(id))

    @property
    def age(self):
        today = date.today()
        years_difference = today.year - self.birthdate.year
        is_before_birthday = (today.month, today.day) < (self.birthdate.month,
                                                         self.birthdate.day)
        elapsed_years = years_difference - int(is_before_birthday)
        return elapsed_years

    def get_full_name(self):
        """
        Returns the first_name plus the last_name, with a space in between.
        """
        full_name = '%s <%s>' % (self.username, self.email)
        return full_name.strip()

    def get_short_name(self):
        "Returns the short name for the user."
        return self.username

    def signup(self, username, email, timezone, commit=True):
        """Update the fields required for sign-up."""
        self.username = username
        self.email = email
        self.timezone = timezone
        if commit:
            self.save()
Exemple #8
0
class Migration(migrations.Migration):
    initial = True

    dependencies = [("auth", "0011_update_proxy_permissions")]

    operations = [
        migrations.CreateModel(
            name="User",
            fields=[
                (
                    "id",
                    models.AutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                ("password",
                 models.CharField(max_length=128, verbose_name="password")),
                (
                    "last_login",
                    models.DateTimeField(blank=True,
                                         null=True,
                                         verbose_name="last login"),
                ),
                (
                    "is_superuser",
                    models.BooleanField(
                        default=False,
                        help_text="Designates that this user has all "
                        "permissions without explicitly assigning "
                        "them.",
                        verbose_name="superuser status",
                    ),
                ),
                (
                    "username",
                    models.CharField(
                        max_length=150,
                        unique=True,
                        verbose_name="username",
                        error_messages={
                            "unique":
                            "A user with that username "
                            "already exists."
                        },
                        help_text="Required. 150 characters or fewer. "
                        "Letters, digits and @/./+/-/_ only.",
                        validators=[
                            auth_validators.UnicodeUsernameValidator()
                        ],
                    ),
                ),
                (
                    "first_name",
                    models.CharField(blank=True,
                                     max_length=30,
                                     verbose_name="first name"),
                ),
                (
                    "last_name",
                    models.CharField(blank=True,
                                     max_length=150,
                                     verbose_name="last name"),
                ),
                (
                    "email",
                    models.EmailField(blank=True,
                                      max_length=254,
                                      verbose_name="email address"),
                ),
                (
                    "is_staff",
                    models.BooleanField(
                        default=False,
                        help_text="Designates whether the user can log into "
                        "this admin site.",
                        verbose_name="staff status",
                    ),
                ),
                (
                    "is_active",
                    models.BooleanField(
                        default=True,
                        help_text="Designates whether this user should be "
                        "treated as active. Unselect this instead "
                        "of deleting accounts.",
                        verbose_name="active",
                    ),
                ),
                (
                    "date_joined",
                    models.DateTimeField(default=timezone.now,
                                         verbose_name="date joined"),
                ),
                (
                    "groups",
                    models.ManyToManyField(
                        blank=True,
                        help_text="The groups this user belongs to. "
                        "A user will get all permissions granted t"
                        "o each of their groups.",
                        related_name="user_set",
                        related_query_name="user",
                        to="auth.Group",
                        verbose_name="groups",
                    ),
                ),
                (
                    "user_permissions",
                    models.ManyToManyField(
                        blank=True,
                        help_text="Specific permissions for this user.",
                        related_name="user_set",
                        related_query_name="user",
                        to="auth.Permission",
                        verbose_name="user permissions",
                    ),
                ),
            ],
            options={
                "verbose_name": "user",
                "verbose_name_plural": "users",
                "abstract": False,
            },
            managers=[("objects", auth_models.UserManager())],
        ),
        migrations.CreateModel(
            name='Tenant',
            fields=[
                ('id',
                 models.AutoField(auto_created=True,
                                  primary_key=True,
                                  serialize=False,
                                  verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('name', models.CharField(max_length=150, unique=True)),
                ('users',
                 models.ManyToManyField(related_name='tenants',
                                        to='galaxy_auth.User')),
            ],
            options={
                'abstract': False,
            },
        ),
    ]
Exemple #9
0
class CustomUser(auth_models.AbstractBaseUser,
                 auth_models.PermissionsMixin,
                 mixins.DirtyMixin):
    """
    A custom user class that basically mirrors Django's `AbstractUser` class
    and doesn't force `first_name` or `last_name` with sensibilities for
    international names.

    http://www.w3.org/International/questions/qa-personal-names
    """
    username = models.CharField(
        _('username'),
        max_length=30,
        unique=True,
        help_text=_('Required. 30 characters or fewer. Letters, numbers and '
                    '@/./+/-/_ characters'),
        validators=[
            validators.RegexValidator(re.compile('^[\w.@+-]+$'),
                                      _('Enter a valid username.'),
                                      'invalid')
        ])
    full_name = models.CharField(_('full name'), max_length=254, blank=True)
    short_name = models.CharField(_('short name'), max_length=30, blank=True)
    email = models.EmailField(_('email address'), max_length=254, unique=True)
    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_('Designates whether the user can log into '
                    'this admin site.'))
    is_active = models.BooleanField(
        _('active'),
        default=True,
        db_index=True,
        help_text=_('Designates whether this user should be treated as '
                    'active. Unselect this instead of deleting accounts.'))
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    # TODO(cutwater): Seem to be not used anymore.
    # Consider removal of karma field.
    karma = models.IntegerField(default=0, db_index=True)
    avatar_url = models.CharField(
        _('avatar URL'), max_length=256, blank=True)
    cache_refreshed = models.BooleanField(
        _('cache refreshed'), default=False)

    objects = auth_models.UserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')

    def __str__(self):
        return self.username

    def get_absolute_url(self):
        return "/users/%s/" % urlquote(self.username)

    def get_full_name(self):
        """
        Returns the first_name plus the last_name, with a space in between.
        """
        full_name = self.full_name
        return full_name.strip()

    def get_short_name(self):
        """Returns the short name for the user."""
        return self.short_name.strip()

    def get_num_roles(self):
        return self.roles.filter(active=True, is_valid=True).count()

    def email_user(self, subject, message, from_email=None):
        """
        Sends an email to this User.
        """
        send_mail(subject, message, from_email, [self.email])

    def hasattr(self, attr):
        return hasattr(self, attr)

    def get_subscriptions(self):
        return [{
            'id': g.id,
            'github_user': g.github_user,
            'github_repo': g.github_repo,
        } for g in self.subscriptions.all()]

    def get_starred(self):
        return [{
            'id': g.id,
            'github_user': g.repository.github_user,
            'github_repo': g.repository.github_repo,
        } for g in self.starred.select_related('repository').all()]

    def get_subscriber(self, github_user, github_repo):
        try:
            return self.subscriptions.get(
                github_user=github_user,
                github_repo=github_repo)
        except exceptions.ObjectDoesNotExist:
            return None

    def get_stargazer(self, github_user, github_repo):
        try:
            star = self.starred.get(
                repository__provider_namespace__name=github_user,
                repository__name=github_repo)
            return star
        except exceptions.ObjectDoesNotExist:
            return None

    def is_connected_to_github(self):
        connected = False
        for account in self.socialaccount_set.all():
            if account.provider == 'github':
                connected = True
        return connected
Exemple #10
0
class User(auth_models.AbstractBaseUser, auth_models.PermissionsMixin):
    username = models.CharField(
        _('username'),
        max_length=60,
        unique=True,
        help_text=_(
            'Your username will appear publicly next to your posts.'),
        validators=[
            validators.RegexValidator(
                USERNAME_REGEX, USERNAME_INVALID_MESSAGE, 'invalid')],
        error_messages={
            'unique': _('A user with that username already exists.')}
    )

    email = models.EmailField(
        _('Email address'),
        unique=True,
        error_messages={
            'unique': _('A user with that email address already exists.')}
    )

    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_(
            'Designates whether the user can log into this admin site.')
    )

    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.')
    )

    date_joined = models.DateTimeField(
        editable=False,
        default=timezone.now
    )

    get_notifications = models.BooleanField(
        verbose_name=_('Notifications'),
        default=True,
        help_text=_(
            'Yes, I would like to be notified by e-mail about the start '
            'and end of participation opportunities. This applies to all '
            'projects I follow. I also receive an e-mail when someone '
            'comments on one of my contributions.')
    )

    get_newsletters = models.BooleanField(
        verbose_name=_('Newsletter'),
        default=False,
        help_text=_(
            'Yes, I would like to receive e-mail newsletters about '
            'the projects I am following.')
    )

    objects = auth_models.UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    @property
    def organisations(self):
        initiator_orgs = self.organisation_set.all()
        if self.groups.all():
            user_groups = self.groups.all().values_list('id', flat=True)
            group_orgs = Organisation.objects \
                .filter(groups__in=user_groups)
            orgs = initiator_orgs | group_orgs
            return orgs.distinct()
        return initiator_orgs

    def get_short_name(self):
        return self.username

    def get_full_name(self):
        full_name = '%s <%s>' % (self.username, self.email)
        return full_name.strip()

    def signup(self, username, email, commit=True):
        """Update the fields required for sign-up."""
        self.username = username
        self.email = email
        if commit:
            self.save()

    def get_absolute_url(self):
        return reverse('profile', args=[str(self.username)])
Exemple #11
0
class SvUserInfo(models.Model):
    """
    Django base User class + extra Savane fields

    Since it adds a field to Django's User objects, we prefix it by
    'sv' to avoid clashes with other packages, C-style (ahem).

    Using AutoOneToOneField to automatically create this extra data
    for new users as soon as the field is accessed.
    """

    class Meta:
        ordering = ['user__username']

    user = AutoOneToOneField(auth_models.User, primary_key=True)

    # Migrated to 'first_name' and 'last_name' in auth.User
    #realname = models.CharField(max_length=96)

    # Old Savane can be Active/Deleted/Pending/Suspended/SQuaD
    status_CHOICES = (
        ('A', _('Active')),
        ('D', _('Deleted')),
        ('P', _('Pending')),
        ('S', _('Suspended')),
        #('SQD', _('Squad')), # TODO: implement squads more cleanly
        )
    status = models.CharField(max_length=3, choices=status_CHOICES, default='A')

    # Unix mapping, used when populating a LDAP directory
    uidNumber = models.IntegerField(default=0)
    gidNumber = models.IntegerField(default=0)

    # Used by trackers only but it could be used more widely
    spamscore = models.IntegerField(null=True, blank=True)

    # Confirm that user owns the e-mail the hash was sent to
    email_hash_confirm = models.BigIntegerField(blank=True, null=True)
    # Allow a user to counter-act an account hijack
    email_hash_cancel = models.BigIntegerField(blank=True, null=True)
    # The new e-mail to use if validated
    email_new = models.EmailField(_("new e-mail address"), blank=True, null=True)

    # Keys
    gpg_key = models.TextField(blank=True,
                               help_text=_("You can write down here your (ASCII) public key (gpg --export --armor keyid)"))
    gpg_key_count = models.IntegerField(null=True, blank=True)
    # SSH keys: cf. SshKey above

    # Preferences - /!\ some are also in the user_preferences table
    email_hide = models.BooleanField(default=False)
    timezone = models.CharField(max_length=192, blank=True)
    #theme = models.CharField(max_length=45, blank=True)

    superuser_is_enabled = models.BooleanField(default=False)

    # Inherit specialized models.Manager with convenience functions
    objects = auth_models.UserManager()

    @staticmethod
    def query_active_users_raw(conn, fields):
        """
        Return efficient query with all the users; used by LDIF export
        """
        return conn.query("SELECT "
                          + ",".join(fields)
                          + " FROM auth_user JOIN svmain_extendeduser"
                          + " ON auth_user.id = svmain_extendeduser.user_ptr_id"
                          + " WHERE status = 'A'"
                          )

    def get_full_name_display(self):
        if self.user.get_full_name() != "":
            return self.user.get_full_name()
        else:
            return self.user.username

    def __unicode__(self):
        return "Savane information on user %s" % (self.user.username)
Exemple #12
0
class User(auth_models.AbstractBaseUser, auth_models.PermissionsMixin):
    username = models.CharField(
        _('username'),
        max_length=75,
        unique=True,
        help_text=_(
            'Required. 60 characters or less. Letters, digits, spaces and '
            '@/./+/-/_ only.'),
        validators=[
            validators.RegexValidator(USERNAME_REGEX, USERNAME_INVALID_MESSAGE,
                                      'invalid')
        ],
        error_messages={
            'unique': _('A user with that username already exists.')
        })

    email = models.EmailField(
        _('email address'),
        unique=True,
        error_messages={
            'unique': _('A user with that email address already exists.')
        })

    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_(
            'Designates whether the user can log into this admin site.'))

    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'))

    _avatar = fields.ConfiguredImageField(
        'avatar',
        upload_to='users/images',
        blank=True,
        verbose_name=_('Profile picture'),
        help_text=_('Please upload a picture in landscape format, at least '
                    '340x340 px. You can upload a .jpg, .png or .gif.'))

    date_joined = models.DateTimeField(editable=False, default=timezone.now)

    twitter_handle = models.CharField(
        blank=True,
        max_length=15,
        verbose_name=_('Twitter name'),
    )

    facebook_handle = models.CharField(
        blank=True,
        max_length=50,
        verbose_name=_('Facebook name'),
    )

    instagram_handle = models.CharField(
        blank=True,
        max_length=30,
        verbose_name=_('Instagram name'),
    )

    website = models.URLField(blank=True,
                              verbose_name=_('Website'),
                              help_text=_(
                                  'Please add either https:// or http:// '
                                  'at the beginning of your URL.'))

    get_notifications = models.BooleanField(
        verbose_name=_("my own ideas and ideas that I'm watching"),
        default=True)

    objects = auth_models.UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    @property
    def avatar(self):
        if self._avatar:
            return self._avatar

    @property
    def fallback_avatar(self):
        number = self.pk % 3
        return static('images/avatar-{0:02d}.svg'.format(number))

    @property
    def is_innovator(self):
        return Idea.objects.filter(Q(creator=self)
                                   | Q(co_workers=self)).count() > 0

    def avatar_or_fallback_url(self):
        if self._avatar:
            return get_thumbnailer(self._avatar)['avatar'].url
        else:
            return self.fallback_avatar

    def get_short_name(self):
        return self.username

    def get_full_name(self):
        full_name = '%s <%s>' % (self.username, self.email)
        return full_name.strip()

    def signup(self, username, email, commit=True):
        """Update the fields required for sign-up."""
        self.username = username
        self.email = email
        if commit:
            self.save()

    def get_absolute_url(self):
        return reverse('profile', args=[str(self.username)])
Exemple #13
0
class User(auth_models.AbstractBaseUser, auth_models.PermissionsMixin):
    username = models.CharField(
        _('username'),
        max_length=60,
        unique=True,
        help_text=_(
            'Required. 60 characters or fewer. Letters, digits, spaces and '
            '@/./+/-/_ only.'),
        validators=[
            validators.RegexValidator(
                USERNAME_REGEX, USERNAME_INVALID_MESSAGE, 'invalid')],
        error_messages={
            'unique': _('A user with that username already exists.'),
            'used_as_email': _('This username is already used as an '
                               'e-mail address.')}
    )

    email = models.EmailField(
        _('Email address'),
        unique=True,
        error_messages={
            'unique': _('A user with that email address already exists.')}
    )

    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_(
            'Designates whether the user can log into this admin site.')
    )

    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.')
    )

    date_joined = models.DateTimeField(
        editable=False,
        default=timezone.now
    )

    get_notifications = models.BooleanField(
        verbose_name=_('Send me email notifications'),
        default=True,
        help_text=_(
            'Designates whether you want to receive notifications. '
            'Unselect if you do not want to receive notifications.')
    )

    get_newsletters = models.BooleanField(
        verbose_name=_('I would like to receive further information'),
        default=False,
        help_text=_(
            'Projects you are following can send you '
            'additional information via email.')
    )

    bio = models.TextField(
        blank=True,
        max_length=255,
        verbose_name=_('Biography'),
        help_text=_(
            'Tell us about yourself in 255 characters!')
    )

    twitter_handle = models.CharField(
        blank=True,
        max_length=15,
        verbose_name=_('Twitter handle'),
    )

    facebook_handle = models.CharField(
        blank=True,
        max_length=50,
        verbose_name=_('Facebook name'),
        help_text=_(
            'Your facebook name is the last part of the URL, '
            'when you access your profile.')
    )

    homepage = models.URLField(
        blank=True,
        max_length=50,
        verbose_name=_('Homepage'),
    )

    _avatar = ConfiguredImageField(
        'avatar',
        upload_to='users/images',
        blank=True,
        verbose_name=_('Avatar picture'),
    )

    language = models.CharField(
        verbose_name=_('Your preferred language'),
        choices=settings.LANGUAGES,
        default=settings.DEFAULT_USER_LANGUAGE_CODE,
        max_length=4,
        help_text=_(
            'Specify your preferred language for the user interface '
            'and the notifications of the platform.'),
    )

    objects = auth_models.UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    def get_projects_follow_list(self, exclude_private_projects=False):
        projects = Project.objects \
            .filter(follow__creator=self,
                    follow__enabled=True,
                    is_draft=False)
        if exclude_private_projects:
            projects = projects.exclude(models.Q(access=Access.PRIVATE))

        now = timezone.now()

        sorted_active_projects = projects\
            .annotate(project_start=models.Min('module__phase__start_date'))\
            .annotate(project_end=models.Max('module__phase__end_date'))\
            .filter(project_start__lte=now, project_end__gt=now)\
            .order_by('project_end')

        sorted_future_projects = projects\
            .annotate(project_start=models.Min('module__phase__start_date'))\
            .filter(models.Q(project_start__gt=now)
                    | models.Q(project_start=None))\
            .order_by('project_start')

        sorted_past_projects = projects\
            .annotate(project_start=models.Min('module__phase__start_date'))\
            .annotate(project_end=models.Max('module__phase__end_date'))\
            .filter(project_end__lt=now)\
            .order_by('project_start')

        return sorted_active_projects, \
            sorted_future_projects, \
            sorted_past_projects

    @cached_property
    def organisations(self):
        return self.organisation_set.all()

    @cached_property
    def avatar(self):
        if self._avatar:
            return self._avatar

    @cached_property
    def avatar_fallback(self):
        number = self.pk % 4
        return static('images/avatar-{0:02d}.svg'.format(number))

    def get_short_name(self):
        return self.username

    def get_full_name(self):
        full_name = '%s <%s>' % (self.username, self.email)
        return full_name.strip()

    def get_absolute_url(self):
        return reverse('profile', args=[str(self.username)])
class AbstractUser(auth_models.AbstractBaseUser, auth_models.PermissionsMixin):
    """
    An abstract base class implementing a fully featured User model with
    admin-compliant permissions.

    removed first_name, last_name field from default AbstractUser
    phone_number and password are required. Other fields are optional.
    """
    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        _('username'),
        max_length=150,
        unique=True,
        help_text=
        _('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'
          ),
        validators=[username_validator],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )

    name = models.CharField(max_length=255)
    email = models.EmailField(_('email address'))
    phone_number = PhoneNumberField(_("Mobile Number"),
                                    unique=True,
                                    validators=[])
    dob = models.DateField(_('Date of Birth'), null=True, blank=True)

    is_mobile_verified = models.NullBooleanField()
    is_email_verified = models.NullBooleanField()

    gender = models.PositiveSmallIntegerField(choices=GENDER_CHOICES,
                                              verbose_name='Gender',
                                              null=True)

    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_(
            'Designates whether the user can log into this admin site.'),
    )
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'),
    )
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = auth_models.UserManager()

    EMAIL_FIELD = 'email'
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['name', 'email', 'phone_number']

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')
        abstract = True

    def get_full_name(self):
        return self.name.strip()

    def get_short_name(self):
        return self.name.strip()

    def clean(self):
        super().clean()
        self.email = self.__class__.objects.normalize_email(self.email)

    def _migrate_alerts_to_user(self):
        """
        Transfer any active alerts linked to a user's email address to the
        newly registered user.
        """
        ProductAlert = self.alerts.model
        alerts = ProductAlert.objects.filter(email=self.email,
                                             status=ProductAlert.ACTIVE)
        alerts.update(user=self, key='', email='')

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        # Migrate any "anonymous" product alerts to the registered user
        # Ideally, this would be done via a post-save signal. But we can't
        # use get_user_model to wire up signals to custom user models
        # see Oscar ticket #1127, Django ticket #19218
        self._migrate_alerts_to_user()
Exemple #15
0
class User(auth_models.AbstractBaseUser, auth_models.PermissionsMixin):
    username = models.CharField(
        _('username'),
        max_length=60,
        unique=True,
        help_text=_(
            'Required. 60 characters or fewer. Letters, digits, spaces and '
            '@/./+/-/_ only.'),
        validators=[
            validators.RegexValidator(
                USERNAME_REGEX, USERNAME_INVALID_MESSAGE, 'invalid')],
        error_messages={
            'unique': _('A user with that username already exists.')}
    )

    email = models.EmailField(
        _('Email address'),
        unique=True,
        error_messages={
            'unique': _('A user with that email address already exists.')}
    )

    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_(
            'Designates whether the user can log into this admin site.')
    )

    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.')
    )

    date_joined = models.DateTimeField(
        editable=False,
        default=timezone.now
    )

    get_notifications = models.BooleanField(
        verbose_name=_('Send me email notifications'),
        default=True,
        help_text=_(
            'Designates whether you want to receive notifications. '
            'Unselect if you do not want to receive notifications.')
    )

    get_newsletters = models.BooleanField(
        verbose_name=_('Send me newsletters'),
        default=False,
        help_text=_(
            'Designates whether you want to receive newsletters. '
            'Unselect if you do not want to receive newsletters.')
    )

    bio = models.TextField(
        blank=True,
        max_length=255,
        verbose_name=_('Biography'),
        help_text=_(
            'Tell us about yourself in 255 characters!')
    )

    twitter_handle = models.CharField(
        blank=True,
        max_length=15,
        verbose_name=_('Twitter handle'),
    )

    facebook_handle = models.CharField(
        blank=True,
        max_length=50,
        verbose_name=_('Facebook name'),
        help_text=_(
            'Your facebook name is the last part of the URL, '
            'when you access your profile.')
    )

    homepage = models.URLField(
        blank=True,
        max_length=50,
        verbose_name=_('Homepage'),
    )

    _avatar = ConfiguredImageField(
        'avatar',
        upload_to='users/images',
        blank=True,
        verbose_name=_('Avatar picture'),
    )

    language = models.CharField(
        verbose_name=_('Your preferred language'),
        choices=settings.LANGUAGES,
        default=settings.DEFAULT_USER_LANGUAGE_CODE,
        max_length=4,
        help_text=_(
            'Specify your preferred language for the user interface '
            'and the notifications of the platform.'),
    )

    objects = auth_models.UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    @cached_property
    def organisations(self):
        return self.organisation_set.all()

    @cached_property
    def avatar(self):
        if self._avatar:
            return self._avatar

    def get_short_name(self):
        return self.username

    def get_full_name(self):
        full_name = '%s <%s>' % (self.username, self.email)
        return full_name.strip()

    def get_absolute_url(self):
        return reverse('profile', args=[str(self.username)])
Exemple #16
0
class User(AbstractBaseUser, PermissionsMixin):
    MALE = "M"
    FEMALE = "F"
    OTHER = "O"
    GENDER_CHOICES = [
        (None, None),
        (MALE, "Mann"),
        (FEMALE, "Kvinne"),
        (OTHER, "Annet"),
    ]
    username = models.CharField(max_length=60,
                                unique=True,
                                verbose_name="brukernavn")
    email = models.EmailField(max_length=254,
                              unique=True,
                              null=True,
                              blank=True)
    first_name = models.CharField(max_length=60,
                                  null=True,
                                  blank=True,
                                  verbose_name="Fornavn")
    last_name = models.CharField(max_length=150,
                                 null=True,
                                 blank=True,
                                 verbose_name="Etternavn")
    # department = models.ForeignKey('accounts.Department', on_delete=models.SET_NULL, null=True, blank=True, verbose_name="Avdeling", related_name="users")
    # nickname = models.CharField(max_length=150, unique=True, null=True, blank=False, verbose_name="Kallenavn")
    gender = models.CharField(max_length=1,
                              choices=GENDER_CHOICES,
                              default=None,
                              null=True,
                              blank=True,
                              verbose_name="Kjønn")
    is_active = models.BooleanField(default=True)
    phone_number = models.CharField(max_length=13,
                                    default=None,
                                    null=True,
                                    blank=True,
                                    verbose_name="Mobilnummer")
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    date_joined = models.DateTimeField(default=timezone.now,
                                       blank=True,
                                       editable=False,
                                       verbose_name="Opprettet")

    objects = auth_models.UserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = []

    class Meta:
        verbose_name = 'user'
        verbose_name_plural = 'users'
        ordering = ['username']

    def __str__(self):
        return f"{self.get_full_name() or self.username or self.email or self.id}"

    def get_full_name(self):
        if self.first_name and self.last_name:
            return f"{self.first_name} {self.last_name}"
        else:
            return None

    def get_username(self):
        return self.username

    def get_short_name(self):
        return self.first_name

    def serialize(self):
        jayson = {}
        jayson['id'] = self.id
        # jayson['email'] = self.email
        jayson['nickname'] = self.nickname
        jayson['first_name'] = self.first_name
        jayson['last_name'] = self.last_name
        jayson['department'] = self.department
        jayson['is_staff'] = self.is_staff
        jayson['is_superuser'] = self.is_superuser
        return jayson
Exemple #17
0
class User(ActiveStateMixin, auth.AbstractBaseUser):
    """
    A custom user model that stores the name in a more portable way. Also
    stores information relating to project tracking.
    """
    username = models.CharField(_('username'), max_length=30, unique=True,
        help_text=_('Required. 30 characters or fewer. Letters, digits and '
                    '@/./+/-/_ only.'),
        validators=[validators.RegexValidator(r'^[\w.@+-]+$',
            _('Enter a valid username.'), 'invalid')])
    full_name = models.CharField(_('full name'), max_length=255, blank=True)
    short_name = models.CharField(_('preferred name'), max_length=50, blank=True)
    email = models.EmailField(_('email address'), blank=True)

    is_superuser = models.BooleanField(_('superuser status'), default=False,
        help_text=_('Designates that this user has all permissions without '
                    'explicitly assigning them.'))
    is_staff = models.BooleanField(_('staff status'), default=False,
        help_text=_('Designates whether the user can log into this admin '
                    'site.'))
    groups = models.ManyToManyField(auth.Group,
        verbose_name=_('groups'), blank=True,
        help_text=_('The groups this user belongs to. A user will get all '
                    'permissions granted to each of their groups.'),
        related_name='custom_users', related_query_name='custom_user')
    user_permissions = models.ManyToManyField(auth.Permission,
        verbose_name=_('user permissions'), blank=True,
        help_text=_('Specific permissions for this user.'),
        related_name='custom_users', related_query_name='custom_user')

    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
    projects = models.ManyToManyField(Project, through=ProjectTracking,
        verbose_name=_('tracked projects'), blank=True,
        help_text=_('Projects this user is tracking'),
        related_name='users', related_query_name='user')

    objects = auth.UserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')

    def __str__(self):
        return self.get_full_name()

    def get_full_name(self):
        return self.full_name

    def get_short_name(self):
        return self.short_name

    def email_user(self, subject, message, from_email=None, **kwargs):
        """
        Sends an email to this User.
        """
        send_mail(subject, message, from_email, [self.email], **kwargs)

    def get_projects(self, permission, followed=None):
        """
        Returns a queryset of projects that the user has the specified
        permissions on.

        :param permission: Should be one of 'owner', 'member', or 'viewer'
                           depending on the desired permission desired.
        """
        group_ids = self.groups.values_list('id', flat=True)
        if permission == 'owner':
            permission_filters = models.Q(owner_group_id__in=group_ids)
        elif permission == 'member':
            permission_filters = (models.Q(owner_group_id__in=group_ids) |
                                  models.Q(member_group_id__in=group_ids))
        elif permission == 'viewer':
            permission_filters = (models.Q(owner_group_id__in=group_ids) |
                                  models.Q(member_group_id__in=group_ids) |
                                  models.Q(viewer_group_id__in=group_ids))
        else:
            raise ValueError('Permission {} is not valid. Should be one of '
                             'owner, member, or viewer'.format(permission))
        if followed is None:
            return Project.objects.filter(permission_filters)
        elif followed is True:
            return self.projects.filter(permission_filters)
        else:
            return (Project.objects.filter(permission_filters)
                    .exclude(id__in=self.projects.values_list('id', flat=True)))

    def get_investigations(self, permission, followed=None):
        """
        Returns a queryset of investigations that the user has the specified
        permissions on.

        :param permission: Should be one of 'owner', 'member', or 'viewer'
                           depending on the desired permission desired.
        """
        project_ids = self.get_projects(permission,
                                        followed).values_list('id', flat=True)
        return Investigation.objects.filter(project_id__in=project_ids)

    def get_milestones(self, permission, followed=None):
        """
        Returns a queryset of milestones that the user has the specified
        permissions on.

        :param permission: Should be one of 'owner', 'member', or 'viewer'
                           depending on the desired permission desired.
        """
        investigation_ids = self.get_investigations(permission,
                                                    followed).values_list('id', flat=True)
        return Milestone.objects.filter(investigation_id__in=investigation_ids)

    def get_tasks(self, permission, followed=None):
        """
        Returns a queryset of milestones that the user has the specified
        permissions on.

        :param permission: Should be one of 'owner', 'member', or 'viewer'
                           depending on the desired permission desired.
        """
        milestone_ids = self.get_milestones(permission,
                                            followed).values_list('id', flat=True)
        return Task.objects.filter(milestone_id__in=milestone_ids)

    def get_group_permissions(self, obj=None):
        """
        Returns a list of permission strings that this user has through their
        groups. This method queries all available auth backends. If an object
        is passed in, only permissions matching this object are returned.
        """
        permissions = set()
        for backend in auth.get_backends():
            if hasattr(backend, "get_group_permissions"):
                permissions.update(backend.get_group_permissions(self, obj))
        return permissions

    def get_all_permissions(self, obj=None):
        return _user_get_all_permissions(self, obj)

    def has_perm(self, perm, obj=None):
        """
        Returns True if the user has the specified permission. This method
        queries all available auth backends, but returns immediately if any
        backend returns True. Thus, a user who has permission from a single
        auth backend is assumed to have permission in general. If an object is
        provided, permissions for this specific object are checked.
        """
        # Active superusers have all permissions.
        if self.is_active and self.is_superuser:
            return True

        # Otherwise we need to check the backends.
        return _user_has_perm(self, perm, obj)

    def has_perms(self, perm_list, obj=None):
        """
        Returns True if the user has each of the specified permissions. If
        object is passed, it checks if the user has all required perms for this
        object.
        """
        for perm in perm_list:
            if not self.has_perm(perm, obj):
                return False
        return True

    def has_module_perms(self, app_label):
        """
        Returns True if the user has any permissions in the given app label.
        Uses pretty much the same logic as has_perm, above.
        """
        # Active superusers have all permissions.
        if self.is_active and self.is_superuser:
            return True

        return _user_has_module_perms(self, app_label)
Exemple #18
0
class User(auth_models.AbstractBaseUser, auth_models.PermissionsMixin):
    username = models.CharField(_('username'),
                                max_length=60,
                                unique=True,
                                help_text=USERNAME_HELP,
                                validators=[USERNAME_VALIDATOR],
                                error_messages={
                                    'unique': _(USERNAME_NOT_UNIQUE),
                                })

    email = models.EmailField(_('email address'),
                              unique=True,
                              error_messages={
                                  'unique': EMAIL_NOT_UNIQUE,
                              })

    is_staff = models.BooleanField(_('staff status'),
                                   default=False,
                                   help_text=IS_STAFF_HELP)

    is_active = models.BooleanField(_('active'),
                                    default=True,
                                    help_text=IS_ACTIVE_HELP)

    date_joined = models.DateTimeField(editable=False, default=timezone.now)

    get_notifications = models.BooleanField(
        verbose_name=_('Send me email notifications'),
        default=True,
        help_text=GET_NOTIFICATIONS_HELP)

    objects = auth_models.UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    class Meta:
        verbose_name = _("User")
        verbose_name_plural = _("Users")

    def get_absolute_url(self):
        return reverse('profile', kwargs={'slug': str(self.username)})

    @property
    def organisations(self):
        return self.organisation_set.all()

    def get_full_name(self):
        full_name = '%s <%s>' % (self.username, self.email)
        return full_name.strip()

    def get_short_name(self):
        """Return the short name for the user."""
        return self.username

    def signup(self, username, email, commit=True):
        """Update the fields required for sign-up."""
        self.username = username
        self.email = email
        if commit:
            self.save()