Change Environment.creator relation from ApplicationRole to User

This commit is contained in:
richard-dds 2019-09-10 14:16:38 -04:00
parent e65c1d69b6
commit f6cb6f2a31
13 changed files with 50 additions and 21 deletions

View File

@ -18,13 +18,13 @@ depends_on = None
def upgrade(): def upgrade():
# ### commands auto generated by Alembic - please adjust! ### # ### commands auto generated by Alembic - please adjust! ###
op.add_column('environments', sa.Column('creator_role_id', postgresql.UUID(as_uuid=True), nullable=False)) op.add_column('environments', sa.Column('creator_id', postgresql.UUID(as_uuid=True), nullable=False))
op.create_foreign_key("fk_application_roles_id", 'environments', 'application_roles', ['creator_role_id'], ['id']) op.create_foreign_key("fk_users_id", 'environments', 'users', ['creator_id'], ['id'])
# ### end Alembic commands ### # ### end Alembic commands ###
def downgrade(): def downgrade():
# ### commands auto generated by Alembic - please adjust! ### # ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint("fk_application_roles_id", 'environments', type_='foreignkey') op.drop_constraint("fk_users_id", 'environments', type_='foreignkey')
op.drop_column('environments', 'creator_role_id') op.drop_column('environments', 'creator_id')
# ### end Alembic commands ### # ### end Alembic commands ###

View File

@ -19,13 +19,13 @@ class Applications(BaseDomainClass):
resource_name = "application" resource_name = "application"
@classmethod @classmethod
def create(cls, portfolio, name, description, environment_names): def create(cls, user, portfolio, name, description, environment_names):
application = Application( application = Application(
portfolio=portfolio, name=name, description=description portfolio=portfolio, name=name, description=description
) )
db.session.add(application) db.session.add(application)
Environments.create_many(application, environment_names) Environments.create_many(user, application, environment_names)
db.session.commit() db.session.commit()
return application return application

View File

@ -11,17 +11,17 @@ from .exceptions import NotFoundError
class Environments(object): class Environments(object):
@classmethod @classmethod
def create(cls, application, name): def create(cls, user, application, name):
environment = Environment(application=application, name=name) environment = Environment(application=application, name=name, creator=user)
db.session.add(environment) db.session.add(environment)
db.session.commit() db.session.commit()
return environment return environment
@classmethod @classmethod
def create_many(cls, application, names): def create_many(cls, user, application, names):
environments = [] environments = []
for name in names: for name in names:
environment = Environments.create(application, name) environment = Environments.create(user, application, name)
environments.append(environment) environments.append(environment)
db.session.add_all(environments) db.session.add_all(environments)

View File

