Allow creating a task order for an existing portfolio

This commit is contained in:
Patrick Smith 2019-01-16 08:13:58 -05:00
parent a010487f34
commit 1cc4c23588
3 changed files with 47 additions and 6 deletions

View File

@ -100,11 +100,14 @@ class ShowTaskOrderWorkflow:
class UpdateTaskOrderWorkflow(ShowTaskOrderWorkflow): class UpdateTaskOrderWorkflow(ShowTaskOrderWorkflow):
def __init__(self, user, form_data, screen=1, task_order_id=None): def __init__(
self, user, form_data, screen=1, task_order_id=None, portfolio_id=None
):
self.user = user self.user = user
self.form_data = form_data self.form_data = form_data
self.screen = screen self.screen = screen
self.task_order_id = task_order_id self.task_order_id = task_order_id
self.portfolio_id = portfolio_id
self._task_order = None self._task_order = None
self._section = TASK_ORDER_SECTIONS[screen - 1] self._section = TASK_ORDER_SECTIONS[screen - 1]
self._form = self._section["form"](self.form_data) self._form = self._section["form"](self.form_data)
@ -144,7 +147,10 @@ class UpdateTaskOrderWorkflow(ShowTaskOrderWorkflow):
Portfolios.update(self.task_order.portfolio, {"name": new_name}) Portfolios.update(self.task_order.portfolio, {"name": new_name})
TaskOrders.update(self.user, self.task_order, **self.task_order_form_data) TaskOrders.update(self.user, self.task_order, **self.task_order_form_data)
else: else:
pf = Portfolios.create(self.user, self.form.portfolio_name.data) if self.portfolio_id:
pf = Portfolios.get(self.user, self.portfolio_id)
else:
pf = Portfolios.create(self.user, self.form.portfolio_name.data)
self._task_order = TaskOrders.create(portfolio=pf, creator=self.user) self._task_order = TaskOrders.create(portfolio=pf, creator=self.user)
TaskOrders.update(self.user, self.task_order, **self.task_order_form_data) TaskOrders.update(self.user, self.task_order, **self.task_order_form_data)
@ -217,13 +223,15 @@ def get_started():
@task_orders_bp.route("/task_orders/new/<int:screen>") @task_orders_bp.route("/task_orders/new/<int:screen>")
@task_orders_bp.route("/task_orders/new/<int:screen>/<task_order_id>") @task_orders_bp.route("/task_orders/new/<int:screen>/<task_order_id>")
def new(screen, task_order_id=None): @task_orders_bp.route("/portfolios/<portfolio_id>/task_orders/new/<int:screen>")
def new(screen, task_order_id=None, portfolio_id=None):
workflow = ShowTaskOrderWorkflow(g.current_user, screen, task_order_id) workflow = ShowTaskOrderWorkflow(g.current_user, screen, task_order_id)
return render_template( return render_template(
workflow.template, workflow.template,
current=screen, current=screen,
task_order_id=task_order_id, task_order_id=task_order_id,
task_order=workflow.task_order, task_order=workflow.task_order,
portfolio_id=portfolio_id,
screens=workflow.display_screens, screens=workflow.display_screens,
form=workflow.form, form=workflow.form,
) )
@ -231,9 +239,12 @@ def new(screen, task_order_id=None):
@task_orders_bp.route("/task_orders/new/<int:screen>", methods=["POST"]) @task_orders_bp.route("/task_orders/new/<int:screen>", methods=["POST"])
@task_orders_bp.route("/task_orders/new/<int:screen>/<task_order_id>", methods=["POST"]) @task_orders_bp.route("/task_orders/new/<int:screen>/<task_order_id>", methods=["POST"])
def update(screen, task_order_id=None): @task_orders_bp.route(
"/portfolios/<portfolio_id>/task_orders/new/<int:screen>", methods=["POST"]
)
def update(screen, task_order_id=None, portfolio_id=None):
workflow = UpdateTaskOrderWorkflow( workflow = UpdateTaskOrderWorkflow(
g.current_user, http_request.form, screen, task_order_id g.current_user, http_request.form, screen, task_order_id, portfolio_id
) )
if workflow.validate(): if workflow.validate():
@ -250,6 +261,7 @@ def update(screen, task_order_id=None):
workflow.template, workflow.template,
current=screen, current=screen,
task_order_id=task_order_id, task_order_id=task_order_id,
portfolio_id=portfolio_id,
screens=TASK_ORDER_SECTIONS, screens=TASK_ORDER_SECTIONS,
form=workflow.form, form=workflow.form,
) )

View File

@ -12,7 +12,7 @@
{% if task_order_id %} {% if task_order_id %}
<form method='POST' action="{{ url_for('task_orders.new', screen=current, task_order_id=task_order_id) }}" autocomplete="off"> <form method='POST' action="{{ url_for('task_orders.new', screen=current, task_order_id=task_order_id) }}" autocomplete="off">
{% else %} {% else %}
<form method='POST' action="{{ url_for('task_orders.update', screen=current) }}" autocomplete="off"> <form method='POST' action="{{ url_for('task_orders.update', screen=current, portfolio_id=portfolio_id) }}" autocomplete="off">
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View File

@ -48,6 +48,8 @@ def test_create_new_task_order(client, user_session):
task_order_data = TaskOrderFactory.dictionary() task_order_data = TaskOrderFactory.dictionary()
app_info_data = slice_data_for_section(task_order_data, "app_info") app_info_data = slice_data_for_section(task_order_data, "app_info")
portfolio_name = "Mos Eisley"
app_info_data["portfolio_name"] = portfolio_name
response = client.post( response = client.post(
url_for("task_orders.update", screen=1), url_for("task_orders.update", screen=1),
@ -56,6 +58,11 @@ def test_create_new_task_order(client, user_session):
) )
assert url_for("task_orders.new", screen=2) in response.headers["Location"] assert url_for("task_orders.new", screen=2) in response.headers["Location"]
created_task_order_id = response.headers["Location"].split("/")[-1]
created_task_order = TaskOrders.get(creator, created_task_order_id)
assert created_task_order.portfolio is not None
assert created_task_order.portfolio.name == portfolio_name
funding_data = slice_data_for_section(task_order_data, "funding") funding_data = slice_data_for_section(task_order_data, "funding")
funding_data = serialize_dates(funding_data) funding_data = serialize_dates(funding_data)
response = client.post( response = client.post(
@ -70,6 +77,28 @@ def test_create_new_task_order(client, user_session):
assert url_for("task_orders.new", screen=4) in response.headers["Location"] assert url_for("task_orders.new", screen=4) in response.headers["Location"]
def test_create_new_task_order_for_portfolio(client, user_session):
portfolio = PortfolioFactory.create()
creator = portfolio.owner
user_session(creator)
task_order_data = TaskOrderFactory.dictionary()
app_info_data = slice_data_for_section(task_order_data, "app_info")
portfolio_name = "This is ignored for now"
app_info_data["portfolio_name"] = portfolio_name
response = client.post(
url_for("task_orders.update", screen=1, portfolio_id=portfolio.id),
data=app_info_data,
follow_redirects=False,
)
assert url_for("task_orders.new", screen=2) in response.headers["Location"]
created_task_order_id = response.headers["Location"].split("/")[-1]
created_task_order = TaskOrders.get(creator, created_task_order_id)
assert created_task_order.portfolio == portfolio
def test_task_order_form_shows_errors(client, user_session): def test_task_order_form_shows_errors(client, user_session):
creator = UserFactory.create() creator = UserFactory.create()
user_session(creator) user_session(creator)