diff --git a/atst/routes/applications/settings.py b/atst/routes/applications/settings.py index e12a66f9..eebd3d32 100644 --- a/atst/routes/applications/settings.py +++ b/atst/routes/applications/settings.py @@ -179,3 +179,21 @@ def delete(application_id): "applications.portfolio_applications", portfolio_id=application.portfolio_id ) ) + + +@applications_bp.route("/environments//delete", methods=["POST"]) +@user_can(Permissions.DELETE_ENVIRONMENT, message="delete delete_environment") +def delete_environment(environment_id): + environment = Environments.get(environment_id) + Environments.delete(environment=environment, commit=True) + + flash("environment_deleted", environment_name=environment.name) + + return redirect( + url_for( + "applications.settings", + application_id=environment.application_id, + _anchor="application-environments", + fragment="application-environments", + ) + ) diff --git a/atst/utils/flash.py b/atst/utils/flash.py index 9fff1be2..9855628e 100644 --- a/atst/utils/flash.py +++ b/atst/utils/flash.py @@ -2,6 +2,11 @@ from flask import flash, render_template_string from atst.utils.localization import translate MESSAGES = { + "environment_deleted": { + "title_template": "{{ environment_name }} deleted", + "message_template": 'The environment "{{ environment_name }}" has been deleted', + "category": "success", + }, "application_environments_updated": { "title_template": "Application environments updated", "message_template": "Application environments have been updated", diff --git a/templates/fragments/applications/edit_environments.html b/templates/fragments/applications/edit_environments.html index cd27c2d3..ec021234 100644 --- a/templates/fragments/applications/edit_environments.html +++ b/templates/fragments/applications/edit_environments.html @@ -2,6 +2,7 @@ {% from "components/toggle_list.html" import ToggleButton, ToggleSection %} {% from "components/text_input.html" import TextInput %} {% from "components/save_button.html" import SaveButton %} +{% from "components/modal.html" import Modal %} {% macro RolePanel(users=[], role='no_access') %} {% if role == 'no_access' %} @@ -51,6 +52,7 @@ {% set member_count = env['members_form'].data['team_roles'] | length %} {% set members_by_role = env['members'] %} {% set unassigned = members_by_role['no_access'] %} + {% set delete_environment_modal_id = 'delete' %}
  • @@ -74,7 +76,7 @@
    - + {{ Icon('trash') }}
    @@ -122,6 +124,42 @@ {% endcall %}
  • + + {% call Modal(name=delete_environment_modal_id, dismissable=True) %} +

    Are you sure you want to delete this environment?

    + + {{ + Alert( + level="warning", + title="Warning! This action is permanent", + message="You will no longer be able to access this environment", + ) + }} + + +
    +
    + + +
    +
    +
    + {{ form.csrf_token }} + +
    + +
    +
    +
    + {% endcall %} {% endfor %} diff --git a/tests/routes/applications/test_settings.py b/tests/routes/applications/test_settings.py index 8bcf7bc7..01394afa 100644 --- a/tests/routes/applications/test_settings.py +++ b/tests/routes/applications/test_settings.py @@ -306,3 +306,32 @@ def test_delete_application(client, user_session): # app and envs are soft deleted assert len(port.applications) == 0 assert len(application.environments) == 0 + + +def test_delete_environment(client, user_session): + user = UserFactory.create() + portfolio = PortfolioFactory(owner=user) + application = ApplicationFactory.create(portfolio=portfolio) + environment = EnvironmentFactory.create(application=application) + + user_session(user) + + response = client.post( + url_for("applications.delete_environment", environment_id=environment.id) + ) + + # appropriate response and redirect + assert response.status_code == 302 + assert response.location == url_for( + "applications.settings", + application_id=application.id, + _anchor="application-environments", + _external=True, + fragment="application-environments", + ) + # appropriate flash message + message = get_flashed_messages()[0] + assert "deleted" in message["message"] + assert environment.name in message["message"] + # deletes environment + assert len(application.environments) == 0