From f84328dec44dea5f815e4725540e56cd10511d81 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Mon, 14 Jan 2019 13:59:54 -0500 Subject: [PATCH 01/19] Update header colors --- styles/elements/_panels.scss | 9 ++++++++- templates/task_orders/_new.html | 6 ++++-- templates/task_orders/new/app_info.html | 8 ++++---- templates/task_orders/new/funding.html | 6 +++--- templates/task_orders/new/oversight.html | 6 +++--- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/styles/elements/_panels.scss b/styles/elements/_panels.scss index 7d1b31d4..f59c9a16 100644 --- a/styles/elements/_panels.scss +++ b/styles/elements/_panels.scss @@ -59,6 +59,13 @@ margin: ($gap * 4) 0; padding: 0 ($gap * 4); } + + h1, h2, h3, h4, h5, h6 { + + &.subheading { + color: $color-gray; + } + } } .panel__heading { @@ -80,7 +87,7 @@ margin: 0; display: inline-block; - .subtitle { + .subtitle, &.gray { color: $color-gray; } } diff --git a/templates/task_orders/_new.html b/templates/task_orders/_new.html index ec860310..5348701a 100644 --- a/templates/task_orders/_new.html +++ b/templates/task_orders/_new.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..963a9ea2 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..652e8d5e 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,7 +36,7 @@


-

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

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) }} From 3010745cf2d76af2e0a925548530162b867473ba Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Mon, 14 Jan 2019 14:02:38 -0500 Subject: [PATCH 02/19] Update app info section --- templates/task_orders/new/review.html | 34 +++++++++++++-------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/templates/task_orders/new/review.html b/templates/task_orders/new/review.html index 3211c438..1bfa764e 100644 --- a/templates/task_orders/new/review.html +++ b/templates/task_orders/new/review.html @@ -5,7 +5,7 @@ {% from "components/icon.html" import Icon %} {% block heading %} - Review & Download + Review Your Task Order Info {% endblock %} {% block form %} @@ -18,24 +18,24 @@ {% endif %} {% endmacro %} -
-

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

-

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

+

What are you building {{ TOEditLink(screen=1) }}

-
-
-

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

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

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

- {{ task_order.budget }} -
+
+
+

Portfolio

+

{{ task_order.portfolio_name or RequiredLabel() }}

-
+ +
+

DoD Component

+

{{ task_order.defense_component or RequiredLabel() }}

+
+
+ +

Scope (Statement of Work)

+

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


