From f6cb6f2a3128bbecabde5cbf91559e81b9d43415 Mon Sep 17 00:00:00 2001 From: richard-dds Date: Tue, 10 Sep 2019 14:16:38 -0400 Subject: [PATCH] Change Environment.creator relation from ApplicationRole to User --- ...fab6c8243cb_add_environment_creator_role.py | 8 ++++---- atst/domain/applications.py | 4 ++-- atst/domain/environments.py | 8 ++++---- atst/models/environment.py | 7 +++++-- atst/routes/applications/new.py | 3 ++- atst/routes/applications/settings.py | 4 +++- script/seed_sample.py | 3 ++- tests/domain/test_applications.py | 2 +- tests/domain/test_environments.py | 4 +++- tests/domain/test_portfolios.py | 18 +++++++++++++++--- tests/factories.py | 1 + tests/models/test_environments.py | 6 +++++- tests/routes/applications/test_settings.py | 3 +++ 13 files changed, 50 insertions(+), 21 deletions(-) diff --git a/alembic/versions/cfab6c8243cb_add_environment_creator_role.py b/alembic/versions/cfab6c8243cb_add_environment_creator_role.py index 33a7a2a0..b96c78e2 100644 --- a/alembic/versions/cfab6c8243cb_add_environment_creator_role.py +++ b/alembic/versions/cfab6c8243cb_add_environment_creator_role.py @@ -18,13 +18,13 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.add_column('environments', sa.Column('creator_role_id', postgresql.UUID(as_uuid=True), nullable=False)) - op.create_foreign_key("fk_application_roles_id", 'environments', 'application_roles', ['creator_role_id'], ['id']) + op.add_column('environments', sa.Column('creator_id', postgresql.UUID(as_uuid=True), nullable=False)) + op.create_foreign_key("fk_users_id", 'environments', 'users', ['creator_id'], ['id']) # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.drop_constraint("fk_application_roles_id", 'environments', type_='foreignkey') - op.drop_column('environments', 'creator_role_id') + op.drop_constraint("fk_users_id", 'environments', type_='foreignkey') + op.drop_column('environments', 'creator_id') # ### end Alembic commands ### diff --git a/atst/domain/applications.py b/atst/domain/applications.py index dc519a0a..0c063332 100644 --- a/atst/domain/applications.py +++ b/atst/domain/applications.py @@ -19,13 +19,13 @@ class Applications(BaseDomainClass): resource_name = "application" @classmethod - def create(cls, portfolio, name, description, environment_names): + def create(cls, user, portfolio, name, description, environment_names): application = Application( portfolio=portfolio, name=name, description=description ) db.session.add(application) - Environments.create_many(application, environment_names) + Environments.create_many(user, application, environment_names) db.session.commit() return application diff --git a/atst/domain/environments.py b/atst/domain/environments.py index b4bd2edd..3a740807 100644 --- a/atst/domain/environments.py +++ b/atst/domain/environments.py @@ -11,17 +11,17 @@ from .exceptions import NotFoundError class Environments(object): @classmethod - def create(cls, application, name): - environment = Environment(application=application, name=name) + def create(cls, user, application, name): + environment = Environment(application=application, name=name, creator=user) db.session.add(environment) db.session.commit() return environment @classmethod - def create_many(cls, application, names): + def create_many(cls, user, application, names): environments = [] for name in names: - environment = Environments.create(application, name) + environment = Environments.create(user, application, name) environments.append(environment) db.session.add_all(environments) diff --git a/atst/models/environment.py b/atst/models/environment.py index fde36934..02e87f85 100644 --- a/atst/models/environment.py +++ b/atst/models/environment.py @@ -18,8 +18,11 @@ class Environment( application_id = Column(ForeignKey("applications.id"), nullable=False) application = relationship("Application") - creator_role_id = Column(ForeignKey("application_roles.id"), nullable=False) - creator = relationship("ApplicationRole") + # User user.id as the foreign key here beacuse the Environment creator may + # not have an application role. We may need to revisit this if we receive any + # requirements around tracking an environment's custodian. + creator_id = Column(ForeignKey("users.id"), nullable=False) + creator = relationship("User") cloud_id = Column(String) root_user_info = Column(JSONB) diff --git a/atst/routes/applications/new.py b/atst/routes/applications/new.py index 070aa940..2d04d7a3 100644 --- a/atst/routes/applications/new.py +++ b/atst/routes/applications/new.py @@ -1,4 +1,4 @@ -from flask import redirect, render_template, request as http_request, url_for +from flask import redirect, render_template, request as http_request, url_for, g from . import applications_bp from atst.domain.applications import Applications @@ -24,6 +24,7 @@ def create(portfolio_id): if form.validate(): application_data = form.data Applications.create( + g.current_user, portfolio, application_data["name"], application_data["description"], diff --git a/atst/routes/applications/settings.py b/atst/routes/applications/settings.py index e586e317..ee7d844c 100644 --- a/atst/routes/applications/settings.py +++ b/atst/routes/applications/settings.py @@ -230,7 +230,9 @@ def new_environment(application_id): env_form = EditEnvironmentForm(formdata=http_request.form) if env_form.validate(): - Environments.create(application=application, name=env_form.name.data) + Environments.create( + g.current_user, application=application, name=env_form.name.data + ) flash("environment_added", environment_name=env_form.data["name"]) diff --git a/script/seed_sample.py b/script/seed_sample.py index e5fde801..a242d20d 100644 --- a/script/seed_sample.py +++ b/script/seed_sample.py @@ -220,6 +220,7 @@ def add_applications_to_portfolio(portfolio): applications = random_applications() for application_data in applications: application = Applications.create( + portfolio.owner, portfolio=portfolio, name=application_data["name"], description=application_data["description"], @@ -278,7 +279,7 @@ def create_demo_portfolio(name, data): portfolio=portfolio, name=mock_application.name, description="" ) env_names = [env.name for env in mock_application.environments] - envs = Environments.create_many(application, env_names) + envs = Environments.create_many(portfolio.owner, application, env_names) db.session.add(application) db.session.commit() diff --git a/tests/domain/test_applications.py b/tests/domain/test_applications.py index acbddc11..4e25ab4e 100644 --- a/tests/domain/test_applications.py +++ b/tests/domain/test_applications.py @@ -21,7 +21,7 @@ from tests.factories import ( def test_create_application_with_multiple_environments(): portfolio = PortfolioFactory.create() application = Applications.create( - portfolio, "My Test Application", "Test", ["dev", "prod"] + portfolio.owner, portfolio, "My Test Application", "Test", ["dev", "prod"] ) assert application.portfolio == portfolio diff --git a/tests/domain/test_environments.py b/tests/domain/test_environments.py index 36624403..a87551a4 100644 --- a/tests/domain/test_environments.py +++ b/tests/domain/test_environments.py @@ -21,7 +21,9 @@ from tests.factories import ( @pytest.mark.skip(reason="Reinstate and update once jobs api is up") def test_create_environments(): application = ApplicationFactory.create() - environments = Environments.create_many(application, ["Staging", "Production"]) + environments = Environments.create_many( + application.portfolio.owner, application, ["Staging", "Production"] + ) for env in environments: assert env.cloud_id is not None diff --git a/tests/domain/test_portfolios.py b/tests/domain/test_portfolios.py index e69ee45d..80dade92 100644 --- a/tests/domain/test_portfolios.py +++ b/tests/domain/test_portfolios.py @@ -71,7 +71,11 @@ def test_update_portfolio_role_role(portfolio, portfolio_owner): def test_scoped_portfolio_for_admin_missing_view_apps_perms(portfolio_owner, portfolio): Applications.create( - portfolio, "My Application 2", "My application 2", ["dev", "staging", "prod"] + portfolio.owner, + portfolio, + "My Application 2", + "My application 2", + ["dev", "staging", "prod"], ) restricted_admin = UserFactory.create() PortfolioRoleFactory.create( @@ -90,7 +94,11 @@ def test_scoped_portfolio_returns_all_applications_for_portfolio_admin( ): for _ in range(5): Applications.create( - portfolio, "My Application", "My application", ["dev", "staging", "prod"] + portfolio.owner, + portfolio, + "My Application", + "My application", + ["dev", "staging", "prod"], ) admin = UserFactory.create() @@ -109,7 +117,11 @@ def test_scoped_portfolio_returns_all_applications_for_portfolio_owner( ): for _ in range(5): Applications.create( - portfolio, "My Application", "My application", ["dev", "staging", "prod"] + portfolio.owner, + portfolio, + "My Application", + "My application", + ["dev", "staging", "prod"], ) scoped_portfolio = Portfolios.get(portfolio_owner, portfolio.id) diff --git a/tests/factories.py b/tests/factories.py index 7dd4a2f6..99ada8f4 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -185,6 +185,7 @@ class EnvironmentFactory(Base): name = factory.Faker("domain_word") application = factory.SubFactory(ApplicationFactory) + creator = factory.SubFactory(UserFactory) @classmethod def _create(cls, model_class, *args, **kwargs): diff --git a/tests/models/test_environments.py b/tests/models/test_environments.py index 9bc1c8b5..170b5162 100644 --- a/tests/models/test_environments.py +++ b/tests/models/test_environments.py @@ -12,7 +12,11 @@ def test_add_user_to_environment(): portfolio = PortfolioFactory.create(owner=owner) application = Applications.create( - portfolio, "my test application", "It's mine.", ["dev", "staging", "prod"] + portfolio.owner, + portfolio, + "my test application", + "It's mine.", + ["dev", "staging", "prod"], ) dev_environment = application.environments[0] diff --git a/tests/routes/applications/test_settings.py b/tests/routes/applications/test_settings.py index 9222167d..51ac6d91 100644 --- a/tests/routes/applications/test_settings.py +++ b/tests/routes/applications/test_settings.py @@ -71,6 +71,7 @@ def test_update_environment_failure(client, user_session): def test_application_settings(client, user_session): portfolio = PortfolioFactory.create() application = Applications.create( + portfolio.owner, portfolio, "Snazzy Application", "A new application for me and my friends", @@ -86,6 +87,7 @@ def test_application_settings(client, user_session): def test_edit_application_environments_obj(app, client, user_session): portfolio = PortfolioFactory.create() application = Applications.create( + portfolio.owner, portfolio, "Snazzy Application", "A new application for me and my friends", @@ -127,6 +129,7 @@ def test_edit_application_environments_obj(app, client, user_session): def test_data_for_app_env_roles_form(app, client, user_session): portfolio = PortfolioFactory.create() application = Applications.create( + portfolio.owner, portfolio, "Snazzy Application", "A new application for me and my friends",