Merge pull request #478 from dod-ccpo/audit-log-event-templates
Audit log event templates
This commit is contained in:
commit
fee032e6d8
6
.gitignore
vendored
6
.gitignore
vendored
@ -45,8 +45,12 @@ ssl/client-certs/*.srl
|
||||
# uploads
|
||||
/uploads
|
||||
|
||||
# coverage output
|
||||
# python coverage output
|
||||
.coverage
|
||||
|
||||
# je coverage output
|
||||
coverage
|
||||
|
||||
|
||||
# selenium testing
|
||||
browserstacklocal
|
||||
|
@ -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
|
||||
|
@ -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")
|
||||
|
@ -1,75 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
{% from "components/pagination.html" import Pagination %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
|
||||
<section class="block-list">
|
||||
<header class="block-list__header">
|
||||
<h1 class="block-list__title">Activity History</h1>
|
||||
</header>
|
||||
|
||||
<ul>
|
||||
{% for event in audit_events %}
|
||||
<li class="block-list__item">
|
||||
<article class='audit-log__item'>
|
||||
<div class='audit-log__item__timestamp'>
|
||||
<local-datetime timestamp='{{ event.time_created }}'></local-datetime>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 class='h4 audit-log__item__name'>
|
||||
{{ event.user.full_name if event.user else "ATAT System" }}
|
||||
</h2>
|
||||
{{ event.action }} {{ event.resource_type }} <code>{{ event.resource_id }}</code>
|
||||
{% if event.display_name %}
|
||||
({{ event.display_name }})
|
||||
{% endif %}
|
||||
|
||||
<br>
|
||||
|
||||
{% if event.event_details and event.resource_type == "user" %}
|
||||
for User <code>{{ event.event_details.updated_user_id }}</code> ({{ event.event_details.updated_user_name }})
|
||||
|
||||
{% if event.event_details["environment"] %}
|
||||
<br>
|
||||
in Environment <code>{{ event.event_details["environment_id"] }}</code> ({{ event.event_details["environment"] }})
|
||||
<br>
|
||||
in Project <code>{{ event.event_details["project_id"] }}</code> ({{ event.event_details["project"] }})
|
||||
<br>
|
||||
in Workspace <code>{{ event.event_details["workspace_id"] }}</code> ({{ event.event_details["workspace"] }})
|
||||
{% endif %}
|
||||
<br>
|
||||
|
||||
{% 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 <code>{{ event.event_details.dod_id }}</code>)
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
{% if event.changed_state and event.resource_type == 'environment_role' %}
|
||||
from {{ event.changed_state.role[0] }} to {{ event.changed_state.role[1] }}
|
||||
<br>
|
||||
{% endif %}
|
||||
|
||||
{% if event.workspace %}
|
||||
in Workspace <code>{{ event.workspace_id }}</code> ({{ event.workspace.name }})
|
||||
{% elif event.request %}
|
||||
on Request <code>{{ event.request_id }}</code> ({{ event.request.displayname }})
|
||||
{% endif %}
|
||||
|
||||
{% if event.changed_state.role %}
|
||||
from {{ event.changed_state.role[0] }} to {{ event.changed_state.role[1] }}
|
||||
<br>
|
||||
{% endif %}
|
||||
</div>
|
||||
</article>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
</section>
|
||||
|
||||
{{ Pagination(audit_events, 'atst.activity_history') }}
|
||||
{% endblock %}
|
25
templates/audit_log/audit_log.html
Normal file
25
templates/audit_log/audit_log.html
Normal file
@ -0,0 +1,25 @@
|
||||
{% extends "base.html" %}
|
||||
{% from "components/pagination.html" import Pagination %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
|
||||
<section class="block-list">
|
||||
<header class="block-list__header">
|
||||
<h1 class="block-list__title">Activity History</h1>
|
||||
</header>
|
||||
|
||||
<ul>
|
||||
{% for event in audit_events %}
|
||||
<li class="block-list__item">
|
||||
{% autoescape false %}
|
||||
{{ event | renderAuditEvent }}
|
||||
{% endautoescape %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
</section>
|
||||
|
||||
{{ Pagination(audit_events, 'atst.activity_history') }}
|
||||
{% endblock %}
|
22
templates/audit_log/events/_base.html
Normal file
22
templates/audit_log/events/_base.html
Normal file
@ -0,0 +1,22 @@
|
||||
<article class='audit-log__item'>
|
||||
<div class='audit-log__item__timestamp'>
|
||||
<local-datetime timestamp='{{ event.time_created }}'></local-datetime>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{% block header %}
|
||||
<h2 class='h4 audit-log__item__name'>
|
||||
{{ event.user.full_name if event.user else "ATAT System" }}
|
||||
</h2>
|
||||
{{ event.action }} {{ event.resource_type }} <code>{{ event.resource_id }}</code>
|
||||
{% if event.display_name %}
|
||||
({{ event.display_name }})
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
<br>
|
||||
|
||||
{% block content %}{% endblock %}
|
||||
</div>
|
||||
</article>
|
||||
|
26
templates/audit_log/events/default.html
Normal file
26
templates/audit_log/events/default.html
Normal file
@ -0,0 +1,26 @@
|
||||
{% extends "audit_log/events/_base.html" %}
|
||||
|
||||
{% block content %}
|
||||
{% if event.event_details %}
|
||||
<br>
|
||||
<b>Details:</b>
|
||||
<dl>
|
||||
{% for key, value in event.event_details.items() %}
|
||||
{% if value is not none %}
|
||||
<dt>{{ key }}</dt>
|
||||
<dd>{{ value }}</dd>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</dl>
|
||||
{% endif %}
|
||||
{% if event.changed_state %}
|
||||
<br>
|
||||
<b>Changes:</b>
|
||||
<dl>
|
||||
{% for key, value in event.changed_state.items() %}
|
||||
<dt>{{ key }}</dt>
|
||||
<dd>{{ value[0] }} to {{ value[1] }}</dd>
|
||||
{% endfor %}
|
||||
</dl>
|
||||
{% endif %}
|
||||
{% endblock %}
|
5
templates/audit_log/events/environment.html
Normal file
5
templates/audit_log/events/environment.html
Normal file
@ -0,0 +1,5 @@
|
||||
{% extends "audit_log/events/_base.html" %}
|
||||
|
||||
{% block content %}
|
||||
in Workspace <code>{{ event.workspace_id }}</code> ({{ event.workspace.name }})
|
||||
{% endblock %}
|
13
templates/audit_log/events/environment_role.html
Normal file
13
templates/audit_log/events/environment_role.html
Normal file
@ -0,0 +1,13 @@
|
||||
{% extends 'audit_log/events/_base.html' %}
|
||||
|
||||
{% block content %}
|
||||
for User <code>{{ event.event_details.updated_user_id }}</code> ({{ event.event_details.updated_user_name }})
|
||||
{% if event.event_details["environment"] %}
|
||||
<br>
|
||||
in Environment <code>{{ event.event_details["environment_id"] }}</code> ({{ event.event_details["environment"] }})
|
||||
<br>
|
||||
in Project <code>{{ event.event_details["project_id"] }}</code> ({{ event.event_details["project"] }})
|
||||
<br>
|
||||
in Workspace <code>{{ event.event_details["workspace_id"] }}</code> ({{ event.event_details["workspace"] }})
|
||||
{% endif %}
|
||||
{% endblock %}
|
8
templates/audit_log/events/invitation.html
Normal file
8
templates/audit_log/events/invitation.html
Normal file
@ -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 <code>{{ event.event_details.dod_id }}</code>)
|
||||
{% endif %}
|
||||
{% endblock %}
|
4
templates/audit_log/events/project.html
Normal file
4
templates/audit_log/events/project.html
Normal file
@ -0,0 +1,4 @@
|
||||
{% extends "audit_log/events/_base.html" %}
|
||||
|
||||
{% block content %}
|
||||
{% endblock %}
|
4
templates/audit_log/events/request.html
Normal file
4
templates/audit_log/events/request.html
Normal file
@ -0,0 +1,4 @@
|
||||
{% extends "audit_log/events/_base.html" %}
|
||||
|
||||
{% block content %}
|
||||
{% endblock %}
|
4
templates/audit_log/events/request_review.html
Normal file
4
templates/audit_log/events/request_review.html
Normal file
@ -0,0 +1,4 @@
|
||||
{% extends "audit_log/events/_base.html" %}
|
||||
|
||||
{% block content %}
|
||||
{% endblock %}
|
5
templates/audit_log/events/request_revision.html
Normal file
5
templates/audit_log/events/request_revision.html
Normal file
@ -0,0 +1,5 @@
|
||||
{% extends "audit_log/events/_base.html" %}
|
||||
|
||||
{% block content %}
|
||||
on Request <code>{{ event.request_id }}</code> ({{ event.request.displayname }})
|
||||
{% endblock %}
|
4
templates/audit_log/events/request_status_event.html
Normal file
4
templates/audit_log/events/request_status_event.html
Normal file
@ -0,0 +1,4 @@
|
||||
{% extends "audit_log/events/_base.html" %}
|
||||
|
||||
{% block content %}
|
||||
{% endblock %}
|
4
templates/audit_log/events/user.html
Normal file
4
templates/audit_log/events/user.html
Normal file
@ -0,0 +1,4 @@
|
||||
{% extends "audit_log/events/_base.html" %}
|
||||
|
||||
{% block content %}
|
||||
{% endblock %}
|
4
templates/audit_log/events/workspace.html
Normal file
4
templates/audit_log/events/workspace.html
Normal file
@ -0,0 +1,4 @@
|
||||
{% extends "audit_log/events/_base.html" %}
|
||||
|
||||
{% block content %}
|
||||
{% endblock %}
|
14
templates/audit_log/events/workspace_role.html
Normal file
14
templates/audit_log/events/workspace_role.html
Normal file
@ -0,0 +1,14 @@
|
||||
{% extends "audit_log/events/_base.html" %}
|
||||
|
||||
{% block content %}
|
||||
for User <code>{{ event.event_details.updated_user_id }}</code> ({{ event.event_details.updated_user_name }})
|
||||
in Workspace <code>{{ event.workspace_id }}</code> ({{ 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 %}
|
@ -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 "<article" in result
|
||||
|
||||
|
||||
def test_render_audit_event_with_unknown_resource_type():
|
||||
event = AuditEvent(resource_type="boat")
|
||||
result = renderAuditEvent(event)
|
||||
assert "<article" in result
|
||||
|
Loading…
x
Reference in New Issue
Block a user