From 682b2d34a75278e43bdd161ad6a167f3b6b7dcca Mon Sep 17 00:00:00 2001
From: ericiwamoto <100735505+ericiwamoto@users.noreply.github.com>
Date: Mon, 23 Dec 2024 08:05:18 -0800
Subject: [PATCH 1/6] Fix docker
---
QUICKSTART.md | 4 +-
client/.dockerignore | 9 ++-
client/Dockerfile | 9 +--
data/data-pipeline/.dockerignore | 17 ++++++
data/data-pipeline/Dockerfile | 51 ++++++++++-------
.../data_pipeline/application.py | 55 ++++++++++++++-----
.../data/tribal/geojson/__init__.py | 0
.../etl/sources/tribal/etl_utils.py | 6 +-
data/data-pipeline/data_pipeline/utils.py | 1 +
docker-compose.yml | 13 ++---
10 files changed, 111 insertions(+), 54 deletions(-)
create mode 100644 data/data-pipeline/.dockerignore
delete mode 100644 data/data-pipeline/data_pipeline/data/tribal/geojson/__init__.py
diff --git a/QUICKSTART.md b/QUICKSTART.md
index ca7e5c5c..12cbc154 100644
--- a/QUICKSTART.md
+++ b/QUICKSTART.md
@@ -14,10 +14,10 @@ Install [`docker`](https://docs.docker.com/get-docker/). See [Install Docker](IN
> _Important_: To be able to run the entire application, you may need to increase the memory allocated for docker to at least 8096 MB. See [this post](https://stackoverflow.com/a/44533437) for more details.
-Use `docker-compose` to run the application:
+Use `docker compose` to run the application:
```sh
-$ docker-compose up
+$ docker compose up
```
> Note: This may take a while – possibly even an hour or two – since it has to build the containers and then download and process all the data.
diff --git a/client/.dockerignore b/client/.dockerignore
index b512c09d..c9713701 100644
--- a/client/.dockerignore
+++ b/client/.dockerignore
@@ -1 +1,8 @@
-node_modules
\ No newline at end of file
+.git
+.gitignore
+*Dockerfile*
+*docker-compose*
+.cache
+public
+node_modules
+npm-debug.log
\ No newline at end of file
diff --git a/client/Dockerfile b/client/Dockerfile
index 71c6024e..8ae0f912 100644
--- a/client/Dockerfile
+++ b/client/Dockerfile
@@ -4,17 +4,14 @@ FROM node:14
# this working directory
WORKDIR /client
-# Copy the package.json and package_lock.json files from local to the docker image / container
-COPY package*.json ./
-
-# install all packages as a layer in the docker image / container
-RUN npm install
-
# copy all local files from the working directory to the docker image/container however we must use
# dockerignore to ignore node_modules so that the image can use what what was just installed from the above
# step.
COPY . .
+# install all packages as a layer in the docker image / container
+RUN npm ci
+
ENV PORT=6000
EXPOSE 6000
diff --git a/data/data-pipeline/.dockerignore b/data/data-pipeline/.dockerignore
new file mode 100644
index 00000000..fe68a7b1
--- /dev/null
+++ b/data/data-pipeline/.dockerignore
@@ -0,0 +1,17 @@
+./data_pipeline/data/census/csv/*
+./data_pipeline/data/census/geojson/*
+./data_pipeline/data/census/shp/*
+./data_pipeline/data/dataset/*
+./data_pipeline/data/score/csv/*
+./data_pipeline/data/score/downloadable/*
+./data_pipeline/data/score/geojson/*
+./data_pipeline/data/score/search/*
+./data_pipeline/data/score/shapefile/*
+./data_pipeline/data/score/tiles/*
+./data_pipeline/data/sources/*
+./data_pipeline/data/tmp/*
+./data_pipeline/data/tribal/csv/*
+./data_pipeline/data/tribal/geographic_data/*
+./data_pipeline/data/tribal/geojson/*
+./data_pipeline/data/tribal/tiles/*
+
diff --git a/data/data-pipeline/Dockerfile b/data/data-pipeline/Dockerfile
index 04bbca22..91016639 100644
--- a/data/data-pipeline/Dockerfile
+++ b/data/data-pipeline/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:20.04
+FROM ubuntu:22.04
ENV TZ=America/Los_Angeles
@@ -10,13 +10,13 @@ RUN apt-get update && TZ=America/Los_Angeles DEBIAN_FRONTEND=noninteractive apt-
git \
unzip \
wget \
- python3-dev \
- python3-pip \
- gdal-bin
+ software-properties-common \
+ libsqlite3-dev \
+ zlib1g-dev
-# tippeanoe
+# tippecanoe
+RUN apt-get update
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
-RUN apt-get install -y software-properties-common libsqlite3-dev zlib1g-dev
RUN apt-add-repository -y ppa:git-core/ppa
RUN mkdir -p /tmp/tippecanoe-src && git clone https://github.com/mapbox/tippecanoe.git /tmp/tippecanoe-src
WORKDIR /tmp/tippecanoe-src
@@ -24,26 +24,35 @@ RUN /bin/sh -c make && make install
## gdal
RUN add-apt-repository ppa:ubuntugis/ppa
-RUN apt-get -y install gdal-bin
+RUN apt-get -y install gdal-bin libgdal-dev
+
+# Install python3.10
+RUN add-apt-repository ppa:deadsnakes/ppa
+RUN apt install -y python3.10-dev
+RUN apt install -y python3-pip
+RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1
+RUN update-alternatives --config python3
+
+# Copy all project files into the container
+COPY . /data-pipeline
+WORKDIR /data-pipeline
# Python package installation using poetry. See:
# https://stackoverflow.com/questions/53835198/integrating-python-poetry-with-docker
ENV PYTHONFAULTHANDLER=1 \
- PYTHONUNBUFFERED=1 \
- PYTHONHASHSEED=random \
- PIP_NO_CACHE_DIR=off \
- PIP_DISABLE_PIP_VERSION_CHECK=on \
- PIP_DEFAULT_TIMEOUT=100 \
- POETRY_VERSION=1.1.12
-
-WORKDIR /data-pipeline
-COPY . /data-pipeline
+ PYTHONUNBUFFERED=1 \
+ PYTHONHASHSEED=random \
+ PIP_NO_CACHE_DIR=off \
+ PIP_DISABLE_PIP_VERSION_CHECK=on \
+ PIP_DEFAULT_TIMEOUT=100 \
+ POETRY_VERSION=1.8.4
RUN pip install "poetry==$POETRY_VERSION"
RUN poetry config virtualenvs.create false \
- && poetry config virtualenvs.in-project false \
- && poetry install --no-dev --no-interaction --no-ansi
+ && poetry config virtualenvs.in-project false \
+ && poetry install --only main --no-interaction --no-ansi
+RUN pip install openpyxl
-# Copy all project files into the container
-
-CMD python3 -m data_pipeline.application data-full-run --check -s aws
+# Default behavior is to output the options for "full-run". This prevents the entire pipeline from running unintentionally.
+ENTRYPOINT [ "poetry", "run", "python3", "-m", "data_pipeline.application"]
+CMD ["full-run", "--help"]
\ No newline at end of file
diff --git a/data/data-pipeline/data_pipeline/application.py b/data/data-pipeline/data_pipeline/application.py
index e405d9ec..2dc8d206 100644
--- a/data/data-pipeline/data_pipeline/application.py
+++ b/data/data-pipeline/data_pipeline/application.py
@@ -88,10 +88,11 @@ def data_cleanup():
log_info("Cleaning up all data folders")
census_reset(data_path)
data_folder_cleanup()
- tribal_reset(data_path)
+ downloadable_cleanup()
score_folder_cleanup()
temp_folder_cleanup()
geo_score_folder_cleanup()
+ tribal_reset(data_path)
log_goodbye()
@@ -304,45 +305,67 @@ def data_full_run(check: bool, data_source: str, use_cache: bool):
log_title("Full Run", "Census DL, ETL, Score, Combine, Generate Tiles")
data_path = settings.APP_ROOT / "data"
+ first_run = False
if check:
if not check_first_run():
# check if the data full run has been run before
- log_info("The data full run was already executed")
- sys.exit()
+ first_run = True
+
+ if first_run:
+ log_info("The data full run was already executed")
+ sys.exit()
else:
- # census directories
+ # Directory cleanup
log_info("Cleaning up data folders")
census_reset(data_path)
data_folder_cleanup()
+ downloadable_cleanup()
score_folder_cleanup()
+ geo_score_folder_cleanup()
temp_folder_cleanup()
+ tribal_reset(data_path)
if data_source == "local":
log_info("Downloading census data")
etl_runner("census", use_cache)
- log_info("Running all ETLs")
- etl_runner(use_cache=use_cache)
+ log_info("Running all ETLs")
+ etl_runner(use_cache=True)
+
+ log_info("Running tribal ETL")
+ etl_runner("tribal", use_cache)
+
+ else:
+ log_info("Downloading census data")
+ etl_runner("census", use_cache=False)
+
+ log_info("Running all ETLs")
+ etl_runner(use_cache=False)
+
+ log_info("Running tribal ETL")
+ etl_runner("tribal", use_cache=False)
log_info("Generating score")
score_generate()
log_info("Running post score")
- downloadable_cleanup()
score_post(data_source)
- log_info("Combining score with census GeoJSON")
- score_geo(data_source)
+ log_info("Combining score with census GeoJSON")
+ score_geo(data_source)
- log_info("Generating map tiles")
- generate_tiles(data_path, True)
+ log_info("Generating map tiles")
+ generate_tiles(data_path, False)
- log_info("Completing pipeline")
- file = "first_run.txt"
- cmd = f"touch {data_path}/{file}"
- call(cmd, shell=True)
+ log_info("Generating tribal map tiles")
+ generate_tiles(data_path, True)
+
+ log_info("Completing pipeline")
+ file = "first_run.txt"
+ cmd = f"touch {data_path}/{file}"
+ call(cmd, shell=True)
log_goodbye()
@@ -427,6 +450,7 @@ def full_post_etl(ctx):
ctx.invoke(generate_score_post, data_source=None)
ctx.invoke(geo_score, data_source=None)
ctx.invoke(generate_map_tiles, generate_tribal_layer=False)
+ ctx.invoke(generate_map_tiles, generate_tribal_layer=True)
@cli.command(
@@ -440,6 +464,7 @@ def full_run(ctx, use_cache):
ctx.invoke(data_cleanup)
ctx.invoke(census_data_download, zip_compress=False, use_cache=use_cache)
ctx.invoke(etl_run, dataset=None, use_cache=use_cache)
+ ctx.invoke(etl_run, dataset="tribal", use_cache=use_cache)
ctx.invoke(full_post_etl)
diff --git a/data/data-pipeline/data_pipeline/data/tribal/geojson/__init__.py b/data/data-pipeline/data_pipeline/data/tribal/geojson/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/data/data-pipeline/data_pipeline/etl/sources/tribal/etl_utils.py b/data/data-pipeline/data_pipeline/etl/sources/tribal/etl_utils.py
index ea97db1c..6bbb5b8b 100644
--- a/data/data-pipeline/data_pipeline/etl/sources/tribal/etl_utils.py
+++ b/data/data-pipeline/data_pipeline/etl/sources/tribal/etl_utils.py
@@ -21,5 +21,9 @@ def reset_data_directories(
)
# geojson
- geojson_path = tribal_data_path / "geojson"
+ geojson_path = tribal_data_path / "geographic_data"
remove_all_from_dir(geojson_path)
+
+ # tiles
+ tiles_path = tribal_data_path / "tiles"
+ remove_all_from_dir(tiles_path)
diff --git a/data/data-pipeline/data_pipeline/utils.py b/data/data-pipeline/data_pipeline/utils.py
index fd5ff5d7..8e5fe8fa 100644
--- a/data/data-pipeline/data_pipeline/utils.py
+++ b/data/data-pipeline/data_pipeline/utils.py
@@ -218,6 +218,7 @@ def score_folder_cleanup() -> None:
remove_all_from_dir(data_path / "score" / "geojson")
remove_all_from_dir(data_path / "score" / "tiles")
remove_all_from_dir(data_path / "score" / "shapefile")
+ remove_all_from_dir(data_path / "score" / "search")
downloadable_cleanup()
diff --git a/docker-compose.yml b/docker-compose.yml
index b3f109c7..8af8f990 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,4 +1,3 @@
-version: "3.4"
services:
# The j40_data_pipeline service runs the ETL pipeline to create the score
score:
@@ -15,6 +14,9 @@ services:
ENV_FOR_DYNACONF: development
PYTHONUNBUFFERED: 1
TZ: America/Los_Angeles
+ # The argument (and options) for the scoring step you want to run. Replace "full-run" with "etl-run" or whatever step you want to run
+ # To add arguments follow this example: command: ["generate-map-tiles", "--arg1", "value1", "--arg2", "value2"]
+ command: ["full-run", "--help"]
# The score_server serves the data-pipeline volume as a URL
j40_score_server:
@@ -23,26 +25,21 @@ services:
build: data/data-serve/.
volumes:
- ./data/data-pipeline/data_pipeline/data/score:/data/data-pipeline/data_pipeline/data/score
+ - ./data/data-pipeline/data_pipeline/data/tribal:/data/data-pipeline/data_pipeline/data/tribal
ports:
- 5000:8080
environment:
TZ: America/Los_Angeles
-
#The j40_website service runs the web app / map / site
j40_website:
image: j40_website
container_name: j40_website_1
- build: ./client
+ build: client
environment:
# See the client readme for more info on environment variables:
# https://github.com/usds/justice40-tool/blob/main/client/README.md
DATA_SOURCE: local
-
- # If you want the map to render a MapBox base map (as opposed to the
- # open source one from CartoDB), please create your own API TOKEN from
- # your MapBox account and add the token here:
- MAPBOX_STYLES_READ_TOKEN: ""
TZ: America/Los_Angeles
volumes:
- ./client/src:/client/src
From 7af92f575b99e4c43c481265ad3f2adb930290ec Mon Sep 17 00:00:00 2001
From: ericiwamoto <100735505+ericiwamoto@users.noreply.github.com>
Date: Thu, 26 Dec 2024 08:35:22 -0800
Subject: [PATCH 2/6] Add retry logic to downloader
---
.linkspector.yml | 4 ++++
QUICKSTART.md | 7 +++++--
data/data-pipeline/data_pipeline/etl/downloader.py | 9 +++++++++
data/data-pipeline/pyproject.toml | 1 +
4 files changed, 19 insertions(+), 2 deletions(-)
create mode 100644 .linkspector.yml
diff --git a/.linkspector.yml b/.linkspector.yml
new file mode 100644
index 00000000..0202c8c1
--- /dev/null
+++ b/.linkspector.yml
@@ -0,0 +1,4 @@
+dirs:
+ - .
+ignorePatterns:
+ - pattern: '^http://localhost.*$'
\ No newline at end of file
diff --git a/QUICKSTART.md b/QUICKSTART.md
index 12cbc154..22f953ac 100644
--- a/QUICKSTART.md
+++ b/QUICKSTART.md
@@ -19,7 +19,10 @@ Use `docker compose` to run the application:
```sh
$ docker compose up
```
+Docker compose will spin up three containers: A data pipeline container, a data server, and a web server.
-> Note: This may take a while – possibly even an hour or two – since it has to build the containers and then download and process all the data.
+The data pipeline container can run the entire data pipeline, or any individual step. By default it will simply display the options for the full pipeline run. To have it actually run the pipeline, remove the `, "--help"` from the `[command]` in the `docker-compose.yml` file before launch. Note that it can take an hour or more to run the full pipeline. Furthermore, the data container mounts your local repo directory to read and write files so if you've previously run the pipeline manually on your local system, your score and map tile files will get overwritten.
-After it initializes, you should be able to open the application in your browser at [http://localhost:8000](http://localhost:8000).
+The data server will make the files created by the data pipeline container available to the web server
+
+The web server will run the application website. After it initializes, you should be able to open the web server in your browser at [http://localhost:8000](http://localhost:8000).
\ No newline at end of file
diff --git a/data/data-pipeline/data_pipeline/etl/downloader.py b/data/data-pipeline/data_pipeline/etl/downloader.py
index fd0fec50..4cc4f83e 100644
--- a/data/data-pipeline/data_pipeline/etl/downloader.py
+++ b/data/data-pipeline/data_pipeline/etl/downloader.py
@@ -7,6 +7,7 @@ import shutil
from pathlib import Path
from data_pipeline.config import settings
from data_pipeline.utils import get_module_logger
+from tenacity import retry, stop_after_attempt, wait_exponential
logger = get_module_logger(__name__)
@@ -15,6 +16,10 @@ class Downloader:
"""A simple class to encapsulate the download capabilities of the application"""
@classmethod
+ @retry(
+ stop=stop_after_attempt(3),
+ wait=wait_exponential(multiplier=1, min=4, max=10),
+ )
def download_file_from_url(
cls,
file_url: str,
@@ -58,6 +63,10 @@ class Downloader:
return download_file_name
@classmethod
+ @retry(
+ stop=stop_after_attempt(3),
+ wait=wait_exponential(multiplier=1, min=4, max=10),
+ )
def download_zip_file_from_url(
cls,
file_url: str,
diff --git a/data/data-pipeline/pyproject.toml b/data/data-pipeline/pyproject.toml
index f7122078..47b676dd 100644
--- a/data/data-pipeline/pyproject.toml
+++ b/data/data-pipeline/pyproject.toml
@@ -41,6 +41,7 @@ xlsxwriter = "^2.0.0"
pydantic = "^1.9.0"
Rtree = "^1.0.0"
fiona = "~1.8.21"
+tenacity = ">=5.0.2"
[tool.poetry.group.dev.dependencies]
black = "^21"
From aa7d12b5708ed5d0d8a8dcd98ba553ba2bece423 Mon Sep 17 00:00:00 2001
From: Carlos Felix <63804190+carlosfelix2@users.noreply.github.com>
Date: Fri, 27 Dec 2024 11:19:38 -0500
Subject: [PATCH 3/6] Update to comparator tool to create output folder if it
does not exist
---
data/data-pipeline/data_pipeline/comparator.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/data/data-pipeline/data_pipeline/comparator.py b/data/data-pipeline/data_pipeline/comparator.py
index 97e512c3..4d0cd47f 100644
--- a/data/data-pipeline/data_pipeline/comparator.py
+++ b/data/data-pipeline/data_pipeline/comparator.py
@@ -257,6 +257,7 @@ def _generate_delta(prod_df: pd.DataFrame, local_df: pd.DataFrame):
f" There are {len(comparison_results_df.index):,} tracts with at least one difference.\n"
)
+ WORKING_PATH.mkdir(parents=True, exist_ok=True)
comparison_path = WORKING_PATH / "deltas.csv"
comparison_results_df.to_csv(path_or_buf=comparison_path)
From f14eeab61d07cbb393cffc3bcbd44ffdb6bdbd2f Mon Sep 17 00:00:00 2001
From: Carlos Felix <63804190+carlosfelix2@users.noreply.github.com>
Date: Fri, 27 Dec 2024 11:20:17 -0500
Subject: [PATCH 4/6] Content updates as requested post launch
---
.../datasetContainer.test.tsx.snap | 8 ++-
client/src/data/copy/explore.tsx | 4 +-
client/src/data/copy/faqs.tsx | 4 +-
client/src/data/copy/methodology.tsx | 59 +++----------------
client/src/intl/en.json | 20 +++----
client/src/intl/es.json | 14 ++---
.../freqAskedQuestions.test.tsx.snap | 4 +-
.../__snapshots__/methodology.test.tsx.snap | 14 +++--
8 files changed, 45 insertions(+), 82 deletions(-)
diff --git a/client/src/components/DatasetContainer/tests/__snapshots__/datasetContainer.test.tsx.snap b/client/src/components/DatasetContainer/tests/__snapshots__/datasetContainer.test.tsx.snap
index ca1692bb..d22b249d 100644
--- a/client/src/components/DatasetContainer/tests/__snapshots__/datasetContainer.test.tsx.snap
+++ b/client/src/components/DatasetContainer/tests/__snapshots__/datasetContainer.test.tsx.snap
@@ -978,7 +978,7 @@ exports[`rendering of the DatasetContainer checks if various text fields are vis
rel="noreferrer"
target="_blank"
>
- The Trust for Public Lands
+ The Trust for Public Land
and
diff --git a/client/src/data/copy/explore.tsx b/client/src/data/copy/explore.tsx
index 73eb41d2..615955c8 100644
--- a/client/src/data/copy/explore.tsx
+++ b/client/src/data/copy/explore.tsx
@@ -649,7 +649,7 @@ export const PRIORITIZATION_COPY = {
/>,
PRIO_ISLAND_LI: AND is located in a U.S. Territory.'}
+ defaultMessage={'This tract is considered disadvantaged because it meets the low income threshold AND is in a U.S. Territory that is not included in each of the nationally-consistent datasets on environmental and climate burdens currently used in the tool.'}
description={`Navigate to the explore the map page. Click on tract, The side panel will show This tract is considered disadvantaged. It is an island territory that meets an adjusted low income threshold.`}
values={{
bold: boldFn,
@@ -1411,7 +1411,7 @@ export const LOW_INCOME_TOOLTIP = defineMessages({
},
IMP_YES_POP_NOT_NULL: {
id: 'explore.map.page.side.panel.indicator.low.income.tooltip.IMP_YES_POP_NOT_NULL',
- defaultMessage: `Tracts with missing income data are given estimated incomes based on an average of the incomes of the surrounding tracts.`,
+ defaultMessage: `Tracts with known populations that are missing income data are given estimated incomes based on an average of the incomes in the surrounding tracts.`,
description: 'Hover over the low income icon and it will show Tracts with missing income data are given estimated incomes based on an average of the incomes of the surrounding tracts.',
},
});
diff --git a/client/src/data/copy/faqs.tsx b/client/src/data/copy/faqs.tsx
index 70eaecdd..45533cd5 100644
--- a/client/src/data/copy/faqs.tsx
+++ b/client/src/data/copy/faqs.tsx
@@ -370,7 +370,7 @@ export const FAQ_ANSWERS = {
/>,
Q19: downloads for the current version available. Spreadsheets (.xlxs) and (.csv) contain the tool’s definitions and data. These data can be used for analysis. Shapefiles and GeoJSON files can be uploaded into other mapping programs such as Esri. The downloads include information on how to use the files. Information from previous versions of the tool is available on the previous versions page.`}
+ defaultMessage={ `The Climate and Economic Justice Screening Tool (CEJST) has downloads for the current version available. Spreadsheets (.xlxs) and (.csv) contain the tool’s definitions and data. These data can be used for analysis. Shapefiles and GeoJSON files can be uploaded into other mapping programs such as Esri. The downloads include information on how to use the files (columns.csv). Information from previous versions of the tool is available on the previous versions page.`}
description={ 'Navigate to the FAQs page, this will be an answer, Q19'}
values={{
link1: linkFn(PAGES_ENDPOINTS.DOWNLOADS, true, false),
@@ -401,7 +401,7 @@ export const FAQ_ANSWERS = {
/>,
Q22: ,
};
diff --git a/client/src/data/copy/methodology.tsx b/client/src/data/copy/methodology.tsx
index 2c135105..c7cb3784 100644
--- a/client/src/data/copy/methodology.tsx
+++ b/client/src/data/copy/methodology.tsx
@@ -37,21 +37,21 @@ export const PAGE = defineMessages({
PARA1_BULLET2: {
id: 'methodology.page.paragraph.1.bullet.2',
defaultMessage: `
- If they are on land within the boundaries of Federally Recognized Tribes.
+ If they are on land within the boundaries of Federally Recognized Tribes
`,
description: 'Navigate to the methodology page. This is the methodology paragraph 1, bullet 2',
},
PARA1_BULLET3: {
id: 'methodology.page.paragraph.1.bullet.3',
defaultMessage: `
- For census tracts that were identified as disadvantaged in version 1.0 of the tool, but do not meet the methodology for the 2.0 version: If the census tract ID was identified as disadvantaged in version 1.0, then the census tract is considered disadvantaged.
+ For census tracts that were identified as disadvantaged in version 1.0 of the tool, but do not meet the methodology for the 2.0 version: If the census tract ID was identified as disadvantaged in version 1.0, then the census tract is considered disadvantaged
`,
description: 'Navigate to the methodology page. This is the methodology paragraph 1, bullet 3',
},
PARA1_BULLET4: {
id: 'methodology.page.paragraph.1.bullet.4',
defaultMessage: `
- Additionally, census tracts in certain U.S. Territories are considered disadvantaged if they meet the low income threshold only. This is because these Territories are not included in each of the nationally-consistent datasets on environmental and climate burdens currently used in the tool.
+ Additionally, census tracts in certain U.S. Territories are considered disadvantaged if they meet the low income threshold only. This is because these Territories are not included in each of the nationally-consistent datasets on environmental and climate burdens used in the tool
`,
description: 'Navigate to the methodology page. This is the methodology paragraph 1, bullet 5',
},
@@ -581,7 +581,7 @@ export const RESPONSIBLE_PARTIES = {
GREEN_SPACE: Multi-Resolution Land Characteristics (MRLC) consortium; data analysis provided by The Trust for Public Lands and American Forests
+ Data from Multi-Resolution Land Characteristics (MRLC) consortium; data analysis provided by The Trust for Public Land and American Forests
`}
description={'responsible party text'}
values={{
@@ -1338,7 +1338,7 @@ export const INDICATORS: IIndicators[] = [
description: ,
@@ -1776,10 +1776,12 @@ export const INDICATORS: IIndicators[] = [
id={'methodology.page.category.tribal.lands.note.text'}
defaultMessage={`
Note: The LAR dataset depicts the exterior extent of a Federal Indian land area. Not all Federally Recognized Tribes have a designated land area; therefore, they may not have an associated land area represented in the land area dataset.
+ {linebreak}{linebreak}The Department of the Interior makes no warrant for legal application of this data such as a legal boundary.
`}
description={'Navigate to the Methodology page. This is the note text for low median expectancy'}
values={{
boldtag: boldFn,
+ linebreak: ,
}}
/>,
usedIn: CATEGORIES.TRIBAL_LANDS.METHODOLOGY,
@@ -1791,53 +1793,6 @@ export const INDICATORS: IIndicators[] = [
},
],
},
- // Unused burdens:
- // {
- // domID: 'high-ed-enroll-rate',
- // indicator: ,
- // description: ,
- // usedIn: CATEGORIES.ALL,
- // responsibleParty: RESPONSIBLE_PARTIES.CENSUS,
- // sources: [
- // {
- // source: SOURCE_LINKS.CENSUS_ACS_15_19,
- // availableFor: AVAILABLE_FOR.ALL_US_DC_PR,
- // },
- // ],
- // },
- // {
- // domID: 'median-home',
- // indicator: ,
- // description: ,
- // usedIn: CATEGORIES.AFFORDABLE_HOUSING.METHODOLOGY,
- // responsibleParty: RESPONSIBLE_PARTIES.CENSUS,
- // sources: [
- // {
- // source: SOURCE_LINKS.CENSUS_ACS_15_19,
- // availableFor: AVAILABLE_FOR.ALL_US_DC,
- // },
- // ],
- // },
];
export const RETURN_TO_TOP = {
diff --git a/client/src/intl/en.json b/client/src/intl/en.json
index 9b2894d4..581ef63c 100644
--- a/client/src/intl/en.json
+++ b/client/src/intl/en.json
@@ -816,7 +816,7 @@
"description": "Navigate to the explore the map page. When the map is in view, click on the map. The side panel will show low income"
},
"explore.map.page.side.panel.indicator.low.income.tooltip.IMP_YES_POP_NOT_NULL": {
- "defaultMessage": "Tracts with missing income data are given estimated incomes based on an average of the incomes of the surrounding tracts.",
+ "defaultMessage": "Tracts with known populations that are missing income data are given estimated incomes based on an average of the incomes in the surrounding tracts.",
"description": "Hover over the low income icon and it will show Tracts with missing income data are given estimated incomes based on an average of the incomes of the surrounding tracts."
},
"explore.map.page.side.panel.indicator.low.income.tooltip.IMP_YES_POP_NULL": {
@@ -1132,7 +1132,7 @@
"description": "Navigate to the explore the map page. Click on tract, The side panel will show This tract is considered disadvantaged. This tract is considered disadvantaged because it was identified as disadvantaged in version 1.0 of the tool."
},
"explore.map.page.side.panel.prio.copy.prio.island.li": {
- "defaultMessage": "This tract is considered disadvantaged because it meets the low income threshold AND is located in a U.S. Territory.",
+ "defaultMessage": "This tract is considered disadvantaged because it meets the low income threshold AND is in a U.S. Territory that is not included in each of the nationally-consistent datasets on environmental and climate burdens currently used in the tool.",
"description": "Navigate to the explore the map page. Click on tract, The side panel will show This tract is considered disadvantaged. It is an island territory that meets an adjusted low income threshold."
},
"explore.map.page.side.panel.prio.copy.prio.n.burden": {
@@ -1320,7 +1320,7 @@
"description": "Navigate to the FAQs page, this will be an answer, Q16_P2"
},
"faqs.page.answers.Q19": {
- "defaultMessage": "The Climate and Economic Justice Screening Tool (CEJST) has downloads for the current version available. Spreadsheets (.xlxs) and (.csv) contain the tool’s definitions and data. These data can be used for analysis. Shapefiles and GeoJSON files can be uploaded into other mapping programs such as Esri. The downloads include information on how to use the files. Information from previous versions of the tool is available on the previous versions page.",
+ "defaultMessage": "The Climate and Economic Justice Screening Tool (CEJST) has downloads for the current version available. Spreadsheets (.xlxs) and (.csv) contain the tool’s definitions and data. These data can be used for analysis. Shapefiles and GeoJSON files can be uploaded into other mapping programs such as Esri. The downloads include information on how to use the files (columns.csv). Information from previous versions of the tool is available on the previous versions page.",
"description": "Navigate to the FAQs page, this will be an answer, Q19"
},
"faqs.page.answers.Q1_P1": {
@@ -1344,7 +1344,7 @@
"description": "Navigate to the FAQs page, this will be an answer, Q21"
},
"faqs.page.answers.Q22": {
- "defaultMessage": "Because some nationally-consistent datasets on indicators of environmental or climate burden used in the tool do not currently include data from certain U.S. Territories, tracts in these Territories are considered disadvantaged if they meet the low income threshold only.",
+ "defaultMessage": "Because some nationally-consistent datasets on indicators of environmental or climate burden used in the tool do not currently include data for certain U.S. Territories, tracts in these Territories are considered disadvantaged if they meet the low income threshold only.",
"description": "Navigate to the FAQs page, this will be an answer, Q22"
},
"faqs.page.answers.Q2_P1": {
@@ -1516,7 +1516,7 @@
"description": "responsible party text"
},
"methodology.page.cat.res.part.GREEN_SPACE": {
- "defaultMessage": "Data from Multi-Resolution Land Characteristics (MRLC) consortium; data analysis provided by The Trust for Public Lands and American Forests",
+ "defaultMessage": "Data from Multi-Resolution Land Characteristics (MRLC) consortium; data analysis provided by The Trust for Public Land and American Forests",
"description": "responsible party text"
},
"methodology.page.cat.res.part.HUD": {
@@ -1612,7 +1612,7 @@
"description": "Navigate to the Methodology page. This is the description text for housing burden"
},
"methodology.page.category.lead.paint.description.text": {
- "defaultMessage": "Share of homes built before 1960, which indicates potential lead paint exposure. Tracts with extremely high home values (i.e. median home values above the 90th percentile) that are less likely to face health risks from lead paint exposure are not included.",
+ "defaultMessage": "Share of homes built before 1960, which indicates potential lead paint exposure. Tracts with extremely high home values (i.e., median home values above the 90th percentile) that are less likely to face health risks from lead paint exposure are not included.",
"description": "Navigate to the Methodology page. This is the description text for lead paint"
},
"methodology.page.category.leaky.uwt.description.text": {
@@ -1784,7 +1784,7 @@
"description": "Navigate to the Methodology page. This is the description text for Tribal lands"
},
"methodology.page.category.tribal.lands.note.text": {
- "defaultMessage": "Note: The LAR dataset depicts the exterior extent of a Federal Indian land area. Not all Federally Recognized Tribes have a designated land area; therefore, they may not have an associated land area represented in the land area dataset.",
+ "defaultMessage": "Note: The LAR dataset depicts the exterior extent of a Federal Indian land area. Not all Federally Recognized Tribes have a designated land area; therefore, they may not have an associated land area represented in the land area dataset. {linebreak}{linebreak}The Department of the Interior makes no warrant for legal application of this data such as a legal boundary.",
"description": "Navigate to the Methodology page. This is the note text for low median expectancy"
},
"methodology.page.category.unemploy.description.text": {
@@ -2132,15 +2132,15 @@
"description": "Navigate to the methodology page. This is the methodology paragraph 1, bullet 1"
},
"methodology.page.paragraph.1.bullet.2": {
- "defaultMessage": "If they are on land within the boundaries of Federally Recognized Tribes.",
+ "defaultMessage": "If they are on land within the boundaries of Federally Recognized Tribes",
"description": "Navigate to the methodology page. This is the methodology paragraph 1, bullet 2"
},
"methodology.page.paragraph.1.bullet.3": {
- "defaultMessage": "For census tracts that were identified as disadvantaged in version 1.0 of the tool, but do not meet the methodology for the 2.0 version: If the census tract ID was identified as disadvantaged in version 1.0, then the census tract is considered disadvantaged.",
+ "defaultMessage": "For census tracts that were identified as disadvantaged in version 1.0 of the tool, but do not meet the methodology for the 2.0 version: If the census tract ID was identified as disadvantaged in version 1.0, then the census tract is considered disadvantaged",
"description": "Navigate to the methodology page. This is the methodology paragraph 1, bullet 3"
},
"methodology.page.paragraph.1.bullet.4": {
- "defaultMessage": "Additionally, census tracts in certain U.S. Territories are considered disadvantaged if they meet the low income threshold only. This is because these Territories are not included in each of the nationally-consistent datasets on environmental and climate burdens currently used in the tool.",
+ "defaultMessage": "Additionally, census tracts in certain U.S. Territories are considered disadvantaged if they meet the low income threshold only. This is because these Territories are not included in each of the nationally-consistent datasets on environmental and climate burdens used in the tool",
"description": "Navigate to the methodology page. This is the methodology paragraph 1, bullet 5"
},
"methodology.page.paragraph.2": {
diff --git a/client/src/intl/es.json b/client/src/intl/es.json
index 57114297..53d6a2fd 100644
--- a/client/src/intl/es.json
+++ b/client/src/intl/es.json
@@ -204,7 +204,7 @@
"explore.map.page.side.panel.indicator.lifeExpect": "Baja esperanza de vida",
"explore.map.page.side.panel.indicator.ling.iso": "Aislamiento lingüístico",
"explore.map.page.side.panel.indicator.low.income": "Bajos ingresos",
- "explore.map.page.side.panel.indicator.low.income.tooltip.IMP_YES_POP_NOT_NULL": "Los distritos censales en los que faltan datos sobre ingresos tienen ingresos estimados basados en un promedio de los ingresos de los distritos censales circundantes.",
+ "explore.map.page.side.panel.indicator.low.income.tooltip.IMP_YES_POP_NOT_NULL": "Los distritos censales con conocidas poblaciones que le faltan datos sobre ingresos tienen ingresos estimados basados en un promedio de los ingresos de los distritos censales circundantes.",
"explore.map.page.side.panel.indicator.low.income.tooltip.IMP_YES_POP_NULL": "Los ingresos no se estiman para los distritos censales con poblaciones desconocidas.",
"explore.map.page.side.panel.indicator.low.med.income": "Mediana de bajos ingresos",
"explore.map.page.side.panel.indicator.med.home.val": "Mediana del valor de la vivienda",
@@ -272,7 +272,7 @@
"explore.map.page.side.panel.num.categories.exceeded": "en {numberOfDisCategories, plural, one {# categoría} otras {# categorías}}",
"explore.map.page.side.panel.partial.community.of.focus": "PARCIALMENTE",
"explore.map.page.side.panel.prio.copy.not.prio": "Este distrito censal no se considera desfavorecido. No cumple con ninguno de los umbrales O con al menos un umbral socioeconómico relacionado.",
- "explore.map.page.side.panel.prio.copy.prio.island.li": "Este distrito censal se considera desfavorecido porque cumple con el umbral de bajos ingresos Y está ubicado en un territorio de los EE. UU.",
+ "explore.map.page.side.panel.prio.copy.prio.island.li": "Este distrito censal se considera desfavorecido porque cumple con el umbral de bajos ingresos Y se encuentra en un territorio de EE. UU. que no está incluido en cada uno de los conjuntos de datos consistentes a nivel nacional sobre cargas ambientales y climáticas que se utilizan actualmente en la herramienta.",
"explore.map.page.side.panel.prio.copy.not.prio.n.burden": "Este distrito censal no se considera desfavorecido. Cumple con más de 1 umbral de carga PERO con ningún umbral socioeconómico asociado.",
"explore.map.page.side.panel.prio.copy.not.prio.one.burden": "Este distrito censal no se considera desfavorecido. Cumple con 1 umbral de carga PERO con ningún umbral socioeconómico asociado.",
"explore.map.page.side.panel.prio.copy.not.prio.surr.li": "Este distrito censal no se considera desfavorecido. Está rodeado de distritos censales desfavorecidos PERO no cumple con el umbral ajustado de bajos ingresos. El ajuste no corresponde a ninguna de las categorías.",
@@ -330,7 +330,7 @@
"faqs.page.answers.Q15_P1_4": "El público también puede enviar un correo electrónico a {general_email_address}",
"faqs.page.answers.Q16_P1": "CEQ lanzó una versión beta (o borrador) del CEJST en febrero de 2022 con el apoyo del Servicio Digital de EE. UU. (USDS) y en colaboración con otras agencias y departamentos federales. El CEJST se lanzó en una versión beta para buscar comentarios de agencias federales, naciones tribales, gobiernos estatales y locales, miembros del Congreso, partes interesadas en la justicia ambiental y el público. El período de comentarios públicos de 90 días fue cerrado el 25 de mayo de 2022. CEQ y el USDS organizaron varios entrenamientos públicos sobre la versión beta del CEJST. Todos estos comentarios sobre la versión beta del CEJST ayudaron a informar el lanzamiento de la versión 1.0 del CEJST.",
"faqs.page.answers.Q16_P2": "La versión 1.0 se lanzó en {version1Release}. La versión actual, la versión {currentVersion}, se publicó en {currentVersionRelease}.",
- "faqs.page.answers.Q19": "La Herramienta de evaluación de la justicia climática y económica (CEJST) dispone de descargas. Las planillas de cálculo (.xlxs) y (.csv) contienen definiciones y datos de la herramienta. Estos datos pueden utilizarse para el análisis. Los archivos de forma y GeoJSON pueden cargarse en otros programas cartográficos como Esri. Las descargas incluyen información sobre cómo utilizar los archivos. La información de versiones anteriores de la herramienta está disponible en la página versiones anteriores.",
+ "faqs.page.answers.Q19": "La Herramienta de evaluación de la justicia climática y económica (CEJST) dispone de descargas. Las planillas de cálculo (.xlxs) y (.csv) contienen definiciones y datos de la herramienta. Estos datos pueden utilizarse para el análisis. Los archivos de forma y GeoJSON pueden cargarse en otros programas cartográficos como Esri. Las descargas incluyen información sobre cómo utilizar los archivos (columns.csv). La información de versiones anteriores de la herramienta está disponible en la página versiones anteriores.",
"faqs.page.answers.Q1_P1": "El CEJST es una herramienta de mapeo geoespacial que identifica comunidades desfavorecidas que enfrentan cargas. La herramienta tiene un mapa interactivo y utiliza conjuntos de datos que son indicadores de cargas.",
"faqs.page.answers.Q1_P2": "El público puede encontrar comunidades de interés y proporcionar comentarios al respecto. Estos comentarios se usarán para mejorar la herramienta.",
"faqs.page.answers.Q20_P1": "Los archivos de forma pueden cargarse en otros programas cartográficos como Esri.",
@@ -446,7 +446,7 @@
"methodology.page.category.trans.barrier.description.text": "Costo promedio relativo y tiempo dedicado al transporte en relación con el resto de distritos censales.",
"methodology.page.category.trans.barrier.note.text": "Nota: esta carga sólo se aplica a los distritos censales con una población superior a 20 personas.",
"methodology.page.category.tribal.lands.description.text": "El conjunto de datos de la Representación de área de tierra (LAR) representa las áreas de tierra de los indígenas americanos para las tribus reconocidas a nivel federal.",
- "methodology.page.category.tribal.lands.note.text": "Nota: El conjunto de datos LAR representa la extensión exterior de un área de tierra indígena federal. No todas las tribus reconocidas a nivel federal tienen un área de tierra designada; por lo tanto, es posible que no tengan un área de tierra asociada representada en el conjunto de datos de área de tierra.",
+ "methodology.page.category.tribal.lands.note.text": "Nota: El conjunto de datos LAR representa la extensión exterior de un área de tierra indígena federal. No todas las tribus reconocidas a nivel federal tienen un área de tierra designada; por lo tanto, es posible que no tengan un área de tierra asociada representada en el conjunto de datos de área de tierra.{linebreak}{linebreak}El Departamento del Interior no ofrece ninguna garantía legal por la aplicación de estos datos como un límite legal",
"methodology.page.category.unemploy.description.text": "Número de personas desempleadas como porcentaje de la fuerza laboral",
"methodology.page.category.waste.water.description.text": "El Modelo de los indicadores ambientales para detección del riesgo (RSEI) representa concentraciones tóxicas en segmentos de flujos de agua a menos de 500 metros de distancia, divididos por distancia en kilómetros.",
"methodology.page.category.wildfire.risk.rate.description.text": "Un modelo de 30 metros de resolución que proyecta la exposición a incendios forestales para cualquier ubicación específica en los EE. UU. contiguos, en la actualidad y con el cambio climático futuro. El riesgo de incendio forestal se calcula a partir de entradas asociadas a los combustibles del fuego, el clima, la influencia humana y el movimiento del fuego. El riesgo no tiene en cuenta el valor de la propiedad.",
@@ -534,9 +534,9 @@
"methodology.page.paragraph.1": "La herramienta destaca los distritos censales desfavorecidos de los 50 estados, el Distrito de Columbia y los territorios estadounidenses. Las comunidades se consideran desfavorecidas:",
"methodology.page.paragraph.2": "La herramienta utiliza conjuntos de datos como indicadores de cargas. Las cargas están organizadas en categorías. Una comunidad se destaca como desfavorecida en el mapa CEJST si se encuentra en un distrito censal que está (1) en o por encima del umbral para una o más cargas ambientales, climáticas u otras, y (2) en o por encima del umbral de carga socioeconómica asociada.",
"methodology.page.paragraph.1.bullet.1": "Si se encuentran en un distrito censal que cumple con los umbrales de al menos una de las categorías de carga de la herramienta, o",
- "methodology.page.paragraph.1.bullet.2": "Si están en tierras dentro de los límites de las tribus reconocidas a nivel federal.",
- "methodology.page.paragraph.1.bullet.3": "Para los distritos censales que se identificaron como desfavorecidos en la versión 1.0 de la herramienta, pero que no cumplen con la metodología para la versión 2.0: si el distrito censal se identificó como desfavorecido en la versión 1.0, entonces el distrito censal se considera desfavorecido.",
- "methodology.page.paragraph.1.bullet.4": "Además, los ditritos censales en ciertos territorios de EE. UU. se consideran desfavorecidas si solo alcanzan el umbral de bajos ingresos. Esto se debe a que estos Territorios no están incluidos en cada uno de los conjuntos de datos consistentes a nivel nacional sobre cargas ambientales y climáticas que se utilizan actualmente en la herramienta.",
+ "methodology.page.paragraph.1.bullet.2": "Si están en tierras dentro de los límites de las tribus reconocidas a nivel federal",
+ "methodology.page.paragraph.1.bullet.3": "Para los distritos censales que se identificaron como desfavorecidos en la versión 1.0 de la herramienta, pero que no cumplen con la metodología para la versión 2.0: si el distrito censal se identificó como desfavorecido en la versión 1.0, entonces el distrito censal se considera desfavorecido",
+ "methodology.page.paragraph.1.bullet.4": "Además, los ditritos censales en ciertos territorios de EE. UU. se consideran desfavorecidas si solo alcanzan el umbral de bajos ingresos. Esto se debe a que estos Territorios no están incluidos en cada uno de los conjuntos de datos consistentes a nivel nacional sobre cargas ambientales y climáticas que se utilizan en la herramienta",
"methodology.page.paragraph.3": "La herramienta utiliza conjuntos de datos que son indicadores de cargas. Las cargas se organizan en categorías. Una comunidad se destaca como desfavorecida en el mapa de la CEJST si se encuentra en un distrito censal que está (1) en o por encima del umbral para una o más cargas ambientales, climáticas o de otro tipo, y (2) en o por encima del umbral para una carga socioeconómica asociada.",
"methodology.page.paragraph.4": "Además, también se considera desfavorecido un distrito censal que esté completamente rodeado de comunidades desfavorecidas y se sitúe en el percentil 50 o por encima de él en cuanto a ingresos bajos.",
"methodology.page.paragraph.5": "Las tribus reconocidas a nivel federal, incluidos los pueblos nativos de Alaska, también se consideran comunidades desfavorecidas.",
diff --git a/client/src/pages/tests/__snapshots__/freqAskedQuestions.test.tsx.snap b/client/src/pages/tests/__snapshots__/freqAskedQuestions.test.tsx.snap
index c500596d..128f7c98 100644
--- a/client/src/pages/tests/__snapshots__/freqAskedQuestions.test.tsx.snap
+++ b/client/src/pages/tests/__snapshots__/freqAskedQuestions.test.tsx.snap
@@ -990,7 +990,7 @@ exports[`rendering of the DatasetContainer checks if various text fields are vis
>
downloads
- for the current version available. Spreadsheets (.xlxs) and (.csv) contain the tool’s definitions and data. These data can be used for analysis. Shapefiles and GeoJSON files can be uploaded into other mapping programs such as Esri. The downloads include information on how to use the files. Information from previous versions of the tool is available on the
+ for the current version available. Spreadsheets (.xlxs) and (.csv) contain the tool’s definitions and data. These data can be used for analysis. Shapefiles and GeoJSON files can be uploaded into other mapping programs such as Esri. The downloads include information on how to use the files (columns.csv). Information from previous versions of the tool is available on the