Merge pull request #1287 from dod-ccpo/portfolio-defense-component-bug
Portfolio defense component bug
This commit is contained in:
commit
86913ec738
@ -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 ###
|
@ -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(
|
||||||
|
@ -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)
|
||||||
|
@ -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 %}
|
||||||
|
@ -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
|
||||||
|
@ -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"],
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user