From 1a5bf7d56c101dd704e1cb5e9ee2037de0cd77e6 Mon Sep 17 00:00:00 2001 From: Klaas van Schelven Date: Sat, 4 Nov 2023 21:02:04 +0100 Subject: [PATCH] The ugliest thing that could get a stacktrace on screen --- events/__init__.py | 0 events/admin.py | 3 ++ events/apps.py | 6 ++++ events/migrations/__init__.py | 0 events/models.py | 3 ++ events/templates/events/event_detail.html | 34 +++++++++++++++++++++++ events/tests.py | 3 ++ events/urls.py | 8 ++++++ events/views.py | 21 ++++++++++++++ ingest/models.py | 4 +++ issues/__init__.py | 0 issues/admin.py | 3 ++ issues/apps.py | 6 ++++ issues/migrations/__init__.py | 0 issues/models.py | 3 ++ issues/tests.py | 3 ++ issues/views.py | 3 ++ project/settings.py | 2 ++ project/urls.py | 4 ++- 19 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 events/__init__.py create mode 100644 events/admin.py create mode 100644 events/apps.py create mode 100644 events/migrations/__init__.py create mode 100644 events/models.py create mode 100644 events/templates/events/event_detail.html create mode 100644 events/tests.py create mode 100644 events/urls.py create mode 100644 events/views.py create mode 100644 issues/__init__.py create mode 100644 issues/admin.py create mode 100644 issues/apps.py create mode 100644 issues/migrations/__init__.py create mode 100644 issues/models.py create mode 100644 issues/tests.py create mode 100644 issues/views.py diff --git a/events/__init__.py b/events/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/events/admin.py b/events/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/events/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/events/apps.py b/events/apps.py new file mode 100644 index 0000000..20f48f2 --- /dev/null +++ b/events/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class EventsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'events' diff --git a/events/migrations/__init__.py b/events/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/events/models.py b/events/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/events/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/events/templates/events/event_detail.html b/events/templates/events/event_detail.html new file mode 100644 index 0000000..918109c --- /dev/null +++ b/events/templates/events/event_detail.html @@ -0,0 +1,34 @@ + + + +{% for exception in exceptions %} +

{{ exception.type }}: {{ exception.value }}

+ {{ parsed_data.request.url }}
+ + {% for frame in exception.stacktrace.frames %} + +

+
+ {{ frame.filename }} line {{ frame.lineno }}, in {{ frame.function }}.
+ +

+{% for line in frame.pre_context %}{{ line }}
+{% endfor %}{{ frame.context_line }}
+{% for line in frame.post_context %}{{ line }}
+{% endfor %}
+            
+ + {% for var, value in frame.vars.items %} + {{ var }}: {{ value }}
+ {% endfor %} + +

+ + {% endfor %} + + {% if not forloop.last %}While handling the above exception, yad yad
{% endif %} + +{% endfor %} + + + diff --git a/events/tests.py b/events/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/events/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/events/urls.py b/events/urls.py new file mode 100644 index 0000000..d6d447a --- /dev/null +++ b/events/urls.py @@ -0,0 +1,8 @@ +from django.urls import path + +from .views import decompressed_event_detail + + +urlpatterns = [ + path('event//', decompressed_event_detail), +] diff --git a/events/views.py b/events/views.py new file mode 100644 index 0000000..283fc6b --- /dev/null +++ b/events/views.py @@ -0,0 +1,21 @@ +import json + +from django.shortcuts import render, get_object_or_404 + +from ingest.models import DecompressedEvent + + +def decompressed_event_detail(request, pk): + # this view is misplaced "by nature" (it mixes ingested stuff and rendering); until we create a pipeline for that. + obj = get_object_or_404(DecompressedEvent, pk=pk) + + parsed_data = json.loads(obj.data) + + # NOTE: instead of values, this may also just be a flat list; TODO implement this + exceptions = parsed_data["exception"]["values"] + + return render(request, "events/event_detail.html", { + "obj": obj, + "parsed_data": parsed_data, + "exceptions": exceptions, + }) diff --git a/ingest/models.py b/ingest/models.py index 69b52bc..5cb600c 100644 --- a/ingest/models.py +++ b/ingest/models.py @@ -11,3 +11,7 @@ class DecompressedEvent(models.Model): project = models.ForeignKey(Project, blank=False, null=True, on_delete=models.SET_NULL) # SET_NULL: cleanup 'later' data = models.TextField(blank=False, null=False) timestamp = models.DateTimeField(null=False, auto_now_add=True, help_text="Server-side timestamp") + + def get_absolute_url(self): + # same note about misplacement as the view this is pointing to + return "/events/event/%s/" % self.id diff --git a/issues/__init__.py b/issues/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/issues/admin.py b/issues/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/issues/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/issues/apps.py b/issues/apps.py new file mode 100644 index 0000000..2722971 --- /dev/null +++ b/issues/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class IssuesConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'issues' diff --git a/issues/migrations/__init__.py b/issues/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/issues/models.py b/issues/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/issues/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/issues/tests.py b/issues/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/issues/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/issues/views.py b/issues/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/issues/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/project/settings.py b/project/settings.py index 315f88e..5385329 100644 --- a/project/settings.py +++ b/project/settings.py @@ -30,6 +30,8 @@ INSTALLED_APPS = [ 'projects', 'ingest', + 'issues', + 'events', ] MIDDLEWARE = [ diff --git a/project/urls.py b/project/urls.py index 2fbd3c3..33d7233 100644 --- a/project/urls.py +++ b/project/urls.py @@ -7,7 +7,9 @@ from .views import trigger_error urlpatterns = [ - path('api/', include('ingest.urls')), + path('api/', include('ingest.urls')), + + path('events/', include('events.urls')), path('admin/', admin.site.urls), ]