Merge pull request #861 from dod-ccpo/new-to-form

New TO form
This commit is contained in:
dandds
2019-06-05 14:56:43 -04:00
committed by GitHub
23 changed files with 323 additions and 1528 deletions

View File

@@ -18,8 +18,10 @@ class TaskOrders(BaseDomainClass):
UNCLASSIFIED_FUNDING = []
@classmethod
def create(cls, creator, portfolio):
task_order = TaskOrder(portfolio=portfolio, creator=creator)
def create(cls, creator, portfolio_id, **kwargs):
task_order = TaskOrder(portfolio_id=portfolio_id, creator=creator)
for key, value in kwargs.items():
setattr(task_order, key, value)
db.session.add(task_order)
db.session.commit()
@@ -27,7 +29,8 @@ class TaskOrders(BaseDomainClass):
return task_order
@classmethod
def update(cls, task_order, **kwargs):
def update(cls, task_order_id, **kwargs):
task_order = TaskOrders.get(task_order_id)
for key, value in kwargs.items():
setattr(task_order, key, value)

View File

@@ -1,131 +1,26 @@
from wtforms.fields import (
BooleanField,
DecimalField,
RadioField,
SelectField,
SelectMultipleField,
StringField,
TextAreaField,
FileField,
)
from wtforms.fields.html5 import DateField, TelField
from wtforms.widgets import ListWidget, CheckboxInput
from wtforms.validators import Email, Length, Required, Optional
from flask_wtf.file import FileAllowed
from atst.forms.validators import IsNumber, PhoneNumber, RequiredIf
from wtforms.fields import BooleanField, DecimalField, StringField
from wtforms.fields.html5 import DateField
from wtforms.validators import Required, Optional
from .forms import BaseForm
from .data import (
SERVICE_BRANCHES,
APP_MIGRATION,
APPLICATION_COMPLEXITY,
DEV_TEAM,
TEAM_EXPERIENCE,
PERIOD_OF_PERFORMANCE_LENGTH,
)
from atst.utils.localization import translate
class AppInfoWithExistingPortfolioForm(BaseForm):
scope = TextAreaField(
translate("forms.task_order.scope_label"),
description=translate("forms.task_order.scope_description"),
)
app_migration = RadioField(
translate("forms.task_order.app_migration.label"),
description=translate("forms.task_order.app_migration.description"),
choices=APP_MIGRATION,
default="",
validators=[Optional()],
)
native_apps = RadioField(
translate("forms.task_order.native_apps.label"),
description=translate("forms.task_order.native_apps.description"),
choices=[("yes", "Yes"), ("no", "No"), ("not_sure", "Not Sure")],
default="",
validators=[Optional()],
)
complexity = SelectMultipleField(
translate("forms.task_order.complexity.label"),
description=translate("forms.task_order.complexity.description"),
choices=APPLICATION_COMPLEXITY,
default=None,
filters=[BaseForm.remove_empty_string],
widget=ListWidget(prefix_label=False),
option_widget=CheckboxInput(),
)
complexity_other = StringField(
translate("forms.task_order.complexity_other_label"),
default=None,
filters=[BaseForm.remove_empty_string],
)
dev_team = SelectMultipleField(
translate("forms.task_order.dev_team.label"),
description=translate("forms.task_order.dev_team.description"),
choices=DEV_TEAM,
default=None,
filters=[BaseForm.remove_empty_string],
widget=ListWidget(prefix_label=False),
option_widget=CheckboxInput(),
)
dev_team_other = StringField(
translate("forms.task_order.dev_team_other_label"),
default=None,
filters=[BaseForm.remove_empty_string],
)
team_experience = RadioField(
translate("forms.task_order.team_experience.label"),
description=translate("forms.task_order.team_experience.description"),
choices=TEAM_EXPERIENCE,
default="",
validators=[Optional()],
)
class AppInfoForm(AppInfoWithExistingPortfolioForm):
portfolio_name = StringField(
translate("forms.task_order.portfolio_name_label"),
description=translate("forms.task_order.portfolio_name_description"),
filters=[BaseForm.remove_empty_string],
validators=[
Required(),
Length(
min=4,
max=100,
message=translate("forms.portfolio.name_length_validation_message"),
),
],
)
defense_component = SelectField(
translate("forms.task_order.defense_component_label"),
choices=SERVICE_BRANCHES,
default="",
filters=[BaseForm.remove_empty_string],
class TaskOrderForm(BaseForm):
number = StringField(
translate("forms.task_order.number_label"),
description=translate("forms.task_order.number_description"),
validators=[Required()],
)
class FundingForm(BaseForm):
performance_length = SelectField(
translate("forms.task_order.performance_length.label"),
choices=PERIOD_OF_PERFORMANCE_LENGTH,
)
start_date = DateField(
translate("forms.task_order.start_date_label"), format="%m/%d/%Y"
)
end_date = DateField(
translate("forms.task_order.end_date_label"), format="%m/%d/%Y"
)
csp_estimate = FileField(
translate("forms.task_order.csp_estimate_label"),
description=translate("forms.task_order.csp_estimate_description"),
validators=[
FileAllowed(
["pdf", "png"], translate("forms.task_order.file_format_not_allowed")
)
],
render_kw={"accept": ".pdf,.png,application/pdf,image/png"},
)
clin_01 = DecimalField(
translate("forms.task_order.clin_01_label"), validators=[Optional()]
)
@@ -151,135 +46,7 @@ class UnclassifiedFundingForm(FundingForm):
)
class OversightForm(BaseForm):
ko_first_name = StringField(
translate("forms.task_order.oversight_first_name_label"),
filters=[BaseForm.remove_empty_string],
)
ko_last_name = StringField(
translate("forms.task_order.oversight_last_name_label"),
filters=[BaseForm.remove_empty_string],
)
ko_email = StringField(
translate("forms.task_order.oversight_email_label"),
validators=[Optional(), Email()],
filters=[BaseForm.remove_empty_string],
)
ko_phone_number = TelField(
translate("forms.task_order.oversight_phone_label"),
validators=[Optional(), PhoneNumber()],
filters=[BaseForm.remove_empty_string],
)
ko_dod_id = StringField(
translate("forms.task_order.oversight_dod_id_label"),
filters=[BaseForm.remove_empty_string],
validators=[
RequiredIf(lambda form: form._fields.get("ko_invite").data),
Length(min=10),
IsNumber(),
],
)
am_cor = BooleanField(translate("forms.task_order.oversight_am_cor_label"))
cor_first_name = StringField(
translate("forms.task_order.oversight_first_name_label"),
filters=[BaseForm.remove_empty_string],
)
cor_last_name = StringField(
translate("forms.task_order.oversight_last_name_label"),
filters=[BaseForm.remove_empty_string],
)
cor_email = StringField(
translate("forms.task_order.oversight_email_label"),
filters=[BaseForm.remove_empty_string],
validators=[Optional(), Email()],
)
cor_phone_number = TelField(
translate("forms.task_order.oversight_phone_label"),
filters=[BaseForm.remove_empty_string],
validators=[
RequiredIf(lambda form: not form._fields.get("am_cor").data),
Optional(),
PhoneNumber(),
],
)
cor_dod_id = StringField(
translate("forms.task_order.oversight_dod_id_label"),
filters=[BaseForm.remove_empty_string],
validators=[
RequiredIf(
lambda form: not form._fields.get("am_cor").data
and form._fields.get("cor_invite").data
),
Length(min=10),
IsNumber(),
],
)
so_first_name = StringField(
translate("forms.task_order.oversight_first_name_label"),
filters=[BaseForm.remove_empty_string],
)
so_last_name = StringField(
translate("forms.task_order.oversight_last_name_label"),
filters=[BaseForm.remove_empty_string],
)
so_email = StringField(
translate("forms.task_order.oversight_email_label"),
filters=[BaseForm.remove_empty_string],
validators=[Optional(), Email()],
)
so_phone_number = TelField(
translate("forms.task_order.oversight_phone_label"),
filters=[BaseForm.remove_empty_string],
validators=[Optional(), PhoneNumber()],
)
so_dod_id = StringField(
translate("forms.task_order.oversight_dod_id_label"),
filters=[BaseForm.remove_empty_string],
validators=[
RequiredIf(lambda form: form._fields.get("so_invite").data),
Length(min=10),
IsNumber(),
],
)
ko_invite = BooleanField(
translate("forms.task_order.ko_invite_label"),
description=translate("forms.task_order.skip_invite_description"),
)
cor_invite = BooleanField(
translate("forms.task_order.cor_invite_label"),
description=translate("forms.task_order.skip_invite_description"),
)
so_invite = BooleanField(
translate("forms.task_order.so_invite_label"),
description=translate("forms.task_order.skip_invite_description"),
)
class ReviewForm(BaseForm):
pass
class SignatureForm(BaseForm):
level_of_warrant = DecimalField(
translate("task_orders.sign.level_of_warrant_label"),
description=translate("task_orders.sign.level_of_warrant_description"),
validators=[
RequiredIf(
lambda form: (
form._fields.get("unlimited_level_of_warrant").data is not True
)
)
],
)
unlimited_level_of_warrant = BooleanField(
translate("task_orders.sign.unlimited_level_of_warrant_description"),
validators=[Optional()],
)
signature = BooleanField(
translate("task_orders.sign.digital_signature_label"),
description=translate("task_orders.sign.digital_signature_description"),

View File

@@ -1,355 +1,59 @@
from copy import deepcopy
from flask import (
request as http_request,
render_template,
g,
redirect,
url_for,
current_app as app,
)
from flask import g, redirect, render_template, request as http_request, url_for
from . import task_orders_bp
from atst.domain.task_orders import TaskOrders
from atst.domain.portfolios import Portfolios
from atst.utils.flash import formatted_flash as flash
import atst.forms.task_order as task_order_form
from atst.domain.authz.decorator import user_can_access_decorator as user_can
from atst.domain.task_orders import TaskOrders
from atst.forms.task_order import TaskOrderForm
from atst.models.permissions import Permissions
from atst.utils.localization import translate
from atst.utils.flash import formatted_flash as flash
TASK_ORDER_SECTIONS = [
{
"section": "app_info",
"title": translate("forms.task_order.first_step_title"),
"template": "task_orders/new/app_info.html",
"form": task_order_form.AppInfoForm,
},
{
"section": "funding",
"title": "Funding",
"template": "task_orders/new/funding.html",
"form": task_order_form.FundingForm,
"unclassified_form": task_order_form.UnclassifiedFundingForm,
},
{
"section": "oversight",
"title": "Oversight",
"template": "task_orders/new/oversight.html",
"form": task_order_form.OversightForm,
},
{
"section": "review",
"title": "Review",
"template": "task_orders/new/review.html",
"form": task_order_form.ReviewForm,
},
]
@task_orders_bp.route("/portfolios/<portfolio_id>/task_orders/new")
@task_orders_bp.route("/portfolios/<portfolio_id>/task_orders/<task_order_id>/edit")
@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form")
def edit(portfolio_id, task_order_id=None):
form = None
class ShowTaskOrderWorkflow:
def __init__(self, user, screen=1, task_order_id=None, portfolio_id=None):
self.user = user
self.screen = screen
self.task_order_id = task_order_id
self._task_order = None
self.portfolio_id = portfolio_id
self._portfolio = None
self._section = TASK_ORDER_SECTIONS[screen - 1]
self._form = None
@property
def task_order(self):
if not self._task_order and self.task_order_id:
if self.portfolio_id:
self._task_order = TaskOrders.get(
self.task_order_id, portfolio_id=self.portfolio_id
)
else:
self._task_order = TaskOrders.get(self.task_order_id)
return self._task_order
@property
def portfolio(self):
if not self._portfolio:
if self.task_order:
self._portfolio = self.task_order.portfolio
elif self.portfolio_id:
self._portfolio = Portfolios.get(self.user, self.portfolio_id)
return self._portfolio
@property
def form(self):
form_type = (
"unclassified_form"
if "unclassified_form" in self._section and not app.config.get("CLASSIFIED")
else "form"
)
if self._form:
pass
elif self.task_order:
if self.pf_attributes_read_only and self.screen == 1:
self._form = task_order_form.AppInfoWithExistingPortfolioForm(
obj=self.task_order
)
else:
self._form = self._section[form_type](obj=self.task_order)
# manually set SelectMultipleFields
if self._section["section"] == "app_info":
self._form.complexity.data = self.task_order.complexity
self._form.dev_team.data = self.task_order.dev_team
elif self._section["section"] == "oversight":
if self.user.dod_id == self.task_order.cor_dod_id:
self._form.am_cor.data = True
if self.task_order.contracting_officer or self.task_order.ko_invite:
self._form.ko_invite.data = True
if (
self.task_order.contracting_officer_representative
or self.task_order.cor_invite
):
self._form.cor_invite.data = True
if self.task_order.security_officer or self.task_order.so_invite:
self._form.so_invite.data = True
else:
self._form = self._section[form_type]()
return self._form
@property
def template(self):
return self._section["template"]
@property
def display_screens(self):
screen_info = deepcopy(TASK_ORDER_SECTIONS)
if self.task_order:
for section in screen_info:
section["completion"] = TaskOrders.section_completion_status(
self.task_order, section["section"]
)
return screen_info
@property
def is_complete(self):
if self.task_order and TaskOrders.all_sections_complete(self.task_order):
return True
else:
return False
@property
def pf_attributes_read_only(self):
if self.task_order and self.portfolio.num_task_orders > 1:
return True
elif self.portfolio_id:
return True
else:
return False
class UpdateTaskOrderWorkflow(ShowTaskOrderWorkflow):
def __init__(
self, user, form_data, screen=1, task_order_id=None, portfolio_id=None
):
self.user = user
self.form_data = form_data
self.screen = screen
self.task_order_id = task_order_id
self.portfolio_id = portfolio_id
self._task_order = None
self._section = TASK_ORDER_SECTIONS[screen - 1]
self._form = None
@property
def form(self):
if not self._form:
form_type = (
"unclassified_form"
if "unclassified_form" in self._section
and not app.config.get("CLASSIFIED")
else "form"
)
if self.pf_attributes_read_only and self.screen == 1:
self._form = task_order_form.AppInfoWithExistingPortfolioForm(
self.form_data
)
else:
self._form = self._section[form_type](
self.form_data, obj=self.task_order
)
return self._form
@property
def portfolio(self):
if self.task_order:
return self.task_order.portfolio
@property
def task_order_form_data(self):
to_data = self.form.data.copy()
if "portfolio_name" in to_data:
to_data.pop("portfolio_name")
if "defense_component" in to_data:
to_data.pop("defense_component")
# don't save other text in DB unless "other" is checked
if (
"complexity" in to_data
and bool(to_data["complexity"])
and "other" not in to_data["complexity"]
):
to_data["complexity_other"] = None
if (
"dev_team" in to_data
and bool(to_data["dev_team"])
and "other" not in to_data["dev_team"]
):
to_data["dev_team_other"] = None
if self.form_data.get("am_cor"):
cor_data = {
"cor_first_name": self.user.first_name,
"cor_last_name": self.user.last_name,
"cor_email": self.user.email,
"cor_phone_number": self.user.phone_number,
"cor_dod_id": self.user.dod_id,
"cor_id": self.user.id,
}
to_data = {**to_data, **cor_data}
return to_data
def validate(self):
return self.form.validate()
def update(self):
if self.task_order:
if "portfolio_name" in self.form.data:
new_name = self.form.data["portfolio_name"]
old_name = self.task_order.portfolio_name
if not new_name == old_name:
Portfolios.update(self.task_order.portfolio, {"name": new_name})
TaskOrders.update(self.task_order, **self.task_order_form_data)
else:
if self.portfolio_id:
pf = Portfolios.get(self.user, self.portfolio_id)
else:
pf = Portfolios.create(
user=self.user,
portfolio_attrs={
"name": self.form.portfolio_name.data,
"defense_component": self.form.defense_component.data,
},
)
self._task_order = TaskOrders.create(portfolio=pf, creator=self.user)
TaskOrders.update(self.task_order, **self.task_order_form_data)
return self.task_order
@task_orders_bp.route("/task_orders/new/get_started")
def get_started():
return render_template("task_orders/new/get_started.html") # pragma: no cover
def is_new_task_order(*_args, **kwargs):
return (
"screen" in kwargs
and kwargs["screen"] == 1
and "task_order_id" not in kwargs
and "portfolio_id" not in kwargs
)
# TODO: /task_orders/new/<int:screen>/<task_order_id> should not exist
@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("/portfolios/<portfolio_id>/task_orders/new/<int:screen>")
@user_can(
Permissions.CREATE_TASK_ORDER,
override=is_new_task_order,
message="view new task order form",
)
def new(screen, task_order_id=None, portfolio_id=None):
workflow = ShowTaskOrderWorkflow(
g.current_user, screen, task_order_id, portfolio_id
)
template_args = {
"current": screen,
"task_order_id": task_order_id,
"screens": workflow.display_screens,
"form": workflow.form,
"complete": workflow.is_complete,
}
if task_order_id and screen is 4:
if not TaskOrders.all_sections_complete(workflow.task_order):
flash("task_order_draft")
if workflow.pf_attributes_read_only:
template_args["portfolio"] = workflow.portfolio
url_args = {"screen": screen}
if task_order_id:
url_args["task_order_id"] = task_order_id
task_order = TaskOrders.get(task_order_id)
form = TaskOrderForm(number=task_order.number)
else:
url_args["portfolio_id"] = portfolio_id
form = TaskOrderForm()
if workflow.task_order:
template_args["task_order"] = workflow.task_order
if http_request.args.get("ko_edit"):
template_args["ko_edit"] = True
template_args["next"] = url_for(
"task_orders.ko_review", task_order_id=task_order_id
)
url_args["next"] = template_args["next"]
template_args["action_url"] = url_for("task_orders.update", **url_args)
return render_template(workflow.template, **template_args)
# TODO: /task_orders/new/<int:screen>/<task_order_id> should not exist
@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(
"/portfolios/<portfolio_id>/task_orders/new/<int:screen>", methods=["POST"]
)
@user_can(
Permissions.CREATE_TASK_ORDER,
override=is_new_task_order,
message="update task order",
)
def update(screen, task_order_id=None, portfolio_id=None):
form_data = {**http_request.form, **http_request.files}
workflow = UpdateTaskOrderWorkflow(
g.current_user, form_data, screen, task_order_id, portfolio_id
cancel_url = (
http_request.referrer
if http_request.referrer
else url_for("task_orders.portfolio_funding", portfolio_id=portfolio_id)
)
if workflow.validate():
workflow.update()
if http_request.args.get("next"):
redirect_url = http_request.args.get("next")
return render_template("task_orders/edit.html", form=form, cancel_url=cancel_url)
@task_orders_bp.route("/portfolios/<portfolio_id>/task_orders/new", methods=["POST"])
@task_orders_bp.route(
"/portfolios/<portfolio_id>/task_orders/<task_order_id>", methods=["POST"]
)
@user_can(Permissions.CREATE_TASK_ORDER, message="create new task order")
def update(portfolio_id, task_order_id=None):
form_data = http_request.form
form = TaskOrderForm(form_data)
if form.validate():
task_order = None
if task_order_id:
task_order = TaskOrders.update(task_order_id, **form.data)
else:
redirect_url = url_for(
"task_orders.new",
screen=screen + 1,
task_order_id=workflow.task_order.id,
task_order = TaskOrders.create(g.current_user, portfolio_id, **form.data)
flash("task_order_draft")
return redirect(
url_for(
"task_orders.edit",
portfolio_id=portfolio_id,
task_order_id=task_order.id,
)
return redirect(redirect_url)
else:
return render_template(
workflow.template,
current=screen,
task_order_id=task_order_id,
portfolio_id=portfolio_id,
screens=workflow.display_screens,
form=workflow.form,
)
else:
flash("form_errors")
return render_template("task_orders/edit.html", form=form)

View File

@@ -2,19 +2,32 @@ from flask import flash, render_template_string
from atst.utils.localization import translate
MESSAGES = {
"application_environment_members_updated": {
"title_template": "Application environment members updated",
"message_template": "Application environment members have been updated",
"category": "success",
},
"application_deleted": {
"title_template": translate("flash.success"),
"message_template": """
{{ "flash.application.deleted" | translate({"application_name": application_name}) }}
<a href="#">{{ "common.undo" | translate }}</a>
""",
"category": "success",
},
"application_environments_updated": {
"title_template": "Application environments updated",
"message_template": "Application environments have been updated",
"category": "success",
},
"application_member_removed": {
"title_template": "Team member removed from application",
"message_template": "You have successfully deleted {{ user_name }} from {{ application_name }}",
"category": "success",
},
"environment_deleted": {
"title_template": "{{ environment_name }} deleted",
"message_template": 'The environment "{{ environment_name }}" has been deleted',
"category": "success",
},
"application_environment_members_updated": {
"title_template": "Application environment members updated",
"message_template": "Application environment members have been updated",
"environment_access_changed": {
"title_template": "User access successfully changed.",
"message_template": "",
"category": "success",
},
"environment_added": {
@@ -24,37 +37,44 @@ MESSAGES = {
""",
"category": "success",
},
"application_environments_updated": {
"title_template": "Application environments updated",
"message_template": "Application environments have been updated",
"environment_deleted": {
"title_template": "{{ environment_name }} deleted",
"message_template": 'The environment "{{ environment_name }}" has been deleted',
"category": "success",
},
"primary_point_of_contact_changed": {
"title_template": translate("flash.new_ppoc_title"),
"message_template": """{{ "flash.new_ppoc_message" | translate({ "ppoc_name": ppoc_name }) }}""",
"category": "success",
"form_errors": {
"title_template": "There were some errors",
"message_template": "<p>Please see below.</p>",
"category": "error",
},
"invitation_resent": {
"title_template": "Invitation resent",
"message_template": "The {{ officer_type }} has been resent instructions to join this portfolio.",
"category": "success",
},
"task_order_draft": {
"title_template": translate("task_orders.form.draft_alert_title"),
"message_template": translate("task_orders.form.draft_alert_message"),
"logged_out": {
"title_template": translate("flash.logged_out"),
"message_template": """
You've been logged out.
""",
"category": "info",
},
"login_next": {
"title_template": translate("flash.login_required_title"),
"message_template": translate("flash.login_required_message"),
"category": "warning",
},
"task_order_signed": {
"title_template": "Task Order Signed",
"new_application_member": {
"title_template": translate("flash.success"),
"message_template": """
<p>Task order has been signed successfully</p>
<p>{{ "flash.new_application_member" | translate({ "user_name": new_member.user_name }) }}</p>
""",
"category": "success",
},
"update_portfolio_members": {
"title_template": "Success!",
"new_portfolio": {
"title_template": "Portfolio created!",
"message_template": """
<p>You have successfully updated access permissions for members of {{ portfolio.name }}.</p>
<p>You are now ready to create applications and environments within the JEDI Cloud.</p>
""",
"category": "success",
},
@@ -65,17 +85,17 @@ MESSAGES = {
""",
"category": "success",
},
"revoked_portfolio_access": {
"title_template": "Removed portfolio access",
"portfolio_member_dod_id_error": {
"title_template": "CAC ID Error",
"message_template": """
<p>Portfolio access successfully removed from {{ member_name }}.</p>
The member attempted to accept this invite, but their CAC ID did not match the CAC ID you specified on the invite. Please confirm that the DoD ID is accurate.
""",
"category": "success",
"category": "error",
},
"resend_portfolio_invitation": {
"title_template": "Invitation resent",
"portfolio_member_removed": {
"title_template": translate("flash.deleted_member"),
"message_template": """
<p>Successfully sent a new invitation to {{ user_name }}.</p>
{{ "flash.delete_member_success" | translate({ "member_name": member_name }) }}
""",
"category": "success",
},
@@ -86,6 +106,25 @@ MESSAGES = {
""",
"category": "success",
},
"primary_point_of_contact_changed": {
"title_template": translate("flash.new_ppoc_title"),
"message_template": """{{ "flash.new_ppoc_message" | translate({ "ppoc_name": ppoc_name }) }}""",
"category": "success",
},
"resend_portfolio_invitation": {
"title_template": "Invitation resent",
"message_template": """
<p>Successfully sent a new invitation to {{ user_name }}.</p>
""",
"category": "success",
},
"revoked_portfolio_access": {
"title_template": "Removed portfolio access",
"message_template": """
<p>Portfolio access successfully removed from {{ member_name }}.</p>
""",
"category": "success",
},
"session_expired": {
"title_template": "Session Expired",
"message_template": """
@@ -93,52 +132,6 @@ MESSAGES = {
""",
"category": "error",
},
"login_next": {
"title_template": translate("flash.login_required_title"),
"message_template": translate("flash.login_required_message"),
"category": "warning",
},
"new_portfolio": {
"title_template": "Portfolio created!",
"message_template": """
<p>You are now ready to create applications and environments within the JEDI Cloud.</p>
""",
"category": "success",
},
"portfolio_member_dod_id_error": {
"title_template": "CAC ID Error",
"message_template": """
The member attempted to accept this invite, but their CAC ID did not match the CAC ID you specified on the invite. Please confirm that the DoD ID is accurate.
""",
"category": "error",
},
"form_errors": {
"title_template": "There were some errors",
"message_template": "<p>Please see below.</p>",
"category": "error",
},
"user_must_complete_profile": {
"title_template": "You must complete your profile",
"message_template": "<p>Before continuing, you must complete your profile</p>",
"category": "info",
},
"user_updated": {
"title_template": "User information updated.",
"message_template": "",
"category": "success",
},
"environment_access_changed": {
"title_template": "User access successfully changed.",
"message_template": "",
"category": "success",
},
"task_order_submitted": {
"title_template": "Task Order Form Submitted",
"message_template": """
Your task order form for {{ task_order.portfolio_name }} has been submitted.
""",
"category": "success",
},
"task_order_congrats": {
"title_template": translate("flash.congrats"),
"message_template": translate("flash.new_portfolio"),
@@ -157,6 +150,11 @@ MESSAGES = {
""",
"category": "success",
},
"task_order_draft": {
"title_template": translate("task_orders.form.draft_alert_title"),
"message_template": translate("task_orders.form.draft_alert_message"),
"category": "warning",
},
"task_order_incomplete": {
"title_template": "Task Order Incomplete",
"message_template": """
@@ -164,25 +162,24 @@ MESSAGES = {
""",
"category": "error",
},
"portfolio_member_removed": {
"title_template": translate("flash.deleted_member"),
"task_order_signed": {
"title_template": "Task Order Signed",
"message_template": """
{{ "flash.delete_member_success" | translate({ "member_name": member_name }) }}
<p>Task order has been signed successfully</p>
""",
"category": "success",
},
"application_deleted": {
"title_template": translate("flash.success"),
"task_order_submitted": {
"title_template": "Task Order Form Submitted",
"message_template": """
{{ "flash.application.deleted" | translate({"application_name": application_name}) }}
<a href="#">{{ "common.undo" | translate }}</a>
Your task order form for {{ task_order.portfolio_name }} has been submitted.
""",
"category": "success",
},
"new_application_member": {
"title_template": translate("flash.success"),
"update_portfolio_members": {
"title_template": "Success!",
"message_template": """
<p>{{ "flash.new_application_member" | translate({ "user_name": new_member.user_name }) }}</p>
<p>You have successfully updated access permissions for members of {{ portfolio.name }}.</p>
""",
"category": "success",
},
@@ -193,13 +190,16 @@ MESSAGES = {
""",
"category": "success",
},
"logged_out": {
"title_template": translate("flash.logged_out"),
"message_template": """
You've been logged out.
""",
"user_must_complete_profile": {
"title_template": "You must complete your profile",
"message_template": "<p>Before continuing, you must complete your profile</p>",
"category": "info",
},
"user_updated": {
"title_template": "User information updated.",
"message_template": "",
"category": "success",
},
}