__package__ = "archivebox.core" from django.contrib import admin from django.contrib.auth.admin import UserAdmin from django.contrib.auth import get_user_model from django.utils.html import format_html from django.utils.safestring import mark_safe class CustomUserAdmin(UserAdmin): sort_fields = ["id", "email", "username", "is_superuser", "last_login", "date_joined"] list_display = ["username", "id", "email", "is_superuser", "last_login", "date_joined"] readonly_fields = ("snapshot_set", "archiveresult_set", "tag_set", "apitoken_set", "outboundwebhook_set") # Preserve Django's default user creation form and fieldsets # This ensures passwords are properly hashed and permissions are set correctly add_fieldsets = UserAdmin.add_fieldsets # Extend fieldsets for change form only (not user creation) fieldsets = [*(UserAdmin.fieldsets or ()), ("Data", {"fields": readonly_fields})] @admin.display(description="Snapshots") def snapshot_set(self, obj): total_count = obj.snapshot_set.count() return mark_safe( "
".join( format_html( '[{}] 📅 {} {}', snap.pk, str(snap.id)[:8], snap.downloaded_at.strftime("%Y-%m-%d %H:%M") if snap.downloaded_at else "pending...", snap.url[:64], ) for snap in obj.snapshot_set.order_by("-modified_at")[:10] ) + f'
{total_count} total records...', ) @admin.display(description="Archive Result Logs") def archiveresult_set(self, obj): total_count = obj.archiveresult_set.count() return mark_safe( "
".join( format_html( '
[{}] 📅 {} 📄 {} {}', result.pk, str(result.id)[:8], result.snapshot.downloaded_at.strftime("%Y-%m-%d %H:%M") if result.snapshot.downloaded_at else "pending...", result.extractor, result.snapshot.url[:64], ) for result in obj.archiveresult_set.order_by("-modified_at")[:10] ) + f'
{total_count} total records...', ) @admin.display(description="Tags") def tag_set(self, obj): total_count = obj.tag_set.count() return mark_safe( ", ".join( format_html( '{}', tag.pk, tag.name, ) for tag in obj.tag_set.order_by("-modified_at")[:10] ) + f'
{total_count} total records...', ) @admin.display(description="API Tokens") def apitoken_set(self, obj): total_count = obj.apitoken_set.count() return mark_safe( "
".join( format_html( '
[{}] {} (expires {})', apitoken.pk, str(apitoken.id)[:8], apitoken.token_redacted[:64], apitoken.expires, ) for apitoken in obj.apitoken_set.order_by("-modified_at")[:10] ) + f'
{total_count} total records...', ) @admin.display(description="API Outbound Webhooks") def outboundwebhook_set(self, obj): total_count = obj.outboundwebhook_set.count() return mark_safe( "
".join( format_html( '
[{}] {} -> {}', outboundwebhook.pk, str(outboundwebhook.id)[:8], outboundwebhook.referenced_model, outboundwebhook.endpoint, ) for outboundwebhook in obj.outboundwebhook_set.order_by("-modified_at")[:10] ) + f'
{total_count} total records...', ) def register_admin(admin_site): admin_site.register(get_user_model(), CustomUserAdmin)