Merge pull request #478 from dod-ccpo/audit-log-event-templates

Audit log event templates
This commit is contained in:
patricksmithdds 2018-12-05 11:58:12 -05:00 committed by GitHub
commit fee032e6d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 173 additions and 79 deletions

6
.gitignore vendored
View File

@ -45,8 +45,12 @@ ssl/client-certs/*.srl
# uploads
/uploads
# coverage output
# python coverage output
.coverage
# je coverage output
coverage
# selenium testing
browserstacklocal

View File

@ -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

View File

@ -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")

View File

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

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

View 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>

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

View File

@ -0,0 +1,5 @@
{% extends "audit_log/events/_base.html" %}
{% block content %}
in Workspace <code>{{ event.workspace_id }}</code> ({{ event.workspace.name }})
{% endblock %}

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

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

View File

@ -0,0 +1,4 @@
{% extends "audit_log/events/_base.html" %}
{% block content %}
{% endblock %}

View File

@ -0,0 +1,4 @@
{% extends "audit_log/events/_base.html" %}
{% block content %}
{% endblock %}

View File

@ -0,0 +1,4 @@
{% extends "audit_log/events/_base.html" %}
{% block content %}
{% endblock %}

View File

@ -0,0 +1,5 @@
{% extends "audit_log/events/_base.html" %}
{% block content %}
on Request <code>{{ event.request_id }}</code> ({{ event.request.displayname }})
{% endblock %}

View File

@ -0,0 +1,4 @@
{% extends "audit_log/events/_base.html" %}
{% block content %}
{% endblock %}

View File

@ -0,0 +1,4 @@
{% extends "audit_log/events/_base.html" %}
{% block content %}
{% endblock %}

View File

@ -0,0 +1,4 @@
{% extends "audit_log/events/_base.html" %}
{% block content %}
{% endblock %}

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

View File

@ -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