@ -18,8 +18,11 @@ class Environment(
application_id = Column(ForeignKey("applications.id"), nullable=False) application_id = Column(ForeignKey("applications.id"), nullable=False)
application = relationship("Application") application = relationship("Application")
creator_role_id = Column(ForeignKey("application_roles.id"), nullable=False) # User user.id as the foreign key here beacuse the Environment creator may
creator = relationship("ApplicationRole") # 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) cloud_id = Column(String)
root_user_info = Column(JSONB) root_user_info = Column(JSONB)

View File

@ -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 . import applications_bp
from atst.domain.applications import Applications from atst.domain.applications import Applications
@ -24,6 +24,7 @@ def create(portfolio_id):
if form.validate(): if form.validate():
application_data = form.data application_data = form.data
Applications.create( Applications.create(
g.current_user,
portfolio, portfolio,
application_data["name"], application_data["name"],
application_data["description"], application_data["description"],

View File

@ -230,7 +230,9 @@ def new_environment(application_id):
env_form = EditEnvironmentForm(formdata=http_request.form) env_form = EditEnvironmentForm(formdata=http_request.form)
if env_form.validate(): 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"]) flash("environment_added", environment_name=env_form.data["name"])

View File

@ -220,6 +220,7 @@ def add_applications_to_portfolio(portfolio):
applications = random_applications() applications = random_applications()
for application_data in applications: for application_data in applications:
application = Applications.create( application = Applications.create(
portfolio.owner,
portfolio=portfolio, portfolio=portfolio,
name=application_data["name"], name=application_data["name"],
description=application_data["description"], description=application_data["description"],
@ -278,7 +279,7 @@ def create_demo_portfolio(name, data):
portfolio=portfolio, name=mock_application.name, description="" portfolio=portfolio, name=mock_application.name, description=""
) )
env_names = [env.name for env in mock_application.environments] 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.add(application)
db.session.commit() db.session.commit()

View File

@ -21,7 +21,7 @@ from tests.factories import (
def test_create_application_with_multiple_environments(): def test_create_application_with_multiple_environments():
portfolio = PortfolioFactory.create() portfolio = PortfolioFactory.create()
application = Applications.create( application = Applications.create(
portfolio, "My Test Application", "Test", ["dev", "prod"] portfolio.owner, portfolio, "My Test Application", "Test", ["dev", "prod"]
) )
assert application.portfolio == portfolio assert application.portfolio == portfolio

View File

@ -21,7 +21,9 @@ from tests.factories import (
@pytest.mark.skip(reason="Reinstate and update once jobs api is up") @pytest.mark.skip(reason="Reinstate and update once jobs api is up")
def test_create_environments(): def test_create_environments():
application = ApplicationFactory.create() application = ApplicationFactory.create()
environments = Environments.create_many(application, ["Staging", "Production"]) environments = Environments.create_many(
application.portfolio.owner, application, ["Staging", "Production"]
)
for env in environments: for env in environments:
assert env.cloud_id is not None assert env.cloud_id is not None

View File

@ -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): def test_scoped_portfolio_for_admin_missing_view_apps_perms(portfolio_owner, portfolio):
Applications.create( 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() restricted_admin = UserFactory.create()
PortfolioRoleFactory.create( PortfolioRoleFactory.create(
@ -90,7 +94,11 @@ def test_scoped_portfolio_returns_all_applications_for_portfolio_admin(
): ):
for _ in range(5): for _ in range(5):
Applications.create( Applications.create(
portfolio, "My Application", "My application", ["dev", "staging", "prod"] portfolio.owner,
portfolio,
"My Application",
"My application",
["dev", "staging", "prod"],
) )
admin = UserFactory.create() admin = UserFactory.create()
@ -109,7 +117,11 @@ def test_scoped_portfolio_returns_all_applications_for_portfolio_owner(
): ):
for _ in range(5): for _ in range(5):
Applications.create( 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) scoped_portfolio = Portfolios.get(portfolio_owner, portfolio.id)

View File

@ -185,6 +185,7 @@ class EnvironmentFactory(Base):
name = factory.Faker("domain_word") name = factory.Faker("domain_word")
application = factory.SubFactory(ApplicationFactory) application = factory.SubFactory(ApplicationFactory)
creator = factory.SubFactory(UserFactory)
@classmethod @classmethod
def _create(cls, model_class, *args, **kwargs): def _create(cls, model_class, *args, **kwargs):

View File

@ -12,7 +12,11 @@ def test_add_user_to_environment():
portfolio = PortfolioFactory.create(owner=owner) portfolio = PortfolioFactory.create(owner=owner)
application = Applications.create( 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] dev_environment = application.environments[0]

View File

@ -71,6 +71,7 @@ def test_update_environment_failure(client, user_session):
def test_application_settings(client, user_session): def test_application_settings(client, user_session):
portfolio = PortfolioFactory.create() portfolio = PortfolioFactory.create()
application = Applications.create( application = Applications.create(
portfolio.owner,
portfolio, portfolio,
"Snazzy Application", "Snazzy Application",
"A new application for me and my friends", "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): def test_edit_application_environments_obj(app, client, user_session):
portfolio = PortfolioFactory.create() portfolio = PortfolioFactory.create()
application = Applications.create( application = Applications.create(
portfolio.owner,
portfolio, portfolio,
"Snazzy Application", "Snazzy Application",
"A new application for me and my friends", "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): def test_data_for_app_env_roles_form(app, client, user_session):
portfolio = PortfolioFactory.create() portfolio = PortfolioFactory.create()
application = Applications.create( application = Applications.create(
portfolio.owner,
portfolio, portfolio,
"Snazzy Application", "Snazzy Application",
"A new application for me and my friends", "A new application for me and my friends",