web/lib/django/contrib/auth/models.py
author ymh <ymh.work@gmail.com>
Wed, 02 Jun 2010 18:57:35 +0200
changeset 38 77b6da96e6f1
permissions -rw-r--r--
update django
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
import datetime
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
import urllib
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
from django.contrib import auth
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
from django.core.exceptions import ImproperlyConfigured
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
from django.db import models
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
from django.db.models.manager import EmptyManager
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
from django.contrib.contenttypes.models import ContentType
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
from django.utils.encoding import smart_str
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
from django.utils.hashcompat import md5_constructor, sha_constructor
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
from django.utils.translation import ugettext_lazy as _
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
UNUSABLE_PASSWORD = '!' # This will never be a valid hash
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
def get_hexdigest(algorithm, salt, raw_password):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
    Returns a string of the hexdigest of the given plaintext password and salt
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
    using the given algorithm ('md5', 'sha1' or 'crypt').
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    raw_password, salt = smart_str(raw_password), smart_str(salt)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
    if algorithm == 'crypt':
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
        try:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
            import crypt
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
        except ImportError:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
            raise ValueError('"crypt" password algorithm not supported in this environment')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
        return crypt.crypt(raw_password, salt)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    if algorithm == 'md5':
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
        return md5_constructor(salt + raw_password).hexdigest()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
    elif algorithm == 'sha1':
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
        return sha_constructor(salt + raw_password).hexdigest()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
    raise ValueError("Got unknown password algorithm type in password.")
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
def check_password(raw_password, enc_password):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    Returns a boolean of whether the raw_password was correct. Handles
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    encryption formats behind the scenes.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    algo, salt, hsh = enc_password.split('$')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
    return hsh == get_hexdigest(algo, salt, raw_password)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
