View events only as part of an issue

This commit is contained in:
Klaas van Schelven
2023-11-14 19:14:53 +01:00
parent 5d1bb46a40
commit 6db3f94eb6
8 changed files with 53 additions and 34 deletions

View File

@@ -0,0 +1,2 @@
{% extends "base.html" %}
{% block title %}{{ issue.title }}{# note: dubious: should really be event.title... #} | {{ block.super }}{% endblock %}

View File

@@ -1,4 +1,4 @@
{% extends "base.html" %}
{% extends "events/base.html" %}
{% block content %}
<div class="m-4">

View File

@@ -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/<uuid:pk>/', event_detail),
# path('event/<uuid:pk>/', event_detail), perhaps should become a redirect to issue/.../event now?
path('event/<uuid:pk>/raw/', event_download, kwargs={"as_attachment": False}),
path('event/<uuid:pk>/download/', event_download, kwargs={"as_attachment": True}),
path('debug_get_hash/<uuid:event_pk>/', debug_get_hash),

View File

@@ -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")

View File

@@ -8,7 +8,7 @@
{% for issue in issue_list %}
<div class="m-4 ml-0 p-4 border-2 bg-slate-50">
<div><a href="/issues/issue/{{ issue.id }}/events/" class="text-blue-800 font-bold">{{ issue.title }}</a> <span class="ml-2 italic">{{ issue.parsed_data.transaction }}</span> </div>
<div><a href="/issues/issue/{{ issue.id }}/event/last/" class="text-blue-800 font-bold">{{ issue.title }}</a> <span class="ml-2 italic">{{ issue.parsed_data.transaction }}</span> </div>
<div class="text-sm">from <b>8 Nov 12:33</b> | last <b>8 Nov 12:39</b> | with <b>3</b> events</div>
</div>

View File

@@ -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/<uuid:pk>/', issue_detail),
path('<int:project_id>/', issue_list),
path('issue/<uuid:issue_pk>/event/<uuid:event_pk>/', issue_event_detail),
path('issue/<uuid:issue_pk>/event/last/', issue_last_event),
path('issue/<uuid:issue_pk>/events/', issue_event_list),
]

View File

@@ -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

View File

@@ -2,7 +2,7 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>{% block title %}{% endblock %}</title>
<title>{% block title %}Bugsink{% endblock %}</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{% tailwind_css %}