diff --git a/atst/filters.py b/atst/filters.py index 524d39bb..1c368aee 100644 --- a/atst/filters.py +++ b/atst/filters.py @@ -19,6 +19,14 @@ def dollars(value): return "${:,.0f}".format(numberValue) +def dollarsWithCents(value): + try: + numberValue = float(value) + except ValueError: + numberValue = 0 + return "${:,.2f}".format(numberValue) + + def usPhone(number): phone = re.sub(r"\D", "", number) return "+1 ({}) {} - {}".format(phone[0:3], phone[3:6], phone[6:]) @@ -113,6 +121,7 @@ def normalizeOrder(title): def register_filters(app): app.jinja_env.filters["iconSvg"] = iconSvg app.jinja_env.filters["dollars"] = dollars + app.jinja_env.filters["dollarsWithCents"] = dollarsWithCents app.jinja_env.filters["usPhone"] = usPhone app.jinja_env.filters["readableInteger"] = readableInteger app.jinja_env.filters["getOptionLabel"] = getOptionLabel diff --git a/atst/forms/task_order.py b/atst/forms/task_order.py index e84f5e07..5d1157d6 100644 --- a/atst/forms/task_order.py +++ b/atst/forms/task_order.py @@ -45,8 +45,8 @@ class AppInfoForm(CacheableForm): default="", ) native_apps = RadioField( - translate("forms.task_order.native_apps_label"), - description=translate("forms.task_order.native_apps_description"), + translate("forms.task_order.native_apps.label"), + description=translate("forms.task_order.native_apps.description"), choices=[("yes", "Yes"), ("no", "No"), ("not_sure", "Not Sure")], ) complexity = SelectMultipleField( diff --git a/templates/task_orders/new/review.html b/templates/task_orders/new/review.html index 929e2910..2e47acf1 100644 --- a/templates/task_orders/new/review.html +++ b/templates/task_orders/new/review.html @@ -18,56 +18,57 @@ {% endif %} {% endmacro %} -{% if task_order.defense_component %} - {% set defense_component_description = task_order.defense_component | normalizeOrder %} -{% endif %} +{% macro ReviewField(heading, field, filter=None) %} +
+

{{ heading }}

+ {% if field %} +

{{ field | findFilter(filter) }}

+ {% else %} + {{ RequiredLabel() }} + {% endif %} + {% if caller %} + {{ caller() }} + {% endif %} +
+{% endmacro %} -{% if task_order.app_migration %} - {% set app_migration_description = "forms.task_order.app_migration.{}".format(task_order.app_migration) | translate | removeHtml %} -{% endif %} - -{% 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 %} +{% macro ReviewOfficerInfo(heading, first_name, last_name, email, phone_number, dod_id, invite) %} +
+

{{ heading | translate }}

+ {{ first_name }} {{ last_name }}
+ {{ email }}
+ {% if phone_number %} + {{ phone_number | usPhone }} + {% else %} + {{ RequiredLabel() }} + {% endif %} +
+ {{ "task_orders.new.review.dod_id" | translate }} {{ dod_id}}
+ {% if 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 %} +
+{% endmacro %}

{{ "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() }}

-
+ {{ ReviewField(("task_orders.new.review.portfolio" | translate), task_order.portfolio_name) }} + {{ ReviewField(("task_orders.new.review.dod" | translate), task_order.defense_component, filter="normalizeOrder") }} +
+
+ {{ ReviewField(("task_orders.new.review.scope" | translate), task_order.scope) }}
- -

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

-

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

-

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

-
-

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

-

{{ app_migration_description or RequiredLabel() }}

-
- -
-

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

-

{{ native_apps_description or RequiredLabel() }}

-
+ {{ ReviewField(("forms.task_order.app_migration.label" | translate), ("forms.task_order.app_migration.{}".format(task_order.app_migration) | translate), filter="removeHtml") }} + {{ ReviewField(("forms.task_order.native_apps.label" | translate), ("forms.task_order.native_apps.{}".format(task_order.native_apps))| translate) }}

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

@@ -95,7 +96,6 @@ {% else %} {{ Icon('ok', classes='icon--gray icon--medium') }}{{ "forms.task_order.dev_team.{}".format(item) | translate }} {% endif %} - {% endfor %} @@ -104,10 +104,7 @@ {% endif %} -
-

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

-

{{ team_experience_description or RequiredLabel() }}

-
+ {{ ReviewField(("forms.task_order.team_experience.label" |translate), ("forms.task_order.team_experience.{}".format(task_order.team_experience)) | translate) }}
@@ -115,22 +112,30 @@

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

-
-

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

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

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

-
+ {% call ReviewField(("task_orders.new.review.performance_period" | translate), task_order.performance_length, filter="translateDuration") %} +

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

+ {% endcall %}
- + - + - + - - + +

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

{{ '${:,.2f}'.format(task_order.budget) }} + {% if task_order.budget %} + {{ task_order.budget | dollarsWithCents }} + {% endif %} +

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

{{ '${:,.2f}'.format(task_order.clin_01) }} + {% if task_order.clin_01 %} + {{ task_order.clin_01 | dollarsWithCents }} + {% else %} + {{ RequiredLabel() }} + {% endif %} +

@@ -140,27 +145,33 @@ {% endif %}

- {% if config.CLASSIFIED %} - {{ '${:,.2f}'.format(task_order.clin_02) }} + {% if task_order.clin_02 and config.CLASSIFIED %} + {{ task_order.clin_02 | dollarsWithCents or RequiredLabel() }} {% endif %}

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

{{ '${:,.2f}'.format(task_order.clin_03) }} + {% if task_order.clin_03 %} + {{ task_order.clin_03 | dollarsWithCents or RequiredLabel() }} + {% else %} + {{ RequiredLabel() }} + {% endif %} +

- {{ "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.clin_4"| translate }} + {% if not config.CLASSIFIED %} +
{{ "task_orders.new.review.classified_inactive"| translate }}
+ {% endif %} +

+ {% if task_order.clin_04 and config.CLASSIFIED %} + {{ task_order.clin_04 | dollarsWithCents or RequiredLabel() }} + {% endif %} +
@@ -172,45 +183,11 @@

{{ "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 %} -
+ {{ ReviewOfficerInfo("task_orders.new.review.ko", task_order.ko_first_name, task_order.ko_last_name, task_order.ko_email, task_order.ko_phone_number, task_order.ko_dod_id, task_order.ko_invite) }} + {{ ReviewOfficerInfo("task_orders.new.review.cor", task_order.cor_first_name, task_order.cor_last_name, task_order.cor_email, task_order.cor_phone_number, task_order.cor_dod_id, task_order.cor_invite) }}
-
-

{{ "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 %} -
+ {{ ReviewOfficerInfo("task_orders.new.review.so", task_order.so_first_name, task_order.so_last_name, task_order.so_email, task_order.so_phone_number, task_order.so_dod_id, task_order.so_invite) }}
{% endblock %} @@ -222,5 +199,7 @@ {% endblock %} {% block form_action %} -
+ {% if task_order_id %} + + {% endif %} {% endblock %} diff --git a/translations.yaml b/translations.yaml index 3dd2da51..f7131bc2 100644 --- a/translations.yaml +++ b/translations.yaml @@ -177,8 +177,12 @@ forms: 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? + native_apps: + label: Native Apps + description: Do you plan to develop application(s) natively in the cloud? + 'yes': Yes, planning to develop natively in the cloud + 'no': No, not planning to develop natively in the cloud + not_sure: Not sure, unsure if planning to develop natively in the cloud complexity: label: Project Complexity description: Which of these describes how complex your team's use of the cloud will be? Select all that apply. @@ -414,14 +418,8 @@ task_orders: 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 @@ -429,7 +427,7 @@ task_orders: clin_1: 'CLIN #1: Unclassified Cloud' clin_2: 'CLIN #2: Classified Cloud' clin_3: 'CLIN #3: Unclassified Cloud' - clin_4: 'CLIN $4: Classified Cloud' + clin_4: 'CLIN #4: Classified Cloud' classified_inactive: (Available Soon) oversight: Oversight ko: Contracting Officer (KO)