diff options
author | ttt | 2017-05-13 00:29:47 +0530 |
---|---|---|
committer | ttt | 2017-05-13 00:29:47 +0530 |
commit | abf599be33b383a6a5baf9493093b2126a622ac8 (patch) | |
tree | 4c5ab6e0d935d5e65fabcf0258e4a00dd20a5afa /lib/python2.7/site-packages/django/contrib/auth/models.py | |
download | SBHS-2018-Rpi-abf599be33b383a6a5baf9493093b2126a622ac8.tar.gz SBHS-2018-Rpi-abf599be33b383a6a5baf9493093b2126a622ac8.tar.bz2 SBHS-2018-Rpi-abf599be33b383a6a5baf9493093b2126a622ac8.zip |
added all server files
Diffstat (limited to 'lib/python2.7/site-packages/django/contrib/auth/models.py')
-rw-r--r-- | lib/python2.7/site-packages/django/contrib/auth/models.py | 527 |
1 files changed, 527 insertions, 0 deletions
diff --git a/lib/python2.7/site-packages/django/contrib/auth/models.py b/lib/python2.7/site-packages/django/contrib/auth/models.py new file mode 100644 index 0000000..5153753 --- /dev/null +++ b/lib/python2.7/site-packages/django/contrib/auth/models.py @@ -0,0 +1,527 @@ +from __future__ import unicode_literals +import re +import warnings + +from django.core.exceptions import ImproperlyConfigured +from django.core.mail import send_mail +from django.core import validators +from django.db import models +from django.db.models.manager import EmptyManager +from django.utils.crypto import get_random_string +from django.utils.http import urlquote +from django.utils import six +from django.utils.translation import ugettext_lazy as _ +from django.utils import timezone + +from django.contrib import auth +from django.contrib.auth.hashers import ( + check_password, make_password, is_password_usable) +from django.contrib.auth.signals import user_logged_in +from django.contrib.contenttypes.models import ContentType +from django.utils.encoding import python_2_unicode_compatible + + +def update_last_login(sender, user, **kwargs): + """ + A signal receiver which updates the last_login date for + the user logging in. + """ + user.last_login = timezone.now() + user.save(update_fields=['last_login']) +user_logged_in.connect(update_last_login) + + +class SiteProfileNotAvailable(Exception): + pass + + +class PermissionManager(models.Manager): + def get_by_natural_key(self, codename, app_label, model): + return self.get( + codename=codename, + content_type=ContentType.objects.get_by_natural_key(app_label, + model), + ) + + +@python_2_unicode_compatible +class Permission(models.Model): + """ + The permissions system provides a way to assign permissions to specific + users and groups of users. + + 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: + + - The "add" permission limits the user's ability to view the "add" form + and add an object. + - The "change" permission limits a user's ability to view the change + list, view the "change" form and change an object. + - The "delete" permission limits the ability to delete an object. + + 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." + + Three basic permissions -- add, change and delete -- are automatically + created for each Django model. + """ + name = models.CharField(_('name'), max_length=50) + content_type = models.ForeignKey(ContentType) + codename = models.CharField(_('codename'), max_length=100) + objects = PermissionManager() + + class Meta: + verbose_name = _('permission') + verbose_name_plural = _('permissions') + unique_together = (('content_type', 'codename'),) + ordering = ('content_type__app_label', 'content_type__model', + 'codename') + + def __str__(self): + return "%s | %s | %s" % ( + six.text_type(self.content_type.app_label), + six.text_type(self.content_type), + six.text_type(self.name)) + + def natural_key(self): + return (self.codename,) + self.content_type.natural_key() + natural_key.dependencies = ['contenttypes.contenttype'] + + +class GroupManager(models.Manager): + """ + The manager for the auth's Group model. + """ + def get_by_natural_key(self, name): + return self.get(name=name) + + +@python_2_unicode_compatible +class Group(models.Model): + """ + 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. + + 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. + + 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 email + messages. + """ + name = models.CharField(_('name'), max_length=80, unique=True) + permissions = models.ManyToManyField(Permission, + verbose_name=_('permissions'), blank=True) + + objects = GroupManager() + + class Meta: + verbose_name = _('group') + verbose_name_plural = _('groups') + + def __str__(self): + return self.name + + def natural_key(self): + return (self.name,) + + +class BaseUserManager(models.Manager): + + @classmethod + def normalize_email(cls, email): + """ + Normalize the address by lowercasing the domain part of the email + address. + """ + email = email or '' + try: + email_name, domain_part = email.strip().rsplit('@', 1) + except ValueError: + pass + else: + email = '@'.join([email_name, domain_part.lower()]) + return email + + def make_random_password(self, length=10, + allowed_chars='abcdefghjkmnpqrstuvwxyz' + 'ABCDEFGHJKLMNPQRSTUVWXYZ' + '23456789'): + """ + Generates a random password with the given length and given + allowed_chars. Note that the default value of allowed_chars does not + have "I" or "O" or letters and digits that look similar -- just to + avoid confusion. + """ + return get_random_string(length, allowed_chars) + + def get_by_natural_key(self, username): + return self.get(**{self.model.USERNAME_FIELD: username}) + + +class UserManager(BaseUserManager): + + def _create_user(self, username, email, password, + is_staff, is_superuser, **extra_fields): + """ + Creates and saves a User with the given username, email and password. + """ + now = timezone.now() + if not username: + raise ValueError('The given username must be set') + email = self.normalize_email(email) + user = self.model(username=username, email=email, + is_staff=is_staff, is_active=True, + is_superuser=is_superuser, last_login=now, + date_joined=now, **extra_fields) + user.set_password(password) + user.save(using=self._db) + return user + + def create_user(self, username, email=None, password=None, **extra_fields): + return self._create_user(username, email, password, False, False, + **extra_fields) + + def create_superuser(self, username, email, password, **extra_fields): + return self._create_user(username, email, password, True, True, + **extra_fields) + + +@python_2_unicode_compatible +class AbstractBaseUser(models.Model): + password = models.CharField(_('password'), max_length=128) + last_login = models.DateTimeField(_('last login'), default=timezone.now) + + is_active = True + + REQUIRED_FIELDS = [] + + class Meta: + abstract = True + + def get_username(self): + "Return the identifying username for this User" + return getattr(self, self.USERNAME_FIELD) + + def __str__(self): + return self.get_username() + + def natural_key(self): + return (self.get_username(),) + + def is_anonymous(self): + """ + Always returns False. This is a way of comparing User objects to + anonymous users. + """ + return False + + def is_authenticated(self): + """ + Always return True. This is a way to tell if the user has been + authenticated in templates. + """ + return True + + def set_password(self, raw_password): + self.password = make_password(raw_password) + + def check_password(self, raw_password): + """ + Returns a boolean of whether the raw_password was correct. Handles + hashing formats behind the scenes. + """ + def setter(raw_password): + self.set_password(raw_password) + self.save(update_fields=["password"]) + return check_password(raw_password, self.password, setter) + + def set_unusable_password(self): + # Sets a value that will never be a valid hash + self.password = make_password(None) + + def has_usable_password(self): + return is_password_usable(self.password) + + def get_full_name(self): + raise NotImplementedError() + + def get_short_name(self): + raise NotImplementedError() + + +# A few helper functions for common logic between User and AnonymousUser. +def _user_get_all_permissions(user, obj): + permissions = set() + for backend in auth.get_backends(): + if hasattr(backend, "get_all_permissions"): + permissions.update(backend.get_all_permissions(user, obj)) + return permissions + + +def _user_has_perm(user, perm, obj): + for backend in auth.get_backends(): + if hasattr(backend, "has_perm"): + if backend.has_perm(user, perm, obj): + return True + return False + + +def _user_has_module_perms(user, app_label): + for backend in auth.get_backends(): + if hasattr(backend, "has_module_perms"): + if backend.has_module_perms(user, app_label): + return True + return False + + +class PermissionsMixin(models.Model): + """ + A mixin class that adds the fields and methods necessary to support + Django's Group and Permission model using the ModelBackend. + """ + is_superuser = models.BooleanField(_('superuser status'), default=False, + help_text=_('Designates that this user has all permissions without ' + 'explicitly assigning them.')) + groups = models.ManyToManyField(Group, verbose_name=_('groups'), + blank=True, help_text=_('The groups this user belongs to. A user will ' + 'get all permissions granted to each of ' + 'his/her group.'), + related_name="user_set", related_query_name="user") + user_permissions = models.ManyToManyField(Permission, + verbose_name=_('user permissions'), blank=True, + help_text=_('Specific permissions for this user.'), + related_name="user_set", related_query_name="user") + + class Meta: + abstract = True + + def get_group_permissions(self, obj=None): + """ + Returns a list of permission strings that this user has through his/her + 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) + + +class AbstractUser(AbstractBaseUser, PermissionsMixin): + """ + An abstract base class implementing a fully featured User model with + admin-compliant permissions. + + Username, password and email are required. Other fields are optional. + """ + 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') + ]) + first_name = models.CharField(_('first name'), max_length=30, blank=True) + last_name = models.CharField(_('last name'), max_length=30, blank=True) + 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) + + objects = UserManager() + + USERNAME_FIELD = 'username' + REQUIRED_FIELDS = ['email'] + + class Meta: + verbose_name = _('user') + verbose_name_plural = _('users') + abstract = True + + 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 = '%s %s' % (self.first_name, self.last_name) + return full_name.strip() + + def get_short_name(self): + "Returns the short name for the user." + return self.first_name + + def email_user(self, subject, message, from_email=None): + """ + Sends an email to this User. + """ + send_mail(subject, message, from_email, [self.email]) + + def get_profile(self): + """ + Returns site-specific profile for this user. Raises + SiteProfileNotAvailable if this site does not allow profiles. + """ + warnings.warn("The use of AUTH_PROFILE_MODULE to define user profiles has been deprecated.", + DeprecationWarning, stacklevel=2) + if not hasattr(self, '_profile_cache'): + from django.conf import settings + if not getattr(settings, 'AUTH_PROFILE_MODULE', False): + raise SiteProfileNotAvailable( + 'You need to set AUTH_PROFILE_MODULE in your project ' + 'settings') + try: + app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.') + except ValueError: + raise SiteProfileNotAvailable( + 'app_label and model_name should be separated by a dot in ' + 'the AUTH_PROFILE_MODULE setting') + try: + model = models.get_model(app_label, model_name) + if model is None: + raise SiteProfileNotAvailable( + 'Unable to load the profile model, check ' + 'AUTH_PROFILE_MODULE in your project settings') + self._profile_cache = model._default_manager.using( + self._state.db).get(user__id__exact=self.id) + self._profile_cache.user = self + except (ImportError, ImproperlyConfigured): + raise SiteProfileNotAvailable + return self._profile_cache + + +class User(AbstractUser): + """ + Users within the Django authentication system are represented by this + model. + + Username, password and email are required. Other fields are optional. + """ + class Meta(AbstractUser.Meta): + swappable = 'AUTH_USER_MODEL' + + +@python_2_unicode_compatible +class AnonymousUser(object): + id = None + pk = None + username = '' + is_staff = False + is_active = False + is_superuser = False + _groups = EmptyManager(Group) + _user_permissions = EmptyManager(Permission) + + def __init__(self): + pass + + def __str__(self): + return 'AnonymousUser' + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not self.__eq__(other) + + def __hash__(self): + return 1 # instances always return the same hash value + + def save(self): + raise NotImplementedError + + def delete(self): + raise NotImplementedError + + def set_password(self, raw_password): + raise NotImplementedError + + def check_password(self, raw_password): + raise NotImplementedError + + def _get_groups(self): + return self._groups + groups = property(_get_groups) + + def _get_user_permissions(self): + return self._user_permissions + user_permissions = property(_get_user_permissions) + + def get_group_permissions(self, obj=None): + return set() + + def get_all_permissions(self, obj=None): + return _user_get_all_permissions(self, obj=obj) + + def has_perm(self, perm, obj=None): + return _user_has_perm(self, perm, obj=obj) + + def has_perms(self, perm_list, obj=None): + for perm in perm_list: + if not self.has_perm(perm, obj): + return False + return True + + def has_module_perms(self, module): + return _user_has_module_perms(self, module) + + def is_anonymous(self): + return True + + def is_authenticated(self): + return False |