feat: Implement passkey authentication, account management features, and a dedicated MFA login verification flow.

This commit is contained in:
pacnpal
2026-01-06 10:08:44 -05:00
parent b80654952d
commit 4da7e52fb0
14 changed files with 1566 additions and 20 deletions

View File

@@ -173,6 +173,10 @@ class IsModeratorOrAdmin(GuardMixin, permissions.BasePermission):
if not request.user or not request.user.is_authenticated:
return False
# Django superusers always have access
if getattr(request.user, "is_superuser", False):
return True
user_role = getattr(request.user, "role", "USER")
return user_role in ["MODERATOR", "ADMIN", "SUPERUSER"]
@@ -193,6 +197,10 @@ class IsAdminOrSuperuser(GuardMixin, permissions.BasePermission):
if not request.user or not request.user.is_authenticated:
return False
# Django superusers always have access
if getattr(request.user, "is_superuser", False):
return True
user_role = getattr(request.user, "role", "USER")
return user_role in ["ADMIN", "SUPERUSER"]
@@ -220,6 +228,10 @@ class CanViewModerationData(GuardMixin, permissions.BasePermission):
if not request.user or not request.user.is_authenticated:
return False
# Django superusers can view all data
if getattr(request.user, "is_superuser", False):
return True
user_role = getattr(request.user, "role", "USER")
# Moderators and above can view all data
@@ -249,6 +261,10 @@ class CanModerateContent(GuardMixin, permissions.BasePermission):
if not request.user or not request.user.is_authenticated:
return False
# Django superusers always have access
if getattr(request.user, "is_superuser", False):
return True
user_role = getattr(request.user, "role", "USER")
return user_role in ["MODERATOR", "ADMIN", "SUPERUSER"]
@@ -257,6 +273,10 @@ class CanModerateContent(GuardMixin, permissions.BasePermission):
if not self.has_permission(request, view):
return False
# Django superusers can do everything
if getattr(request.user, "is_superuser", False):
return True
user_role = getattr(request.user, "role", "USER")
# Superusers can do everything
@@ -297,6 +317,10 @@ class CanAssignModerationTasks(GuardMixin, permissions.BasePermission):
if not request.user or not request.user.is_authenticated:
return False
# Django superusers always have access
if getattr(request.user, "is_superuser", False):
return True
user_role = getattr(request.user, "role", "USER")
return user_role in ["MODERATOR", "ADMIN", "SUPERUSER"]
@@ -341,6 +365,10 @@ class CanPerformBulkOperations(GuardMixin, permissions.BasePermission):
if not request.user or not request.user.is_authenticated:
return False
# Django superusers always have access
if getattr(request.user, "is_superuser", False):
return True
user_role = getattr(request.user, "role", "USER")
return user_role in ["ADMIN", "SUPERUSER"]
@@ -349,6 +377,10 @@ class CanPerformBulkOperations(GuardMixin, permissions.BasePermission):
if not self.has_permission(request, view):
return False
# Django superusers can perform all bulk operations
if getattr(request.user, "is_superuser", False):
return True
user_role = getattr(request.user, "role", "USER")
# Superusers can perform all bulk operations
@@ -386,6 +418,10 @@ class IsOwnerOrModerator(GuardMixin, permissions.BasePermission):
if not request.user or not request.user.is_authenticated:
return False
# Django superusers can access any object
if getattr(request.user, "is_superuser", False):
return True
user_role = getattr(request.user, "role", "USER")
# Moderators and above can access any object
@@ -419,6 +455,10 @@ class CanManageUserRestrictions(GuardMixin, permissions.BasePermission):
if not request.user or not request.user.is_authenticated:
return False
# Django superusers always have access
if getattr(request.user, "is_superuser", False):
return True
user_role = getattr(request.user, "role", "USER")
return user_role in ["MODERATOR", "ADMIN", "SUPERUSER"]
@@ -427,6 +467,10 @@ class CanManageUserRestrictions(GuardMixin, permissions.BasePermission):
if not self.has_permission(request, view):
return False
# Django superusers can manage any restriction
if getattr(request.user, "is_superuser", False):
return True
user_role = getattr(request.user, "role", "USER")
# Superusers can manage any restriction