@@ -0,0 +1,18 @@ +# Generated by Django 5.0.11 on 2025-09-23 09:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('msgs', '0006_messageerror'), + ] + + operations = [ + migrations.AddField( + model_name='messageerror', + name='stacktrace', + field=models.TextField(default=None, verbose_name='Stack Trace'), + ), + ] @@ -8,6 +8,7 @@ from .message import Message class MessageError(BaseModel): message = models.ForeignKey(Message, on_delete=models.DO_NOTHING, verbose_name=_('Message'), related_name='message') detail = models.TextField(verbose_name=_('Detail')) + stacktrace = models.TextField(default=None, verbose_name='Stack Trace') class Meta: verbose_name = _('Message error') @@ -1,8 +1,32 @@ from django.contrib import admin -from messages.models import MessageError +from messages.models import MessageError, Message + + +@admin.register(Message) +class MessageAdmin(admin.ModelAdmin): + readonly_fields = ( + 'uid', + 'created_at', + 'content', + 'file', + 'from_public_api', + 'is_sent', + 'info' + ) + exclude = ( + 'elapsed_time', + 'from_model', + 'is_deleted', + 'is_favourite', + 'is_shared', + 'content_type', + 'object_id', + ) @admin.register(MessageError) class MessageErrorAdmin(admin.ModelAdmin): - list_display = ['message', 'detail'] \ No newline at end of file + readonly_fields = ('detail', 'stacktrace') + list_display = ('message', 'detail') + list_filter = ('detail',) @@ -21,9 +21,10 @@ def make_messages_urls(appname: str): ), ] -def push_message_error(message: Message, err: str) -> None: +def push_message_error(message: Message, err: str, stacktrace: str) -> None: err_data = { 'message_id': str(message.uid), - 'detail': err + 'detail': err, + 'stacktrace': stacktrace } cache.client.get_client().rpush('message_errors', json.dumps(err_data)) @@ -1,5 +1,6 @@ import logging import sys +import traceback from django.utils.translation import gettext_lazy as _ from drf_spectacular.utils import OpenApiParameter, extend_schema @@ -175,7 +176,7 @@ class MessagesAPIView(APIView): if isinstance(exc, InsufficientBalance): return Response({'detail': f'{exc}'}, status=HTTP_402_PAYMENT_REQUIRED) logger.exception(exc) - push_message_error(input_message, str(exc)) + push_message_error(input_message, str(exc), traceback.format_exc()) return Response( { 'detail': _( @@ -1,5 +1,6 @@ import logging import sys +import traceback from drf_spectacular.utils import OpenApiParameter, extend_schema from rest_framework.permissions import IsAuthenticated @@ -147,7 +148,7 @@ class MediaAPIView(APIView): logger.exception(exc) input_message.is_sent = False input_message.save() - push_message_error(input_message, str(exc)) + push_message_error(input_message, str(exc), traceback.format_exc()) return Response(f'Error: {exc}', status=400) return Response(MessageSerializer(output_messages, many=True).data, 201) else: