diff --git a/docs/Security-Compliance/File-Transfer-TDRS/diagram.drawio b/docs/Security-Compliance/File-Transfer-TDRS/diagram.drawio
index 3e678846a..2c22f92dd 100644
--- a/docs/Security-Compliance/File-Transfer-TDRS/diagram.drawio
+++ b/docs/Security-Compliance/File-Transfer-TDRS/diagram.drawio
@@ -1 +1 @@
-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
\ No newline at end of file
+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
\ No newline at end of file
diff --git a/docs/Security-Compliance/File-Transfer-TDRS/diagram.png b/docs/Security-Compliance/File-Transfer-TDRS/diagram.png
index e40b8e67d..476b82d33 100644
Binary files a/docs/Security-Compliance/File-Transfer-TDRS/diagram.png and b/docs/Security-Compliance/File-Transfer-TDRS/diagram.png differ
diff --git a/docs/Security-Compliance/Incidence-Response/Cloudgov-S3-IRP-Oct2023.md b/docs/Security-Compliance/Incidence-Response/Cloudgov-S3-IRP-Oct2023.md
new file mode 100644
index 000000000..3c9425d90
--- /dev/null
+++ b/docs/Security-Compliance/Incidence-Response/Cloudgov-S3-IRP-Oct2023.md
@@ -0,0 +1,197 @@
+# Response Strategy for Cloud.gov Security Incident (Oct 2023)
+
+TDP is hosted in cloud.gov, and our team was recently informed of a security incident that potentially exposed the secret keys that are used to access our AWS S3 buckets, which are used to store raw data files submitted through the system.
+
+While, there's been no indication from cloud.gov or our audit logs of unusual activity on TDP, we were advised to rotate the S3 bucket access keys.
+
+This document captures the steps we followed to respond to this incident, from the point of initial notification to resolution. These steps should be repeated in the event of another incident on platform.
+
+## Summary of the security incident reported by cloud.gov support on 10/17/2023
+
+> Dear cloud.gov customer,
+>
+> We are writing to notify you of an incident involving brokered service credentials on the cloud.gov platform. We do not believe there was any impact to confidentiality, integrity, or availability of your data as a result of this incident, but we are sharing this information with you so your teams can assess the risk and take action as needed.
+>
+> **What happened?**
+On Friday October 16, a cloud.gov engineer found that the cloud.gov S3 broker, which manages the S3 buckets that customers broker using the platform, was printing AWS secret access keys in clear text to its logs. Specifically, whenever a customer created a “binding” between the bucket and one of their applications, the newly created key was written to the broker log and indexed by our log management system.
+>
+> **How has cloud.gov responded?**
+>We have modified the S3 broker to stop printing these credentials and we have removed all log lines containing the keys from our active log indices. However, the log lines will remain in our long-term log archives due to our retention obligations.
+>
+>**What is the scope of the issue?**
+>
+>The relevant code and configuration was introduced more than six years ago. Because of the time span, it is likely that all current and past brokered S3 buckets are affected.
+>
+>**Next steps**
+>Because of the factors listed above, although there was no public compromise of your credentials, we recommend rotating your access keys at this time.
+>
+>You can rotate your keys by un-binding and re-binding your S3 buckets to each bound application. In a terminal, using the cf command line tool:
+
+
+ # list all spaces in your organization
+ cf spaces
+
+ # target a space
+ cf target -s SPACE-NAME
+
+ # list all s3 services in the space and the applications bound to them.
+ cf services | grep s3
+
+ # for each application bound to the service, un-bind it from the service, re-bind it, and restage it.
+ cf unbind-service YOUR-APPLICATION YOUR-SERVICE
+ cf bind-service YOUR-APPLICATION YOUR-SERVICE
+ cf restage YOUR-APPLICATION
+
+
+> Note that re-staging your application may cause downtime.
+> You will also need to delete and recreate any service keys for your S3 services:
+
+
+ # delete and recreate service keys for each service
+ cf delete-service-key SERVICE SERVICE_KEY
+ cf create-service-key SERVICE SERVICE_KEY
+
+
+> **Is my data at risk?**
+Cloud.gov does not believe your data is at risk. The logging system is designed to segregate logs from customer tenant access, and we have no indications of unauthorized access. We are continually monitoring our system and will reach out to your team directly if we detect any suspicious activity.
+>
+>**Why did this happen?**
+>Cloud.gov will hold an incident postmortem in the coming weeks to discuss the root cause of this incident and how similar incidents will be prevented in the future. We will share our findings and corrective actions at that time.
+> Please feel free to reach out to our support team at support@cloud.gov if you have questions or concerns.
+
+> **Update from cloud.gov on 10/31/2023**
+> First, here are some corrections and updates to the original email:
+> * The original email said that the incident occurred on Friday October 16. The correct date is Friday October 13.
+> * The original email said, “[Whenever] a customer created a “binding” between the bucket and one of their applications, the newly created key was written to the broker log”. This is correct but incomplete; credentials were also written to the log when service keys were created, not only when bindings were created. The remediation guidance under “Next steps” includes a section addressing service key rotation and remains the same.
+> * If you are still working on rotating keys that are created by service bindings, please be aware that if you have enough memory in your organization for additional application instances, you can run cf restage APPNAME --strategy rolling to restage your applications without downtime.
+> * Lastly, we have posted a public incident and postmortem to our status page. You can view the write-up here. The cloud.gov team is making several changes to the platform to reduce the likelihood of keys being sent to the logging system, and to reject them from the logging system and alert platform operators if keys are detected in logs.
+
+
+---
+
+## Response Strategy
+
+### 1. User Reporting of Security Incident
+
+The cloud.gov platform team reported the security incident (copied above) to the TDP system owner and government technical monitor (GTM) via e-email on 10-17-2023.
+
+### 2. TANF Data Portal (OFA-Raft) Team Procedures and Reporting
+
+Upon confirming receipt of the reported incident, TDP GTM activated the [secret key incident response communication protocol](https://github.com/HHS/TANF-app/blob/main/docs/Security-Compliance/Incidence-Response/Secret-Key-Mgmt.md/#communication-protocol-if-secret-keys-are-leaked).
+
+On 10-18-2023, TDP GTM and the development team (responding team) met to assess the incident and plan remediation steps. *This information was also shared with the ACF IRT via e-mail on 10-18-2023.*
+
+Please note the following assessment and remediation plan:
+* the access keys were printed out only to the platform’s logs, which only authorized personnel from cloud.gov can see. There was no reported exposure of these keys outside of cloud.gov personnel
+* A [review of historic logs via cloud.gov](https://cloud.gov/docs/deployment/logs/#web-based-logs-with-historic-log-data) for the backend production app (`tdp-backend-prod`) during the time period of the security incident does not show any evidence of unauthorized access to these buckets;
+* Additionally, there is no evidence of any content missing from or added to TDP's S3 buckets.
+* As recommended by cloud.gov platform team, the TDP GTM will be following the guidance above to rotate the access keys. This change will take less than 4 hours; therefore, we do not anticipate needing to activate the TDP contingency plan (which is to be activated when the system will be down for more than 1 day).
+
+### 3. Mitigation steps
+
+The TDP GTM followed the mitigation steps below for the TDP staging and prod environments.
+
+1. Save a backup of env variables for tdp-backend-staging
+ `cf env tdp-backend-staging > backupstaging`
+
+2. Follow steps outlined above to rotate s3 keys in staging (`hhs:main` branch)
+
+ ```
+ # list all spaces in your organization
+ cf spaces
+
+ # output
+ Getting spaces in org hhs-acf-ofa as alexandra.pennington@acf.hhs.gov...
+
+ name
+ tanf-dev
+ tanf-prod
+ tanf-staging
+
+ # target a space
+ cf target -s tanf-staging
+
+ #output
+ API endpoint: https://api.fr.cloud.gov
+ API version: 3.149.0
+ user: alexandra.pennington@acf.hhs.gov
+ org: hhs-acf-ofa
+ space: tanf-staging
+
+
+ # list all s3 services in the space and the applications bound to them.
+ cf services | grep s3
+
+ #output
+ tdp-datafiles-develop s3 basic-sandbox tdp-backend-develop create succeeded s3-broker
+ tdp-datafiles-staging s3 basic-sandbox tdp-backend-develop, tdp-backend-staging create succeeded s3-broker
+ tdp-staticfiles-develop s3 basic-public-sandbox tdp-backend-develop create succeeded s3-broker
+ tdp-staticfiles-staging s3 basic-public-sandbox tdp-backend-develop, tdp-backend-staging create succeeded s3-broker
+ tdp-tf-states s3 basic-sandbox create succeeded s3-broker
+
+ # take frontend down for maintenance to update backend
+ ssh tdp-frontend-staging
+ # commands:
+ cd ~/app/public
+ mv 503_.html 503.html
+ exit
+
+
+ # for each application bound to the service, un-bind it from the service, re-bind it, and restage it.
+ cf unbind-service tdp-backend-staging tdp-staticfiles-staging
+ cf bind-service tdp-backend-staging tdp-staticfiles-staging
+ cf unbind-service tdp-backend-staging tdp-datafiles-staging
+ cf bind-service tdp-backend-staging tdp-datafiles-staging
+ cf restage tdp-backend-staging
+
+ # verify access_key_id and secret_access_key have been rotated for each s3 resource
+ cf env tdp-backend-staging
+
+ # restart frontend
+ cf restart tdp-frontend-staging
+
+ # check for service keys that need to be rotated
+ apennington@HHSLBDSWL73 MINGW64 /
+ $ cf service-keys tdp-staticfiles-staging
+ Getting keys for service instance tdp-staticfiles-staging as alexandra.pennington@acf.hhs.gov...
+ No service key for service instance tdp-staticfiles-staging
+
+ apennington@HHSLBDSWL73 MINGW64 /
+ $ cf service-keys tdp-datafiles-staging
+ Getting keys for service instance tdp-datafiles-staging as alexandra.pennington@acf.hhs.gov...
+
+ name
+ s3-versioning-key
+
+
+ # rotate service-key
+ cf delete-service-key tdp-datafiles-staging s3-versioning-key
+
+ Really delete the service key s3-versioning-key?> y
+ Deleting key s3-versioning-key for service instance tdp-datafiles-staging as alexandra.pennington@acf.hhs.gov...
+ OK
+
+ cf create-service-key tdp-datafiles-staging s3-versioning-key
+ Creating service key s3-versioning-key for service instance tdp-datafiles-staging as alexandra.pennington@acf.hhs.gov...
+ OK
+
+ # verify rotation
+ cf service-key tdp-datafiles-staging s3-versioning-key
+ Getting key s3-versioning-key for service instance tdp-datafiles-staging as alexandra.pennington@acf.hhs.gov...
+
+
+
+ #restage
+ cf restage tdp-backend-staging
+
+ ```
+
+3. test file submission and verify that file is stored in s3 via DAC
+
+4. Follow rotation steps for `tanf-prod` space (`hhs:master` branch). Documentation saved [here](https://hhsgov.sharepoint.com/sites/TANFDataPortalOFA/_layouts/15/Doc.aspx?sourcedoc={cbce2e75-17b2-4e70-b422-60d034fcd4af}&action=edit&wd=target%28Admin%20Notes.one%7C8e533710-461e-4b99-a33c-94e9b67b197e%2FSystem%20admin%20sync%20log%7C47928620-33e4-4cd0-8a3c-0542b83ef9b0%2F%29&wdorigin=NavigationUrl) :lock:
+
+5. Inform team that key rotation steps were completed.
+
+---
+
+
diff --git a/docs/Security-Compliance/Incidence-Response/README.md b/docs/Security-Compliance/Incidence-Response/README.md
index 131b951a4..a62aec2dc 100644
--- a/docs/Security-Compliance/Incidence-Response/README.md
+++ b/docs/Security-Compliance/Incidence-Response/README.md
@@ -6,4 +6,5 @@ This subdirectory contains documentation that describes our protocols for respon
## Table of Contents
* **[Secret Key Management](./Secret-Key-Mgmt.md)** - lays out TDP's standards for minimizing the risk of leaking secret keys (i.e. sensitive information that--if exposed--opens the door for unauthorized access to the system and/or data therein).
* **[System Admin Account Restoration](./Sys-Admin-Acct-Mgmt.md)** - lays out steps for restoring permissions for a TDP sys admin if their account has been compromised.
-* **[CircleCI Secret Key Rotation Tabletop](./CircleCI-IRP.md)** - lays out steps taken in response to CircleCI's security incident in December 2022.
\ No newline at end of file
+* **[CircleCI Secret Key Rotation Tabletop](./CircleCI-IRP.md)** - lays out steps taken in response to CircleCI's security incident in December 2022.
+* **[Cloud.gov S3 Security Incident Response](./Cloudgov-S3-IRP-Oct2023.md)** - lays out steps taken in response to Cloud.gov's security incident in October 2023.
\ No newline at end of file
diff --git a/docs/Security-Compliance/boundary-diagram.md b/docs/Security-Compliance/boundary-diagram.md
index d548a41b0..c1a8de954 100644
--- a/docs/Security-Compliance/boundary-diagram.md
+++ b/docs/Security-Compliance/boundary-diagram.md
@@ -18,7 +18,7 @@ Developers will deploy new code through GitHub, initiating the continuous integr
### User access
-All web users will log into the system through their web browsers.
+All web users will log into the system through their web browsers. An [Nginx server](../../tdrs-frontend/nginx/README.md) sits in front of each frontend application to serve the frontend application as well as act as a reverse proxy which blocks traffic to TDP from outside the US/US territories. For traffic *within* the US/US territories:
- all non-acf users will leverage Login.gov and two factor authentication.
- all ACF users will leverage ACF AMS and authenticate using PIV/CAC. Developers will also have access to the `dev` and `staging` spaces using SSH.
@@ -26,9 +26,9 @@ All users will be required to be approved within the application by an administr
### Access points
-Beyond web-based authentication through ACF AMS or Login.gov, and developer SSH access to the dev Space, CircleCI will also have access to the various environments to support deployments.
+Beyond web-based authentication through ACF AMS or Login.gov, and developer SSH access to the dev Space, CircleCI will also have access to the various environments to support deployments. TDP system administrators will trigger CircleCI-based deployments via GitHub.
-TDP system administrators will trigger CircleCI-based deployments via GitHub.
+Additionally, the [SendGrid E-mail API](../Technical-Documentation/Architecture-Decision-Record/021-sendgrid.md) receives requests from the backend applications in each environment to trigger email notifications for key user activities in TDP: requests for access, admin changes to user accounts (approval, denial, deactivation), and data submissions. SendGrid only has access to TDP user email addresses.
### Configuration
diff --git a/docs/Security-Compliance/diagram.drawio b/docs/Security-Compliance/diagram.drawio
index 8ead466d8..279703124 100644
--- a/docs/Security-Compliance/diagram.drawio
+++ b/docs/Security-Compliance/diagram.drawio
@@ -1,241 +1 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+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
\ No newline at end of file
diff --git a/docs/Security-Compliance/diagram.png b/docs/Security-Compliance/diagram.png
index 306ec5845..859d52b76 100644
Binary files a/docs/Security-Compliance/diagram.png and b/docs/Security-Compliance/diagram.png differ
diff --git a/product-updates/img/ftanf/1.png b/product-updates/img/ftanf/1.png
new file mode 100644
index 000000000..e04d91f2f
Binary files /dev/null and b/product-updates/img/ftanf/1.png differ
diff --git a/product-updates/img/ftanf/2.png b/product-updates/img/ftanf/2.png
new file mode 100644
index 000000000..03c796f77
Binary files /dev/null and b/product-updates/img/ftanf/2.png differ
diff --git a/product-updates/img/ftanf/3.png b/product-updates/img/ftanf/3.png
new file mode 100644
index 000000000..d102c3692
Binary files /dev/null and b/product-updates/img/ftanf/3.png differ
diff --git a/product-updates/img/ftanf/4.png b/product-updates/img/ftanf/4.png
new file mode 100644
index 000000000..180aaa9f7
Binary files /dev/null and b/product-updates/img/ftanf/4.png differ
diff --git a/tdrs-backend/Pipfile b/tdrs-backend/Pipfile
index 89f316b60..0aa6e5b40 100644
--- a/tdrs-backend/Pipfile
+++ b/tdrs-backend/Pipfile
@@ -59,6 +59,7 @@ django-elasticsearch-dsl-drf = "==0.22.5"
requests-aws4auth = "==1.1.2"
cerberus = "==1.3.4"
xlsxwriter = "==3.1.9"
+openpyxl = "==3.1.2"
sendgrid = "==6.10.0"
[requires]
diff --git a/tdrs-backend/Pipfile.lock b/tdrs-backend/Pipfile.lock
index 258f9f234..b813960d6 100644
--- a/tdrs-backend/Pipfile.lock
+++ b/tdrs-backend/Pipfile.lock
@@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
- "sha256": "6e853152cf067206afe522c93538ef6922368a9a69928f16591fd275ede287c1"
+ "sha256": "b5dc98d1853dfbc3fc4cf27e370277bce4b6979094bda1d183b7ce369382e3ce"
},
"pipfile-spec": 6,
"requires": {
@@ -18,11 +18,11 @@
"default": {
"amqp": {
"hashes": [
- "sha256:2c1b13fecc0893e946c65cbd5f36427861cffa4ea2201d8f6fca22e2a373b5e2",
- "sha256:6f0956d2c23d8fa6e7691934d8c3930eadb44972cbbd1a7ae3a520f735d43359"
+ "sha256:827cb12fb0baa892aad844fd95258143bce4027fdac4fccddbc43330fd281637",
+ "sha256:a1ecff425ad063ad42a486c902807d1482311481c8ad95a72694b2975e75f7fd"
],
"markers": "python_version >= '3.6'",
- "version": "==5.1.1"
+ "version": "==5.2.0"
},
"asgiref": {
"hashes": [
@@ -34,44 +34,33 @@
},
"asttokens": {
"hashes": [
- "sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e",
- "sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69"
- ],
- "version": "==2.4.0"
- },
- "backcall": {
- "hashes": [
- "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e",
- "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"
+ "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24",
+ "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"
],
- "version": "==0.2.0"
+ "version": "==2.4.1"
},
"bcrypt": {
"hashes": [
- "sha256:089098effa1bc35dc055366740a067a2fc76987e8ec75349eb9484061c54f535",
- "sha256:08d2947c490093a11416df18043c27abe3921558d2c03e2076ccb28a116cb6d0",
- "sha256:0eaa47d4661c326bfc9d08d16debbc4edf78778e6aaba29c1bc7ce67214d4410",
- "sha256:27d375903ac8261cfe4047f6709d16f7d18d39b1ec92aaf72af989552a650ebd",
- "sha256:2b3ac11cf45161628f1f3733263e63194f22664bf4d0c0f3ab34099c02134665",
- "sha256:2caffdae059e06ac23fce178d31b4a702f2a3264c20bfb5ff541b338194d8fab",
- "sha256:3100851841186c25f127731b9fa11909ab7b1df6fc4b9f8353f4f1fd952fbf71",
- "sha256:5ad4d32a28b80c5fa6671ccfb43676e8c1cc232887759d1cd7b6f56ea4355215",
- "sha256:67a97e1c405b24f19d08890e7ae0c4f7ce1e56a712a016746c8b2d7732d65d4b",
- "sha256:705b2cea8a9ed3d55b4491887ceadb0106acf7c6387699fca771af56b1cdeeda",
- "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9",
- "sha256:a522427293d77e1c29e303fc282e2d71864579527a04ddcfda6d4f8396c6c36a",
- "sha256:ae88eca3024bb34bb3430f964beab71226e761f51b912de5133470b649d82344",
- "sha256:b1023030aec778185a6c16cf70f359cbb6e0c289fd564a7cfa29e727a1c38f8f",
- "sha256:b3b85202d95dd568efcb35b53936c5e3b3600c7cdcc6115ba461df3a8e89f38d",
- "sha256:b57adba8a1444faf784394de3436233728a1ecaeb6e07e8c22c8848f179b893c",
- "sha256:bf4fa8b2ca74381bb5442c089350f09a3f17797829d958fad058d6e44d9eb83c",
- "sha256:ca3204d00d3cb2dfed07f2d74a25f12fc12f73e606fcaa6975d1f7ae69cacbb2",
- "sha256:cbb03eec97496166b704ed663a53680ab57c5084b2fc98ef23291987b525cb7d",
- "sha256:e9a51bbfe7e9802b5f3508687758b564069ba937748ad7b9e890086290d2f79e",
- "sha256:fbdaec13c5105f0c4e5c52614d04f0bca5f5af007910daa8b6b12095edaa67b3"
+ "sha256:12611c4b0a8b1c461646228344784a1089bc0c49975680a2f54f516e71e9b79e",
+ "sha256:12f40f78dcba4aa7d1354d35acf45fae9488862a4fb695c7eeda5ace6aae273f",
+ "sha256:14d41933510717f98aac63378b7956bbe548986e435df173c841d7f2bd0b2de7",
+ "sha256:196008d91201bbb1aa4e666fee5e610face25d532e433a560cabb33bfdff958b",
+ "sha256:24c2ebd287b5b11016f31d506ca1052d068c3f9dc817160628504690376ff050",
+ "sha256:2ade10e8613a3b8446214846d3ddbd56cfe9205a7d64742f0b75458c868f7492",
+ "sha256:2e197534c884336f9020c1f3a8efbaab0aa96fc798068cb2da9c671818b7fbb0",
+ "sha256:3d6c4e0d6963c52f8142cdea428e875042e7ce8c84812d8e5507bd1e42534e07",
+ "sha256:476aa8e8aca554260159d4c7a97d6be529c8e177dbc1d443cb6b471e24e82c74",
+ "sha256:755b9d27abcab678e0b8fb4d0abdebeea1f68dd1183b3f518bad8d31fa77d8be",
+ "sha256:a7a7b8a87e51e5e8ca85b9fdaf3a5dc7aaf123365a09be7a27883d54b9a0c403",
+ "sha256:bab33473f973e8058d1b2df8d6e095d237c49fbf7a02b527541a86a5d1dc4444",
+ "sha256:c6450538a0fc32fb7ce4c6d511448c54c4ff7640b2ed81badf9898dcb9e5b737",
+ "sha256:d573885b637815a7f3a3cd5f87724d7d0822da64b0ab0aa7f7c78bae534e86dc",
+ "sha256:df37f5418d4f1cdcff845f60e747a015389fa4e63703c918330865e06ad80007",
+ "sha256:f33b385c3e80b5a26b3a5e148e6165f873c1c202423570fdf45fe34e00e5f3e5",
+ "sha256:fb931cd004a7ad36a89789caf18a54c20287ec1cd62161265344b9c4554fdb2e"
],
- "markers": "python_version >= '3.6'",
- "version": "==4.0.1"
+ "markers": "python_version >= '3.7'",
+ "version": "==4.1.1"
},
"billiard": {
"hashes": [
@@ -117,11 +106,11 @@
},
"certifi": {
"hashes": [
- "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082",
- "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"
+ "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1",
+ "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"
],
"markers": "python_version >= '3.6'",
- "version": "==2023.7.22"
+ "version": "==2023.11.17"
},
"cffi": {
"hashes": [
@@ -315,10 +304,10 @@
},
"django-colorfield": {
"hashes": [
- "sha256:00ceb5ef55338a0af131c87a13eca3533a327a6206e02a6c2723c059bcd65ea5",
- "sha256:1e862bef9e73308499f366ab61190554fba366aa54d5fb1eba378ed2a04bc93d"
+ "sha256:05c38c8eb2a94938b810a19b2011846391a4ce71d1c92e88a35974fbcc8fc62e",
+ "sha256:460f40e6123b6ae0fb51a4eb86fc258fcdc0ea28f75102b685e8209b1eae9ec3"
],
- "version": "==0.10.1"
+ "version": "==0.11.0"
},
"django-configurations": {
"hashes": [
@@ -467,20 +456,29 @@
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==7.4.1"
},
+ "et-xmlfile": {
+ "hashes": [
+ "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c",
+ "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"
+ ],
+ "markers": "python_version >= '3.6'",
+ "version": "==1.1.0"
+ },
"exceptiongroup": {
"hashes": [
- "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9",
- "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"
+ "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14",
+ "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"
],
"markers": "python_version < '3.11'",
- "version": "==1.1.3"
+ "version": "==1.2.0"
},
"executing": {
"hashes": [
- "sha256:06df6183df67389625f4e763921c6cf978944721abf3e714000200aab95b0657",
- "sha256:0ff053696fdeef426cda5bd18eacd94f82c91f49823a2e9090124212ceea9b08"
+ "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147",
+ "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"
],
- "version": "==2.0.0"
+ "markers": "python_version >= '3.5'",
+ "version": "==2.0.1"
},
"flower": {
"hashes": [
@@ -501,19 +499,19 @@
},
"humanize": {
"hashes": [
- "sha256:8bc9e2bb9315e61ec06bf690151ae35aeb65651ab091266941edf97c90836404",
- "sha256:9783373bf1eec713a770ecaa7c2d7a7902c98398009dfa3d8a2df91eec9311e8"
+ "sha256:582a265c931c683a7e9b8ed9559089dea7edcf6cc95be39a3cbc2c5d5ac2bcfa",
+ "sha256:ce284a76d5b1377fd8836733b983bfb0b76f1aa1c090de2566fcf008d7f6ab16"
],
"markers": "python_version >= '3.8'",
- "version": "==4.8.0"
+ "version": "==4.9.0"
},
"idna": {
"hashes": [
- "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4",
- "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"
+ "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca",
+ "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"
],
"markers": "python_version >= '3'",
- "version": "==3.4"
+ "version": "==3.6"
},
"inflection": {
"hashes": [
@@ -533,11 +531,11 @@
},
"ipython": {
"hashes": [
- "sha256:0852469d4d579d9cd613c220af7bf0c9cc251813e12be647cb9d463939db9b1e",
- "sha256:ad52f58fca8f9f848e256c629eff888efc0528c12fe0f8ec14f33205f23ef938"
+ "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27",
+ "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"
],
"markers": "python_version >= '3.7'",
- "version": "==8.16.1"
+ "version": "==8.18.1"
},
"itypes": {
"hashes": [
@@ -580,11 +578,11 @@
},
"kombu": {
"hashes": [
- "sha256:0ba213f630a2cb2772728aef56ac6883dc3a2f13435e10048f6e97d48506dbbd",
- "sha256:b753c9cfc9b1e976e637a7cbc1a65d446a22e45546cd996ea28f932082b7dc9e"
+ "sha256:0bb2e278644d11dea6272c17974a3dbb9688a949f3bb60aeb5b791329c44fadc",
+ "sha256:63bb093fc9bb80cfb3a0972336a5cec1fa7ac5f9ef7e8237c6bf8dda9469313e"
],
"markers": "python_version >= '3.8'",
- "version": "==5.3.2"
+ "version": "==5.3.4"
},
"markdown": {
"hashes": [
@@ -669,6 +667,15 @@
"markers": "python_version >= '3.5'",
"version": "==0.1.6"
},
+ "openpyxl": {
+ "hashes": [
+ "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184",
+ "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.6'",
+ "version": "==3.1.2"
+ },
"packaging": {
"hashes": [
"sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5",
@@ -695,18 +702,11 @@
},
"pexpect": {
"hashes": [
- "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937",
- "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"
+ "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523",
+ "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"
],
"markers": "sys_platform != 'win32'",
- "version": "==4.8.0"
- },
- "pickleshare": {
- "hashes": [
- "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca",
- "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"
- ],
- "version": "==0.7.5"
+ "version": "==4.9.0"
},
"pillow": {
"hashes": [
@@ -770,19 +770,19 @@
},
"prometheus-client": {
"hashes": [
- "sha256:21e674f39831ae3f8acde238afd9a27a37d0d2fb5a28ea094f0ce25d2cbf2091",
- "sha256:e537f37160f6807b8202a6fc4764cdd19bac5480ddd3e0d463c3002b34462101"
+ "sha256:4585b0d1223148c27a225b10dbec5ae9bc4c81a99a3fa80774fa6209935324e1",
+ "sha256:c88b1e6ecf6b41cd8fb5731c7ae919bf66df6ec6fafa555cd6c0e16ca169ae92"
],
- "markers": "python_version >= '3.6'",
- "version": "==0.17.1"
+ "markers": "python_version >= '3.8'",
+ "version": "==0.19.0"
},
"prompt-toolkit": {
"hashes": [
- "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac",
- "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"
+ "sha256:3b50b5fc50660dc8e39dfe464b170959ad82ff185ffa53bfd3be02222e7156a1",
+ "sha256:bfbf7d6ea9744e4ec94c9a69539e8106c77a2a607d728ded87c9182a4aec39be"
],
"markers": "python_full_version >= '3.7.0'",
- "version": "==3.0.39"
+ "version": "==3.0.42"
},
"psycopg2-binary": {
"hashes": [
@@ -873,11 +873,11 @@
},
"pygments": {
"hashes": [
- "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692",
- "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"
+ "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c",
+ "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"
],
"markers": "python_version >= '3.7'",
- "version": "==2.16.1"
+ "version": "==2.17.2"
},
"pyjwt": {
"hashes": [
@@ -978,36 +978,49 @@
},
"ruamel.yaml": {
"hashes": [
- "sha256:8df81a51384f2e6af73d88bede63ec437df4854a5a74841f40e7622471298457",
- "sha256:ee9a9178a231306d2b260e67ba497c136d4639d58b08775ab67f5fb0f21e73f0"
+ "sha256:61917e3a35a569c1133a8f772e1226961bf5a1198bea7e23f06a0841dea1ab0e",
+ "sha256:a013ac02f99a69cdd6277d9664689eb1acba07069f912823177c5eced21a6ada"
],
- "markers": "python_version >= '3'",
- "version": "==0.17.39"
+ "markers": "python_version >= '3.7'",
+ "version": "==0.18.5"
},
"ruamel.yaml.clib": {
"hashes": [
+ "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d",
"sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001",
"sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462",
+ "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9",
+ "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe",
+ "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b",
+ "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b",
"sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615",
+ "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62",
"sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15",
"sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b",
+ "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1",
+ "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9",
"sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675",
- "sha256:3fcc54cb0c8b811ff66082de1680b4b14cf8a81dce0d4fbf665c2265a81e07a1",
+ "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899",
+ "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7",
"sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7",
"sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312",
- "sha256:665f58bfd29b167039f714c6998178d27ccd83984084c286110ef26b230f259f",
+ "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa",
"sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91",
- "sha256:7048c338b6c86627afb27faecf418768acb6331fc24cfa56c93e8c9780f815fa",
"sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b",
+ "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6",
"sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3",
+ "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334",
"sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5",
+ "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3",
"sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe",
- "sha256:9eb5dee2772b0f704ca2e45b1713e4e5198c18f515b52743576d196348f374d3",
+ "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c",
"sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed",
"sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337",
+ "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880",
+ "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f",
+ "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d",
"sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248",
"sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d",
- "sha256:b5edda50e5e9e15e54a6a8a0070302b00c518a9d32accc2346ad6c984aacd279",
"sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf",
"sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512",
"sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069",
@@ -1016,8 +1029,9 @@
"sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d",
"sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31",
"sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92",
- "sha256:d92f81886165cb14d7b067ef37e142256f1c6a90a65cd156b063a43da1708cfd",
"sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5",
+ "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28",
+ "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d",
"sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1",
"sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2",
"sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875",
@@ -1045,11 +1059,11 @@
},
"setuptools": {
"hashes": [
- "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87",
- "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"
+ "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2",
+ "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6"
],
"markers": "python_version >= '3.8'",
- "version": "==68.2.2"
+ "version": "==69.0.2"
},
"six": {
"hashes": [
@@ -1090,36 +1104,36 @@
},
"tornado": {
"hashes": [
- "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f",
- "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5",
- "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d",
- "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3",
- "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2",
- "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a",
- "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16",
- "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a",
- "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17",
- "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0",
- "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"
+ "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0",
+ "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63",
+ "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263",
+ "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052",
+ "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f",
+ "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee",
+ "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78",
+ "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579",
+ "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212",
+ "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e",
+ "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"
],
"markers": "python_version >= '3.8'",
- "version": "==6.3.3"
+ "version": "==6.4"
},
"traitlets": {
"hashes": [
- "sha256:7564b5bf8d38c40fa45498072bf4dc5e8346eb087bbf1e2ae2d8774f6a0f078e",
- "sha256:98277f247f18b2c5cabaf4af369187754f4fb0e85911d473f72329db8a7f4fae"
+ "sha256:f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33",
+ "sha256:fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772"
],
"markers": "python_version >= '3.8'",
- "version": "==5.11.2"
+ "version": "==5.14.0"
},
"typing-extensions": {
"hashes": [
- "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0",
- "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"
+ "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783",
+ "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"
],
"markers": "python_version < '3.11'",
- "version": "==4.8.0"
+ "version": "==4.9.0"
},
"uritemplate": {
"hashes": [
@@ -1139,11 +1153,11 @@
},
"vine": {
"hashes": [
- "sha256:4c9dceab6f76ed92105027c49c823800dd33cacce13bdedc5b914e3514b7fb30",
- "sha256:7d3b1624a953da82ef63462013bbd271d3eb75751489f9807598e8f340bd637e"
+ "sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc",
+ "sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0"
],
"markers": "python_version >= '3.6'",
- "version": "==5.0.0"
+ "version": "==5.1.0"
},
"wait-for-it": {
"hashes": [
@@ -1156,91 +1170,86 @@
},
"wcwidth": {
"hashes": [
- "sha256:77f719e01648ed600dfa5402c347481c0992263b81a027344f3e1ba25493a704",
- "sha256:8705c569999ffbb4f6a87c6d1b80f324bd6db952f5eb0b95bc07517f4c1813d4"
+ "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02",
+ "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c"
],
- "version": "==0.2.8"
+ "version": "==0.2.12"
},
"wrapt": {
"hashes": [
- "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0",
- "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420",
- "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a",
- "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c",
- "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079",
- "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923",
- "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f",
- "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1",
- "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8",
- "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86",
- "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0",
- "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364",
- "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e",
- "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c",
- "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e",
- "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c",
- "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727",
- "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff",
- "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e",
- "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29",
- "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7",
- "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72",
- "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475",
- "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a",
- "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317",
- "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2",
- "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd",
- "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640",
- "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98",
- "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248",
- "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e",
- "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d",
- "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec",
- "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1",
- "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e",
- "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9",
- "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92",
- "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb",
- "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094",
- "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46",
- "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29",
- "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd",
- "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705",
- "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8",
- "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975",
- "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb",
- "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e",
- "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b",
- "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418",
- "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019",
- "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1",
- "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba",
- "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6",
- "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2",
- "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3",
- "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7",
- "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752",
- "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416",
- "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f",
- "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1",
- "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc",
- "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145",
- "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee",
- "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a",
- "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7",
- "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b",
- "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653",
- "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0",
- "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90",
- "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29",
- "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6",
- "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034",
- "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09",
- "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559",
- "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"
+ "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc",
+ "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81",
+ "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09",
+ "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e",
+ "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca",
+ "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0",
+ "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb",
+ "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487",
+ "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40",
+ "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c",
+ "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060",
+ "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202",
+ "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41",
+ "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9",
+ "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b",
+ "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664",
+ "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d",
+ "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362",
+ "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00",
+ "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc",
+ "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1",
+ "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267",
+ "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956",
+ "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966",
+ "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1",
+ "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228",
+ "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72",
+ "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d",
+ "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292",
+ "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0",
+ "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0",
+ "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36",
+ "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c",
+ "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5",
+ "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f",
+ "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73",
+ "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b",
+ "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2",
+ "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593",
+ "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39",
+ "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389",
+ "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf",
+ "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf",
+ "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89",
+ "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c",
+ "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c",
+ "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f",
+ "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440",
+ "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465",
+ "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136",
+ "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b",
+ "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8",
+ "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3",
+ "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8",
+ "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6",
+ "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e",
+ "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f",
+ "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c",
+ "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e",
+ "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8",
+ "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2",
+ "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020",
+ "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35",
+ "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d",
+ "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3",
+ "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537",
+ "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809",
+ "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d",
+ "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a",
+ "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"
],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==1.15.0"
+ "markers": "python_version >= '3.6'",
+ "version": "==1.16.0"
},
"xlsxwriter": {
"hashes": [
@@ -1374,11 +1383,11 @@
},
"exceptiongroup": {
"hashes": [
- "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9",
- "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"
+ "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14",
+ "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"
],
"markers": "python_version < '3.11'",
- "version": "==1.1.3"
+ "version": "==1.2.0"
},
"factory-boy": {
"hashes": [
@@ -1391,11 +1400,11 @@
},
"faker": {
"hashes": [
- "sha256:a62a3fd3bfa3122d4f57dfa26a1cc37d76751a76c8ddd63cf9d24078c57913a4",
- "sha256:e28090068293c5a83e7f4d636417d45fae1031ca8a8136cc2415549ebc2111e2"
+ "sha256:562a3a09c3ed3a1a7b20e13d79f904dfdfc5e740f72813ecf95e4cf71e5a2f52",
+ "sha256:aeb3e26742863d1e387f9d156f1c36e14af63bf5e6f36fb39b8c27f6a903be38"
],
"markers": "python_version >= '3.8'",
- "version": "==19.11.0"
+ "version": "==20.1.0"
},
"flake8": {
"hashes": [
@@ -1465,9 +1474,9 @@
},
"localstack-client": {
"hashes": [
- "sha256:377ed05e7854eb476dc73b0ab992c433c683bd1026aa84755eaa29f7561757c1"
+ "sha256:8b8b2ee6013265a55d3e312a4513efccd222131bed79395545a4f643704f9213"
],
- "version": "==2.3"
+ "version": "==2.5"
},
"markdown": {
"hashes": [
@@ -1587,11 +1596,11 @@
},
"pyasn1": {
"hashes": [
- "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57",
- "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"
+ "sha256:4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58",
+ "sha256:6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
- "version": "==0.5.0"
+ "version": "==0.5.1"
},
"pycodestyle": {
"hashes": [
@@ -1792,11 +1801,11 @@
},
"typing-extensions": {
"hashes": [
- "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0",
- "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"
+ "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783",
+ "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"
],
"markers": "python_version < '3.11'",
- "version": "==4.8.0"
+ "version": "==4.9.0"
},
"urllib3": {
"hashes": [
diff --git a/tdrs-backend/tdpservice/parsers/models.py b/tdrs-backend/tdpservice/parsers/models.py
index 12c70a2c0..c0c15f4bf 100644
--- a/tdrs-backend/tdpservice/parsers/models.py
+++ b/tdrs-backend/tdpservice/parsers/models.py
@@ -93,7 +93,6 @@ class Status(models.TextChoices):
def get_status(self):
"""Set and return the status field based on errors and models associated with datafile."""
errors = ParserError.objects.filter(file=self.datafile)
- [print(error) for error in errors]
# excluding row-level pre-checks and trailer pre-checks.
precheck_errors = errors.filter(error_type=ParserErrorCategoryChoices.PRE_CHECK)\
diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py
index eebfa9e0c..4dd0a00ec 100644
--- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py
+++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py
@@ -290,8 +290,7 @@
Field(
item="32C",
name='DISABLED_TITLE_XIVAPDT',
- friendly_name="receives aid to the permanently and totally disabled" +
- " under title xiv-apdt of the social security act",
+ friendly_name="received aid under Title XIV-APDT",
type='number',
startIndex=47,
endIndex=48,
@@ -301,7 +300,7 @@
Field(
item="32D",
name='AID_AGED_BLIND',
- friendly_name="receives from the aid to the aged, blind, and disabled program",
+ friendly_name="receives from aid to the aged, blind, and disabled program",
type='number',
startIndex=48,
endIndex=49,
@@ -311,7 +310,7 @@
Field(
item="32E",
name='RECEIVE_SSI',
- friendly_name="receives social security income",
+ friendly_name="receives SSI",
type='number',
startIndex=49,
endIndex=50,
@@ -772,7 +771,7 @@
Field(
item="59C",
name='UNEARNED_SSI',
- friendly_name="unearned ssi benefit",
+ friendly_name="unearned SSI benefit",
type='number',
startIndex=138,
endIndex=142,
diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py
index 19c101687..fb05903f6 100644
--- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py
+++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py
@@ -229,7 +229,7 @@
Field(
item="65A",
name='RECEIVE_NONSSI_BENEFITS',
- friendly_name="receive non-ssi benefits",
+ friendly_name="receive non-SSI benefits",
type='number',
startIndex=44,
endIndex=45,
@@ -239,7 +239,7 @@
Field(
item="65B",
name='RECEIVE_SSI',
- friendly_name="receives ssi",
+ friendly_name="receives SSI",
type='number',
startIndex=45,
endIndex=46,
@@ -294,7 +294,7 @@
Field(
item="70A",
name='UNEARNED_SSI',
- friendly_name="unearned ssi benefit",
+ friendly_name="unearned SSI benefit",
type='number',
startIndex=52,
endIndex=56,
@@ -536,7 +536,7 @@
Field(
item="65A",
name='RECEIVE_NONSSI_BENEFITS',
- friendly_name="receives non-ssi benefit",
+ friendly_name="receives non-SSI benefit",
type='number',
startIndex=85,
endIndex=86,
@@ -601,7 +601,7 @@
Field(
item="70A",
name='UNEARNED_SSI',
- friendly_name="unearned ssi benefit",
+ friendly_name="unearned SSI benefit",
type='number',
startIndex=93,
endIndex=97,
diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m5.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m5.py
index b37ad8bda..a63cd6591 100644
--- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m5.py
+++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m5.py
@@ -272,7 +272,7 @@
Field(
item="18D",
name="REC_AID_AGED_BLIND",
- friendly_name="receives from the aid to the aged, blind, and disabled program",
+ friendly_name="receives from aid to the aged, blind, and disabled program",
type="number",
startIndex=47,
endIndex=48,
@@ -282,7 +282,7 @@
Field(
item="18E",
name="REC_SSI",
- friendly_name="receives social security income",
+ friendly_name="receives SSI",
type="number",
startIndex=48,
endIndex=49,
diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py
index 441795ca1..63f8706ac 100644
--- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py
+++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py
@@ -297,8 +297,7 @@
Field(
item="36C",
name="DISABLED_TITLE_XIVAPDT",
- friendly_name="receives aid to the permanently and totally disabled" +
- " under title xiv-apdt of the social security act",
+ friendly_name="received aid under Title XIV-APDT",
type="string",
startIndex=47,
endIndex=48,
@@ -325,7 +324,7 @@
Field(
item="36E",
name="RECEIVE_SSI",
- friendly_name="receives social security income",
+ friendly_name="receives SSI",
type="number",
startIndex=49,
endIndex=50,
@@ -919,7 +918,7 @@
Field(
item="66C",
name="UNEARNED_SSI",
- friendly_name="unearned ssi benefit",
+ friendly_name="unearned SSI benefit",
type="string",
startIndex=144,
endIndex=148,
diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py
index f91217ccd..54995f23a 100644
--- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py
+++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py
@@ -237,7 +237,7 @@
Field(
item="72B",
name="RECEIVE_SSI",
- friendly_name="receives social security income",
+ friendly_name="receives SSI",
type="number",
startIndex=45,
endIndex=46,
@@ -292,7 +292,7 @@
Field(
item="77A",
name="UNEARNED_SSI",
- friendly_name="unearned ssi benefit",
+ friendly_name="unearned SSI benefit",
type="string",
startIndex=52,
endIndex=56,
@@ -541,7 +541,7 @@
Field(
item="72B",
name="RECEIVE_SSI",
- friendly_name="receives social security income",
+ friendly_name="receives SSI",
type="number",
startIndex=86,
endIndex=87,
@@ -596,7 +596,7 @@
Field(
item="77A",
name="UNEARNED_SSI",
- friendly_name="unearned ssi benefit",
+ friendly_name="unearned SSI benefit",
type="string",
startIndex=93,
endIndex=97,
diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t5.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t5.py
index 120c9389e..199c08f0c 100644
--- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t5.py
+++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t5.py
@@ -283,7 +283,7 @@
Field(
item="19E",
name="REC_SSI",
- friendly_name="receives social security income",
+ friendly_name="receives SSI",
type="number",
startIndex=48,
endIndex=49,
diff --git a/tdrs-backend/tdpservice/parsers/test/data/small_incorrect_file_cross_validator.txt b/tdrs-backend/tdpservice/parsers/test/data/small_incorrect_file_cross_validator.txt
new file mode 100644
index 000000000..f01ab84d1
--- /dev/null
+++ b/tdrs-backend/tdpservice/parsers/test/data/small_incorrect_file_cross_validator.txt
@@ -0,0 +1,3 @@
+HEADER20204A06 TAN1 N
+T12020101111111111223003403361110213120000300000000000008730000000000000000000000000000000000000222222000000002229012
+TRAILER0000001
\ No newline at end of file
diff --git a/tdrs-backend/tdpservice/parsers/test/test_parse.py b/tdrs-backend/tdpservice/parsers/test/test_parse.py
index d74f0e930..02cd7365b 100644
--- a/tdrs-backend/tdpservice/parsers/test/test_parse.py
+++ b/tdrs-backend/tdpservice/parsers/test/test_parse.py
@@ -631,7 +631,6 @@ def test_parse_bad_tfs1_missing_required(bad_tanf_s1__row_missing_required_field
parser_errors = ParserError.objects.filter(
file=bad_tanf_s1__row_missing_required_field)
assert parser_errors.count() == 4
- [print(parser_error) for parser_error in parser_errors]
error_message = 'RPT_MONTH_YEAR is required but a value was not provided.'
row_2_error = parser_errors.get(row_number=2, error_message=error_message)
diff --git a/tdrs-backend/tdpservice/parsers/test/test_views.py b/tdrs-backend/tdpservice/parsers/test/test_views.py
new file mode 100644
index 000000000..7f5c7ec35
--- /dev/null
+++ b/tdrs-backend/tdpservice/parsers/test/test_views.py
@@ -0,0 +1,85 @@
+"""Tests for the views in the parsers app."""
+
+import pytest
+import base64
+import openpyxl
+from .. import parse
+from tdpservice.parsers.views import ParsingErrorViewSet
+from .. import util
+
+@pytest.fixture
+def test_datafile(stt_user, stt):
+ """Fixture for small_correct_file."""
+ return util.create_test_datafile('small_incorrect_file_cross_validator.txt', stt_user, stt)
+
+
+@pytest.mark.django_db
+def test_parsing_error_viewset_list(client, mocker, test_datafile):
+ """Test the django rest framework parsing error viewset list."""
+ # parse datafile
+ parse.parse_datafile(test_datafile)
+
+ id = test_datafile.id
+ view = ParsingErrorViewSet()
+ view.format_kwarg = None
+ request = mocker.Mock()
+
+ request.query_params = {'file': id}
+ view.request = request
+
+ ser = view.list(request).data['xls_report']
+
+ decoded_ser = base64.b64decode(ser)
+ # write the excel file to disk
+ with open('mycls.xlsx', 'wb') as f:
+ f.write(decoded_ser)
+
+ # read the excel file from disk
+ wb = openpyxl.load_workbook('mycls.xlsx')
+ ws = wb.get_sheet_by_name('Sheet1')
+
+ COL_ERROR_MESSAGE = 5
+
+ assert ws.cell(row=1, column=1).value == "Error reporting in TDP is still in development.We'll" \
+ + " be in touch when it's ready to use!For now please refer to the reports you receive via email"
+ assert ws.cell(row=4, column=COL_ERROR_MESSAGE).value == "if cash amount :873 validator1 passed" \
+ + " then number of months 0 is not larger than 0."
+
+
+@pytest.mark.django_db
+def test_parsing_error_viewset_list_no_fields_json(mocker, test_datafile):
+ """Test the django rest framework parsing error viewset list."""
+ # parse datafile
+ parse.parse_datafile(test_datafile)
+
+ # set fields_json to None
+ from tdpservice.parsers.models import ParserError
+ for error in ParserError.objects.all():
+ error.fields_json = None
+ error.save()
+
+ id = test_datafile.id
+ view = ParsingErrorViewSet()
+ view.format_kwarg = None
+ request = mocker.Mock()
+
+ request.query_params = {'file': id}
+ view.request = request
+
+ ser = view.list(request).data['xls_report']
+
+ decoded_ser = base64.b64decode(ser)
+ # write the excel file to disk
+ with open('mycls.xlsx', 'wb') as f:
+ f.write(decoded_ser)
+
+ # read the excel file from disk
+ wb = openpyxl.load_workbook('mycls.xlsx')
+ ws = wb.get_sheet_by_name('Sheet1')
+
+ COL_ERROR_MESSAGE = 5
+
+ assert ws.cell(row=1, column=1).value == "Error reporting in TDP is still in development.We'll" \
+ + " be in touch when it's ready to use!For now please refer to the reports you receive via email"
+ assert ws.cell(row=4, column=COL_ERROR_MESSAGE).value == "if CASH_AMOUNT :873 validator1 passed" \
+ + " then NBR_MONTHS 0 is not larger than 0."
diff --git a/tdrs-backend/tdpservice/parsers/views.py b/tdrs-backend/tdpservice/parsers/views.py
index 72d84e4f7..ef6f5f7cf 100644
--- a/tdrs-backend/tdpservice/parsers/views.py
+++ b/tdrs-backend/tdpservice/parsers/views.py
@@ -40,6 +40,23 @@ def get_queryset(self):
def _get_xls_serialized_file(self, data):
"""Return xls file created from the error."""
+ def chk(x):
+ """Check if fields_json is not None."""
+ x['fields_json'] = x['fields_json'] if x.get('fields_json', None) else {
+ 'friendly_name': {
+ x['field_name']: x['field_name']
+ },
+ }
+ x['fields_json']['friendly_name'] = x['fields_json']['friendly_name'] if x['fields_json'].get(
+ 'friendly_name', None) else {
+ x['field_name']: x['field_name']
+ }
+ if None in x['fields_json']['friendly_name'].keys():
+ x['fields_json']['friendly_name'].pop(None)
+ if None in x['fields_json']['friendly_name'].values():
+ x['fields_json']['friendly_name'].pop()
+ return x
+
def format_error_msg(x):
"""Format error message."""
error_msg = x['error_message']
@@ -58,10 +75,10 @@ def format_error_msg(x):
int(str(x['rpt_month_year'])[4:])
] if x['rpt_month_year'] else None),
('error_type', lambda x: x['error_type']),
- ('error_message', lambda x: format_error_msg(x)),
+ ('error_message', lambda x: format_error_msg(chk(x))),
('item_number', lambda x: x['item_number']),
- ('item_name', lambda x: ','.join([i for i in x['fields_json']['friendly_name'].values()])),
- ('internal_variable_name', lambda x: ','.join([i for i in x['fields_json']['friendly_name'].keys()])),
+ ('item_name', lambda x: ','.join([i for i in chk(x)['fields_json']['friendly_name'].values()])),
+ ('internal_variable_name', lambda x: ','.join([i for i in chk(x)['fields_json']['friendly_name'].keys()])),
('row_number', lambda x: x['row_number']),
('column_number', lambda x: x['column_number'])
]
diff --git a/tdrs-frontend/nginx/cloud.gov/locations.conf b/tdrs-frontend/nginx/cloud.gov/locations.conf
index 1bccf800e..a6c6d7b42 100644
--- a/tdrs-frontend/nginx/cloud.gov/locations.conf
+++ b/tdrs-frontend/nginx/cloud.gov/locations.conf
@@ -16,13 +16,13 @@ location ~ ^/(v1|admin|static/admin|swagger|redocs) {
proxy_buffer_size 4k;
proxy_temp_file_write_size 64k;
- limit_except GET HEAD POST { deny all;
+ limit_except GET HEAD POST PATCH { deny all;
}
add_header Access-Control-Allow-Origin 's3-us-gov-west-1.amazonaws.com';
}
-if ($request_method ~ ^(PATCH|TRACE|OPTION)$) {
+if ($request_method ~ ^(TRACE|OPTION)$) {
return 405;
}