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),
]