class SiteProfileNotAvailable(Exception):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
    pass
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
class PermissionManager(models.Manager):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
    def get_by_natural_key(self, codename, app_label, model):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
        return self.get(
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
            codename=codename,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
            content_type=ContentType.objects.get_by_natural_key(app_label, model)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
        )
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
class Permission(models.Model):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
    """The permissions system provides a way to assign permissions to specific users and groups of users.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
    The permission system is used by the Django admin site, but may also be useful in your own code. The Django admin site uses permissions as follows:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
        - The "add" permission limits the user's ability to view the "add" form and add an object.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
        - The "change" permission limits a user's ability to view the change list, view the "change" form and change an object.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        - The "delete" permission limits the ability to delete an object.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
    Permissions are set globally per type of object, not per specific object instance. It is possible to say "Mary may change news stories," but it's not currently possible to say "Mary may change news stories, but only the ones she created herself" or "Mary may only change news stories that have a certain status or publication date."
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
    Three basic permissions -- add, change and delete -- are automatically created for each Django model.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
    name = models.CharField(_('name'), max_length=50)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
    content_type = models.ForeignKey(ContentType)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
    codename = models.CharField(_('codename'), max_length=100)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
    objects = PermissionManager()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
    class Meta:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
        verbose_name = _('permission')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
        verbose_name_plural = _('permissions')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
        unique_together = (('content_type', 'codename'),)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
        ordering = ('content_type__app_label', 'content_type__model', 'codename')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
    def __unicode__(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
        return u"%s | %s | %s" % (
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
            unicode(self.content_type.app_label),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
            unicode(self.content_type),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
            unicode(self.name))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
    def natural_key(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
        return (self.codename,) + self.content_type.natural_key()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
    natural_key.dependencies = ['contenttypes.contenttype']
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
class Group(models.Model):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    """Groups are a generic way of categorizing users to apply permissions, or some other label, to those users. A user can belong to any number of groups.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
    A user in a group automatically has all the permissions granted to that group. For example, if the group Site editors has the permission can_edit_home_page, any user in that group will have that permission.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
    Beyond permissions, groups are a convenient way to categorize users to apply some label, or extended functionality, to them. For example, you could create a group 'Special users', and you could write code that would do special things to those users -- such as giving them access to a members-only portion of your site, or sending them members-only e-mail messages.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
    name = models.CharField(_('name'), max_length=80, unique=True)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
    permissions = models.ManyToManyField(Permission, verbose_name=_('permissions'), blank=True)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
    class Meta:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
        verbose_name = _('group')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
        verbose_name_plural = _('groups')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
    def __unicode__(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
        return self.name
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
class UserManager(models.Manager):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
    def create_user(self, username, email, password=None):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
        Creates and saves a User with the given username, e-mail and password.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
        now = datetime.datetime.now()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
        
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
        # Normalize the address by lowercasing the domain part of the email
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
        # address.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
        try:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
            email_name, domain_part = email.strip().split('@', 1)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
        except ValueError:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
            pass
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
        else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
            email = '@'.join([email_name, domain_part.lower()])
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
        user = self.model(username=username, email=email, is_staff=False,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
                         is_active=True, is_superuser=False, last_login=now,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
                         date_joined=now)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
        if password:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
            user.set_password(password)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
        else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
            user.set_unusable_password()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
        user.save(using=self._db)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
        return user
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
    def create_superuser(self, username, email, password):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
        u = self.create_user(username, email, password)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
        u.is_staff = True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
        u.is_active = True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
        u.is_superuser = True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
        u.save(using=self._db)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
        return u
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
    def make_random_password(self, length=10, allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789'):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
        "Generates a random password with the given length and given allowed_chars"
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
        # Note that default value of allowed_chars does not have "I" or letters
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
        # that look like it -- just to avoid confusion.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
        from random import choice
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
        return ''.join([choice(allowed_chars) for i in range(length)])
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
# A few helper functions for common logic between User and AnonymousUser.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
def _user_get_all_permissions(user, obj):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
    permissions = set()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
    anon = user.is_anonymous()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
    for backend in auth.get_backends():
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
        if not anon or backend.supports_anonymous_user:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
            if hasattr(backend, "get_all_permissions"):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
                if obj is not None:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
                    if backend.supports_object_permissions:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
                        permissions.update(
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
                            backend.get_all_permissions(user, obj)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
                        )
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
                else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
                    permissions.update(backend.get_all_permissions(user))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
    return permissions
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
def _user_has_perm(user, perm, obj):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
    anon = user.is_anonymous()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
    for backend in auth.get_backends():
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
        if not anon or backend.supports_anonymous_user:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
            if hasattr(backend, "has_perm"):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
                if obj is not None:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
                    if (backend.supports_object_permissions and
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
                        backend.has_perm(user, perm, obj)):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
                            return True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
                else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
                    if backend.has_perm(user, perm):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
                        return True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
    return False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
def _user_has_module_perms(user, app_label):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
    anon = user.is_anonymous()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
    for backend in auth.get_backends():
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
        if not anon or backend.supports_anonymous_user:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
            if hasattr(backend, "has_module_perms"):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
                if backend.has_module_perms(user, app_label):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
                    return True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
    return False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
class User(models.Model):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
    Users within the Django authentication system are represented by this model.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
    Username and password are required. Other fields are optional.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
    username = models.CharField(_('username'), max_length=30, unique=True, help_text=_("Required. 30 characters or fewer. Letters, numbers and @/./+/-/_ characters"))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
    last_name = models.CharField(_('last name'), max_length=30, blank=True)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
    email = models.EmailField(_('e-mail address'), blank=True)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
    password = models.CharField(_('password'), max_length=128, help_text=_("Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
    is_staff = models.BooleanField(_('staff status'), default=False, help_text=_("Designates whether the user can log into this admin site."))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
    is_active = models.BooleanField(_('active'), default=True, help_text=_("Designates whether this user should be treated as active. Unselect this instead of deleting accounts."))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
    is_superuser = models.BooleanField(_('superuser status'), default=False, help_text=_("Designates that this user has all permissions without explicitly assigning them."))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
    last_login = models.DateTimeField(_('last login'), default=datetime.datetime.now)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
    date_joined = models.DateTimeField(_('date joined'), default=datetime.datetime.now)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
    groups = models.ManyToManyField(Group, verbose_name=_('groups'), blank=True,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
        help_text=_("In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
    user_permissions = models.ManyToManyField(Permission, verbose_name=_('user permissions'), blank=True)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
    objects = UserManager()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
    class Meta:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
        verbose_name = _('user')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
        verbose_name_plural = _('users')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
    def __unicode__(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
        return self.username
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
    def get_absolute_url(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
        return "/users/%s/" % urllib.quote(smart_str(self.username))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
    def is_anonymous(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
        Always returns False. This is a way of comparing User objects to
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
        anonymous users.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
        return False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
    def is_authenticated(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
        Always return True. This is a way to tell if the user has been
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
        authenticated in templates.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
        return True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
    def get_full_name(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
        "Returns the first_name plus the last_name, with a space in between."
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
        full_name = u'%s %s' % (self.first_name, self.last_name)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
        return full_name.strip()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
    def set_password(self, raw_password):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
        import random
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
        algo = 'sha1'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
        salt = get_hexdigest(algo, str(random.random()), str(random.random()))[:5]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
        hsh = get_hexdigest(algo, salt, raw_password)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
        self.password = '%s$%s$%s' % (algo, salt, hsh)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
    def check_password(self, raw_password):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
        Returns a boolean of whether the raw_password was correct. Handles
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
        encryption formats behind the scenes.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
        # Backwards-compatibility check. Older passwords won't include the
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
        # algorithm or salt.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
        if '$' not in self.password:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
            is_correct = (self.password == get_hexdigest('md5', '', raw_password))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
            if is_correct:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
                # Convert the password to the new, more secure format.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
                self.set_password(raw_password)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
                self.save()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
            return is_correct
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
        return check_password(raw_password, self.password)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
    def set_unusable_password(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
        # Sets a value that will never be a valid hash
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
        self.password = UNUSABLE_PASSWORD
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
    def has_usable_password(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
        return self.password != UNUSABLE_PASSWORD
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
    def get_group_permissions(self, obj=None):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
        Returns a list of permission strings that this user has through
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
        his/her groups. This method queries all available auth backends.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
        If an object is passed in, only permissions matching this object
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
        are returned.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
        permissions = set()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
        for backend in auth.get_backends():
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
            if hasattr(backend, "get_group_permissions"):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
                if obj is not None:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
                    if backend.supports_object_permissions:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
                        permissions.update(
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
                            backend.get_group_permissions(self, obj)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
                        )
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
                else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
                    permissions.update(backend.get_group_permissions(self))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
        return permissions
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
    def get_all_permissions(self, obj=None):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
        return _user_get_all_permissions(self, obj)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
    def has_perm(self, perm, obj=None):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
        Returns True if the user has the specified permission. This method
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
        queries all available auth backends, but returns immediately if any
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
        backend returns True. Thus, a user who has permission from a single
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
        auth backend is assumed to have permission in general. If an object
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
        is provided, permissions for this specific object are checked.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
        # Inactive users have no permissions.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
        if not self.is_active:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
            return False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
        # Superusers have all permissions.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
        if self.is_superuser:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
            return True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
        # Otherwise we need to check the backends.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
        return _user_has_perm(self, perm, obj)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
    def has_perms(self, perm_list, obj=None):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
        Returns True if the user has each of the specified permissions.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
        If object is passed, it checks if the user has all required perms
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
        for this object.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
        for perm in perm_list:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
            if not self.has_perm(perm, obj):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
                return False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
        return True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
    def has_module_perms(self, app_label):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
        Returns True if the user has any permissions in the given app
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
        label. Uses pretty much the same logic as has_perm, above.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
        if not self.is_active:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
            return False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
        if self.is_superuser:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
            return True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
        return _user_has_module_perms(self, app_label)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
    def get_and_delete_messages(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
        messages = []
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
        for m in self.message_set.all():
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
            messages.append(m.message)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
            m.delete()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
        return messages
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
    def email_user(self, subject, message, from_email=None):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
        "Sends an e-mail to this User."
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
        from django.core.mail import send_mail
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
        send_mail(subject, message, from_email, [self.email])
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
    def get_profile(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
        Returns site-specific profile for this user. Raises
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
        SiteProfileNotAvailable if this site does not allow profiles.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
        if not hasattr(self, '_profile_cache'):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
            from django.conf import settings
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
            if not getattr(settings, 'AUTH_PROFILE_MODULE', False):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
                raise SiteProfileNotAvailable('You need to set AUTH_PROFILE_MO'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
                                              'DULE in your project settings')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
            try:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
                app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
            except ValueError:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
                raise SiteProfileNotAvailable('app_label and model_name should'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
                        ' be separated by a dot in the AUTH_PROFILE_MODULE set'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
                        'ting')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
            try:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
                model = models.get_model(app_label, model_name)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
                if model is None:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
                    raise SiteProfileNotAvailable('Unable to load the profile '
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
                        'model, check AUTH_PROFILE_MODULE in your project sett'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
                        'ings')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
                self._profile_cache = model._default_manager.using(self._state.db).get(user__id__exact=self.id)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
                self._profile_cache.user = self
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
            except (ImportError, ImproperlyConfigured):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
                raise SiteProfileNotAvailable
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
        return self._profile_cache
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
    def _get_message_set(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
        import warnings
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
        warnings.warn('The user messaging API is deprecated. Please update'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
                      ' your code to use the new messages framework.',
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
                      category=PendingDeprecationWarning)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
        return self._message_set
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
    message_set = property(_get_message_set)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
class Message(models.Model):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
    The message system is a lightweight way to queue messages for given
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
    users. A message is associated with a User instance (so it is only
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
    applicable for registered users). There's no concept of expiration or
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
    timestamps. Messages are created by the Django admin after successful
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
    actions. For example, "The poll Foo was created successfully." is a
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
    message.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
    user = models.ForeignKey(User, related_name='_message_set')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
    message = models.TextField(_('message'))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
    def __unicode__(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
        return self.message
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
class AnonymousUser(object):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
    id = None
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
    username = ''
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
    is_staff = False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
    is_active = False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
    is_superuser = False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
    _groups = EmptyManager()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
    _user_permissions = EmptyManager()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
    def __init__(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
        pass
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
    def __unicode__(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
        return 'AnonymousUser'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
    def __str__(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
        return unicode(self).encode('utf-8')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
    def __eq__(self, other):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
        return isinstance(other, self.__class__)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
    def __ne__(self, other):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
        return not self.__eq__(other)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
    def __hash__(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
        return 1 # instances always return the same hash value
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
    def save(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
        raise NotImplementedError
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
    def delete(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
        raise NotImplementedError
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
    def set_password(self, raw_password):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
        raise NotImplementedError
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
    def check_password(self, raw_password):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
        raise NotImplementedError
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
    def _get_groups(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
        return self._groups
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
    groups = property(_get_groups)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
    def _get_user_permissions(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
        return self._user_permissions
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
    user_permissions = property(_get_user_permissions)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
    def get_group_permissions(self, obj=None):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
        return set()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
    def get_all_permissions(self, obj=None):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
        return _user_get_all_permissions(self, obj=obj)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
    def has_perm(self, perm, obj=None):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
        return _user_has_perm(self, perm, obj=obj)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
    def has_perms(self, perm_list, obj=None):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
        for perm in perm_list:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
            if not self.has_perm(perm, obj):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
                return False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
        return True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
    def has_module_perms(self, module):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
        return _user_has_module_perms(self, module)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
    def get_and_delete_messages(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
        return []
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
    def is_anonymous(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
        return True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
    def is_authenticated(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
        return False