Merge pull request #354 from dod-ccpo/fix-environments-for-user

Fix environment listing for user
This commit is contained in:
patricksmithdds 2018-10-01 09:48:40 -04:00 committed by GitHub
commit 04f3134729
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 75 additions and 24 deletions

View File

@ -44,7 +44,7 @@ class Environments(object):
.join(EnvironmentRole) .join(EnvironmentRole)
.join(Project) .join(Project)
.filter(EnvironmentRole.user_id == user.id) .filter(EnvironmentRole.user_id == user.id)
.filter(Project.id == Environment.project_id) .filter(Environment.project_id == project.id)
.all() .all()
) )

View File

@ -16,25 +16,29 @@
] ]
) }} ) }}
{{ SidenavItem( {% if user_can(permissions.VIEW_WORKSPACE_MEMBERS) %}
"Members", {{ SidenavItem(
href=url_for("workspaces.workspace_members", workspace_id=workspace.id), "Members",
active=request.url_rule.rule.startswith('/workspaces/<workspace_id>/members'), href=url_for("workspaces.workspace_members", workspace_id=workspace.id),
subnav=None if not user_can(permissions.ASSIGN_AND_UNASSIGN_ATAT_ROLE) else [ active=request.url_rule.rule.startswith('/workspaces/<workspace_id>/members'),
{ subnav=None if not user_can(permissions.ASSIGN_AND_UNASSIGN_ATAT_ROLE) else [
"label": "Add New Member", {
"href": url_for("workspaces.new_member", workspace_id=workspace.id), "label": "Add New Member",
"active": request.url_rule.rule.startswith('/workspaces/<workspace_id>/members/new'), "href": url_for("workspaces.new_member", workspace_id=workspace.id),
"icon": "plus" "active": request.url_rule.rule.startswith('/workspaces/<workspace_id>/members/new'),
} "icon": "plus"
] }
) }} ]
) }}
{% endif %}
{{ SidenavItem( {% if user_can(permissions.VIEW_USAGE_DOLLARS) %}
"Budget Report", {{ SidenavItem(
href=url_for("workspaces.workspace_reports", workspace_id=workspace.id), "Budget Report",
active=request.url_rule.rule.startswith('/workspaces/<workspace_id>/reports') href=url_for("workspaces.workspace_reports", workspace_id=workspace.id),
) }} active=request.url_rule.rule.startswith('/workspaces/<workspace_id>/reports')
) }}
{% endif %}
{% if user_can(permissions.EDIT_WORKSPACE_INFORMATION) %} {% if user_can(permissions.EDIT_WORKSPACE_INFORMATION) %}
{{ SidenavItem( {{ SidenavItem(

View File

@ -25,10 +25,12 @@
<div class='block-list project-list-item'> <div class='block-list project-list-item'>
<header class='block-list__header'> <header class='block-list__header'>
<h2 class='block-list__title'>{{ project.name }} ({{ project.environments|length }} environments)</h2> <h2 class='block-list__title'>{{ project.name }} ({{ project.environments|length }} environments)</h2>
<a class='icon-link' href='{{ url_for("workspaces.edit_project", workspace_id=workspace.id, project_id=project.id) }}'> {% if user_can(permissions.RENAME_APPLICATION_IN_WORKSPACE) %}
{{ Icon('edit') }} <a class='icon-link' href='{{ url_for("workspaces.edit_project", workspace_id=workspace.id, project_id=project.id) }}'>
<span>edit</span> {{ Icon('edit') }}
</a> <span>edit</span>
</a>
{% endif %}
</header> </header>
<ul> <ul>
{% for environment in project.environments %} {% for environment in project.environments %}

View File

@ -4,11 +4,19 @@ from uuid import uuid4
from atst.domain.environments import Environments from atst.domain.environments import Environments
from atst.domain.environment_roles import EnvironmentRoles from atst.domain.environment_roles import EnvironmentRoles
from atst.domain.projects import Projects from atst.domain.projects import Projects
from atst.domain.roles import Roles
from atst.domain.workspaces import Workspaces from atst.domain.workspaces import Workspaces
from atst.domain.workspace_users import WorkspaceUsers from atst.domain.workspace_users import WorkspaceUsers
from atst.domain.exceptions import NotFoundError from atst.domain.exceptions import NotFoundError
from atst.models.environment_role import EnvironmentRole
from tests.factories import RequestFactory, UserFactory from tests.factories import (
RequestFactory,
UserFactory,
WorkspaceFactory,
EnvironmentFactory,
ProjectFactory,
)
def test_update_environment_roles(): def test_update_environment_roles():
@ -43,3 +51,24 @@ def test_update_environment_roles():
assert new_dev_env_role.role == "billing_admin" assert new_dev_env_role.role == "billing_admin"
assert staging_env_role.role == "developer" assert staging_env_role.role == "developer"
def test_get_scoped_environments(db):
developer = UserFactory.create()
workspace = WorkspaceFactory.create()
workspace_user = Workspaces.add_member(workspace, developer, "developer")
project1 = ProjectFactory.create(workspace=workspace)
project2 = ProjectFactory.create(workspace=workspace)
env1 = EnvironmentFactory.create(project=project1, name="project1 dev")
env2 = EnvironmentFactory.create(project=project1, name="project1 staging")
env3 = EnvironmentFactory.create(project=project2, name="project2 dev")
env4 = EnvironmentFactory.create(project=project2, name="project2 staging")
db.session.add(EnvironmentRole(user=developer, environment=env1, role="developer"))
db.session.add(EnvironmentRole(user=developer, environment=env4, role="developer"))
db.session.commit()
project1_envs = Environments.for_user(developer, project1)
assert [env.name for env in project1_envs] == ["project1 dev"]
project2_envs = Environments.for_user(developer, project2)
assert [env.name for env in project2_envs] == ["project2 staging"]

View File

@ -6,11 +6,13 @@ import datetime
from faker import Faker as _Faker from faker import Faker as _Faker
from atst.forms.data import SERVICE_BRANCHES from atst.forms.data import SERVICE_BRANCHES
from atst.models.environment import Environment
from atst.models.request import Request from atst.models.request import Request
from atst.models.request_revision import RequestRevision from atst.models.request_revision import RequestRevision
from atst.models.request_review import RequestReview from atst.models.request_review import RequestReview
from atst.models.request_status_event import RequestStatusEvent, RequestStatus from atst.models.request_status_event import RequestStatusEvent, RequestStatus
from atst.models.pe_number import PENumber from atst.models.pe_number import PENumber
from atst.models.project import Project
from atst.models.task_order import TaskOrder, Source, FundingType from atst.models.task_order import TaskOrder, Source, FundingType
from atst.models.user import User from atst.models.user import User
from atst.models.role import Role from atst.models.role import Role
@ -217,3 +219,17 @@ class WorkspaceFactory(Base):
request = factory.SubFactory(RequestFactory) request = factory.SubFactory(RequestFactory)
# name it the same as the request ID by default # name it the same as the request ID by default
name = factory.LazyAttribute(lambda w: w.request.id) name = factory.LazyAttribute(lambda w: w.request.id)
class ProjectFactory(Base):
class Meta:
model = Project
workspace = factory.SubFactory(WorkspaceFactory)
name = factory.Faker("name")
description = "A test project"
class EnvironmentFactory(Base):
class Meta:
model = Environment