From 5ef246fe2ff981a3cc3bf4d8331b3dd0c242b0e5 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Mon, 14 Jan 2019 14:09:47 -0500 Subject: [PATCH 03/19] Update reporting section --- atst/forms/data.py | 43 +++++++--------- atst/forms/task_order.py | 14 ++--- atst/models/task_order.py | 34 ++++++++++++ templates/task_orders/new/review.html | 74 +++++++++++++++------------ translations.yaml | 34 +++++++++--- 5 files changed, 129 insertions(+), 70 deletions(-) diff --git a/atst/forms/data.py b/atst/forms/data.py index 8aeda1e4..e89d9bdd 100644 --- a/atst/forms/data.py +++ b/atst/forms/data.py @@ -1,4 +1,5 @@ from atst.domain.roles import PORTFOLIO_ROLES as PORTFOLIO_ROLE_DEFINITIONS +from atst.utils.localization import translate SERVICE_BRANCHES = [ ("", "Select an option"), @@ -176,24 +177,21 @@ 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"), +PROJECT_COMPLEXITY = [ + ("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 = [ @@ -204,14 +202,11 @@ DEV_TEAM = [ ] 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 = [ diff --git a/atst/forms/task_order.py b/atst/forms/task_order.py index ce33476d..6d654a09 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,9 +50,9 @@ 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"), - choices=APPLICATION_COMPLEXITY, + translate("forms.task_order.complexity.label"), + description=translate("forms.task_order.complexity.description"), + choices=PROJECT_COMPLEXITY, default="", widget=ListWidget(prefix_label=False), option_widget=CheckboxInput(), @@ -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="", ) diff --git a/atst/models/task_order.py b/atst/models/task_order.py index 340be9af..fe3d2752 100644 --- a/atst/models/task_order.py +++ b/atst/models/task_order.py @@ -6,6 +6,7 @@ from sqlalchemy.types import ARRAY from sqlalchemy.orm import relationship from atst.models import Base, types, mixins +from atst.utils.localization import translate class Status(Enum): @@ -102,6 +103,39 @@ class TaskOrder(Base, mixins.TimestampsMixin): def is_pending(self): return self.status == Status.PENDING + @property + def app_migration_description(self): + if self.app_migration: + text = translate( + "forms.task_order.app_migration.{}".format(self.app_migration) + ) + # remove html tags here? + return text + else: + return None + + @property + def native_apps_description(self): + # move all text into translations file! + if self.native_apps == "yes": + return "Yes, planning to develop natively in the cloud" + elif self.native_apps == "no": + return "No, not planning to develop natively in the cloud" + elif self.native_apps == "not_sure": + return "Not sure, unsure if planning to develop natively in the cloud" + else: + return None + + @property + def team_experience_description(self): + if self.team_experience: + return translate( + "forms.task_order.team_experience.{}".format(self.team_experience) + ) + else: + return None + + def to_dictionary(self): return { "portfolio_name": self.portfolio_name, diff --git a/templates/task_orders/new/review.html b/templates/task_orders/new/review.html index 1bfa764e..cb038863 100644 --- a/templates/task_orders/new/review.html +++ b/templates/task_orders/new/review.html @@ -39,42 +39,52 @@
-
-

Generated Documents

+

Reporting {{ TOEditLink(screen=1) }}

-
+ +{% else %} +

{{ RequiredLabel() }}

+{% endif %} + +
+
+

Development Team

+ {% if task_order.dev_team %} +
    + {% for item in task_order.dev_team %} +
  • {{ item.title() }}
  • + {% endfor %} +
+ + {% else %} +

{{ RequiredLabel() }}

+ {% endif %} +
+ +
+

Team Experience

+

{{ task_order.team_experience_description or RequiredLabel() }}

+
+

diff --git a/translations.yaml b/translations.yaml index 987addb9..bf7f0da8 100644 --- a/translations.yaml +++ b/translations.yaml @@ -169,19 +169,39 @@ 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_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 + start_date_label: Start Date end_date_label: End Date pdf_label: Upload a copy of your CSP Cost Estimate Research From cc4d9670a1e3faf5a4ffdf6f522b459ae590ca90 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Mon, 14 Jan 2019 14:12:38 -0500 Subject: [PATCH 04/19] Update funding section --- atst/forms/data.py | 48 +++++++-------- atst/forms/task_order.py | 2 +- atst/models/task_order.py | 9 +++ styles/elements/_panels.scss | 4 ++ styles/elements/_tables.scss | 8 +++ templates/task_orders/new/review.html | 88 ++++++++++----------------- translations.yaml | 27 +++++++- 7 files changed, 104 insertions(+), 82 deletions(-) diff --git a/atst/forms/data.py b/atst/forms/data.py index e89d9bdd..a8a2d978 100644 --- a/atst/forms/data.py +++ b/atst/forms/data.py @@ -210,28 +210,28 @@ TEAM_EXPERIENCE = [ ] 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"), + ("1", translate("forms.task_order.performance_length.1")), + ("2", translate("forms.task_order.performance_length.2")), + ("3", translate("forms.task_order.performance_length.3")), + ("4", translate("forms.task_order.performance_length.4")), + ("5", translate("forms.task_order.performance_length.5")), + ("6", translate("forms.task_order.performance_length.6")), + ("7", translate("forms.task_order.performance_length.7")), + ("8", translate("forms.task_order.performance_length.8")), + ("9", translate("forms.task_order.performance_length.9")), + ("10", translate("forms.task_order.performance_length.10")), + ("11", translate("forms.task_order.performance_length.11")), + ("12", translate("forms.task_order.performance_length.12")), + ("13", translate("forms.task_order.performance_length.13")), + ("14", translate("forms.task_order.performance_length.14")), + ("15", translate("forms.task_order.performance_length.15")), + ("16", translate("forms.task_order.performance_length.16")), + ("17", translate("forms.task_order.performance_length.17")), + ("18", translate("forms.task_order.performance_length.18")), + ("19", translate("forms.task_order.performance_length.19")), + ("20", translate("forms.task_order.performance_length.20")), + ("21", translate("forms.task_order.performance_length.21")), + ("22", translate("forms.task_order.performance_length.22")), + ("23", translate("forms.task_order.performance_length.23")), + ("24", translate("forms.task_order.performance_length.24")), ] diff --git a/atst/forms/task_order.py b/atst/forms/task_order.py index 6d654a09..f4b40de1 100644 --- a/atst/forms/task_order.py +++ b/atst/forms/task_order.py @@ -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/models/task_order.py b/atst/models/task_order.py index fe3d2752..fffab232 100644 --- a/atst/models/task_order.py +++ b/atst/models/task_order.py @@ -135,6 +135,15 @@ class TaskOrder(Base, mixins.TimestampsMixin): else: return None + @property + def performance_length_description(self): + if self.performance_length: + return translate( + "forms.task_order.performance_length.{}".format(self.performance_length) + ) + else: + return None + def to_dictionary(self): return { diff --git a/styles/elements/_panels.scss b/styles/elements/_panels.scss index f59c9a16..9ac51b84 100644 --- a/styles/elements/_panels.scss +++ b/styles/elements/_panels.scss @@ -65,6 +65,10 @@ &.subheading { color: $color-gray; } + + &.inactive { + color: $color-gray-light; + } } } diff --git a/styles/elements/_tables.scss b/styles/elements/_tables.scss index d28e2e42..34a08308 100644 --- a/styles/elements/_tables.scss +++ b/styles/elements/_tables.scss @@ -76,6 +76,14 @@ &:last-child { margin-bottom: 0; } + + &.funding-summary { + tr td { + margin: 0; + padding: 0; + border-bottom: 0; + } + } } } diff --git a/templates/task_orders/new/review.html b/templates/task_orders/new/review.html index cb038863..c47ff865 100644 --- a/templates/task_orders/new/review.html +++ b/templates/task_orders/new/review.html @@ -88,64 +88,40 @@
-
-

Invite Signatories/Collaborators

+

Funding {{ 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? -
-
-
+
+
+

Period of Performance length

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

{{ Icon('download') }} View Usasge Estimate

-
-
-
-
- Security Officer -

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

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

Task Order Value

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

CLIN #1 Unclassified Cloud

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

CLIN #2 Classified Cloud
(Available soon)

CLIN #3 Unclassified Cloud

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

CLIN #4 Classified Cloud
(Available soon)

diff --git a/translations.yaml b/translations.yaml index bf7f0da8..9a039253 100644 --- a/translations.yaml +++ b/translations.yaml @@ -201,7 +201,32 @@ forms: 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 + '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 start_date_label: Start Date end_date_label: End Date pdf_label: Upload a copy of your CSP Cost Estimate Research From 2a1f3576c51440c2f6c48683cb3379aa39848069 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Mon, 14 Jan 2019 17:20:46 -0500 Subject: [PATCH 05/19] Update oversight section --- styles/elements/_icons.scss | 6 +++- styles/elements/_panels.scss | 10 ++++++ templates/task_orders/new/review.html | 48 ++++++++++++++++++++++++++- 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/styles/elements/_icons.scss b/styles/elements/_icons.scss index 3116125c..121b3fe1 100644 --- a/styles/elements/_icons.scss +++ b/styles/elements/_icons.scss @@ -55,7 +55,11 @@ @include icon-size(24); } - &.icon--remove { + &.icon--remove, &.icon--error { @include icon-color($color-red); } + + &.icon--ok { + @include icon-color($color-green) + } } diff --git a/styles/elements/_panels.scss b/styles/elements/_panels.scss index 9ac51b84..e8f2e1e7 100644 --- a/styles/elements/_panels.scss +++ b/styles/elements/_panels.scss @@ -70,6 +70,16 @@ color: $color-gray-light; } } + + .error { + color: $color-red; + font-weight: $font-bold; + } + + .ok { + color: $color-green; + font-weight: $font-bold; + } } .panel__heading { diff --git a/templates/task_orders/new/review.html b/templates/task_orders/new/review.html index c47ff865..a77d01b9 100644 --- a/templates/task_orders/new/review.html +++ b/templates/task_orders/new/review.html @@ -123,7 +123,53 @@
- +
+ +
+ +

Oversight {{ TOEditLink(screen=3) }}

+ +
+
+

Contracting Officer (KO)

+ {{ task_order.ko_first_name }} {{ task_order.ko_last_name }}
+ {{ task_order.ko_email }}
+ {{ task_order.ko_phone_number }}
+ DoD ID: {{ task_order.ko_dod_id}}
+ {% if task_order.ko_invite %} + {{ Icon('ok', classes='icon--ok') }} Invited + {% else %} + {{ Icon('alert', classes='icon--error') }} Not Yet Invited + {% endif %} +
+ +
+

Contracting Officer Representative (COR)

+ {{ task_order.cor_first_name }} {{ task_order.cor_last_name }}
+ {{ task_order.cor_email }}
+ {{ task_order.cor_phone_number }}
+ DoD ID: {{ task_order.cor_dod_id}}
+ {% if task_order.cor_invite %} + {{ Icon('ok', classes='icon--ok') }} Invited + {% else %} + {{ Icon('alert', classes='icon--error') }} Not Yet Invited + {% endif %} +
+
+
+
+

IA Security Officer

+ {{ task_order.so_first_name }} {{ task_order.so_last_name }}
+ {{ task_order.so_email }}
+ {{ task_order.so_phone_number }}
+ DoD ID: {{ task_order.so_dod_id}}
+ {% if task_order.so_invite %} + {{ Icon('ok', classes='icon--ok') }} Invited + {% else %} + {{ Icon('alert', classes='icon--error') }} Not Yet Invited + {% endif %} +
+
{% endblock %} From 39b527dc4d91d72cbad2ffd726fe14e5446b8dc7 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Mon, 14 Jan 2019 18:13:57 -0500 Subject: [PATCH 06/19] Move text to translations file --- atst/models/task_order.py | 11 ++-- templates/task_orders/new/review.html | 86 ++++++++++++++++----------- translations.yaml | 31 ++++++++++ 3 files changed, 87 insertions(+), 41 deletions(-) diff --git a/atst/models/task_order.py b/atst/models/task_order.py index fffab232..a6262e13 100644 --- a/atst/models/task_order.py +++ b/atst/models/task_order.py @@ -116,13 +116,10 @@ class TaskOrder(Base, mixins.TimestampsMixin): @property def native_apps_description(self): - # move all text into translations file! - if self.native_apps == "yes": - return "Yes, planning to develop natively in the cloud" - elif self.native_apps == "no": - return "No, not planning to develop natively in the cloud" - elif self.native_apps == "not_sure": - return "Not sure, unsure if planning to develop natively in the cloud" + if self.native_apps: + return translate( + "task_orders.new.review.{}_native".format(self.native_apps) + ) else: return None diff --git a/templates/task_orders/new/review.html b/templates/task_orders/new/review.html index a77d01b9..e5e89ad3 100644 --- a/templates/task_orders/new/review.html +++ b/templates/task_orders/new/review.html @@ -5,7 +5,7 @@ {% from "components/icon.html" import Icon %} {% block heading %} - Review Your Task Order Info + {{ "task_orders.new.review.section_title"| translate }} {% endblock %} {% block form %} @@ -18,42 +18,42 @@ {% endif %} {% endmacro %} -

What are you building {{ TOEditLink(screen=1) }}

+

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

-

Portfolio

+

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

{{ task_order.portfolio_name or RequiredLabel() }}

-

DoD Component

+

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

{{ task_order.defense_component or RequiredLabel() }}

-

Scope (Statement of Work)

+

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

{{ task_order.scope or RequiredLabel() }}


-

Reporting {{ TOEditLink(screen=1) }}

+

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

-

App Migration

+

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

{{ task_order.app_migration_description or RequiredLabel() }}

-

Native Apps

+

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

{{ task_order.native_apps_description or RequiredLabel() }}

-

Project Complextiy

+

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

{% if task_order.complexity %}
    {% for item in task_order.complexity %} @@ -67,7 +67,7 @@
    -

    Development Team

    +

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

    {% if task_order.dev_team %}
      {% for item in task_order.dev_team %} @@ -81,44 +81,62 @@
    -

    Team Experience

    +

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

    {{ task_order.team_experience_description or RequiredLabel() }}


    -

    Funding {{ TOEditLink(screen=2) }}

    +

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

    -

    Period of Performance length

    +

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

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

    {{ Icon('download') }} View Usasge Estimate

    +

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

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

    Task Order Value

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

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

    CLIN #1 Unclassified Cloud

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

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

    CLIN #2 Classified Cloud
    (Available soon)

    + {{ "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 %} +

    CLIN #3 Unclassified Cloud

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

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

    CLIN #4 Classified Cloud
    (Available soon)

    + {{ "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 %} +
    @@ -127,46 +145,46 @@
    -

    Oversight {{ TOEditLink(screen=3) }}

    +

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

    -

    Contracting Officer (KO)

    +

    {{ "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 }}
    - DoD ID: {{ task_order.ko_dod_id}}
    + {{ "task_orders.new.review.dod_id"| translate }} {{ task_order.ko_dod_id}}
    {% if task_order.ko_invite %} - {{ Icon('ok', classes='icon--ok') }} Invited + {{ Icon('ok', classes='icon--ok') }} {{ "task_orders.new.review.invited"| translate }} {% else %} - {{ Icon('alert', classes='icon--error') }} Not Yet Invited + {{ Icon('alert', classes='icon--error') }} {{ "task_orders.new.review.not_invited"| translate }} {% endif %}
    -

    Contracting Officer Representative (COR)

    +

    {{ "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 }}
    - DoD ID: {{ task_order.cor_dod_id}}
    + {{ "task_orders.new.review.dod_id"| translate }} {{ task_order.cor_dod_id}}
    {% if task_order.cor_invite %} - {{ Icon('ok', classes='icon--ok') }} Invited + {{ Icon('ok', classes='icon--ok') }} {{ "task_orders.new.review.invited"| translate }} {% else %} - {{ Icon('alert', classes='icon--error') }} Not Yet Invited + {{ Icon('alert', classes='icon--error') }} {{ "task_orders.new.review.not_invited"| translate }} {% endif %}
    -

    IA Security Officer

    +

    {{ "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 }}
    - DoD ID: {{ task_order.so_dod_id}}
    + {{ "task_orders.new.review.dod_id"| translate }} {{ task_order.so_dod_id}}
    {% if task_order.so_invite %} - {{ Icon('ok', classes='icon--ok') }} Invited + {{ Icon('ok', classes='icon--ok') }} {{ "task_orders.new.review.invited"| translate }} {% else %} - {{ Icon('alert', classes='icon--error') }} Not Yet Invited + {{ Icon('alert', classes='icon--error') }} {{ "task_orders.new.review.not_invited"| translate }} {% endif %}
    diff --git a/translations.yaml b/translations.yaml index 9a039253..43d298b7 100644 --- a/translations.yaml +++ b/translations.yaml @@ -425,6 +425,37 @@ task_orders: 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. + 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}!' From 94ea47ca9949c445f78f695dd483dbd021c1b99a Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 15 Jan 2019 10:56:37 -0500 Subject: [PATCH 07/19] Add safe to MultiCheckbox macro so we can use text with html tag --- atst/forms/data.py | 2 +- templates/components/multi_checkbox_input.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/atst/forms/data.py b/atst/forms/data.py index a8a2d978..f5ee974d 100644 --- a/atst/forms/data.py +++ b/atst/forms/data.py @@ -198,7 +198,7 @@ DEV_TEAM = [ ("government_civilians", "Government Civilians"), ("military", "Military "), ("contractor", "Contractor "), - ("other", "Other (E.g. University or other partner)"), + ("other", "Other (E.g. University or other partner)"), ] TEAM_EXPERIENCE = [ 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 %} - +
    From dde87569d242dd8f8110ecb1b337015b6d40b9ba Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 15 Jan 2019 10:57:52 -0500 Subject: [PATCH 08/19] Add missing fields to form and fix display of text --- atst/models/task_order.py | 21 +++++++++++++++++++-- templates/task_orders/new/review.html | 12 +++++++----- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/atst/models/task_order.py b/atst/models/task_order.py index a6262e13..6614a6ad 100644 --- a/atst/models/task_order.py +++ b/atst/models/task_order.py @@ -4,6 +4,7 @@ import pendulum from sqlalchemy import Column, Numeric, String, ForeignKey, Date, Integer from sqlalchemy.types import ARRAY from sqlalchemy.orm import relationship +import re from atst.models import Base, types, mixins from atst.utils.localization import translate @@ -103,14 +104,20 @@ class TaskOrder(Base, mixins.TimestampsMixin): def is_pending(self): return self.status == Status.PENDING + @property + def defense_component_description(self): + if self.defense_component: + return self.normalize_order(self.defense_component) + else: + return None + @property def app_migration_description(self): if self.app_migration: text = translate( "forms.task_order.app_migration.{}".format(self.app_migration) ) - # remove html tags here? - return text + return self.remove_html(text) else: return None @@ -152,6 +159,16 @@ class TaskOrder(Base, mixins.TimestampsMixin): }, } + def remove_html(self, text): + html_tags = re.compile("<.*?>") + return re.sub(html_tags, "", text) + + def normalize_order(self, department): + text = department.split(", ") + reordered_text = text[0:-1] + reordered_text.insert(0, text[-1]) + return " ".join(reordered_text) + def __repr__(self): return "".format( self.number, self.budget, self.end_date, self.id diff --git a/templates/task_orders/new/review.html b/templates/task_orders/new/review.html index e5e89ad3..b666a7f1 100644 --- a/templates/task_orders/new/review.html +++ b/templates/task_orders/new/review.html @@ -28,7 +28,7 @@

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

    -

    {{ task_order.defense_component or RequiredLabel() }}

    +

    {{ task_order.defense_component_description or RequiredLabel() }}

    @@ -57,10 +57,11 @@ {% if task_order.complexity %}
      {% for item in task_order.complexity %} -
    • {{ "forms.task_order.complexity.{}".format(item) | translate }}
    • +
    • + {{ "forms.task_order.complexity.{}".format(item) | translate }}{% if item == 'other' %}: {{ task_order.complexity_other }}{% endif %} +
    • {% endfor %}
    - {% else %}

    {{ RequiredLabel() }}

    {% endif %} @@ -71,10 +72,11 @@ {% if task_order.dev_team %}
      {% for item in task_order.dev_team %} -
    • {{ item.title() }}
    • +
    • + {{ item.title() }}{% if item == 'other' %}: {{ task_order.dev_team_other }}{% endif %} +
    • {% endfor %}
    - {% else %}

    {{ RequiredLabel() }}

    {% endif %} From a1760ad4c07e4c8e8f5c807d96d6efe605596608 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 15 Jan 2019 15:03:18 -0500 Subject: [PATCH 09/19] Fixes after rebase --- atst/forms/data.py | 2 +- atst/forms/task_order.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/atst/forms/data.py b/atst/forms/data.py index f5ee974d..779466b5 100644 --- a/atst/forms/data.py +++ b/atst/forms/data.py @@ -184,7 +184,7 @@ APP_MIGRATION = [ ("not_sure", translate("forms.task_order.app_migration.not_sure")), ] -PROJECT_COMPLEXITY = [ +APPLICATION_COMPLEXITY = [ ("storage", translate("forms.task_order.complexity.storage")), ("data_analytics", translate("forms.task_order.complexity.data_analytics")), ("conus", translate("forms.task_order.complexity.conus")), diff --git a/atst/forms/task_order.py b/atst/forms/task_order.py index f4b40de1..9e1af54f 100644 --- a/atst/forms/task_order.py +++ b/atst/forms/task_order.py @@ -52,7 +52,7 @@ class AppInfoForm(CacheableForm): complexity = SelectMultipleField( translate("forms.task_order.complexity.label"), description=translate("forms.task_order.complexity.description"), - choices=PROJECT_COMPLEXITY, + choices=APPLICATION_COMPLEXITY, default="", widget=ListWidget(prefix_label=False), option_widget=CheckboxInput(), From 03e56d6efc633a6763c45e7bcb783102af985b6e Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 15 Jan 2019 15:10:59 -0500 Subject: [PATCH 10/19] Use checkmarks for complexity and dev team lists --- styles/atat.scss | 1 + styles/components/_checklist.scss | 9 +++++++++ templates/task_orders/new/review.html | 8 ++++---- 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 styles/components/_checklist.scss 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/templates/task_orders/new/review.html b/templates/task_orders/new/review.html index b666a7f1..0c72970c 100644 --- a/templates/task_orders/new/review.html +++ b/templates/task_orders/new/review.html @@ -55,10 +55,10 @@

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

    {% if task_order.complexity %} -
      +
        {% for item in task_order.complexity %}
      • - {{ "forms.task_order.complexity.{}".format(item) | translate }}{% if item == 'other' %}: {{ task_order.complexity_other }}{% endif %} + {{ Icon('ok', classes='icon--gray icon--medium') }}{{ "forms.task_order.complexity.{}".format(item) | translate }}{% if item == 'other' %}: {{ task_order.complexity_other }}{% endif %}
      • {% endfor %}
      @@ -70,10 +70,10 @@

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

      {% if task_order.dev_team %} -
        +
          {% for item in task_order.dev_team %}
        • - {{ item.title() }}{% if item == 'other' %}: {{ task_order.dev_team_other }}{% endif %} + {{ Icon('ok', classes='icon--gray icon--medium') }}{{ item.title() }}{% if item == 'other' %}: {{ task_order.dev_team_other }}{% endif %}
        • {% endfor %}
        From 75e831beb63e1cefe3617cca6f32ef3bd5529c2d Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 15 Jan 2019 15:27:05 -0500 Subject: [PATCH 11/19] Display phone number properly --- atst/models/task_order.py | 12 ++++++++++++ templates/task_orders/new/review.html | 6 +++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/atst/models/task_order.py b/atst/models/task_order.py index 6614a6ad..797ff802 100644 --- a/atst/models/task_order.py +++ b/atst/models/task_order.py @@ -8,6 +8,7 @@ import re from atst.models import Base, types, mixins from atst.utils.localization import translate +from atst.filters import usPhone class Status(Enum): @@ -148,6 +149,17 @@ class TaskOrder(Base, mixins.TimestampsMixin): else: return None + @property + def ko_phone(self): + return usPhone(self.ko_phone_number) + + @property + def cor_phone(self): + return usPhone(self.cor_phone_number) + + @property + def so_phone(self): + return usPhone(self.so_phone_number) def to_dictionary(self): return { diff --git a/templates/task_orders/new/review.html b/templates/task_orders/new/review.html index 0c72970c..62240fe1 100644 --- a/templates/task_orders/new/review.html +++ b/templates/task_orders/new/review.html @@ -154,7 +154,7 @@

        {{ "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 }}
        + {{ task_order.ko_phone }}
        {{ "task_orders.new.review.dod_id"| translate }} {{ task_order.ko_dod_id}}
        {% if task_order.ko_invite %} {{ Icon('ok', classes='icon--ok') }} {{ "task_orders.new.review.invited"| translate }} @@ -167,7 +167,7 @@

        {{ "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 }}
        + {{ task_order.cor_phone }}
        {{ "task_orders.new.review.dod_id"| translate }} {{ task_order.cor_dod_id}}
        {% if task_order.cor_invite %} {{ Icon('ok', classes='icon--ok') }} {{ "task_orders.new.review.invited"| translate }} @@ -181,7 +181,7 @@

        {{ "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 }}
        + {{ task_order.so_phone }}
        {{ "task_orders.new.review.dod_id"| translate }} {{ task_order.so_dod_id}}
        {% if task_order.so_invite %} {{ Icon('ok', classes='icon--ok') }} {{ "task_orders.new.review.invited"| translate }} From 08555e543ea23cad60e620279f80b882e7c08c89 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 15 Jan 2019 16:50:39 -0500 Subject: [PATCH 12/19] Fix spacing throught form and move all TO form related styling to task order stylesheet --- styles/elements/_icon_link.scss | 4 ++ styles/elements/_icons.scss | 14 +++++-- styles/elements/_panels.scss | 23 +----------- styles/elements/_tables.scss | 8 ---- styles/sections/_task_order.scss | 37 ++++++++++++++++++ templates/task_orders/_new.html | 4 +- templates/task_orders/new/app_info.html | 2 +- templates/task_orders/new/funding.html | 6 +-- templates/task_orders/new/review.html | 50 ++++++++++++------------- 9 files changed, 84 insertions(+), 64 deletions(-) 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 121b3fe1..5703356d 100644 --- a/styles/elements/_icons.scss +++ b/styles/elements/_icons.scss @@ -55,11 +55,19 @@ @include icon-size(24); } - &.icon--remove, &.icon--error { + &.icon--remove, &.icon--red { @include icon-color($color-red); } - &.icon--ok { - @include icon-color($color-green) + &.icon--green { + @include icon-color($color-green); + } + + &.icon--gray { + @include icon-color($color-gray); + } + + &.icon--medium { + @include icon-size(12); } } diff --git a/styles/elements/_panels.scss b/styles/elements/_panels.scss index e8f2e1e7..7d1b31d4 100644 --- a/styles/elements/_panels.scss +++ b/styles/elements/_panels.scss @@ -59,27 +59,6 @@ margin: ($gap * 4) 0; padding: 0 ($gap * 4); } - - h1, h2, h3, h4, h5, h6 { - - &.subheading { - color: $color-gray; - } - - &.inactive { - color: $color-gray-light; - } - } - - .error { - color: $color-red; - font-weight: $font-bold; - } - - .ok { - color: $color-green; - font-weight: $font-bold; - } } .panel__heading { @@ -101,7 +80,7 @@ margin: 0; display: inline-block; - .subtitle, &.gray { + .subtitle { color: $color-gray; } } diff --git a/styles/elements/_tables.scss b/styles/elements/_tables.scss index 34a08308..d28e2e42 100644 --- a/styles/elements/_tables.scss +++ b/styles/elements/_tables.scss @@ -76,14 +76,6 @@ &:last-child { margin-bottom: 0; } - - &.funding-summary { - tr td { - margin: 0; - padding: 0; - border-bottom: 0; - } - } } } diff --git a/styles/sections/_task_order.scss b/styles/sections/_task_order.scss index c8d12f4f..04b25d9c 100644 --- a/styles/sections/_task_order.scss +++ b/styles/sections/_task_order.scss @@ -162,3 +162,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/task_orders/_new.html b/templates/task_orders/_new.html index 5348701a..0878a2fe 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,7 +19,7 @@
        -

        +

        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 963a9ea2..8223aee9 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 }}

        diff --git a/templates/task_orders/new/funding.html b/templates/task_orders/new/funding.html index 652e8d5e..82417e2c 100644 --- a/templates/task_orders/new/funding.html +++ b/templates/task_orders/new/funding.html @@ -39,12 +39,12 @@

        {{ "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/review.html b/templates/task_orders/new/review.html index 62240fe1..11331577 100644 --- a/templates/task_orders/new/review.html +++ b/templates/task_orders/new/review.html @@ -22,17 +22,17 @@
        -

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

        +

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

        {{ task_order.portfolio_name or RequiredLabel() }}

        -

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

        +

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

        {{ task_order.defense_component_description or RequiredLabel() }}

        -

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

        +

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

        {{ task_order.scope or RequiredLabel() }}

        @@ -43,17 +43,17 @@
        -

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

        +

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

        {{ task_order.app_migration_description or RequiredLabel() }}

        -

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

        +

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

        {{ task_order.native_apps_description or RequiredLabel() }}

        -

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

        +

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

        {% if task_order.complexity %}
          {% for item in task_order.complexity %} @@ -68,7 +68,7 @@
          -

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

          +

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

          {% if task_order.dev_team %}
            {% for item in task_order.dev_team %} @@ -83,7 +83,7 @@
          -

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

          +

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

          {{ task_order.team_experience_description or RequiredLabel() }}

          @@ -94,24 +94,24 @@
          -

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

          +

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

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

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

          +

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

          - +
          - + - - + -

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

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

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

          {{ "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 }}
          @@ -124,11 +124,11 @@

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

          {{ "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 }}
          @@ -151,42 +151,42 @@
          -

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

          +

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

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

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

          +

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

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

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

          +

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

          {{ task_order.so_first_name }} {{ task_order.so_last_name }}
          {{ task_order.so_email }}
          {{ task_order.so_phone }}
          {{ "task_orders.new.review.dod_id"| translate }} {{ task_order.so_dod_id}}
          {% if task_order.so_invite %} - {{ Icon('ok', classes='icon--ok') }} {{ "task_orders.new.review.invited"| translate }} + {{ Icon('ok', classes='icon--green') }} {{ "task_orders.new.review.invited"| translate }} {% else %} - {{ Icon('alert', classes='icon--error') }} {{ "task_orders.new.review.not_invited"| translate }} + {{ Icon('alert', classes='icon--red') }} {{ "task_orders.new.review.not_invited"| translate }} {% endif %}
          @@ -195,7 +195,7 @@ {% block next %}
          - +
          {% endblock %} From 7891432e903eb1ac1ea3d24ae870ca89e08edddc Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 15 Jan 2019 16:53:18 -0500 Subject: [PATCH 13/19] Add dev team options to translations file so they can be used in the to review template --- atst/forms/data.py | 11 +++++++---- atst/forms/task_order.py | 4 ++-- templates/task_orders/new/review.html | 7 ++++++- translations.yaml | 9 +++++++-- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/atst/forms/data.py b/atst/forms/data.py index 779466b5..dbc3d15e 100644 --- a/atst/forms/data.py +++ b/atst/forms/data.py @@ -195,10 +195,13 @@ APPLICATION_COMPLEXITY = [ ] 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 = [ diff --git a/atst/forms/task_order.py b/atst/forms/task_order.py index 9e1af54f..4935702f 100644 --- a/atst/forms/task_order.py +++ b/atst/forms/task_order.py @@ -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), diff --git a/templates/task_orders/new/review.html b/templates/task_orders/new/review.html index 11331577..cad98d48 100644 --- a/templates/task_orders/new/review.html +++ b/templates/task_orders/new/review.html @@ -73,7 +73,12 @@
            {% for item in task_order.dev_team %}
          • - {{ Icon('ok', classes='icon--gray icon--medium') }}{{ item.title() }}{% if item == 'other' %}: {{ task_order.dev_team_other }}{% endif %} + {% 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 %}
          diff --git a/translations.yaml b/translations.yaml index 43d298b7..522d6c4c 100644 --- a/translations.yaml +++ b/translations.yaml @@ -190,8 +190,13 @@ forms: 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 From a66e5eba72b2f1bd10e8cbe7287dc97931ad7338 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Wed, 16 Jan 2019 10:05:38 -0500 Subject: [PATCH 14/19] Move display logic out of the TaskOrder model and into the template --- atst/filters.py | 15 ++++++ atst/models/task_order.py | 69 --------------------------- templates/task_orders/new/review.html | 37 ++++++++++---- 3 files changed, 44 insertions(+), 77 deletions(-) diff --git a/atst/filters.py b/atst/filters.py index d0fe5bf7..4ab582b2 100644 --- a/atst/filters.py +++ b/atst/filters.py @@ -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,8 @@ 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 @contextfilter def translateWithoutCache(context, *kwargs): diff --git a/atst/models/task_order.py b/atst/models/task_order.py index 797ff802..340be9af 100644 --- a/atst/models/task_order.py +++ b/atst/models/task_order.py @@ -4,11 +4,8 @@ import pendulum from sqlalchemy import Column, Numeric, String, ForeignKey, Date, Integer from sqlalchemy.types import ARRAY from sqlalchemy.orm import relationship -import re from atst.models import Base, types, mixins -from atst.utils.localization import translate -from atst.filters import usPhone class Status(Enum): @@ -105,62 +102,6 @@ class TaskOrder(Base, mixins.TimestampsMixin): def is_pending(self): return self.status == Status.PENDING - @property - def defense_component_description(self): - if self.defense_component: - return self.normalize_order(self.defense_component) - else: - return None - - @property - def app_migration_description(self): - if self.app_migration: - text = translate( - "forms.task_order.app_migration.{}".format(self.app_migration) - ) - return self.remove_html(text) - else: - return None - - @property - def native_apps_description(self): - if self.native_apps: - return translate( - "task_orders.new.review.{}_native".format(self.native_apps) - ) - else: - return None - - @property - def team_experience_description(self): - if self.team_experience: - return translate( - "forms.task_order.team_experience.{}".format(self.team_experience) - ) - else: - return None - - @property - def performance_length_description(self): - if self.performance_length: - return translate( - "forms.task_order.performance_length.{}".format(self.performance_length) - ) - else: - return None - - @property - def ko_phone(self): - return usPhone(self.ko_phone_number) - - @property - def cor_phone(self): - return usPhone(self.cor_phone_number) - - @property - def so_phone(self): - return usPhone(self.so_phone_number) - def to_dictionary(self): return { "portfolio_name": self.portfolio_name, @@ -171,16 +112,6 @@ class TaskOrder(Base, mixins.TimestampsMixin): }, } - def remove_html(self, text): - html_tags = re.compile("<.*?>") - return re.sub(html_tags, "", text) - - def normalize_order(self, department): - text = department.split(", ") - reordered_text = text[0:-1] - reordered_text.insert(0, text[-1]) - return " ".join(reordered_text) - def __repr__(self): return "".format( self.number, self.budget, self.end_date, self.id diff --git a/templates/task_orders/new/review.html b/templates/task_orders/new/review.html index cad98d48..49c1954c 100644 --- a/templates/task_orders/new/review.html +++ b/templates/task_orders/new/review.html @@ -18,6 +18,27 @@ {% endif %} {% endmacro %} +{% if task_order.defense_component %} + {% set defense_component_description = task_order.defense_component | normalizeOrder %} +{% endif %} + +{% 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 %} + +{% if task_order.performance_length %} + {% set performance_length_description = "forms.task_order.performance_length.{}".format(task_order.performance_length) | translate %} +{% endif %} + +

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

          @@ -28,7 +49,7 @@

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

          -

          {{ task_order.defense_component_description or RequiredLabel() }}

          +

          {{ defense_component_description or RequiredLabel() }}

          @@ -44,12 +65,12 @@

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

          -

          {{ task_order.app_migration_description or RequiredLabel() }}

          +

          {{ app_migration_description or RequiredLabel() }}

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

          -

          {{ task_order.native_apps_description or RequiredLabel() }}

          +

          {{ native_apps_description or RequiredLabel() }}

          @@ -89,7 +110,7 @@

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

          -

          {{ task_order.team_experience_description or RequiredLabel() }}

          +

          {{ team_experience_description or RequiredLabel() }}

          @@ -100,7 +121,7 @@

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

          - {{ task_order.performance_length_description or RequiredLabel() }} + {{ performance_length_description or RequiredLabel() }}

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

          @@ -159,7 +180,7 @@

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

          {{ task_order.ko_first_name }} {{ task_order.ko_last_name }}
          {{ task_order.ko_email }}
          - {{ task_order.ko_phone }}
          + {{ 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 }} @@ -172,7 +193,7 @@

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

          {{ task_order.cor_first_name }} {{ task_order.cor_last_name }}
          {{ task_order.cor_email }}
          - {{ task_order.cor_phone }}
          + {{ 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 }} @@ -186,7 +207,7 @@

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

          {{ task_order.so_first_name }} {{ task_order.so_last_name }}
          {{ task_order.so_email }}
          - {{ task_order.so_phone }}
          + {{ 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 }} From bf302a8800ad373ceb48d5fb5c5e32bea704b238 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Wed, 16 Jan 2019 11:03:59 -0500 Subject: [PATCH 15/19] Use choice() instead of choices() so a string is returned --- tests/factories.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) From 35636099d21fe47252bfbcabc5d6b80cf6861e0c Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Wed, 16 Jan 2019 11:11:31 -0500 Subject: [PATCH 16/19] Fix typos --- translations.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/translations.yaml b/translations.yaml index 522d6c4c..4704c17c 100644 --- a/translations.yaml +++ b/translations.yaml @@ -425,11 +425,11 @@ 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 From 5289614140a0213de13024df5b27501bb1bd3131 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Wed, 16 Jan 2019 11:33:04 -0500 Subject: [PATCH 17/19] Add id to Reporting/App Info on first form page it can be linked to directly --- templates/task_orders/new/app_info.html | 2 +- templates/task_orders/new/review.html | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/templates/task_orders/new/app_info.html b/templates/task_orders/new/app_info.html index 8223aee9..881cff16 100644 --- a/templates/task_orders/new/app_info.html +++ b/templates/task_orders/new/app_info.html @@ -20,7 +20,7 @@
          -

          {{ "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) }} diff --git a/templates/task_orders/new/review.html b/templates/task_orders/new/review.html index 49c1954c..32646ceb 100644 --- a/templates/task_orders/new/review.html +++ b/templates/task_orders/new/review.html @@ -10,11 +10,11 @@ {% 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 %} @@ -60,7 +60,7 @@
          -

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

          +

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

          From cfecf3d5443ac28ca95279f0dab8ce4619f1559c Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Wed, 16 Jan 2019 14:01:02 -0500 Subject: [PATCH 18/19] Use function to generate list for performance period instead of hard coding all of the text --- atst/filters.py | 2 ++ atst/forms/data.py | 40 +++++++++++---------------- templates/task_orders/new/review.html | 6 +--- translations.yaml | 24 ---------------- 4 files changed, 19 insertions(+), 53 deletions(-) diff --git a/atst/filters.py b/atst/filters.py index 4ab582b2..319a9afd 100644 --- a/atst/filters.py +++ b/atst/filters.py @@ -1,6 +1,7 @@ import re import datetime from atst.utils.localization import translate +from atst.forms.data import translate_duration from flask import current_app as app, render_template from jinja2 import contextfilter from jinja2.exceptions import TemplateNotFound @@ -125,6 +126,7 @@ def register_filters(app): 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 dbc3d15e..0cb029c4 100644 --- a/atst/forms/data.py +++ b/atst/forms/data.py @@ -1,6 +1,21 @@ +import math +from gettext import ngettext + from atst.domain.roles import PORTFOLIO_ROLES as PORTFOLIO_ROLE_DEFINITIONS from atst.utils.localization import translate + +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) + + SERVICE_BRANCHES = [ ("", "Select an option"), ("Air Force, Department of the", "Air Force, Department of the"), @@ -213,28 +228,5 @@ TEAM_EXPERIENCE = [ ] PERIOD_OF_PERFORMANCE_LENGTH = [ - ("1", translate("forms.task_order.performance_length.1")), - ("2", translate("forms.task_order.performance_length.2")), - ("3", translate("forms.task_order.performance_length.3")), - ("4", translate("forms.task_order.performance_length.4")), - ("5", translate("forms.task_order.performance_length.5")), - ("6", translate("forms.task_order.performance_length.6")), - ("7", translate("forms.task_order.performance_length.7")), - ("8", translate("forms.task_order.performance_length.8")), - ("9", translate("forms.task_order.performance_length.9")), - ("10", translate("forms.task_order.performance_length.10")), - ("11", translate("forms.task_order.performance_length.11")), - ("12", translate("forms.task_order.performance_length.12")), - ("13", translate("forms.task_order.performance_length.13")), - ("14", translate("forms.task_order.performance_length.14")), - ("15", translate("forms.task_order.performance_length.15")), - ("16", translate("forms.task_order.performance_length.16")), - ("17", translate("forms.task_order.performance_length.17")), - ("18", translate("forms.task_order.performance_length.18")), - ("19", translate("forms.task_order.performance_length.19")), - ("20", translate("forms.task_order.performance_length.20")), - ("21", translate("forms.task_order.performance_length.21")), - ("22", translate("forms.task_order.performance_length.22")), - ("23", translate("forms.task_order.performance_length.23")), - ("24", translate("forms.task_order.performance_length.24")), + (str(x + 1), translate_duration(x + 1)) for x in range(24) ] diff --git a/templates/task_orders/new/review.html b/templates/task_orders/new/review.html index 32646ceb..929e2910 100644 --- a/templates/task_orders/new/review.html +++ b/templates/task_orders/new/review.html @@ -34,10 +34,6 @@ {% set team_experience_description = "forms.task_order.team_experience.{}".format(task_order.team_experience) | translate %} {% endif %} -{% if task_order.performance_length %} - {% set performance_length_description = "forms.task_order.performance_length.{}".format(task_order.performance_length) | translate %} -{% endif %} -

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

          @@ -121,7 +117,7 @@

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

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

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

          diff --git a/translations.yaml b/translations.yaml index 4704c17c..df13405e 100644 --- a/translations.yaml +++ b/translations.yaml @@ -208,30 +208,6 @@ forms: built_many: Built or migrated many applications, or consulted on several such projects performance_length: label: 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 start_date_label: Start Date end_date_label: End Date pdf_label: Upload a copy of your CSP Cost Estimate Research From 4fa325818cef5e5d4c03dfd86dbc82fd1809cff5 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Wed, 16 Jan 2019 15:38:08 -0500 Subject: [PATCH 19/19] Move translate_duration() into localization file --- atst/filters.py | 3 +-- atst/forms/data.py | 16 +--------------- atst/utils/localization.py | 13 +++++++++++++ 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/atst/filters.py b/atst/filters.py index 319a9afd..524d39bb 100644 --- a/atst/filters.py +++ b/atst/filters.py @@ -1,7 +1,6 @@ import re import datetime -from atst.utils.localization import translate -from atst.forms.data import translate_duration +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 diff --git a/atst/forms/data.py b/atst/forms/data.py index 0cb029c4..3afb2ec7 100644 --- a/atst/forms/data.py +++ b/atst/forms/data.py @@ -1,19 +1,5 @@ -import math -from gettext import ngettext - from atst.domain.roles import PORTFOLIO_ROLES as PORTFOLIO_ROLE_DEFINITIONS -from atst.utils.localization import translate - - -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) +from atst.utils.localization import translate, translate_duration SERVICE_BRANCHES = [ 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)