83 lines
2.9 KiB
Python
83 lines
2.9 KiB
Python
from django.contrib.auth.models import User
|
|
from django.contrib.auth.backends import ModelBackend
|
|
from .models import Staff, Student
|
|
|
|
class MultiModelBackend(ModelBackend):
|
|
def authenticate(self, request, username=None, password=None, **kwargs):
|
|
"""
|
|
Authenticate the user based on username (phone for Student and Staff) and password.
|
|
"""
|
|
if username is None or password is None:
|
|
return None
|
|
|
|
# Try authenticating as Staff
|
|
try:
|
|
staff = Staff.objects.get(phone=username)
|
|
if staff.check_password(password):
|
|
return staff
|
|
except Staff.DoesNotExist:
|
|
pass
|
|
|
|
# Try authenticating as Student
|
|
try:
|
|
student = Student.objects.get(phone=username)
|
|
if student.check_password(password):
|
|
return student
|
|
except Student.DoesNotExist:
|
|
pass
|
|
|
|
# Return None if no match
|
|
return None
|
|
|
|
def get_user(self, user_id):
|
|
"""
|
|
Retrieve a user instance using their ID.
|
|
"""
|
|
for model in [Staff, Student]:
|
|
try:
|
|
return model.objects.get(pk=user_id)
|
|
except model.DoesNotExist:
|
|
continue
|
|
return None
|
|
|
|
def get_group_permissions(self, user_obj, obj=None):
|
|
"""
|
|
Return a set of permission strings that the user has through their groups.
|
|
"""
|
|
if not user_obj.is_active or user_obj.is_anonymous or obj is not None:
|
|
return set()
|
|
|
|
if isinstance(user_obj, (Staff, Student)):
|
|
if not hasattr(user_obj, '_group_perm_cache'):
|
|
perms = set()
|
|
for group in user_obj.groups.all():
|
|
perms.update(
|
|
"%s.%s" % (ct, name)
|
|
for ct, name in group.permissions.values_list(
|
|
'content_type__app_label',
|
|
'codename'
|
|
)
|
|
)
|
|
user_obj._group_perm_cache = perms
|
|
return user_obj._group_perm_cache
|
|
else:
|
|
return super().get_group_permissions(user_obj, obj)
|
|
|
|
def get_all_permissions(self, user_obj, obj=None):
|
|
if not user_obj.is_active or user_obj.is_anonymous or obj is not None:
|
|
return set()
|
|
|
|
if isinstance(user_obj, (Staff, Student)):
|
|
return self.get_group_permissions(user_obj, obj)
|
|
else:
|
|
return super().get_all_permissions(user_obj, obj)
|
|
|
|
def has_perm(self, user_obj, perm, obj=None):
|
|
if not user_obj.is_active:
|
|
return False
|
|
|
|
if isinstance(user_obj, (Staff, Student)):
|
|
return perm in self.get_all_permissions(user_obj, obj)
|
|
else:
|
|
return super().has_perm(user_obj, perm, obj)
|