diff --git a/issues/templates/issues/base.html b/issues/templates/issues/base.html
index 4e7a554..a98232e 100644
--- a/issues/templates/issues/base.html
+++ b/issues/templates/issues/base.html
@@ -1,5 +1,6 @@
{% extends "base.html" %}
{% load static %}
+{% load issues %}
{% block title %}{{ issue.title }} ยท {{ block.super }}{% endblock %}
{% block content %}
@@ -140,27 +141,38 @@
-
Nr. of events
+
Nr. of events:
{{ issue.event_count }}
{% if issue.event_count > 1 %}
-
First seen
+
First seen:
{{ issue.first_seen|date:"j M G:i" }}
-
-
Last seen
+
+
Last seen:
{{ issue.last_seen|date:"j M G:i" }}
{% else %}
-
-
Seen at
+
+
Seen at:
{{ issue.first_seen|date:"j M G:i" }}
{% endif %}
+ {% if issue.get_events_at %}
+
+
Seen in releases:
+
+ {% for version in issue.get_events_at %}
+ {{ version|shortsha }}{% if not forloop.last %},{% endif %}
+ {% endfor %}
+
+
+ {% endif %}
+
diff --git a/releases/models.py b/releases/models.py
index b914b2c..852a7c7 100644
--- a/releases/models.py
+++ b/releases/models.py
@@ -15,10 +15,6 @@ from issues.models import Issue, TurningPoint, TurningPointKind
RE_PACKAGE_VERSION = re.compile('((?P.*)[@])?(?P.*)')
-# We don't actually parse for HEX yet (it's simply non-semver to us) but if we do we could use the following lengths:
-# 12 | 16 | 20 | 32 | 40 | 64
-
-
def is_valid_semver(full_version):
try:
version = RE_PACKAGE_VERSION.match(full_version).groupdict()["version"]
diff --git a/theme/templatetags/issues.py b/theme/templatetags/issues.py
index 4441cae..990c6e2 100644
--- a/theme/templatetags/issues.py
+++ b/theme/templatetags/issues.py
@@ -1,3 +1,4 @@
+import re
from django import template
from pygments import highlight
from pygments.lexers import PythonLexer
@@ -89,3 +90,27 @@ def firstlineno(value):
if value.get("lineno") is None:
return None
return value['lineno'] - len(value.get('pre_context', []))
+
+
+SHA_RE = re.compile(r"[0-9a-f]+")
+
+
+@register.filter(name='issha')
+def issha(value):
+ """does this look like a sha?"""
+ if len(value) not in [12, 16, 20, 32, 40, 64]:
+ return False
+
+ if not SHA_RE.fullmatch(value):
+ return False
+
+ return True
+
+
+@register.filter(name='shortsha')
+def shortsha(value):
+ """_if_ this value looks like a version hash, make it short"""
+ if not issha(value):
+ return value
+
+ return value[:12]