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 %}
-
{{ issue.title }} {{ issue.parsed_data.transaction }}
+
{{ issue.title }} {{ issue.parsed_data.transaction }}
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 %}