Merge pull request #1287 from dod-ccpo/portfolio-defense-component-bug

Portfolio defense component bug
This commit is contained in:
leigh-mil 2020-01-06 15:53:36 -05:00 committed by GitHub
commit 86913ec738
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 56 additions and 10 deletions

View File

@ -0,0 +1,36 @@
"""update portfolios defense component column type
Revision ID: 02ac8bdcf16f
Revises: 08f2a640e9c2
Create Date: 2019-12-26 16:10:54.366461
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision = '02ac8bdcf16f' # pragma: allowlist secret
down_revision = '08f2a640e9c2' # pragma: allowlist secret
branch_labels = None
depends_on = None
def upgrade():
### commands auto generated by Alembic - please adjust! ###
op.alter_column('portfolios', 'defense_component',
type_=postgresql.ARRAY(sa.VARCHAR()),
existing_type=sa.VARCHAR(),
postgresql_using="string_to_array(defense_component, ',')::character varying[]",
nullable=False)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.alter_column('portfolios', 'defense_component',
type_=sa.VARCHAR(),
existing_type=postgresql.ARRAY(sa.VARCHAR()),
postgresql_using="defense_component[1]::character varying",
nullable=False)
# ### end Alembic commands ###

View File

@ -1,5 +1,6 @@
from sqlalchemy import Column, String from sqlalchemy import Column, String
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship
from sqlalchemy.types import ARRAY
from itertools import chain from itertools import chain
from atst.models.base import Base from atst.models.base import Base
@ -20,7 +21,7 @@ class Portfolio(
name = Column(String, nullable=False) name = Column(String, nullable=False)
description = Column(String) description = Column(String)
defense_component = Column( defense_component = Column(
String, nullable=False ARRAY(String), nullable=False
) # Department of Defense Component ) # Department of Defense Component
applications = relationship( applications = relationship(

View File

@ -34,7 +34,7 @@ from atst.routes.dev import _DEV_USERS as DEV_USERS
from atst.utils import pick from atst.utils import pick
from tests.factories import ( from tests.factories import (
random_service_branch, random_defense_component,
TaskOrderFactory, TaskOrderFactory,
CLINFactory, CLINFactory,
AttachmentFactory, AttachmentFactory,
@ -308,7 +308,7 @@ def create_demo_portfolio(name, data):
portfolio = Portfolios.create( portfolio = Portfolios.create(
user=portfolio_owner, user=portfolio_owner,
portfolio_attrs={"name": name, "defense_component": random_service_branch()}, portfolio_attrs={"name": name, "defense_component": random_defense_component()},
) )
add_task_orders_to_portfolio(portfolio) add_task_orders_to_portfolio(portfolio)
@ -336,7 +336,7 @@ def seed_db():
user=amanda, user=amanda,
portfolio_attrs={ portfolio_attrs={
"name": "TIE Interceptor", "name": "TIE Interceptor",
"defense_component": random_service_branch(), "defense_component": random_defense_component(),
}, },
) )
add_task_orders_to_portfolio(tie_interceptor) add_task_orders_to_portfolio(tie_interceptor)
@ -347,7 +347,7 @@ def seed_db():
user=amanda, user=amanda,
portfolio_attrs={ portfolio_attrs={
"name": "TIE Fighter", "name": "TIE Fighter",
"defense_component": random_service_branch(), "defense_component": random_defense_component(),
}, },
) )
add_task_orders_to_portfolio(tie_fighter) add_task_orders_to_portfolio(tie_fighter)
@ -363,7 +363,7 @@ def seed_db():
user=user, user=user,
portfolio_attrs={ portfolio_attrs={
"name": ship, "name": ship,
"defense_component": random_service_branch(), "defense_component": random_defense_component(),
}, },
) )
add_task_orders_to_portfolio(portfolio) add_task_orders_to_portfolio(portfolio)

View File

@ -41,9 +41,13 @@
<div class='defense-row'> <div class='defense-row'>
<div> <div>
<div class='admin-title'>{{ "forms.task_order.defense_component_label" | translate }}</div> <div class='admin-title'>{{ "portfolios.admin.defense_component_label" | translate }}</div>
{% if portfolio.defense_component %} {% if portfolio.defense_component %}
<div class='admin-content'>{{ portfolio.defense_component }}</div> <div class='admin-content'>
{% for component in portfolio.defense_component %}
{{ "forms.portfolio.defense_component.choices.%s" | format(component) | translate }}<br>
{% endfor %}
</div>
{% else %} {% else %}
<div class='admin-content'>{{ "fragments.portfolio_admin.none" | translate }}</div> <div class='admin-content'>{{ "fragments.portfolio_admin.none" | translate }}</div>
{% endif %} {% endif %}

View File

@ -21,6 +21,10 @@ def random_service_branch():
return random_choice(data.SERVICE_BRANCHES) return random_choice(data.SERVICE_BRANCHES)
def random_defense_component():
return [random_choice(data.SERVICE_BRANCHES)]
def random_dod_id(): def random_dod_id():
return "".join(random.choices(string.digits, k=10)) return "".join(random.choices(string.digits, k=10))
@ -104,7 +108,7 @@ class PortfolioFactory(Base):
model = Portfolio model = Portfolio
name = factory.Faker("domain_word") name = factory.Faker("domain_word")
defense_component = factory.LazyFunction(random_service_branch) defense_component = factory.LazyFunction(random_defense_component)
description = factory.Faker("sentence") description = factory.Faker("sentence")
@classmethod @classmethod

View File

@ -34,7 +34,7 @@ def test_create_portfolio_success(client, user_session):
data={ data={
"name": "My project name", "name": "My project name",
"description": "My project description", "description": "My project description",
"defense_component": "army", "defense_component": ["army"],
}, },
) )

View File

@ -310,6 +310,7 @@ portfolios:
alert_header: Are you sure you want to delete this member? alert_header: Are you sure you want to delete this member?
alert_message: 'The member will be removed from the portfolio, but their log history will be retained.' alert_message: 'The member will be removed from the portfolio, but their log history will be retained.'
alert_title: Warning! You are about to delete a member from the portfolio. alert_title: Warning! You are about to delete a member from the portfolio.
defense_component_label: Department of Defense Component
no_members: There are currently no members in this portfolio. no_members: There are currently no members in this portfolio.
permissions_info: Learn more about these permissions permissions_info: Learn more about these permissions
portfolio_members_subheading: These members have different levels of access to the portfolio. portfolio_members_subheading: These members have different levels of access to the portfolio.