diff --git a/atst/domain/audit_log.py b/atst/domain/audit_log.py
index a334cc7d..9dfffe16 100644
--- a/atst/domain/audit_log.py
+++ b/atst/domain/audit_log.py
@@ -25,6 +25,10 @@ class AuditLog(object):
)
return AuditEventQuery.get_all(pagination_opts)
+ @classmethod
+ def get_by_resource(cls, resource_id):
+ return db.session.query(AuditEvent).filter(AuditEvent.resource_id == resource_id).order_by(AuditEvent.time_created.desc()).all()
+
@classmethod
def _resource_type(cls, resource):
return type(resource).__name__.lower()
diff --git a/atst/models/invitation.py b/atst/models/invitation.py
index a6a2964d..cfa1a450 100644
--- a/atst/models/invitation.py
+++ b/atst/models/invitation.py
@@ -91,3 +91,24 @@ class Invitation(Base, TimestampsMixin, AuditableMixin):
@property
def is_revokable(self):
return self.is_pending and not self.is_expired
+
+ @property
+ def user_dod_id(self):
+ return self.user.dod_id if self.user is not None else None
+
+ @property
+ def event_details(self):
+ return {
+ "email": self.email,
+ "dod_id": self.user_dod_id,
+ }
+
+ @property
+ def history(self):
+ changes = self.get_changes()
+ change_set = {}
+
+ if "status" in changes:
+ change_set["status"] = [s.name for s in changes["status"]]
+
+ return change_set
diff --git a/templates/audit_log.html b/templates/audit_log.html
index b4b41daa..09fd800c 100644
--- a/templates/audit_log.html
+++ b/templates/audit_log.html
@@ -28,7 +28,7 @@
- {% if event.event_details %}
+ {% 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"] %}
@@ -40,6 +40,18 @@
in Workspace {{ event.event_details["workspace_id"] }}
({{ event.event_details["workspace"] }})
{% endif %}
+
+ {% elif event.event_details and event.resource_type == "invitation" %}
+ {% set now_pending = event.changed_state.status and event.changed_state.status.1 == "PENDING" %}
+ {% if now_pending %}
+ now pending
+ {{ event.changed_state.status.1 }}
+ {% 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 %}
diff --git a/tests/domain/test_invitations.py b/tests/domain/test_invitations.py
index 4f4a1492..ee5021a3 100644
--- a/tests/domain/test_invitations.py
+++ b/tests/domain/test_invitations.py
@@ -17,6 +17,8 @@ from tests.factories import (
InvitationFactory,
)
+from atst.domain.audit_log import AuditLog
+
def test_create_invitation():
workspace = WorkspaceFactory.create()
@@ -113,3 +115,15 @@ def test_resend_invitation():
Invitations.resend(workspace.owner, workspace.id, invite.token)
assert ws_role.invitations[0].is_revoked
assert ws_role.invitations[1].is_pending
+
+
+def test_audit_event_for_accepted_invite():
+ workspace = WorkspaceFactory.create()
+ user = UserFactory.create()
+ ws_role = WorkspaceRoleFactory.create(user=user, workspace=workspace)
+ invite = Invitations.create(workspace.owner, ws_role, user.email)
+ invite = Invitations.accept(user, invite.token)
+
+ accepted_event = AuditLog.get_by_resource(invite.id)[0]
+ assert "email" in accepted_event.event_details
+ assert "dod_id" in accepted_event.event_details