Saas-Base / apps /security /admin.py
rsnarsna
first commit
667aacd
Raw
History Blame Contribute Delete
2.56 kB
"""
Admin configuration for the security app.
"""
from django.contrib import admin
from apps.security.models import (
BackupCode,
MFAFactor,
RateLimit,
RefreshToken,
SecurityEvent,
Session,
TokenBlacklist,
TrustedDevice,
)
@admin.register(Session)
class SessionAdmin(admin.ModelAdmin):
list_display = ("user", "ip_address", "is_active", "expires_at", "created_at")
list_filter = ("revoked_at",)
search_fields = ("user__email", "ip_address")
readonly_fields = ("user", "fingerprint", "ip_address", "user_agent", "created_at")
ordering = ("-created_at",)
def is_active(self, obj) -> bool:
return obj.is_active
is_active.boolean = True
@admin.register(RefreshToken)
class RefreshTokenAdmin(admin.ModelAdmin):
list_display = ("user", "is_active", "rotated_from", "expires_at", "created_at")
search_fields = ("user__email",)
ordering = ("-created_at",)
def is_active(self, obj) -> bool:
return obj.is_active
is_active.boolean = True
@admin.register(TokenBlacklist)
class TokenBlacklistAdmin(admin.ModelAdmin):
list_display = ("token_id", "user", "reason", "revoked_at")
search_fields = ("token_id", "user__email")
ordering = ("-revoked_at",)
@admin.register(MFAFactor)
class MFAFactorAdmin(admin.ModelAdmin):
list_display = ("user", "type", "enabled", "created_at")
list_filter = ("type", "enabled")
search_fields = ("user__email",)
@admin.register(BackupCode)
class BackupCodeAdmin(admin.ModelAdmin):
list_display = ("user", "is_used", "created_at")
list_filter = ("used_at",)
search_fields = ("user__email",)
def is_used(self, obj) -> bool:
return obj.is_used
is_used.boolean = True
@admin.register(TrustedDevice)
class TrustedDeviceAdmin(admin.ModelAdmin):
list_display = ("user", "device_id", "approved", "last_used_at")
list_filter = ("approved",)
search_fields = ("user__email", "device_id")
@admin.register(SecurityEvent)
class SecurityEventAdmin(admin.ModelAdmin):
list_display = ("user", "event_type", "created_at")
list_filter = ("event_type",)
search_fields = ("user__email",)
readonly_fields = ("user", "event_type", "metadata", "created_at")
ordering = ("-created_at",)
@admin.register(RateLimit)
class RateLimitAdmin(admin.ModelAdmin):
list_display = ("key", "attempts", "is_blocked", "blocked_until", "updated_at")
search_fields = ("key",)
def is_blocked(self, obj) -> bool:
return obj.is_blocked
is_blocked.boolean = True