diff --git a/atst/domain/audit_log.py b/atst/domain/audit_log.py index cb7354db..97bb6603 100644 --- a/atst/domain/audit_log.py +++ b/atst/domain/audit_log.py @@ -22,6 +22,15 @@ class AuditEventQuery(Query): ) return cls.paginate(query, pagination_opts) + @classmethod + def get_application_events(cls, application_id, pagination_opts): + query = ( + db.session.query(cls.model) + .filter(cls.model.application_id == application_id) + .order_by(cls.model.time_created.desc()) + ) + return cls.paginate(query, pagination_opts) + class AuditLog(object): @classmethod @@ -36,6 +45,9 @@ class AuditLog(object): def get_portfolio_events(cls, portfolio, pagination_opts=None): return AuditEventQuery.get_portfolio_events(portfolio.id, pagination_opts) + @classmethod + def get_application_events(cls, application, pagination_opts=None): + return AuditEventQuery.get_application_events(application.id, pagination_opts) @classmethod def get_by_resource(cls, resource_id): diff --git a/atst/routes/applications/settings.py b/atst/routes/applications/settings.py index 935aaaf4..a50e04ae 100644 --- a/atst/routes/applications/settings.py +++ b/atst/routes/applications/settings.py @@ -3,6 +3,8 @@ from flask import redirect, render_template, request as http_request, url_for from . import applications_bp from atst.domain.environments import Environments from atst.domain.applications import Applications +from atst.domain.audit_log import AuditLog +from atst.domain.common import Paginator from atst.forms.app_settings import AppEnvRolesForm from atst.forms.application import ApplicationForm, EditEnvironmentForm from atst.forms.data import ENV_ROLE_NO_ACCESS as NO_ACCESS @@ -90,6 +92,8 @@ def render_settings_page(application, **kwargs): environments_obj = get_environments_obj_for_app(application=application) members_form = AppEnvRolesForm(data=data_for_app_env_roles_form(application)) new_env_form = EditEnvironmentForm() + pagination_opts = Paginator.get_pagination_opts(http_request) + audit_events = AuditLog.get_application_events(application, pagination_opts) if "application_form" not in kwargs: kwargs["application_form"] = ApplicationForm( @@ -102,6 +106,7 @@ def render_settings_page(application, **kwargs): environments_obj=environments_obj, members_form=members_form, new_env_form=new_env_form, + audit_events=audit_events, **kwargs, ) diff --git a/templates/portfolios/applications/settings.html b/templates/portfolios/applications/settings.html index 8fe46732..65b14f4a 100644 --- a/templates/portfolios/applications/settings.html +++ b/templates/portfolios/applications/settings.html @@ -4,6 +4,7 @@ {% from "components/delete_confirmation.html" import DeleteConfirmation %} {% from "components/icon.html" import Icon %} {% from "components/modal.html" import Modal %} +{% from "components/pagination.html" import Pagination %} {% from "components/text_input.html" import TextInput %} {% set secondary_breadcrumb = 'portfolios.applications.existing_application_title' | translate({ "application_name": application.name }) %} @@ -102,4 +103,9 @@ {% endcall %} {% endif %} + {% if user_can(permissions.VIEW_APPLICATION) %} + {% include "fragments/audit_events_log.html" %} + {{ Pagination(audit_events, url=url_for('applications.settings', application_id=application.id)) }} + {% endif %} + {% endblock %} diff --git a/tests/routes/applications/test_settings.py b/tests/routes/applications/test_settings.py index 40f758ed..ff0b8d34 100644 --- a/tests/routes/applications/test_settings.py +++ b/tests/routes/applications/test_settings.py @@ -15,6 +15,7 @@ from atst.routes.applications.settings import check_users_are_in_application from atst.domain.applications import Applications from atst.domain.environment_roles import EnvironmentRoles from atst.domain.environments import Environments +from atst.domain.common import Paginator from atst.domain.permission_sets import PermissionSets from atst.domain.portfolios import Portfolios from atst.domain.exceptions import NotFoundError @@ -116,7 +117,7 @@ def test_edit_application_environments_obj(app, client, user_session): ) assert response.status_code == 200 - _, context = templates[0] + _, context = templates[-1] assert isinstance(context["members_form"], AppEnvRolesForm) env_obj = context["environments_obj"][0] @@ -127,6 +128,7 @@ def test_edit_application_environments_obj(app, client, user_session): env_obj["members"].sort() == [env_role1.user.full_name, env_role2.user.full_name].sort() ) + assert isinstance(context["audit_events"], Paginator) def test_data_for_app_env_roles_form(app, client, user_session): @@ -156,7 +158,7 @@ def test_data_for_app_env_roles_form(app, client, user_session): ) assert response.status_code == 200 - _, context = templates[0] + _, context = templates[-1] members_form = context["members_form"] assert isinstance(members_form, AppEnvRolesForm)