Source code for fyt.users.models
from django.db import models
from django.contrib.auth.models import BaseUserManager, PermissionsMixin
from fyt.dartdm.lookup import lookup_email, EmailLookupException
SENTINEL_NETID = 'SENTINEL'
SENTINEL_NAME = 'SENTINEL'
SENTINEL_PK = 1
[docs]class DartmouthUserManager(BaseUserManager):
"""
Object manager for DartmouthUser
"""
[docs] def get_or_create_by_netid(self, netid, name, did=None):
"""
Return the user with netid.
Create the user if necessary. Does not search via name, since
names from different sources (CAS, DartDm lookup) can be slightly
different.
Because we added the did field, some users do not have it set.
Also, users added via the permissions/access page don't have a
did set. Check and fix it if possible.
"""
try:
user = self.get(netid=netid)
if user.did == '' and did is not None:
user.did = did
user.save()
created = False
except self.model.DoesNotExist:
user = self.create_user(netid, name=name, did=did)
created = True
return (user, created)
[docs] def create_user(self, netid, name, email=None, did=None):
"""
Create a user. Try and lookup user's email in the
Dartmouth Directory manager. If not found email is
left empty.
"""
if email is None:
try:
email = lookup_email(netid)
except EmailLookupException:
email = ''
if did is None:
did = ''
return self.create(netid=netid, did=did, email=email, name=name)
def create_superuser(self, **kwargs):
raise Exception("create_superuser not implemented. "
"Use 'manage.py setsuperuser' instead.")
[docs] def sentinel(self):
"""
Sentinel user for edge cases.
"""
user, _ = self.get_or_create(
name=SENTINEL_NAME,
netid=SENTINEL_NETID,
pk=SENTINEL_PK,
)
return user
class NetIdField(models.CharField):
"""
Saves NetIds as lowercase for easy comparison.
"""
description = "A field to hold a Dartmouth WebAuth Netid"
def __init__(self, *args, **kwargs):
kwargs['max_length'] = 20
super(NetIdField, self).__init__(*args, **kwargs)
def to_python(self, value):
"""
Handle uppercase ids
"""
value = super(NetIdField, self).to_python(value)
if value is not None:
return value.lower()
def pre_save(self, model_instance, add):
"""
Update lowercase ids on the instance before saving
"""
value = getattr(model_instance, self.attname).lower()
setattr(model_instance, self.attname, value)
return value
[docs]class DartmouthUser(PermissionsMixin):
objects = DartmouthUserManager()
netid = NetIdField(unique=True)
# DID (Dartmouth ID) is not guaranteed to be set
did = models.CharField(max_length=20)
email = models.EmailField('email address')
email2 = models.EmailField('auxiliary email address', null=True, blank=True)
name = models.CharField(max_length=255, db_index=True)
last_login = models.DateTimeField('last login', blank=True, null=True)
class Meta:
ordering = ['name']
# used by Django Admin
@property
def is_active(self):
return True
@property
def is_staff(self):
return self.is_superuser
USERNAME_FIELD = 'netid'
REQUIRED_FIELDS = ['email', 'name']
def get_short_name(self):
return self.name
def get_full_name(self):
return self.name
def get_username(self):
return self.netid
def is_authenticated(self):
return True
def is_anonymous(self):
return False
def __str__(self):
#return '{} ({})'.format(self.name, self.netid)
return str(self.name)