diff --git a/atst/routes/applications/settings.py b/atst/routes/applications/settings.py index 07b08fd5..44b04d90 100644 --- a/atst/routes/applications/settings.py +++ b/atst/routes/applications/settings.py @@ -101,6 +101,7 @@ def settings(application_id): members_form=members_form, active_toggler=http_request.args.get("active_toggler"), active_toggler_section=http_request.args.get("active_toggler_section"), + new_env_form=EditEnvironmentForm(), ) @@ -135,12 +136,52 @@ def update_environment(environment_id): form=ApplicationForm( name=application.name, description=application.description ), + new_env_form=EditEnvironmentForm(), + members_form=AppEnvRolesForm( + data=data_for_app_env_roles_form(application) + ), + environments_obj=get_environments_obj_for_app(application=application), + active_toggler=environment.id, + active_toggler_section="edit", + ), + 400, + ) + + +@applications_bp.route( + "/applications//environments/new", methods=["POST"] +) +@user_can(Permissions.CREATE_ENVIRONMENT, message="create application environment") +def new_environment(application_id): + application = Applications.get(application_id) + env_form = EditEnvironmentForm(formdata=http_request.form) + + if env_form.validate(): + Environments.create(application=application, name=env_form.name.data) + + flash("application_environments_updated") + + return redirect( + url_for( + "applications.settings", + application_id=application.id, + fragment="application-environments", + _anchor="application-environments", + ) + ) + else: + return ( + render_template( + "portfolios/applications/settings.html", + application=application, + form=ApplicationForm( + name=application.name, description=application.description + ), + new_env_form=env_form, environments_obj=get_environments_obj_for_app(application=application), members_form=AppEnvRolesForm( data=data_for_app_env_roles_form(application) ), - active_toggler=environment.id, - active_toggler_section="edit", ), 400, ) @@ -166,22 +207,10 @@ def update(application_id): "portfolios/applications/settings.html", application=application, form=form, + new_env_form=EditEnvironmentForm(), environments_obj=get_environments_obj_for_app(application=application), ) -@applications_bp.route("/applications//add_environment", methods=["POST"]) -@user_can(Permissions.EDIT_APPLICATION, message="add application environment") -def add_environment(application_id): - application = Applications.get(application_id) - form = ApplicationForm(http_request.form) - - return render_template( - "portfolios/applications/settings.html", - application=application, - form=form, - environments_obj=get_environments_obj_for_app(application=application), - ) - @applications_bp.route("/environments//roles", methods=["POST"]) @user_can(Permissions.ASSIGN_ENVIRONMENT_MEMBER, message="update environment roles") @@ -233,6 +262,7 @@ def update_env_roles(environment_id): form=ApplicationForm( name=application.name, description=application.description ), + new_env_form=EditEnvironmentForm(), environments_obj=get_environments_obj_for_app(application=application), active_toggler=environment.id, active_toggler_section="edit", diff --git a/templates/fragments/applications/add_new_environment.html b/templates/fragments/applications/add_new_environment.html index 9adf1e7e..ddf6a5bb 100644 --- a/templates/fragments/applications/add_new_environment.html +++ b/templates/fragments/applications/add_new_environment.html @@ -1,7 +1,9 @@ +{% from 'components/save_button.html' import SaveButton %} +{% from "components/text_input.html" import TextInput %} {% from "components/toggle_list.html" import ToggleButton, ToggleSection %} -
- {{ form.csrf_token }} + + {{ new_env_form.csrf_token }}
@@ -17,7 +19,9 @@ {{ "portfolios.applications.create_new_env" | translate }}
{{ "portfolios.applications.create_new_env_info" | translate }}
{{ "portfolios.applications.enter_env_name" | translate }} + {{ TextInput(new_env_form.name) }}
+ {{ SaveButton(text=('common.save' | translate), element="input", form="add-new-env") }} {% endcall %} {{ diff --git a/templates/fragments/applications/edit_environments.html b/templates/fragments/applications/edit_environments.html index 7852ae7d..299c8f6c 100644 --- a/templates/fragments/applications/edit_environments.html +++ b/templates/fragments/applications/edit_environments.html @@ -128,9 +128,6 @@ diff --git a/tests/routes/applications/test_settings.py b/tests/routes/applications/test_settings.py index 1e5bfb02..a658107a 100644 --- a/tests/routes/applications/test_settings.py +++ b/tests/routes/applications/test_settings.py @@ -54,7 +54,7 @@ def test_updating_application_environments_success(client, user_session): assert environment.name == "new name a" -def test_updating_application_environments_failure(client, user_session): +def test_update_environment_failure(client, user_session): portfolio = PortfolioFactory.create() application = ApplicationFactory.create(portfolio=portfolio) environment = EnvironmentFactory.create( @@ -391,6 +391,38 @@ def test_delete_application(client, user_session): assert len(application.environments) == 0 +def test_new_environment(client, user_session): + user = UserFactory.create() + portfolio = PortfolioFactory(owner=user) + application = ApplicationFactory.create(portfolio=portfolio) + num_envs = len(application.environments) + + user_session(user) + response = client.post( + url_for("applications.new_environment", application_id=application.id), + data={"name": "dabea"}, + ) + + assert response.status_code == 302 + assert len(application.environments) == num_envs + 1 + + +def test_new_environment_with_bad_data(client, user_session): + user = UserFactory.create() + portfolio = PortfolioFactory(owner=user) + application = ApplicationFactory.create(portfolio=portfolio) + num_envs = len(application.environments) + + user_session(user) + response = client.post( + url_for("applications.new_environment", application_id=application.id), + data={"name": None}, + ) + + assert response.status_code == 400 + assert len(application.environments) == num_envs + + def test_delete_environment(client, user_session): user = UserFactory.create() portfolio = PortfolioFactory(owner=user)