Source code for maasserver.models.userprofile
# Copyright 2012 Canonical Ltd. This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
"""UserProfile model."""
from __future__ import (
absolute_import,
print_function,
unicode_literals,
)
str = None
__metaclass__ = type
__all__ = [
'UserProfile',
]
from django.contrib.auth.models import User
from django.db.models import (
Manager,
Model,
OneToOneField,
)
from django.shortcuts import get_object_or_404
from maasserver import DefaultMeta
from maasserver.exceptions import CannotDeleteUserException
from maasserver.models.cleansave import CleanSave
from piston.models import Token
class UserProfileManager(Manager):
"""A utility to manage the collection of `UserProfile` (or `User`).
Use this when dealing with users that represent real-world users. System
users do not have `UserProfile` objects attached to them.
"""
def all_users(self):
"""Returns all "real" users (i.e. not including system users).
:return: A QuerySet of the users.
:rtype: django.db.models.query.QuerySet_
.. _django.db.models.query.QuerySet: https://docs.djangoproject.com/
en/dev/ref/models/querysets/
"""
user_ids = UserProfile.objects.all().values_list('user', flat=True)
return User.objects.filter(id__in=user_ids)
[docs]class UserProfile(CleanSave, Model):
"""A User profile to store MAAS specific methods and fields.
:ivar user: The related User_.
.. _User: https://docs.djangoproject.com/
en/dev/topics/auth/
#storing-additional-information-about-users
"""
class Meta(DefaultMeta):
"""Needed for South to recognize this model."""
objects = UserProfileManager()
user = OneToOneField(User)
def delete(self):
if self.user.node_set.exists():
nb_nodes = self.user.node_set.count()
msg = (
"User %s cannot be deleted: %d node(s) are still "
"allocated to this user." %
(self.user.username, nb_nodes))
raise CannotDeleteUserException(msg)
self.user.consumers.all().delete()
self.user.delete()
super(UserProfile, self).delete()
[docs] def get_authorisation_tokens(self):
"""Fetches all the user's OAuth tokens.
:return: A QuerySet of the tokens.
:rtype: django.db.models.query.QuerySet_
.. _django.db.models.query.QuerySet: https://docs.djangoproject.com/
en/dev/ref/models/querysets/
"""
# Avoid circular imports.
from maasserver.models.user import get_auth_tokens
return get_auth_tokens(self.user)
[docs] def create_authorisation_token(self):
"""Create a new Token and its related Consumer (OAuth authorisation).
:return: A tuple containing the Consumer and the Token that were
created.
:rtype: tuple
"""
# Avoid circular imports.
from maasserver.models.user import create_auth_token
token = create_auth_token(self.user)
return token.consumer, token
[docs] def delete_authorisation_token(self, token_key):
"""Delete the user's OAuth token wich key token_key.
:param token_key: The key of the token to be deleted.
:type token_key: string
:raises: `django.http.Http404`
"""
token = get_object_or_404(
Token, user=self.user, token_type=Token.ACCESS, key=token_key)
token.consumer.delete()
token.delete()
def __unicode__(self):
return self.user.username