Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions tracker/migrations/0005_alter_unexpectedevent_options_and_more.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Generated by Django 5.2.7 on 2026-07-24 18:20

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("tracker", "0004_alter_hello_options"),
]

operations = [
migrations.AlterModelOptions(
name="unexpectedevent",
options={"ordering": ["-updated", "-created"]},
),
migrations.AddField(
model_name="unexpectedevent",
name="updated",
field=models.DateTimeField(auto_now=True, verbose_name="Last update date"),
),
migrations.AlterField(
model_name="unexpectedevent",
name="exception_msg",
field=models.CharField(
blank=True, max_length=400, null=True, verbose_name="Exception Msg"
),
),
migrations.AlterField(
model_name="unexpectedevent",
name="exception_type",
field=models.CharField(
blank=True, max_length=100, null=True, verbose_name="Exception Type"
),
),
]
83 changes: 55 additions & 28 deletions tracker/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,8 @@
import uuid
from datetime import datetime

from django.core.files.base import ContentFile
from django.db import models
from django.utils.translation import gettext_lazy as _
from modelcluster.fields import ParentalKey
from modelcluster.models import ClusterableModel
from wagtail.admin.panels import FieldPanel, InlinePanel, ObjectList, TabbedInterface
from wagtail.models import Orderable
from wagtailautocomplete.edit_handlers import AutocompletePanel

from core.forms import CoreAdminModelForm
from core.models import CommonControlField
from tracker import choices


class ProcEventCreateError(Exception): ...
Expand All @@ -27,9 +17,6 @@ class UnexpectedEventCreateError(Exception): ...
class EventCreateError(Exception): ...


class EventReportCreateError(Exception): ...


class EventReportSaveFileError(Exception): ...


Expand Down Expand Up @@ -97,8 +84,9 @@ def finish(self, completed=None, detail=None, errors=None, exceptions=None):
class UnexpectedEvent(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
created = models.DateTimeField(verbose_name=_("Creation date"), auto_now_add=True)
exception_type = models.TextField(_("Exception Type"), null=True, blank=True)
exception_msg = models.TextField(_("Exception Msg"), null=True, blank=True)
updated = models.DateTimeField(verbose_name=_("Last update date"), auto_now=True)
exception_type = models.CharField(_("Exception Type"), max_length=100, null=True, blank=True)
exception_msg = models.CharField(_("Exception Msg"), max_length=400, null=True, blank=True)
traceback = models.JSONField(null=True, blank=True)
detail = models.JSONField(null=True, blank=True)
item = models.CharField(
Expand All @@ -120,7 +108,7 @@ class Meta:
models.Index(fields=["item"]),
models.Index(fields=["action"]),
]
ordering = ["-created"]
ordering = ["-updated", "-created"]

def __str__(self):
if self.item or self.action:
Expand Down Expand Up @@ -148,30 +136,69 @@ def create(
action=None,
detail=None,
):
"""
Cria um novo UnexpectedEvent ou atualiza um já existente
(mesmo item + action, incluindo o par None/None), usando o
mais recente em caso de múltiplos registros.
"""
try:
if exception:
logging.exception(exception)

obj = cls()
obj.item = item
obj.action = action
obj.exception_msg = str(exception)
obj.exception_type = str(type(exception))
try:
json.dumps(detail)
obj.detail = detail
except Exception as e:
obj.detail = str(detail)
obj = cls._get(item, action)

if obj is not None:
obj._update(exception, exc_traceback, item, action, detail)
else:
obj = cls._create(exception, exc_traceback, item, action, detail)

if exc_traceback:
obj.traceback = traceback.format_tb(exc_traceback)
obj.save()
return obj
except Exception as exc:
raise UnexpectedEventCreateError(
f"Unable to create unexpected event ({exception} {exc_traceback}). EXCEPTION {exc}"
)

# ------------------------------------------------------------------
# Métodos auxiliares
# ------------------------------------------------------------------

@classmethod
def _get(cls, item, action):
"""
Busca um registro existente com o mesmo item e action
(incluindo o par None, None). Se houver múltiplos, retorna
o mais recente considerando updated e, em seguida, created.
"""
qs = cls.objects.filter(item=item, action=action).order_by(
"-updated", "-created"
)
return qs.first()

def _update(self, exception, exc_traceback, item, action, detail):
"""
Preenche/atualiza os campos do objeto (usado tanto na criação
quanto na atualização).
"""
self.item = item
self.action = action
self.exception_msg = str(exception)
self.exception_type = str(type(exception))
try:
json.dumps(detail)
self.detail = detail
except Exception:
self.detail = str(detail)

if exc_traceback:
self.traceback = traceback.format_tb(exc_traceback)

@classmethod
def _create(cls, exception, exc_traceback, item, action, detail):
obj = cls()
obj._update(exception, exc_traceback, item, action, detail)
return obj


def tracker_file_directory_path(instance, filename):
# file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
Expand Down
2 changes: 1 addition & 1 deletion tracker/wagtail_hooks.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from django.http import HttpResponseRedirect
from django.utils.translation import gettext_lazy as _
from wagtail.snippets.models import register_snippet
from wagtail.snippets.views.snippets import SnippetViewSet, SnippetViewSetGroup
Expand All @@ -23,6 +22,7 @@ class UnexpectedEventModelAdmin(SnippetViewSet):
"exception_type",
"exception_msg",
"created",
"updated"
)
list_filter = ("action", "exception_type", )
search_fields = (
Expand Down
Loading