from django.contrib import admin from .models import ( EmailMessageRecord, MailboxConnection, RawDocument, Source, SourceLease, SourceOriginState, SourcePolicyReview, SourceRobotsCache, SourceRun, ) @admin.register(MailboxConnection) class MailboxConnectionAdmin(admin.ModelAdmin): list_display = ( "platform", "provider", "username", "enabled", "poll_interval_minutes", "last_success_at", "next_poll_at", ) list_filter = ("platform", "provider", "enabled") search_fields = ("username",) exclude = ("encrypted_password", "lease_token") @admin.register(Source) class SourceAdmin(admin.ModelAdmin): list_display = ( "name", "domain", "source_type", "status", "policy", "last_success_at", "failure_count", "next_run_at", ) list_filter = ("source_type", "status", "policy", "strict_mode") search_fields = ("name", "domain", "base_url") @admin.register(SourceRun) class SourceRunAdmin(admin.ModelAdmin): list_display = ("source", "status", "started_at", "finished_at", "extracted_count") list_filter = ("status", "error_category") readonly_fields = [field.name for field in SourceRun._meta.fields] @admin.register(SourcePolicyReview) class SourcePolicyReviewAdmin(admin.ModelAdmin): list_display = ( "source", "decision", "scope", "actor", "expires_at", "created_at", ) list_filter = ("decision", "scope", "expires_at") search_fields = ("source__name", "source__domain", "actor__username", "reason") readonly_fields = [field.name for field in SourcePolicyReview._meta.fields] @admin.register(SourceRobotsCache) class SourceRobotsCacheAdmin(admin.ModelAdmin): list_display = ("origin", "expires_at", "byte_length", "updated_at", "error") list_filter = ("error",) search_fields = ("origin",) readonly_fields = [field.name for field in SourceRobotsCache._meta.fields] @admin.register(SourceLease) class SourceLeaseAdmin(admin.ModelAdmin): list_display = ("source", "token", "worker_id", "expires_at", "updated_at") search_fields = ("source__name", "source__domain", "worker_id") readonly_fields = [field.name for field in SourceLease._meta.fields] @admin.register(SourceOriginState) class SourceOriginStateAdmin(admin.ModelAdmin): list_display = ("domain", "next_allowed_at", "updated_at") search_fields = ("domain",) readonly_fields = [field.name for field in SourceOriginState._meta.fields] @admin.register(RawDocument) class RawDocumentAdmin(admin.ModelAdmin): list_display = ("source", "kind", "http_status", "byte_length", "quarantined", "created_at") list_filter = ("kind", "quarantined", "http_status") search_fields = ("url", "final_url", "content_hash") readonly_fields = [field.name for field in RawDocument._meta.fields] @admin.register(EmailMessageRecord) class EmailMessageRecordAdmin(admin.ModelAdmin): list_display = ("subject", "sender", "received_at", "processed", "created_at") list_filter = ("processed", "mailbox") search_fields = ("subject", "sender", "message_id")