diff --git a/events/templates/events/base.html b/events/templates/events/base.html
new file mode 100644
index 0000000..1a4333a
--- /dev/null
+++ b/events/templates/events/base.html
@@ -0,0 +1,2 @@
+{% extends "base.html" %}
+{% block title %}{{ issue.title }}{# note: dubious: should really be event.title... #} | {{ block.super }}{% endblock %}
diff --git a/events/templates/events/event_detail.html b/events/templates/events/event_detail.html
index bddb2f7..880d534 100644
--- a/events/templates/events/event_detail.html
+++ b/events/templates/events/event_detail.html
@@ -1,4 +1,4 @@
-{% extends "base.html" %}
+{% extends "events/base.html" %}
{% block content %}
diff --git a/events/urls.py b/events/urls.py
index 02bf55c..db883cf 100644
--- a/events/urls.py
+++ b/events/urls.py
@@ -1,10 +1,10 @@
from django.urls import path
-from .views import event_detail, event_download, debug_get_hash
+from .views import event_download, debug_get_hash
urlpatterns = [
- path('event/
/', event_detail),
+ # path('event//', event_detail), perhaps should become a redirect to issue/.../event now?
path('event//raw/', event_download, kwargs={"as_attachment": False}),
path('event//download/', event_download, kwargs={"as_attachment": True}),
path('debug_get_hash//', debug_get_hash),
diff --git a/events/views.py b/events/views.py
index 71ad551..cf4075b 100644
--- a/events/views.py
+++ b/events/views.py
@@ -9,33 +9,6 @@ from issues.utils import get_hash_for_data, get_issue_grouper_for_data
from .models import Event
-def event_detail(request, pk):
- obj = get_object_or_404(Event, pk=pk)
-
- parsed_data = json.loads(obj.data)
-
- # sentry/glitchtip have some code here to deal with the case that "values" is not present, and exception itself is
- # the list of exceptions, but we don't aim for endless backwards compat (yet) so we don't.
- exceptions = parsed_data["exception"]["values"] if "exception" in parsed_data else None
-
- if "logentry" in parsed_data:
- logentry = parsed_data["logentry"]
- if "formatted" not in logentry:
- # TODO this is just a wild guess"
- if "message" in logentry:
- if "params" not in logentry:
- logentry["formatted"] = logentry["message"]
- else:
- logentry["formatted"] = logentry["message"].format(logentry["params"])
-
- return render(request, "events/event_detail.html", {
- "obj": obj,
- "parsed_data": parsed_data,
- "exceptions": exceptions,
- "issue_grouper": get_issue_grouper_for_data(parsed_data),
- })
-
-
def event_download(request, pk, as_attachment=False):
obj = get_object_or_404(Event, pk=pk)
result = HttpResponse(obj.data, content_type="application/json")
diff --git a/issues/templates/issues/issue_list.html b/issues/templates/issues/issue_list.html
index ed84f30..7c7dc62 100644
--- a/issues/templates/issues/issue_list.html
+++ b/issues/templates/issues/issue_list.html
@@ -8,7 +8,7 @@
{% for issue in issue_list %}
-
+
from 8 Nov 12:33 | last 8 Nov 12:39 | with 3 events
diff --git a/issues/urls.py b/issues/urls.py
index d0ccc1f..fe2442a 100644
--- a/issues/urls.py
+++ b/issues/urls.py
@@ -1,10 +1,12 @@
from django.urls import path
-from .views import issue_list, issue_event_list
+from .views import issue_list, issue_event_detail, issue_last_event, issue_event_list
urlpatterns = [
# path('issue//', issue_detail),
path('/', issue_list),
+ path('issue//event//', issue_event_detail),
+ path('issue//event/last/', issue_last_event),
path('issue//events/', issue_event_list),
]
diff --git a/issues/views.py b/issues/views.py
index 66ea775..d9595f6 100644
--- a/issues/views.py
+++ b/issues/views.py
@@ -1,5 +1,9 @@
-from django.shortcuts import render
+import json
+from django.shortcuts import render, get_object_or_404, redirect
+from events.models import Event
+
+from .utils import get_issue_grouper_for_data
from .models import Issue
@@ -12,7 +16,45 @@ def issue_list(request, project_id):
})
+def issue_last_event(request, issue_pk):
+ issue = get_object_or_404(Issue, pk=issue_pk)
+ last_event = issue.events.order_by("timestamp").last()
+
+ return redirect(issue_event_detail, issue_pk=issue_pk, event_pk=last_event.pk)
+
+
+def issue_event_detail(request, issue_pk, event_pk):
+ issue = get_object_or_404(Issue, pk=issue_pk)
+ event = get_object_or_404(Event, pk=event_pk)
+
+ parsed_data = json.loads(event.data)
+
+ # sentry/glitchtip have some code here to deal with the case that "values" is not present, and exception itself is
+ # the list of exceptions, but we don't aim for endless backwards compat (yet) so we don't.
+ exceptions = parsed_data["exception"]["values"] if "exception" in parsed_data else None
+
+ if "logentry" in parsed_data:
+ logentry = parsed_data["logentry"]
+ if "formatted" not in logentry:
+ # TODO this is just a wild guess"
+ if "message" in logentry:
+ if "params" not in logentry:
+ logentry["formatted"] = logentry["message"]
+ else:
+ logentry["formatted"] = logentry["message"].format(logentry["params"])
+
+ return render(request, "events/event_detail.html", {
+ "issue": issue,
+ "event": event,
+ "parsed_data": parsed_data,
+ "exceptions": exceptions,
+ "issue_grouper": get_issue_grouper_for_data(parsed_data),
+ })
+
+
def issue_event_list(request, issue_pk):
+ # TODO un-uglify, refactor the html somewhat.
+
issue = Issue.objects.get(pk=issue_pk)
# note: once we have "Event" (with parsed info) we'll point straight to Issue from there which reduces the nr of
diff --git a/theme/templates/base.html b/theme/templates/base.html
index dbdd83f..7c1ae0d 100644
--- a/theme/templates/base.html
+++ b/theme/templates/base.html
@@ -2,7 +2,7 @@
- {% block title %}{% endblock %}
+ {% block title %}Bugsink{% endblock %}
{% tailwind_css %}