diff --git a/atst/filters.py b/atst/filters.py index d0fe5bf7..524d39bb 100644 --- a/atst/filters.py +++ b/atst/filters.py @@ -1,6 +1,6 @@ import re import datetime -from atst.utils.localization import translate +from atst.utils.localization import translate, translate_duration from flask import current_app as app, render_template from jinja2 import contextfilter from jinja2.exceptions import TemplateNotFound @@ -97,6 +97,19 @@ def renderAuditEvent(event): return render_template("audit_log/events/default.html", event=event) +def removeHtml(text): + html_tags = re.compile("<.*?>") + return re.sub(html_tags, "", text) + + +def normalizeOrder(title): + # reorders titles from "Army, Department of the" to "Department of the Army" + text = title.split(", ") + reordered_text = text[0:-1] + reordered_text.insert(0, text[-1]) + return " ".join(reordered_text) + + def register_filters(app): app.jinja_env.filters["iconSvg"] = iconSvg app.jinja_env.filters["dollars"] = dollars @@ -110,6 +123,9 @@ def register_filters(app): app.jinja_env.filters["dateFromString"] = dateFromString app.jinja_env.filters["pageWindow"] = pageWindow app.jinja_env.filters["renderAuditEvent"] = renderAuditEvent + app.jinja_env.filters["removeHtml"] = removeHtml + app.jinja_env.filters["normalizeOrder"] = normalizeOrder + app.jinja_env.filters["translateDuration"] = translate_duration @contextfilter def translateWithoutCache(context, *kwargs): diff --git a/atst/forms/data.py b/atst/forms/data.py index 8aeda1e4..3afb2ec7 100644 --- a/atst/forms/data.py +++ b/atst/forms/data.py @@ -1,4 +1,6 @@ from atst.domain.roles import PORTFOLIO_ROLES as PORTFOLIO_ROLE_DEFINITIONS +from atst.utils.localization import translate, translate_duration + SERVICE_BRANCHES = [ ("", "Select an option"), @@ -176,67 +178,41 @@ FUNDING_TYPES = [ TASK_ORDER_SOURCES = [("MANUAL", "Manual"), ("EDA", "EDA")] APP_MIGRATION = [ - ("on_premise", "Yes, migrating from an on-premise data center"), - ("cloud", "Yes, migrating from another cloud provider"), - ( - "both", - "Yes, migrating from an on-premise data center and another cloud provider", - ), - ("none", "Not planning to migrate any applications"), - ("not_sure", "Not Sure"), + ("on_premise", translate("forms.task_order.app_migration.on_premise")), + ("cloud", translate("forms.task_order.app_migration.cloud")), + ("both", translate("forms.task_order.app_migration.both")), + ("none", translate("forms.task_order.app_migration.none")), + ("not_sure", translate("forms.task_order.app_migration.not_sure")), ] APPLICATION_COMPLEXITY = [ - ("storage", "Storage "), - ("data_analytics", "Data Analytics "), - ("conus", "CONUS Access "), - ("oconus", "OCONUS Access "), - ("tactical_edge", "Tactical Edge Access "), - ("not_sure", "Not Sure "), - ("other", "Other"), + ("storage", translate("forms.task_order.complexity.storage")), + ("data_analytics", translate("forms.task_order.complexity.data_analytics")), + ("conus", translate("forms.task_order.complexity.conus")), + ("oconus", translate("forms.task_order.complexity.oconus")), + ("tactical_edge", translate("forms.task_order.complexity.tactical_edge")), + ("not_sure", translate("forms.task_order.complexity.not_sure")), + ("other", translate("forms.task_order.complexity.other")), ] DEV_TEAM = [ - ("government_civilians", "Government Civilians"), - ("military", "Military "), - ("contractor", "Contractor "), - ("other", "Other (E.g. University or other partner)"), + ( + "government_civilians", + translate("forms.task_order.dev_team.government_civilians"), + ), + ("military", translate("forms.task_order.dev_team.military")), + ("contractor", translate("forms.task_order.dev_team.contractor")), + ("other", translate("forms.task_order.dev_team.other")), ] TEAM_EXPERIENCE = [ - ("none", "No previous experience"), - ("planned", "Researched or planned a cloud build or migration"), - ("built_1", "Built or Migrated 1-2 applications"), - ("built_3", "Built or Migrated 3-5 applications"), - ( - "built_many", - "Built or migrated many applications, or consulted on several such applications", - ), + ("none", translate("forms.task_order.team_experience.none")), + ("planned", translate("forms.task_order.team_experience.planned")), + ("built_1", translate("forms.task_order.team_experience.built_1")), + ("built_3", translate("forms.task_order.team_experience.built_3")), + ("built_many", translate("forms.task_order.team_experience.built_many")), ] PERIOD_OF_PERFORMANCE_LENGTH = [ - ("1", "1 Month"), - ("2", "2 Months"), - ("3", "3 Months"), - ("4", "4 Months"), - ("5", "5 Months"), - ("6", "6 Months"), - ("7", "7 Months"), - ("8", "8 Months"), - ("9", "9 Months"), - ("10", "10 Months"), - ("11", "11 Months"), - ("12", "1 Year"), - ("13", "1 Year, 1 Month"), - ("14", "1 Year, 2 Months"), - ("15", "1 Year, 3 Months"), - ("16", "1 Year, 4 Months"), - ("17", "1 Year, 5 Months"), - ("18", "1 Year, 6 Months"), - ("19", "1 Year, 7 Months"), - ("20", "1 Year, 8 Months"), - ("21", "1 Year, 9 Months"), - ("22", "1 Year, 10 Months"), - ("23", "1 Year, 11 Months"), - ("24", "2 Years"), + (str(x + 1), translate_duration(x + 1)) for x in range(24) ] diff --git a/atst/forms/task_order.py b/atst/forms/task_order.py index ce33476d..4935702f 100644 --- a/atst/forms/task_order.py +++ b/atst/forms/task_order.py @@ -39,8 +39,8 @@ class AppInfoForm(CacheableForm): translate("forms.task_order.defense_component_label"), choices=SERVICE_BRANCHES ) app_migration = RadioField( - translate("forms.task_order.app_migration_label"), - description=translate("forms.task_order.app_migration_description"), + translate("forms.task_order.app_migration.label"), + description=translate("forms.task_order.app_migration.description"), choices=APP_MIGRATION, default="", ) @@ -50,8 +50,8 @@ class AppInfoForm(CacheableForm): choices=[("yes", "Yes"), ("no", "No"), ("not_sure", "Not Sure")], ) complexity = SelectMultipleField( - translate("forms.task_order.complexity_label"), - description=translate("forms.task_order.complexity_description"), + translate("forms.task_order.complexity.label"), + description=translate("forms.task_order.complexity.description"), choices=APPLICATION_COMPLEXITY, default="", widget=ListWidget(prefix_label=False), @@ -59,8 +59,8 @@ class AppInfoForm(CacheableForm): ) complexity_other = StringField(translate("forms.task_order.complexity_other_label")) dev_team = SelectMultipleField( - translate("forms.task_order.dev_team_label"), - description=translate("forms.task_order.dev_team_description"), + translate("forms.task_order.dev_team.label"), + description=translate("forms.task_order.dev_team.description"), choices=DEV_TEAM, default="", widget=ListWidget(prefix_label=False), @@ -68,8 +68,8 @@ class AppInfoForm(CacheableForm): ) dev_team_other = StringField(translate("forms.task_order.dev_team_other_label")) team_experience = RadioField( - translate("forms.task_order.team_experience_label"), - description=translate("forms.task_order.team_experience_description"), + translate("forms.task_order.team_experience.label"), + description=translate("forms.task_order.team_experience.description"), choices=TEAM_EXPERIENCE, default="", ) @@ -77,7 +77,7 @@ class AppInfoForm(CacheableForm): class FundingForm(CacheableForm): performance_length = SelectField( - translate("forms.task_order.performance_length_label"), + translate("forms.task_order.performance_length.label"), choices=PERIOD_OF_PERFORMANCE_LENGTH, ) start_date = DateField( diff --git a/atst/utils/localization.py b/atst/utils/localization.py index 53802fca..fff301fd 100644 --- a/atst/utils/localization.py +++ b/atst/utils/localization.py @@ -1,6 +1,8 @@ import yaml import os from functools import lru_cache +import math +from gettext import ngettext from flask import current_app as app from atst.utils import getattr_path @@ -41,3 +43,14 @@ def translate(key, variables=None): raise LocalizationInvalidKeyError(key, variables) return value.format(**variables).replace("\n", "") + + +def translate_duration(duration_in_months): + duration = [] + years = math.floor(duration_in_months / 12) + months = duration_in_months % 12 + if years > 0: + duration.append("{} {}".format(years, ngettext("year", "years", years))) + if months > 0: + duration.append("{} {}".format(months, ngettext("month", "months", months))) + return (", ").join(duration) diff --git a/styles/atat.scss b/styles/atat.scss index 63889846..f2e91d6e 100644 --- a/styles/atat.scss +++ b/styles/atat.scss @@ -38,6 +38,7 @@ @import 'components/budget_chart'; @import 'components/audit_log'; @import 'components/usa_banner'; +@import 'components/checklist'; @import 'sections/login'; @import 'sections/home'; diff --git a/styles/components/_checklist.scss b/styles/components/_checklist.scss new file mode 100644 index 00000000..01921bfd --- /dev/null +++ b/styles/components/_checklist.scss @@ -0,0 +1,9 @@ +.checklist { + padding-left: 0; + list-style: none; + margin-top: 5px; + + li { + margin-bottom: 0; + } +} diff --git a/styles/elements/_icon_link.scss b/styles/elements/_icon_link.scss index 88e340ff..1c13e558 100644 --- a/styles/elements/_icon_link.scss +++ b/styles/elements/_icon_link.scss @@ -68,4 +68,8 @@ opacity: 0.3; pointer-events: none; } + + &.icon-link--left { + padding-left: 0; + } } diff --git a/styles/elements/_icons.scss b/styles/elements/_icons.scss index 3116125c..5703356d 100644 --- a/styles/elements/_icons.scss +++ b/styles/elements/_icons.scss @@ -55,7 +55,19 @@ @include icon-size(24); } - &.icon--remove { + &.icon--remove, &.icon--red { @include icon-color($color-red); } + + &.icon--green { + @include icon-color($color-green); + } + + &.icon--gray { + @include icon-color($color-gray); + } + + &.icon--medium { + @include icon-size(12); + } } diff --git a/styles/sections/_task_order.scss b/styles/sections/_task_order.scss index faae653f..3b85a4a7 100644 --- a/styles/sections/_task_order.scss +++ b/styles/sections/_task_order.scss @@ -179,3 +179,40 @@ } } } + +.task-order-form { + .task-order-form__heading { + margin-bottom: 0; + + &.inactive { + color: $color-gray-light; + } + + &.subheading { + color: $color-gray; + } + } + + .funding-summary__table { + tr td { + border-bottom: 0; + padding: 0.5rem 1.5rem; + + .funding-summary__td { + margin-top: 0; + } + } + } + + .task-order-invite-message { + &.not-sent { + color: $color-red; + font-weight: $font-bold; + } + + &.sent { + color: $color-green; + font-weight: $font-bold; + } + } +} diff --git a/templates/components/multi_checkbox_input.html b/templates/components/multi_checkbox_input.html index 99235e21..a5477dc0 100644 --- a/templates/components/multi_checkbox_input.html +++ b/templates/components/multi_checkbox_input.html @@ -33,10 +33,10 @@
  • {% if choice[0] != 'other' %} - + {% else %} - +
    diff --git a/templates/task_orders/_new.html b/templates/task_orders/_new.html index 7af31965..10694ef7 100644 --- a/templates/task_orders/_new.html +++ b/templates/task_orders/_new.html @@ -2,7 +2,7 @@ {% block content %} -
    +
    {% include 'task_orders/new/menu.html' %} @@ -19,8 +19,10 @@
    -
    Task Order Builder
    -

    {% block heading %}{% endblock %}

    +

    +
    Task Order Builder
    + {% block heading %}{% endblock %} +

    diff --git a/templates/task_orders/new/app_info.html b/templates/task_orders/new/app_info.html index 99704939..881cff16 100644 --- a/templates/task_orders/new/app_info.html +++ b/templates/task_orders/new/app_info.html @@ -12,7 +12,7 @@ {% block form %} -

    {{ "task_orders.new.app_info.basic_info_title"| translate }}

    +

    {{ "task_orders.new.app_info.basic_info_title"| translate }}

    {{ TextInput(form.portfolio_name, placeholder="The name of your office or organization") }} {{ TextInput(form.scope, paragraph=True) }}

    {{ "task_orders.new.app_info.sample_scope" | translate | safe }}

    @@ -20,20 +20,20 @@
    -

    {{ "task_orders.new.app_info.project_title" | translate }}

    +

    {{ "task_orders.new.app_info.project_title" | translate }}

    {{ OptionsInput(form.app_migration) }} {{ OptionsInput(form.native_apps) }} {{ MultiCheckboxInput(form.complexity, form.complexity_other) }}
    -

    {{ "task_orders.new.app_info.team_title" | translate }}

    +

    {{ "task_orders.new.app_info.team_title" | translate }}

    {{ MultiCheckboxInput(form.dev_team, form.dev_team_other) }} {{ OptionsInput(form.team_experience) }}
    -

    {{ "task_orders.new.app_info.market_research_title" | translate }}

    +

    {{ "task_orders.new.app_info.market_research_title" | translate }}

    {{ "task_orders.new.app_info.market_research_paragraph" | translate | safe }}

    {% endblock %} diff --git a/templates/task_orders/new/funding.html b/templates/task_orders/new/funding.html index 56f8f968..82417e2c 100644 --- a/templates/task_orders/new/funding.html +++ b/templates/task_orders/new/funding.html @@ -15,14 +15,14 @@
    -

    {{ "task_orders.new.funding.performance_period_title" | translate }}

    +

    {{ "task_orders.new.funding.performance_period_title" | translate }}

    {{ "task_orders.new.funding.performance_period_description" | translate }}

    {{ "task_orders.new.funding.performance_period_paragraph" | translate }}

    {{ OptionsInput(form.performance_length) }}
    -

    {{ "task_orders.new.funding.estimate_usage_title" | translate }}

    +

    {{ "task_orders.new.funding.estimate_usage_title" | translate }}

    {{ "task_orders.new.funding.estimate_usage_description" | translate }}

    {{ Icon("link")}} Cloud Service Provider's estimate calculator @@ -36,15 +36,15 @@


    -

    {{ "task_orders.new.funding.cloud_calculations_title" | translate }}

    +

    {{ "task_orders.new.funding.cloud_calculations_title" | translate }}

    {{ "task_orders.new.funding.cloud_calculations_paragraph" | translate }}

    -

    {{ "task_orders.new.funding.cloud_offerings_title" | translate }}

    +

    {{ "task_orders.new.funding.cloud_offerings_title" | translate }}

    {{ "task_orders.new.funding.cloud_offerings_paragraph" | translate }}

    {{ TextInput(form.clin_01, validation='dollars', placeholder="$0.00") }} {{ TextInput(form.clin_02, validation='dollars', disabled=(not config.CLASSIFIED)) }} -

    {{ "task_orders.new.funding.support_assistance_title" | translate }}

    +

    {{ "task_orders.new.funding.support_assistance_title" | translate }}

    {{ "task_orders.new.funding.support_assistance_paragraph" | translate }}

    {{ TextInput(form.clin_03, validation='dollars', tooltip='The cloud support and assistance packages cannot be used as a primary development resource.', placeholder="$0.00") }} {{ TextInput(form.clin_04, validation='dollars', tooltip='The cloud support and assistance packages cannot be used as a primary development resource.', disabled=(not config.CLASSIFIED)) }} @@ -56,7 +56,7 @@ {% block next %}
    -

    {{ "task_orders.new.funding.total" | translate }}

    +

    {{ "task_orders.new.funding.total" | translate }}

    {{ super() }} diff --git a/templates/task_orders/new/oversight.html b/templates/task_orders/new/oversight.html index 01117536..7b5181be 100644 --- a/templates/task_orders/new/oversight.html +++ b/templates/task_orders/new/oversight.html @@ -11,7 +11,7 @@ {% block form %} -

    {{ "task_orders.new.oversight.ko_info_title" | translate }}

    +

    {{ "task_orders.new.oversight.ko_info_title" | translate }}

    {{ "task_orders.new.oversight.ko_info_paragraph" | translate }}

    {{ UserInfo(form.ko_first_name, form.ko_last_name, form.ko_email, form.ko_phone_number) }} {{ CheckboxInput(form.ko_invite) }} @@ -19,7 +19,7 @@
    -

    {{ "task_orders.new.oversight.cor_info_title" | translate }}

    +

    {{ "task_orders.new.oversight.cor_info_title" | translate }}

    {{ "task_orders.new.oversight.cor_info_paragraph" | translate }}

    @@ -35,7 +35,7 @@
    -

    {{ "task_orders.new.oversight.so_info_title" | translate }}

    +

    {{ "task_orders.new.oversight.so_info_title" | translate }}

    {{ "task_orders.new.oversight.so_info_paragraph" | translate }}

    {{ UserInfo(form.so_first_name, form.so_last_name, form.so_email, form.so_phone_number) }} {{ CheckboxInput(form.so_invite) }} diff --git a/templates/task_orders/new/review.html b/templates/task_orders/new/review.html index 3211c438..929e2910 100644 --- a/templates/task_orders/new/review.html +++ b/templates/task_orders/new/review.html @@ -5,145 +5,219 @@ {% from "components/icon.html" import Icon %} {% block heading %} - Review & Download + {{ "task_orders.new.review.section_title"| translate }} {% endblock %} {% block form %} -{% macro TOEditLink(screen=1) %} +{% macro TOEditLink(screen=1, anchor=None) %} {% if task_order %} - {{ EditLink(url_for("task_orders.new", screen=screen, task_order_id=task_order.id)) }} + {{ EditLink(url_for("task_orders.new", screen=screen, task_order_id=task_order.id, _anchor=anchor)) }} {% else %} - {{ EditLink(url_for("task_orders.new", screen=screen)) }} + {{ EditLink(url_for("task_orders.new", screen=screen, _anchor=anchor)) }} {% endif %} {% endmacro %} -
    -

    Scope (Statement of Work) {{ TOEditLink() }}

    -

    - {{ task_order.scope or RequiredLabel() }} -

    +{% if task_order.defense_component %} + {% set defense_component_description = task_order.defense_component | normalizeOrder %} +{% endif %} -
    -
    -

    Period of Performance length {{ TOEditLink(screen=2) }}

    - {{ task_order.performance_length or RequiredLabel() }} -
    +{% if task_order.app_migration %} + {% set app_migration_description = "forms.task_order.app_migration.{}".format(task_order.app_migration) | translate | removeHtml %} +{% endif %} -
    -

    Total funding requested {{ TOEditLink(screen=2) }}

    - {{ task_order.budget }} -
    +{% if task_order.native_apps %} + {% set native_apps_description = "task_orders.new.review.{}_native".format(task_order.native_apps) | translate %} +{% endif %} + +{% if task_order.team_experience %} + {% set team_experience_description = "forms.task_order.team_experience.{}".format(task_order.team_experience) | translate %} +{% endif %} + + +

    {{ "task_orders.new.review.app_info"| translate }} {{ TOEditLink(screen=1) }}

    + +
    +
    +

    {{ "task_orders.new.review.portfolio"| translate }}

    +

    {{ task_order.portfolio_name or RequiredLabel() }}

    -
    + +
    +

    {{ "task_orders.new.review.dod"| translate }}

    +

    {{ defense_component_description or RequiredLabel() }}

    +
    +
    + +

    {{ "task_orders.new.review.scope"| translate }}

    +

    +{{ task_order.scope or RequiredLabel() }} +


    -
    -

    Generated Documents

    +

    {{ "task_orders.new.review.reporting"| translate }} {{ TOEditLink(screen=1, anchor="reporting") }}

    -
    +{% else %} +

    {{ RequiredLabel() }}

    +{% endif %} + +
    +
    +

    {{ "task_orders.new.review.team"| translate }}

    + {% if task_order.dev_team %} +
      + {% for item in task_order.dev_team %} +
    • + {% if item == 'other' %} + {{ Icon('ok', classes='icon--gray icon--medium') }}Other: {{ task_order.dev_team_other }} + {% else %} + {{ Icon('ok', classes='icon--gray icon--medium') }}{{ "forms.task_order.dev_team.{}".format(item) | translate }} + {% endif %} + +
    • + {% endfor %} +
    + {% else %} +

    {{ RequiredLabel() }}

    + {% endif %} +
    + +
    +

    {{ "task_orders.new.review.experience"| translate }}

    +

    {{ team_experience_description or RequiredLabel() }}

    +
    +

    -
    -

    Invite Signatories/Collaborators

    +

    {{ "task_orders.new.review.funding"| translate }} {{ TOEditLink(screen=2) }}

    -
    -
    -
    -
    - Financial Oversight -

    - {% if task_order.ko_first_name %} - {{ task_order.ko_first_name }} - {{ task_order.ko_last_name }} - {% else %} - {{ RequiredLabel() }} - {% endif %} - (Contracting Officer) -

    -

    - {% if task_order.ko_first_name %} - {{ task_order.cor_first_name }} - {{ task_order.cor_last_name }} - {% else %} - {{ RequiredLabel() }} - {% endif %} - (Contracting Officer Representative) -

    -
    -
    -
    -
    -
    -
    - Invite? -
    -
    -
    +
    +
    +

    {{ "task_orders.new.review.performance_period"| translate }}

    + {{ task_order.performance_length | translateDuration or RequiredLabel() }} +

    {{ Icon('download') }} {{ "task_orders.new.review.usage_est_link"| translate }}

    -
    -
    -
    -
    - Security Officer -

    - {% if task_order.so_first_name %} - {{ task_order.so_first_name }} - {{ task_order.so_last_name }} - {% else %} - {{ RequiredLabel() }} - {% endif %} - (Security Officer) -

    -
    -
    -
    -
    -
    -
    -
    + +
    + + + + + + + + + + + + + + + + + + + + + + + +

    {{ "task_orders.new.review.to_value"| translate }}

    {{ '${:,.2f}'.format(task_order.budget) }}

    {{ "task_orders.new.review.clin_1"| translate }}

    {{ '${:,.2f}'.format(task_order.clin_01) }}

    + {{ "task_orders.new.review.clin_2"| translate }} + {% if not config.CLASSIFIED %} +
    {{ "task_orders.new.review.classified_inactive"| translate }}
    + {% endif %} +

    + {% if config.CLASSIFIED %} + {{ '${:,.2f}'.format(task_order.clin_02) }} + {% endif %} +

    {{ "task_orders.new.review.clin_3"| translate }}

    {{ '${:,.2f}'.format(task_order.clin_03) }}

    + {{ "task_orders.new.review.clin_4"| translate }} + {% if not config.CLASSIFIED %} +
    {{ "task_orders.new.review.classified_inactive"| translate }}
    + {% endif %} +

    + {% if config.CLASSIFIED %} + {{ '${:,.2f}'.format(task_order.clin_04) }} + {% endif %} +
    -
    +
    + +
    + +

    {{ "task_orders.new.review.oversight"| translate }} {{ TOEditLink(screen=3) }}

    + +
    +
    +

    {{ "task_orders.new.review.ko"| translate }}

    + {{ task_order.ko_first_name }} {{ task_order.ko_last_name }}
    + {{ task_order.ko_email }}
    + {{ task_order.ko_phone_number | usPhone }}
    + {{ "task_orders.new.review.dod_id"| translate }} {{ task_order.ko_dod_id}}
    + {% if task_order.ko_invite %} + {{ Icon('ok', classes='icon--green') }} {{ "task_orders.new.review.invited"| translate }} + {% else %} + {{ Icon('alert', classes='icon--red') }} {{ "task_orders.new.review.not_invited"| translate }} + {% endif %} +
    + +
    +

    {{ "task_orders.new.review.cor"| translate }}

    + {{ task_order.cor_first_name }} {{ task_order.cor_last_name }}
    + {{ task_order.cor_email }}
    + {{ task_order.cor_phone_number | usPhone }}
    + {{ "task_orders.new.review.dod_id"| translate }} {{ task_order.cor_dod_id}}
    + {% if task_order.cor_invite %} + {{ Icon('ok', classes='icon--green') }} {{ "task_orders.new.review.invited"| translate }} + {% else %} + {{ Icon('alert', classes='icon--red') }} {{ "task_orders.new.review.not_invited"| translate }} + {% endif %} +
    +
    +
    +
    +

    {{ "task_orders.new.review.so"| translate }}

    + {{ task_order.so_first_name }} {{ task_order.so_last_name }}
    + {{ task_order.so_email }}
    + {{ task_order.so_phone_number | usPhone }}
    + {{ "task_orders.new.review.dod_id"| translate }} {{ task_order.so_dod_id}}
    + {% if task_order.so_invite %} + {{ Icon('ok', classes='icon--green') }} {{ "task_orders.new.review.invited"| translate }} + {% else %} + {{ Icon('alert', classes='icon--red') }} {{ "task_orders.new.review.not_invited"| translate }} + {% endif %} +
    +
    {% endblock %} {% block next %}
    - +
    {% endblock %} diff --git a/tests/factories.py b/tests/factories.py index 0f37d4e9..b456ee1d 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -388,7 +388,7 @@ class TaskOrderFactory(Base): defense_component = factory.LazyFunction(random_service_branch) app_migration = random_choice(data.APP_MIGRATION) - native_apps = random.choices(["yes", "no", "not_sure"]) + native_apps = random.choice(["yes", "no", "not_sure"]) complexity = [random_choice(data.APPLICATION_COMPLEXITY)] dev_team = [random_choice(data.DEV_TEAM)] team_experience = random_choice(data.TEAM_EXPERIENCE) diff --git a/translations.yaml b/translations.yaml index 64645809..249ab7e3 100644 --- a/translations.yaml +++ b/translations.yaml @@ -169,19 +169,45 @@ forms: scope_label: Cloud Project Scope scope_description: Your team's plan for using the cloud, such as migrating an existing application or creating a prototype. defense_component_label: Department of Defense Component - app_migration_label: App Migration - app_migration_description: Do you plan to migrate existing application(s) to the cloud? + app_migration: + label: App Migration + description: Do you plan to migrate existing application(s) to the cloud? + on_premise: Yes, migrating from an on-premise data center + cloud: Yes, migrating from another cloud provider + both: Yes, migrating from an on-premise data center and another cloud provider + none: Not planning to migrate any applications + not_sure: "Not Sure" native_apps_label: Native Apps native_apps_description: Do you plan to develop application(s) natively in the cloud? - complexity_label: Project Complexity - complexity_description: Which of these describes how complex your team's use of the cloud will be? Select all that apply. + complexity: + label: Project Complexity + description: Which of these describes how complex your team's use of the cloud will be? Select all that apply. + storage: Storage + data_analytics: Data Analytics + conus: CONUS Acess + oconus: OCONUS Access + tactical_edge: Tactical Edge Access + not_sure: Not Sure + other: Other complexity_other_label: Project Complexity Other - dev_team_label: Development Team - dev_team_description: Which people or teams will be completing the development work for your cloud applications? Select all that apply. + dev_team: + label: Development Team + description: Which people or teams will be completing the development work for your cloud applications? Select all that apply. + government_civilians: Government Civilians + military: Military + contractor: Contractor + other: "Other (E.g. University or other partner)" dev_team_other_label: Development Team Other - team_experience_label: Team Experience - team_experience_description: How much experience does your team have with development in the cloud? - performance_length_label: Period of Performance length + team_experience: + label: Team Experience + description: How much experience does your team have with development in the cloud? + none: No previous experience + planned: Researched or planned a cloud build or migration + built_1: Built or Migrated 1-2 applications + built_3: Built or Migrated 3-5 applications + built_many: Built or migrated many applications, or consulted on several such projects + performance_length: + label: Period of Performance length start_date_label: Start Date end_date_label: End Date pdf_label: Upload a copy of your CSP Cost Estimate Research @@ -375,11 +401,42 @@ task_orders: ko_info_title: Contracting Officer (KO) Information ko_info_paragraph: Your KO will need to approve funding for this Task Order by logging into the JEDI Cloud Portal, submitting the Task Order documents within their official system of record, and electronically signing. You might want to work with your program Financial Manager to get your TO documents moving in the right dirction. skip_ko_label: "Skip for now (We'll remind you to enter one later)" - cor_info_title: Contractive Officer Representative (COR) Information + cor_info_title: Contracting Officer Representative (COR) Information cor_info_paragraph: Your COR may assist in submitting the Task Order documents within thier official system of record. They may also be invited to log in an manage the Task Order entry within the JEDI Cloud portal. am_cor_label: I am the Contracting Officer Representative (COR) for this Task Order so_info_title: Security Officer Information - so_info_paragraph: our Security Officer will need to answer some security configuration questions in order to generate a DD-254 document, then electronically sign. + so_info_paragraph: Your Security Officer will need to answer some security configuration questions in order to generate a DD-254 document, then electronically sign. + review: + section_title: Review Your Task Order Info + app_info: What are you building + portfolio: Portfolio + dod: DoD Component + scope: Scope (Statement of Work) + reporting: Reporting + migration: App Migration + native_apps: Native Apps + yes_native: Yes, planning to develop natively in the cloud + no_native: No, not planning to develop natively in the cloud + not_sure_native: Not sure, unsure if planning to develop natively in the cloud + complexity: Project Complexity + team: Development Team + experience: Team Experience + funding: Funding + performance_period: Period of Performance length + usage_est_link: View Usage Estimate + to_value: Task Order Value + clin_1: 'CLIN #1: Unclassified Cloud' + clin_2: 'CLIN #2: Classified Cloud' + clin_3: 'CLIN #3: Unclassified Cloud' + clin_4: 'CLIN $4: Classified Cloud' + classified_inactive: (Available Soon) + oversight: Oversight + ko: Contracting Officer (KO) + cor: Contracting Officer Representative (COR) + so: IA Security Officer + dod_id: 'DoD ID:' + invited: Invited + not_invited: Not Yet Invited testing: example_string: Hello World example_with_variables: 'Hello, {name}!'