Merge pull request #755 from dod-ccpo/application-role-seeds

ApplicationRoles seed and domain
This commit is contained in:
George Drummond 2019-04-11 15:51:27 -04:00 committed by GitHub
commit 25c1490afb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 194 additions and 37 deletions

View File

@ -0,0 +1,22 @@
from atst.database import db
from atst.models.application_role import ApplicationRole
from atst.domain.permission_sets import PermissionSets
class ApplicationRoles(object):
@classmethod
def _permission_sets_for_names(cls, set_names):
return PermissionSets.get_many(set_names)
@classmethod
def create(cls, user, application, permission_set_names):
application_role = ApplicationRole(user=user, application_id=application.id)
application_role.permission_sets = ApplicationRoles._permission_sets_for_names(
permission_set_names
)
db.session.add(application_role)
db.session.commit()
return application_role

View File

@ -7,7 +7,10 @@ from atst.models import Base, types, mixins
class CSPRole(Enum): class CSPRole(Enum):
NONSENSE_ROLE = "nonsense_role" BASIC_ACCESS = "Basic Access"
NETWORK_ADMIN = "Network Admin"
BUSINESS_READ = "Business Read-only"
TECHNICAL_READ = "Technical Read-only"
class EnvironmentRole(Base, mixins.TimestampsMixin, mixins.AuditableMixin): class EnvironmentRole(Base, mixins.TimestampsMixin, mixins.AuditableMixin):

View File

