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 %} - - -
-
-

Activity History

-
- - - -
- - {{ 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 %} + + +
+
+

Activity History

+
+ + + +
+ + {{ 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 "