diff options
author | 2019-10-20 05:39:11 +1000 | |
---|---|---|
committer | 2019-10-20 05:39:11 +1000 | |
commit | f590d2bc5960cafede1e596d67028052f2fad5b2 (patch) | |
tree | b250e64d985dc8e371145158abb1c8b4d7388b14 | |
parent | Set newest-first sorting for message deletion models, add log_url property. (diff) |
Add message log links, improved formatting to message deletion admin pages.
-rw-r--r-- | pydis_site/apps/api/admin.py | 82 |
1 files changed, 75 insertions, 7 deletions
diff --git a/pydis_site/apps/api/admin.py b/pydis_site/apps/api/admin.py index 059f52eb..6d6a9b3b 100644 --- a/pydis_site/apps/api/admin.py +++ b/pydis_site/apps/api/admin.py @@ -1,7 +1,10 @@ +import json from typing import Optional +from django import urls from django.contrib import admin from django.http import HttpRequest +from django.utils.html import format_html from .models import ( BotSetting, @@ -44,21 +47,86 @@ class LogEntryAdmin(admin.ModelAdmin): """Deny manual LogEntry creation.""" return False - def has_delete_permission( - self, - request: HttpRequest, - obj: Optional[LogEntry] = None - ) -> bool: + def has_delete_permission(self, request: HttpRequest, obj: Optional[LogEntry] = None) -> bool: """Deny LogEntry deletion.""" return False +class DeletedMessageAdmin(admin.ModelAdmin): + """Admin formatting for the DeletedMessage model.""" + + readonly_fields = ( + "id", + "author", + "channel_id", + "content", + "embed_data", + "context", + "view_full_log" + ) + + exclude = ("embeds", "deletion_context") + + search_fields = ( + "id", + "content", + "author__name", + "author__id", + "deletion_context__actor__name", + "deletion_context__actor__id" + ) + + @staticmethod + def embed_data(instance: DeletedMessage) -> Optional[str]: + """Format embed data in a code block for better readability.""" + if instance.embeds: + return format_html( + "<pre><code>{0}</code></pre>", + json.dumps(instance.embeds, indent=4) + ) + + @staticmethod + def context(instance: DeletedMessage) -> str: + """Provide full context info with a link through to context admin view.""" + link = urls.reverse( + "admin:api_messagedeletioncontext_change", + args=[instance.deletion_context.id] + ) + details = ( + f"Deleted by {instance.deletion_context.actor} at " + f"{instance.deletion_context.creation}" + ) + return format_html("<a href='{0}'>{1}</a>", link, details) + + @staticmethod + def view_full_log(instance: DeletedMessage) -> str: + """Provide a link to the message logs for the relevant context.""" + return format_html( + "<a href='{0}'>Click to view full context log</a>", + instance.deletion_context.log_url + ) + + +class MessageDeletionContextAdmin(admin.ModelAdmin): + """Admin formatting for the MessageDeletionContext model.""" + + readonly_fields = ("actor", "creation", "message_log") + + @staticmethod + def message_log(instance: MessageDeletionContext) -> str: + """Provide a formatted link to the message logs for the context.""" + return format_html( + "<a href='{0}'>Click to see deleted message log</a>", + instance.log_url + ) + + admin.site.register(BotSetting) -admin.site.register(DeletedMessage) +admin.site.register(DeletedMessage, DeletedMessageAdmin) admin.site.register(DocumentationLink) admin.site.register(Infraction) admin.site.register(LogEntry, LogEntryAdmin) -admin.site.register(MessageDeletionContext) +admin.site.register(MessageDeletionContext, MessageDeletionContextAdmin) admin.site.register(Nomination) admin.site.register(OffTopicChannelName) admin.site.register(Role) |