@ -1,32 +1,36 @@
# Add root application dir to the python path # Add root application dir to the python path
import os import os
import sys import sys
from datetime import datetime, timedelta, date from datetime import timedelta, date
import random import random
from faker import Faker
parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
sys.path.append(parent_dir) sys.path.append(parent_dir)
from atst.database import db
from atst.app import make_config, make_app from atst.app import make_config, make_app
from atst.domain.users import Users from atst.database import db
from atst.domain.portfolios import Portfolios from atst.domain.application_roles import ApplicationRoles
from atst.domain.applications import Applications from atst.domain.applications import Applications
from atst.domain.csp.reports import MockReportingProvider
from atst.domain.environments import Environments
from atst.domain.exceptions import AlreadyExistsError, NotFoundError
from atst.domain.permission_sets import PermissionSets, APPLICATION_PERMISSION_SETS
from atst.domain.portfolio_roles import PortfolioRoles from atst.domain.portfolio_roles import PortfolioRoles
from atst.models.invitation import Status as InvitationStatus from atst.domain.environment_roles import EnvironmentRoles
from atst.domain.exceptions import AlreadyExistsError from atst.domain.portfolios import Portfolios
from atst.domain.users import Users
from atst.models.application import Application
from atst.models.environment_role import CSPRole
from atst.routes.dev import _DEV_USERS as DEV_USERS
from tests.factories import ( from tests.factories import (
InvitationFactory,
TaskOrderFactory, TaskOrderFactory,
random_future_date,
random_past_date,
random_task_order_number, random_task_order_number,
random_service_branch, random_service_branch,
) )
from atst.routes.dev import _DEV_USERS as DEV_USERS
from atst.domain.csp.reports import MockReportingProvider fake = Faker()
from atst.models.application import Application
from atst.domain.environments import Environments
PORTFOLIO_USERS = [ PORTFOLIO_USERS = [
@ -34,7 +38,6 @@ PORTFOLIO_USERS = [
"first_name": "Danny", "first_name": "Danny",
"last_name": "Knight", "last_name": "Knight",
"email": "knight@mil.gov", "email": "knight@mil.gov",
"portfolio_role": "developer",
"dod_id": "0000000001", "dod_id": "0000000001",
"permission_sets": PortfolioRoles.DEFAULT_PORTFOLIO_PERMISSION_SETS, "permission_sets": PortfolioRoles.DEFAULT_PORTFOLIO_PERMISSION_SETS,
}, },
@ -42,7 +45,6 @@ PORTFOLIO_USERS = [
"first_name": "Mario", "first_name": "Mario",
"last_name": "Hudson", "last_name": "Hudson",
"email": "hudson@mil.gov", "email": "hudson@mil.gov",
"portfolio_role": "billing_auditor",
"dod_id": "0000000002", "dod_id": "0000000002",
"permission_sets": PortfolioRoles.DEFAULT_PORTFOLIO_PERMISSION_SETS, "permission_sets": PortfolioRoles.DEFAULT_PORTFOLIO_PERMISSION_SETS,
}, },
@ -50,13 +52,89 @@ PORTFOLIO_USERS = [
"first_name": "Louise", "first_name": "Louise",
"last_name": "Greer", "last_name": "Greer",
"email": "greer@mil.gov", "email": "greer@mil.gov",
"portfolio_role": "admin",
"dod_id": "0000000003", "dod_id": "0000000003",
"permission_sets": PortfolioRoles.DEFAULT_PORTFOLIO_PERMISSION_SETS, "permission_sets": PortfolioRoles.DEFAULT_PORTFOLIO_PERMISSION_SETS,
}, },
] ]
APPLICATION_USERS = [
{
"first_name": "Jean Luc",
"last_name": "Picard",
"email": "picard@mil.gov",
"dod_id": "0000000004",
"permission_sets": random.sample(
APPLICATION_PERMISSION_SETS, k=random.randint(1, 4)
),
},
{
"first_name": "()",
"last_name": "Spock",
"email": "spock@mil.gov",
"dod_id": "0000000005",
"permission_sets": random.sample(
APPLICATION_PERMISSION_SETS, k=random.randint(1, 4)
),
},
{
"first_name": "William",
"last_name": "Shatner",
"email": "shatner@mil.gov",
"dod_id": "0000000006",
"permission_sets": random.sample(
APPLICATION_PERMISSION_SETS, k=random.randint(1, 4)
),
},
{
"first_name": "Nyota",
"last_name": "Uhura",
"email": "uhura@mil.gov",
"dod_id": "0000000007",
"permission_sets": random.sample(
APPLICATION_PERMISSION_SETS, k=random.randint(1, 4)
),
},
{
"first_name": "Kathryn",
"last_name": "Janeway",
"email": "janeway@mil.gov",
"dod_id": "0000000008",
"permission_sets": random.sample(
APPLICATION_PERMISSION_SETS, k=random.randint(1, 4)
),
},
]
SHIP_NAMES = [
"Millenium Falcon",
"Star Destroyer",
"Attack Cruiser",
"Sith Infiltrator",
"Death Star",
"Lambda Shuttle",
"Corellian Corvette",
]
SOFTWARE_WORDS = [
"Enterprise",
"Scalable",
"Solution",
"Blockchain",
"Cloud",
"Micro",
"Macro",
"Software",
"Global",
"Team",
]
ENVIRONMENT_NAMES = ["production", "staging", "test", "uat", "dev", "qa"]
def get_users(): def get_users():
users = [] users = []
for dev_user in DEV_USERS.values(): for dev_user in DEV_USERS.values():
@ -70,8 +148,8 @@ def get_users():
def add_members_to_portfolio(portfolio): def add_members_to_portfolio(portfolio):
for portfolio_role in PORTFOLIO_USERS: for user_data in PORTFOLIO_USERS:
ws_role = Portfolios.create_member(portfolio, portfolio_role) ws_role = Portfolios.create_member(portfolio, user_data)
db.session.refresh(ws_role) db.session.refresh(ws_role)
PortfolioRoles.enable(ws_role) PortfolioRoles.enable(ws_role)
@ -114,15 +192,53 @@ def create_task_order(portfolio, start, end, clin_01=None, clin_03=None):
db.session.commit() db.session.commit()
def add_applications_to_portfolio(portfolio, applications): def random_applications():
for application in applications: return [
Applications.create( {
"name": fake.sentence(nb_words=3, ext_word_list=SOFTWARE_WORDS)[0:-1],
"description": fake.bs(),
"environments": random.sample(ENVIRONMENT_NAMES, k=random.randint(1, 4)),
}
for n in range(random.randint(1, 4))
]
def add_applications_to_portfolio(portfolio):
applications = random_applications()
for application_data in applications:
application = Applications.create(
portfolio=portfolio, portfolio=portfolio,
name=application["name"], name=application_data["name"],
description=application["description"], description=application_data["description"],
environment_names=application["environments"], environment_names=application_data["environments"],
) )
users = random.sample(APPLICATION_USERS, k=random.randint(1, 5))
for user_data in users:
try:
user = Users.get_by_dod_id(user_data["dod_id"])
except NotFoundError:
user = Users.create(
user_data["dod_id"],
None,
first_name=user_data["first_name"],
last_name=user_data["last_name"],
)
ApplicationRoles.create(
user=user,
application=application,
permission_set_names=[PermissionSets.EDIT_APPLICATION_TEAM],
)
user_environments = random.sample(
application.environments,
k=random.randint(1, len(application.environments)),
)
for env in user_environments:
role = random.choice([e.value for e in CSPRole])
EnvironmentRoles.create(user=user, environment=env, role=role)
def create_demo_portfolio(name, data): def create_demo_portfolio(name, data):
try: try:
@ -156,13 +272,6 @@ def create_demo_portfolio(name, data):
def seed_db(): def seed_db():
get_users() get_users()
amanda = Users.get_by_dod_id("2345678901") amanda = Users.get_by_dod_id("2345678901")
application_info = [
{
"name": "First Application",
"description": "This is our first application",
"environments": ["dev", "staging", "prod"],
}
]
# Create Portfolios for Amanda with mocked reporting data # Create Portfolios for Amanda with mocked reporting data
create_demo_portfolio("A-Wing", MockReportingProvider.REPORT_FIXTURE_MAP["A-Wing"]) create_demo_portfolio("A-Wing", MockReportingProvider.REPORT_FIXTURE_MAP["A-Wing"])
@ -173,23 +282,26 @@ def seed_db():
) )
add_task_orders_to_portfolio(tie_interceptor) add_task_orders_to_portfolio(tie_interceptor)
add_members_to_portfolio(tie_interceptor) add_members_to_portfolio(tie_interceptor)
add_applications_to_portfolio(tie_interceptor, application_info) add_applications_to_portfolio(tie_interceptor)
tie_fighter = Portfolios.create( tie_fighter = Portfolios.create(
amanda, name="TIE Fighter", defense_component=random_service_branch() amanda, name="TIE Fighter", defense_component=random_service_branch()
) )
add_task_orders_to_portfolio(tie_fighter) add_task_orders_to_portfolio(tie_fighter)
add_members_to_portfolio(tie_fighter) add_members_to_portfolio(tie_fighter)
add_applications_to_portfolio(tie_fighter, application_info) add_applications_to_portfolio(tie_fighter)
# create a portfolio 'Y-Wing' for each user # create a portfolio for each user
ships = SHIP_NAMES.copy()
for user in get_users(): for user in get_users():
ship = random.choice(ships)
ships.remove(ship)
portfolio = Portfolios.create( portfolio = Portfolios.create(
user, name="Y-Wing", defense_component=random_service_branch() user, name=ship, defense_component=random_service_branch()
) )
add_task_orders_to_portfolio(portfolio) add_task_orders_to_portfolio(portfolio)
add_members_to_portfolio(portfolio) add_members_to_portfolio(portfolio)
add_applications_to_portfolio(portfolio, application_info) add_applications_to_portfolio(portfolio)
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -0,0 +1,20 @@
from atst.domain.application_roles import ApplicationRoles
from atst.domain.permission_sets import PermissionSets
from tests.factories import UserFactory, ApplicationFactory
def test_create_application_role():
application = ApplicationFactory.create()
user = UserFactory.create()
application_role = ApplicationRoles.create(
application=application,
user=user,
permission_set_names=[PermissionSets.EDIT_APPLICATION_TEAM],
)
assert application_role.permission_sets == PermissionSets.get_many(
[PermissionSets.EDIT_APPLICATION_TEAM]
)
assert application_role.application == application
assert application_role.user == user