diff --git a/.gitignore b/.gitignore
index e161f040..c7205185 100644
--- a/.gitignore
+++ b/.gitignore
@@ -45,8 +45,12 @@ ssl/client-certs/*.srl
# uploads
/uploads
-# coverage output
+# python coverage output
.coverage
+# je coverage output
+coverage
+
+
# selenium testing
browserstacklocal
diff --git a/atst/filters.py b/atst/filters.py
index c172a3df..32000105 100644
--- a/atst/filters.py
+++ b/atst/filters.py
@@ -1,6 +1,7 @@
import re
import datetime
-from flask import current_app as app
+from flask import current_app as app, render_template
+from jinja2.exceptions import TemplateNotFound
def iconSvg(name):
@@ -86,6 +87,14 @@ def pageWindow(pagination, size=2):
return (max(1, (page - size) - over), min(num_pages, (page + size) - under))
+def renderAuditEvent(event):
+ template_name = "audit_log/events/{}.html".format(event.resource_type)
+ try:
+ return render_template(template_name, event=event)
+ except TemplateNotFound:
+ return render_template("audit_log/events/default.html", event=event)
+
+
def register_filters(app):
app.jinja_env.filters["iconSvg"] = iconSvg
app.jinja_env.filters["dollars"] = dollars
@@ -98,3 +107,4 @@ def register_filters(app):
app.jinja_env.filters["formattedDate"] = formattedDate
app.jinja_env.filters["dateFromString"] = dateFromString
app.jinja_env.filters["pageWindow"] = pageWindow
+ app.jinja_env.filters["renderAuditEvent"] = renderAuditEvent
diff --git a/atst/routes/__init__.py b/atst/routes/__init__.py
index 339cd219..2a1d23bc 100644
--- a/atst/routes/__init__.py
+++ b/atst/routes/__init__.py
@@ -137,7 +137,7 @@ def get_pagination_opts(request, default_page=1, default_per_page=100):
def activity_history():
pagination_opts = get_pagination_opts(request)
audit_events = AuditLog.get_all_events(g.current_user, pagination_opts)
- return render_template("audit_log.html", audit_events=audit_events)
+ return render_template("audit_log/audit_log.html", audit_events=audit_events)
@bp.route("/about")
diff --git a/templates/audit_log.html b/templates/audit_log.html
deleted file mode 100644
index cacd164b..00000000
--- a/templates/audit_log.html
+++ /dev/null
@@ -1,75 +0,0 @@
-{% extends "base.html" %}
-{% from "components/pagination.html" import Pagination %}
-
-{% block content %}
-
-
-
-
-
-
- {% for event in audit_events %}
- -
-
-
-
-
-
-
-
- {{ event.user.full_name if event.user else "ATAT System" }}
-
- {{ event.action }} {{ event.resource_type }} {{ event.resource_id }}
- {% if event.display_name %}
- ({{ event.display_name }})
- {% endif %}
-
-
-
- {% if event.event_details and event.resource_type == "user" %}
- for User {{ event.event_details.updated_user_id }}
({{ event.event_details.updated_user_name }})
-
- {% if event.event_details["environment"] %}
-
- in Environment {{ event.event_details["environment_id"] }}
({{ event.event_details["environment"] }})
-
- in Project {{ event.event_details["project_id"] }}
({{ event.event_details["project"] }})
-
- in Workspace {{ event.event_details["workspace_id"] }}
({{ event.event_details["workspace"] }})
- {% endif %}
-
-
- {% elif event.event_details and event.resource_type == "invitation" %}
- {% set accepted = event.changed_state.status and event.changed_state.status.1 == "ACCEPTED" %}
- {% if accepted %}
- accepted by {{ event.event_details.email }} (DOD {{ event.event_details.dod_id }}
)
- {% endif %}
- {% endif %}
-
- {% if event.changed_state and event.resource_type == 'environment_role' %}
- from {{ event.changed_state.role[0] }} to {{ event.changed_state.role[1] }}
-
- {% endif %}
-
- {% if event.workspace %}
- in Workspace {{ event.workspace_id }}
({{ event.workspace.name }})
- {% elif event.request %}
- on Request {{ event.request_id }}
({{ event.request.displayname }})
- {% endif %}
-
- {% if event.changed_state.role %}
- from {{ event.changed_state.role[0] }} to {{ event.changed_state.role[1] }}
-
- {% endif %}
-
-
-
- {% endfor %}
-
-
-
-
- {{ Pagination(audit_events, 'atst.activity_history') }}
-{% endblock %}
diff --git a/templates/audit_log/audit_log.html b/templates/audit_log/audit_log.html
new file mode 100644
index 00000000..3b505135
--- /dev/null
+++ b/templates/audit_log/audit_log.html
@@ -0,0 +1,25 @@
+{% extends "base.html" %}
+{% from "components/pagination.html" import Pagination %}
+
+{% block content %}
+
+
+
+
+
+
+ {% for event in audit_events %}
+ -
+ {% autoescape false %}
+ {{ event | renderAuditEvent }}
+ {% endautoescape %}
+
+ {% endfor %}
+
+
+
+
+ {{ Pagination(audit_events, 'atst.activity_history') }}
+{% endblock %}
diff --git a/templates/audit_log/events/_base.html b/templates/audit_log/events/_base.html
new file mode 100644
index 00000000..03bd5a94
--- /dev/null
+++ b/templates/audit_log/events/_base.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+ {% block header %}
+
+ {{ event.user.full_name if event.user else "ATAT System" }}
+
+ {{ event.action }} {{ event.resource_type }} {{ event.resource_id }}
+ {% if event.display_name %}
+ ({{ event.display_name }})
+ {% endif %}
+ {% endblock %}
+
+
+
+ {% block content %}{% endblock %}
+
+
+
diff --git a/templates/audit_log/events/default.html b/templates/audit_log/events/default.html
new file mode 100644
index 00000000..2a6ecdf5
--- /dev/null
+++ b/templates/audit_log/events/default.html
@@ -0,0 +1,26 @@
+{% extends "audit_log/events/_base.html" %}
+
+{% block content %}
+ {% if event.event_details %}
+
+ Details:
+
+ {% for key, value in event.event_details.items() %}
+ {% if value is not none %}
+ - {{ key }}
+ - {{ value }}
+ {% endif %}
+ {% endfor %}
+
+ {% endif %}
+ {% if event.changed_state %}
+
+ Changes:
+
+ {% for key, value in event.changed_state.items() %}
+ - {{ key }}
+ - {{ value[0] }} to {{ value[1] }}
+ {% endfor %}
+
+ {% endif %}
+{% endblock %}
diff --git a/templates/audit_log/events/environment.html b/templates/audit_log/events/environment.html
new file mode 100644
index 00000000..a31a87ef
--- /dev/null
+++ b/templates/audit_log/events/environment.html
@@ -0,0 +1,5 @@
+{% extends "audit_log/events/_base.html" %}
+
+{% block content %}
+ in Workspace {{ event.workspace_id }}
({{ event.workspace.name }})
+{% endblock %}
diff --git a/templates/audit_log/events/environment_role.html b/templates/audit_log/events/environment_role.html
new file mode 100644
index 00000000..91b7a398
--- /dev/null
+++ b/templates/audit_log/events/environment_role.html
@@ -0,0 +1,13 @@
+{% extends 'audit_log/events/_base.html' %}
+
+{% block content %}
+ for User {{ event.event_details.updated_user_id }}
({{ event.event_details.updated_user_name }})
+ {% if event.event_details["environment"] %}
+
+ in Environment {{ event.event_details["environment_id"] }}
({{ event.event_details["environment"] }})
+
+ in Project {{ event.event_details["project_id"] }}
({{ event.event_details["project"] }})
+
+ in Workspace {{ event.event_details["workspace_id"] }}
({{ event.event_details["workspace"] }})
+ {% endif %}
+{% endblock %}
diff --git a/templates/audit_log/events/invitation.html b/templates/audit_log/events/invitation.html
new file mode 100644
index 00000000..663670bb
--- /dev/null
+++ b/templates/audit_log/events/invitation.html
@@ -0,0 +1,8 @@
+{% extends "audit_log/events/_base.html" %}
+
+{% block content %}
+ {% set accepted = event.changed_state.status and event.changed_state.status.1 == "ACCEPTED" %}
+ {% if accepted %}
+ accepted by {{ event.event_details.email }} (DOD {{ event.event_details.dod_id }}
)
+ {% endif %}
+{% endblock %}
diff --git a/templates/audit_log/events/project.html b/templates/audit_log/events/project.html
new file mode 100644
index 00000000..ef822521
--- /dev/null
+++ b/templates/audit_log/events/project.html
@@ -0,0 +1,4 @@
+{% extends "audit_log/events/_base.html" %}
+
+{% block content %}
+{% endblock %}
diff --git a/templates/audit_log/events/request.html b/templates/audit_log/events/request.html
new file mode 100644
index 00000000..ef822521
--- /dev/null
+++ b/templates/audit_log/events/request.html
@@ -0,0 +1,4 @@
+{% extends "audit_log/events/_base.html" %}
+
+{% block content %}
+{% endblock %}
diff --git a/templates/audit_log/events/request_review.html b/templates/audit_log/events/request_review.html
new file mode 100644
index 00000000..ef822521
--- /dev/null
+++ b/templates/audit_log/events/request_review.html
@@ -0,0 +1,4 @@
+{% extends "audit_log/events/_base.html" %}
+
+{% block content %}
+{% endblock %}
diff --git a/templates/audit_log/events/request_revision.html b/templates/audit_log/events/request_revision.html
new file mode 100644
index 00000000..f29caf62
--- /dev/null
+++ b/templates/audit_log/events/request_revision.html
@@ -0,0 +1,5 @@
+{% extends "audit_log/events/_base.html" %}
+
+{% block content %}
+ on Request {{ event.request_id }}
({{ event.request.displayname }})
+{% endblock %}
diff --git a/templates/audit_log/events/request_status_event.html b/templates/audit_log/events/request_status_event.html
new file mode 100644
index 00000000..ef822521
--- /dev/null
+++ b/templates/audit_log/events/request_status_event.html
@@ -0,0 +1,4 @@
+{% extends "audit_log/events/_base.html" %}
+
+{% block content %}
+{% endblock %}
diff --git a/templates/audit_log/events/user.html b/templates/audit_log/events/user.html
new file mode 100644
index 00000000..ef822521
--- /dev/null
+++ b/templates/audit_log/events/user.html
@@ -0,0 +1,4 @@
+{% extends "audit_log/events/_base.html" %}
+
+{% block content %}
+{% endblock %}
diff --git a/templates/audit_log/events/workspace.html b/templates/audit_log/events/workspace.html
new file mode 100644
index 00000000..ef822521
--- /dev/null
+++ b/templates/audit_log/events/workspace.html
@@ -0,0 +1,4 @@
+{% extends "audit_log/events/_base.html" %}
+
+{% block content %}
+{% endblock %}
diff --git a/templates/audit_log/events/workspace_role.html b/templates/audit_log/events/workspace_role.html
new file mode 100644
index 00000000..38a22720
--- /dev/null
+++ b/templates/audit_log/events/workspace_role.html
@@ -0,0 +1,14 @@
+{% extends "audit_log/events/_base.html" %}
+
+{% block content %}
+ for User {{ event.event_details.updated_user_id }}
({{ event.event_details.updated_user_name }})
+ in Workspace {{ event.workspace_id }}
({{ event.workspace.name }})
+
+ {% if event.changed_state.status %}
+ from status "{{ event.changed_state.status[0] }}" to "{{ event.changed_state.status[1] }}"
+ {% endif %}
+
+ {% if event.changed_state.role %}
+ from role {{ event.changed_state.role[0] }} to {{ event.changed_state.role[1] }}
+ {% endif %}
+{% endblock %}
diff --git a/tests/test_filters.py b/tests/test_filters.py
index fde37097..5cfff00e 100644
--- a/tests/test_filters.py
+++ b/tests/test_filters.py
@@ -1,6 +1,7 @@
import pytest
-from atst.filters import dollars
+from atst.filters import dollars, renderAuditEvent
+from atst.models import AuditEvent
@pytest.mark.parametrize(
@@ -15,3 +16,15 @@ from atst.filters import dollars
)
def test_dollar_fomatter(input, expected):
assert dollars(input) == expected
+
+
+def test_render_audit_event_with_known_resource_type():
+ event = AuditEvent(resource_type="user")
+ result = renderAuditEvent(event)
+ assert "