@@ -64,7 +64,7 @@ class Message(models.Model): ) def __str__(self) -> str: - return f'Сообщение {self.pk} от {self.content_object.user}' + return f'Сообщение {self.pk}' class Meta: verbose_name = 'Сообщение' @@ -1,36 +1,55 @@ from django.contrib import admin +from django.urls import reverse +from django.utils.html import format_html from messages.models import MessageError, Message +from tools.chats.models import Chat +from tools.media.models import Gallery @admin.register(Message) class MessageAdmin(admin.ModelAdmin): - readonly_fields = ( + list_per_page = 20 + readonly_fields = ('uid', 'created_at', 'content_object_link') + fields = ( 'uid', 'created_at', + 'content_object_link', 'content', 'file', 'from_public_api', 'is_sent', 'info' ) - exclude = ( - 'elapsed_time', - 'from_model', - 'is_deleted', - 'is_favourite', - 'is_shared', - 'content_type', - 'object_id', - ) + raw_id_fields = ('content_type',) + + @admin.display(description="Связанный объект") + def content_object_link(self, obj): + if c_obj := obj.content_object: + url = reverse(f'admin:{c_obj._meta.app_label}_{c_obj._meta.model_name}_change', args=[c_obj.pk]) + return format_html('{}', url, str(c_obj)) + return '-' @admin.register(MessageError) class MessageErrorAdmin(admin.ModelAdmin): + list_per_page = 20 readonly_fields = ('detail', 'stacktrace') - list_display = ('message', 'short_detail') + list_display = ('pk', 'message_link', 'short_detail') search_fields = ('detail', 'stacktrace',) + raw_id_fields = ('message',) + + @admin.display(description='Сообщение') + def message_link(self, obj: MessageError): + if msg_id := obj.message_id: + url = reverse('admin:msgs_message_change', args=[msg_id]) + return format_html('{}', url, f'Сообщение {str(msg_id)[:8]}...') + return '-' @admin.display(description='Подробности') def short_detail(self, obj: MessageError): return obj.detail[:50] + + def get_queryset(self, request): + queryset = super().get_queryset(request) + return queryset.select_related('message')