diff --git a/atst/models/__init__.py b/atst/models/__init__.py index ea00ff74..85130ceb 100644 --- a/atst/models/__init__.py +++ b/atst/models/__init__.py @@ -6,6 +6,8 @@ from .permissions import Permissions from .permission_set import PermissionSet from .user import User from .portfolio_role import PortfolioRole +from .application_role import ApplicationRole +from .environment_role import EnvironmentRole from .portfolio import Portfolio from .application import Application from .environment import Environment @@ -14,4 +16,3 @@ from .audit_event import AuditEvent from .invitation import Invitation from .task_order import TaskOrder from .dd_254 import DD254 -from .application_role import ApplicationRole diff --git a/atst/models/application.py b/atst/models/application.py index d3088ebf..d10bd773 100644 --- a/atst/models/application.py +++ b/atst/models/application.py @@ -20,7 +20,7 @@ class Application(Base, mixins.TimestampsMixin, mixins.AuditableMixin): @property def users(self): - return set([user for env in self.environments for user in env.users]) + return set(role.user for role in self.roles) @property def num_users(self): diff --git a/atst/models/user.py b/atst/models/user.py index 1a156fec..971f0a94 100644 --- a/atst/models/user.py +++ b/atst/models/user.py @@ -25,6 +25,7 @@ class User( permission_sets = relationship("PermissionSet", secondary=users_permission_sets) portfolio_roles = relationship("PortfolioRole", backref="user") + application_roles = relationship("ApplicationRole", backref="user") email = Column(String, unique=True) dod_id = Column(String, unique=True, nullable=False) diff --git a/tests/factories.py b/tests/factories.py index 9b1174c4..21116cfd 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -4,22 +4,14 @@ import string import factory from uuid import uuid4 import datetime -from faker import Faker as _Faker from atst.forms import data -from atst.models.attachment import Attachment -from atst.models.environment import Environment -from atst.models.application import Application -from atst.models.task_order import TaskOrder -from atst.models.user import User -from atst.models.permission_set import PermissionSet -from atst.models.portfolio import Portfolio -from atst.domain.permission_sets import PermissionSets, PORTFOLIO_PERMISSION_SETS -from atst.models.portfolio_role import PortfolioRole, Status as PortfolioRoleStatus -from atst.models.environment_role import EnvironmentRole -from atst.models.invitation import Invitation, Status as InvitationStatus -from atst.models.dd_254 import DD254 +from atst.models import * +from atst.models.portfolio_role import Status as PortfolioRoleStatus +from atst.models.application_role import Status as ApplicationRoleStatus +from atst.models.invitation import Status as InvitationStatus from atst.domain.invitations import Invitations +from atst.domain.permission_sets import PermissionSets from atst.domain.portfolio_roles import PortfolioRoles @@ -169,6 +161,20 @@ class ApplicationFactory(Base): with_environments = kwargs.pop("environments", []) application = super()._create(model_class, *args, **kwargs) + # need to create application roles for environment users + app_members_from_envs = set() + for env in with_environments: + with_members = env.get("members", []) + for member_data in with_members: + member = member_data.get("user", UserFactory.create()) + app_members_from_envs.add(member) + # set for environments in case we just created the + # user for the application + member_data["user"] = member + + for member in app_members_from_envs: + ApplicationRoleFactory.create(application=application, user=member) + environments = [ EnvironmentFactory.create(application=application, **e) for e in with_environments @@ -207,6 +213,16 @@ class PortfolioRoleFactory(Base): permission_sets = factory.LazyFunction(base_portfolio_permission_sets) +class ApplicationRoleFactory(Base): + class Meta: + model = ApplicationRole + + application = factory.SubFactory(ApplicationFactory) + user = factory.SubFactory(UserFactory) + status = ApplicationRoleStatus.PENDING + permission_sets = [] + + class EnvironmentRoleFactory(Base): class Meta: model = EnvironmentRole diff --git a/tests/models/test_application.py b/tests/models/test_application.py index 7701fbaf..d7bf564b 100644 --- a/tests/models/test_application.py +++ b/tests/models/test_application.py @@ -1,5 +1,4 @@ -from atst.domain.environments import Environments -from tests.factories import ApplicationFactory, UserFactory +from tests.factories import ApplicationFactory, ApplicationRoleFactory def test_application_num_users(): @@ -8,15 +7,5 @@ def test_application_num_users(): ) assert application.num_users == 0 - first_env = application.environments[0] - user1 = UserFactory() - Environments.add_member(first_env, user1, "developer") + ApplicationRoleFactory.create(application=application) assert application.num_users == 1 - - second_env = application.environments[-1] - Environments.add_member(second_env, user1, "developer") - assert application.num_users == 1 - - user2 = UserFactory() - Environments.add_member(second_env, user2, "developer") - assert application.num_users == 2