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