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():
# ### 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 ###

View File

@ -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

View File

@ -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)

View File

@ -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)

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 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"],

View File

@ -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"])

View File

@ -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()

View File

@ -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

View File

@ -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

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):
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)

View File

@ -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):

View File

@ -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]

View File

@ -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",