ethyca-fides 2.66.2rc0__py2.py3-none-any.whl → 2.67.0rc0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ethyca-fides might be problematic. Click here for more details.

Files changed (326) hide show
  1. {ethyca_fides-2.66.2rc0.dist-info → ethyca_fides-2.67.0rc0.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.66.2rc0.dist-info → ethyca_fides-2.67.0rc0.dist-info}/RECORD +292 -279
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/7e9a2b52f498_adding_masking_secrets.py +60 -0
  5. fides/api/alembic/migrations/versions/a7065df4dcf1_add_finalized_fields_to_privacy_request.py +65 -0
  6. fides/api/alembic/migrations/versions/d0031087eacb_create_manualtaskconditionaldependency_.py +106 -0
  7. fides/api/api/v1/endpoints/dataset_config_endpoints.py +13 -5
  8. fides/api/api/v1/endpoints/drp_endpoints.py +7 -1
  9. fides/api/api/v1/endpoints/privacy_request_endpoints.py +44 -1
  10. fides/api/api/v1/endpoints/user_endpoints.py +83 -7
  11. fides/api/app_setup.py +3 -2
  12. fides/api/common_exceptions.py +4 -0
  13. fides/api/db/base.py +1 -0
  14. fides/api/db/database.py +1 -1
  15. fides/api/graph/execution.py +30 -0
  16. fides/api/graph/graph.py +13 -2
  17. fides/api/graph/traversal.py +126 -39
  18. fides/api/models/manual_task/__init__.py +2 -0
  19. fides/api/models/manual_task/conditional_dependency.py +144 -0
  20. fides/api/models/{manual_task.py → manual_task/manual_task.py} +10 -0
  21. fides/api/models/masking_secret.py +72 -0
  22. fides/api/models/policy.py +23 -0
  23. fides/api/models/privacy_request/execution_log.py +1 -0
  24. fides/api/models/privacy_request/privacy_request.py +31 -13
  25. fides/api/oauth/roles.py +2 -0
  26. fides/api/schemas/application_config.py +11 -1
  27. fides/api/schemas/masking/masking_secrets.py +1 -1
  28. fides/api/schemas/policy.py +1 -0
  29. fides/api/schemas/privacy_request.py +5 -0
  30. fides/api/service/connectors/base_connector.py +1 -0
  31. fides/api/service/connectors/bigquery_connector.py +67 -19
  32. fides/api/service/connectors/dynamodb_connector.py +2 -1
  33. fides/api/service/connectors/fides_connector.py +1 -0
  34. fides/api/service/connectors/http_connector.py +1 -0
  35. fides/api/service/connectors/manual_task_connector.py +1 -0
  36. fides/api/service/connectors/manual_webhook_connector.py +2 -1
  37. fides/api/service/connectors/mongodb_connector.py +1 -0
  38. fides/api/service/connectors/okta_connector.py +1 -0
  39. fides/api/service/connectors/query_configs/bigquery_query_config.py +91 -32
  40. fides/api/service/connectors/rds_mysql_connector.py +1 -0
  41. fides/api/service/connectors/rds_postgres_connector.py +1 -0
  42. fides/api/service/connectors/s3_connector.py +1 -0
  43. fides/api/service/connectors/saas_connector.py +1 -0
  44. fides/api/service/connectors/scylla_connector.py +1 -0
  45. fides/api/service/connectors/sql_connector.py +36 -4
  46. fides/api/service/connectors/website_connector.py +1 -0
  47. fides/api/service/privacy_request/dsr_package/templates/welcome.html +2 -2
  48. fides/api/service/privacy_request/request_runner_service.py +142 -53
  49. fides/api/service/privacy_request/request_service.py +1 -22
  50. fides/api/task/conditional_dependencies/__init__.py +0 -0
  51. fides/api/task/conditional_dependencies/evaluator.py +109 -0
  52. fides/api/task/conditional_dependencies/schemas.py +54 -0
  53. fides/api/task/create_request_tasks.py +1 -1
  54. fides/api/task/deprecated_graph_task.py +24 -6
  55. fides/api/task/execute_request_tasks.py +89 -12
  56. fides/api/task/filter_results.py +1 -1
  57. fides/api/task/graph_task.py +38 -3
  58. fides/api/task/manual/manual_task_address.py +46 -0
  59. fides/api/task/manual/manual_task_graph_task.py +118 -126
  60. fides/api/task/manual/manual_task_utils.py +52 -105
  61. fides/api/util/aws_util.py +5 -1
  62. fides/api/util/cache.py +5 -0
  63. fides/api/util/encryption/secrets_util.py +48 -18
  64. fides/common/api/scope_registry.py +3 -0
  65. fides/common/api/v1/urn_registry.py +1 -1
  66. fides/config/execution_settings.py +4 -0
  67. fides/config/utils.py +1 -0
  68. fides/service/privacy_request/privacy_request_service.py +6 -1
  69. fides/ui-build/static/admin/404.html +1 -1
  70. fides/ui-build/static/admin/_next/static/GKmhMPa_1gMto8JZO8ENy/_buildManifest.js +1 -0
  71. fides/ui-build/static/admin/_next/static/chunks/1316-2606e19807c08aa5.js +1 -0
  72. fides/ui-build/static/admin/_next/static/chunks/1467-8808ec8836e033f9.js +1 -0
  73. fides/ui-build/static/admin/_next/static/chunks/1817-b78b58ae3b75d75a.js +1 -0
  74. fides/ui-build/static/admin/_next/static/chunks/1975.7d4634a0e823a02b.js +1 -0
  75. fides/ui-build/static/admin/_next/static/chunks/{203-5a663f465ba26bb4.js → 203-cd78ea279cecba60.js} +1 -1
  76. fides/ui-build/static/admin/_next/static/chunks/2150-930ffaf2c4718edc.js +1 -0
  77. fides/ui-build/static/admin/_next/static/chunks/255-1bc0cbef7a59cdc6.js +1 -0
  78. fides/ui-build/static/admin/_next/static/chunks/{3450-0ba194991d0cca88.js → 3450-ca4ba70da999f264.js} +1 -1
  79. fides/ui-build/static/admin/_next/static/chunks/346-aa3b88efb85f2e28.js +1 -0
  80. fides/ui-build/static/admin/_next/static/chunks/3550-d04125c828d591a1.js +1 -0
  81. fides/ui-build/static/admin/_next/static/chunks/{3855-e172870d3e21b0dd.js → 3855-509ca7ac99b5eada.js} +1 -1
  82. fides/ui-build/static/admin/_next/static/chunks/{3872-46cebf7ec1b31a2b.js → 3872-0a0f0032ca39a93f.js} +1 -1
  83. fides/ui-build/static/admin/_next/static/chunks/409-ea70638a59296659.js +1 -0
  84. fides/ui-build/static/admin/_next/static/chunks/{4121-2bc09fc4ddbfe5cb.js → 4121-877e19d3fa078c7b.js} +1 -1
  85. fides/ui-build/static/admin/_next/static/chunks/{4230-60100f7ef3ddcde1.js → 4230-114e31621c19ea69.js} +1 -1
  86. fides/ui-build/static/admin/_next/static/chunks/4259.d1507e0db19cbed7.js +1 -0
  87. fides/ui-build/static/admin/_next/static/chunks/431-1db919f6569a4021.js +1 -0
  88. fides/ui-build/static/admin/_next/static/chunks/{4608-bbb7bf511a05c3c2.js → 4608-43acf39319177bee.js} +1 -1
  89. fides/ui-build/static/admin/_next/static/chunks/5163-e682273cd76a7d07.js +1 -0
  90. fides/ui-build/static/admin/_next/static/chunks/{5309-b2c4803370634ff8.js → 5309-ce5702b9faeaff55.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/{905-ffdbd0b14167e8bd.js → 5596-4378b2927dae65b2.js} +3 -3
  92. fides/ui-build/static/admin/_next/static/chunks/5619-9b50cec521203989.js +1 -0
  93. fides/ui-build/static/admin/_next/static/chunks/{6084-7178ff6ea6822475.js → 6084-ddbad3149364725d.js} +1 -1
  94. fides/ui-build/static/admin/_next/static/chunks/6148-59a59d5c5925344f.js +1 -0
  95. fides/ui-build/static/admin/_next/static/chunks/6419-d0c00d661b01f8fa.js +1 -0
  96. fides/ui-build/static/admin/_next/static/chunks/{6662-507be5d46e5b719b.js → 6662-4392ba1e4c254ef7.js} +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/6780-fc7d9ddb1a03e7b3.js +1 -0
  98. fides/ui-build/static/admin/_next/static/chunks/{6853-2ad3e08fe6f9f5f2.js → 6853-d0190d2cca9dbde2.js} +1 -1
  99. fides/ui-build/static/admin/_next/static/chunks/{6882-6af16fef26c21e06.js → 6882-59ea739e3616ce83.js} +1 -1
  100. fides/ui-build/static/admin/_next/static/chunks/6954-9c4912fbce87c4df.js +1 -0
  101. fides/ui-build/static/admin/_next/static/chunks/{7476-281ee9a8286556f3.js → 7476-cc0d9a94ed7aad53.js} +1 -1
  102. fides/ui-build/static/admin/_next/static/chunks/{787-fb41002f797eb2df.js → 787-c57185ad89c4e288.js} +1 -1
  103. fides/ui-build/static/admin/_next/static/chunks/{79-7e87aff851423d4a.js → 79-2aab56be75e16187.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/{796-329a5f823ec258a5.js → 796-3bdda2a7868464af.js} +1 -1
  105. fides/ui-build/static/admin/_next/static/chunks/8237-841439bef6682177.js +1 -0
  106. fides/ui-build/static/admin/_next/static/chunks/8765-f622a35b40a7ec63.js +1 -0
  107. fides/ui-build/static/admin/_next/static/chunks/{9046-5c4c22c375de25b1.js → 9046-04a8c092fef1cd83.js} +1 -1
  108. fides/ui-build/static/admin/_next/static/chunks/9187-7438242f0d380bb0.js +1 -0
  109. fides/ui-build/static/admin/_next/static/chunks/{9226-746771d47dff6266.js → 9226-2dcac54ab3fb94be.js} +1 -1
  110. fides/ui-build/static/admin/_next/static/chunks/9278-08cc704317fe535e.js +1 -0
  111. fides/ui-build/static/admin/_next/static/chunks/{9951-9b753ad7c3f51bdf.js → 9951-7c6639e5d062779e.js} +1 -1
  112. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-39ccb07327c2c5d5.js → _app-4b5bff46158a19a3.js} +56 -56
  113. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-98777246bec9dc2a.js → manual-2a655ff3a97f2492.js} +1 -1
  114. fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-a71c0aff4e0e6535.js → add-systems-0902f0bb4080643e.js} +1 -1
  115. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-1edf582ba3cd3bbb.js → [id]-f22ddd9b48a5c418.js} +1 -1
  116. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-06bb3b0bf097fcdb.js → new-e74cb5ea87f15b40.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-685771e5f7196d87.js → privacy-experience-21f997c69fc3b4c2.js} +1 -1
  118. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-6ccedc70dc447089.js → [id]-da4124b7600a2a1d.js} +1 -1
  119. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-944bca1cc57985b5.js → new-a57d251c88ce68ae.js} +1 -1
  120. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-84f4bd14ce8673bc.js → privacy-notices-ad105181bc91209b.js} +1 -1
  121. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-b0c4235fe6d0b0c8.js +1 -0
  122. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-11d52f1570759c4d.js → [resourceUrn]-aad6047a4604b945.js} +1 -1
  123. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-32eac8bbd217615a.js → projects-29784a11fe0fbd0a.js} +1 -1
  124. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-b83afa5565d0c84e.js → [resourceUrn]-b6b98cea25dd94fa.js} +1 -1
  125. fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-6f630d42ac9fb6b4.js → data-catalog-d5b01abcb76792ce.js} +1 -1
  126. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-7caea7bb58c1f153.js +1 -0
  127. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-a9a70856f7be1542.js +1 -0
  128. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-9ddb52ebb7ac4c71.js → action-center-1f0ea5c92ae9a2b4.js} +1 -1
  129. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-9aa744d56cdacb0d.js → activity-ad6a84a6276f914c.js} +1 -1
  130. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-14bd7500362ff224.js → [resourceUrn]-f98dd251babb7e28.js} +1 -1
  131. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-9e7dfd5a6acc2e8f.js → discovery-56eb4c014f0d96a3.js} +1 -1
  132. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-d23b3ae139f0428b.js +1 -0
  133. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-c0d2bfd465df20e0.js → [...subfieldNames]-15301bd6bf7cf718.js} +1 -1
  134. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-28280a8a39a6e37c.js → [collectionName]-0fa72873e464f581.js} +1 -1
  135. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-82fb246d87e58ebd.js → new-0d50084fbdf9b84c.js} +1 -1
  136. fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-20165c31ab1bc7cf.js → dataset-f3348d0a92543bab.js} +1 -1
  137. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-b4a6bcc87d126840.js → [id]-7d6027570d05c57f.js} +1 -1
  138. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-f95d7b0bbfc58f5a.js → new-8446418c7ad28f77.js} +1 -1
  139. fides/ui-build/static/admin/_next/static/chunks/pages/{fides-js-docs-5d8fd1af75f19e2f.js → fides-js-docs-1f4335dca5c09860.js} +1 -1
  140. fides/ui-build/static/admin/_next/static/chunks/pages/{index-1919aab9e5834b51.js → index-fbf9b845bb901238.js} +1 -1
  141. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-0a58aee2d1e7fa01.js → [id]-f53fe1f2cbebda7c.js} +1 -1
  142. fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-e2d5d7e2a5265e68.js → integrations-142abe3e3e3e5bf7.js} +1 -1
  143. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-1bae386d8c190348.js +1 -0
  144. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-69ad86b7a8a9a115.js → table-migration-05616e2ae20ff4f8.js} +1 -1
  145. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-1b6b0d703cf59389.js +1 -0
  146. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-f1d818242d8550f8.js +1 -0
  147. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-d40a26bddb126c5c.js +1 -0
  148. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-ccd8d9e06cf2d278.js +1 -0
  149. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-fd1a67892056830a.js +1 -0
  150. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-fc201657f4a782c7.js → [purpose_id]-e891d01ece59669e.js} +1 -1
  151. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-c2d39cba8396ef3a.js → consent-f61b87e79367865b.js} +1 -1
  152. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-d992103cc55901ae.js → custom-fields-f8eea5d508c60c64.js} +1 -1
  153. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-023e1895552817de.js → locations-ed6a140b362c5baa.js} +1 -1
  154. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-ac403c0886b20e20.js → organization-ff9a34264d48c35f.js} +1 -1
  155. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-7a3396ac819c7904.js → test-datasets-a4b6d41ca679298b.js} +1 -1
  156. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-8314a819837f5b2a.js → [id]-c8f5fbaa83dd9945.js} +1 -1
  157. fides/ui-build/static/admin/_next/static/chunks/pages/{systems-21f423a7c417aa9d.js → systems-c05b49ddec1a1b4f.js} +1 -1
  158. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-df0d88716578e295.js +1 -0
  159. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-da68efc31998dc66.js +1 -0
  160. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-173ac3a1ed2b05a6.js → user-management-e98dfc7d4f2a4e16.js} +1 -1
  161. fides/ui-build/static/admin/_next/static/chunks/webpack-90e8ec1fc5c6455b.js +1 -0
  162. fides/ui-build/static/admin/_next/static/css/{5bfb2473e5701527.css → 23cf870196941c9a.css} +1 -1
  163. fides/ui-build/static/admin/_next/static/css/{94965f224bc991e9.css → 8bc1833f1fa53ff0.css} +1 -1
  164. fides/ui-build/static/admin/_next/static/css/d9924caa849931b3.css +1 -0
  165. fides/ui-build/static/admin/_next/static/css/dbcf63488933a4d5.css +29 -0
  166. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  167. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  168. fides/ui-build/static/admin/add-systems.html +1 -1
  169. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  170. fides/ui-build/static/admin/consent/configure.html +1 -1
  171. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  172. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  173. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  174. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  175. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  176. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  177. fides/ui-build/static/admin/consent/properties.html +1 -1
  178. fides/ui-build/static/admin/consent/reporting.html +1 -1
  179. fides/ui-build/static/admin/consent.html +1 -1
  180. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  181. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  182. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  183. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  184. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  185. fides/ui-build/static/admin/data-catalog.html +1 -1
  186. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  187. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  188. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  189. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  190. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  191. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  192. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  193. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  194. fides/ui-build/static/admin/datamap.html +1 -1
  195. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  196. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  197. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  198. fides/ui-build/static/admin/dataset/new.html +1 -1
  199. fides/ui-build/static/admin/dataset.html +1 -1
  200. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  201. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  202. fides/ui-build/static/admin/datastore-connection.html +1 -1
  203. fides/ui-build/static/admin/index.html +1 -1
  204. fides/ui-build/static/admin/integrations/[id].html +1 -1
  205. fides/ui-build/static/admin/integrations.html +1 -1
  206. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  207. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  208. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  209. fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
  210. fides/ui-build/static/admin/lib/fides.js +3 -3
  211. fides/ui-build/static/admin/login/[provider].html +1 -1
  212. fides/ui-build/static/admin/login.html +1 -1
  213. fides/ui-build/static/admin/messaging/[id].html +1 -1
  214. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  215. fides/ui-build/static/admin/messaging.html +1 -1
  216. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  217. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  218. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  219. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  220. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  221. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  222. fides/ui-build/static/admin/poc/forms.html +1 -1
  223. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  224. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  225. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  226. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  227. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  228. fides/ui-build/static/admin/privacy-requests.html +1 -1
  229. fides/ui-build/static/admin/properties/[id].html +1 -1
  230. fides/ui-build/static/admin/properties/add-property.html +1 -1
  231. fides/ui-build/static/admin/properties.html +1 -1
  232. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  233. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  234. fides/ui-build/static/admin/settings/about.html +1 -1
  235. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  236. fides/ui-build/static/admin/settings/consent.html +1 -1
  237. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  238. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  239. fides/ui-build/static/admin/settings/domains.html +1 -1
  240. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  241. fides/ui-build/static/admin/settings/locations.html +1 -1
  242. fides/ui-build/static/admin/settings/organization.html +1 -1
  243. fides/ui-build/static/admin/settings/regulations.html +1 -1
  244. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  245. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  246. fides/ui-build/static/admin/systems.html +1 -1
  247. fides/ui-build/static/admin/taxonomy.html +1 -1
  248. fides/ui-build/static/admin/user-management/new.html +1 -1
  249. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  250. fides/ui-build/static/admin/user-management.html +1 -1
  251. fides/ui-build/static/admin/_next/static/8108ANFxs99VY7KZ_Xev2/_buildManifest.js +0 -1
  252. fides/ui-build/static/admin/_next/static/chunks/1316-6cc72a45ebf7ff81.js +0 -1
  253. fides/ui-build/static/admin/_next/static/chunks/1807-3beab149351d5ded.js +0 -1
  254. fides/ui-build/static/admin/_next/static/chunks/1817-e601e737e3cc7a0e.js +0 -1
  255. fides/ui-build/static/admin/_next/static/chunks/255-7db55b0e3a0f9dea.js +0 -1
  256. fides/ui-build/static/admin/_next/static/chunks/2599-6c4d22e75028d8b6.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/2858-0b44609b6be7850b.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/2866-a73888c17a195cbe.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/409-a257e14acebcd73b.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/431-34f0b91c26f8d9ab.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/570-c99f07161bd339cd.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/6780-e3d40aa17a4bf2e9.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/6954-bb875d9ac89f6030.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/7062.fda15dcb7df85675.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/7c79804f.7a7112aece470725.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/9278-9b1b5970f0702668.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/9392.f4520f66206d347d.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/ea076c0a.84423f606aef37cd.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-afdbd4665657cfa1.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-2265ecb899d45fbc.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-5d522637871ac6c8.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-7674b97d655c193b.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-5094ffea13f32ed9.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-32600543eb7b584f.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-10ce53ea356f8bad.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-5501bbb129fee9c4.js +0 -1
  279. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-cbe4c8f9096b6543.js +0 -1
  280. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-e130c0197362e8f3.js +0 -1
  281. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-6387fcc8cce872eb.js +0 -1
  282. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-ff5738706da07801.js +0 -1
  283. fides/ui-build/static/admin/_next/static/chunks/webpack-ff0cd6bff75588da.js +0 -1
  284. fides/ui-build/static/admin/_next/static/css/2cadb5f62dcd7c2b.css +0 -1
  285. {ethyca_fides-2.66.2rc0.dist-info → ethyca_fides-2.67.0rc0.dist-info}/WHEEL +0 -0
  286. {ethyca_fides-2.66.2rc0.dist-info → ethyca_fides-2.67.0rc0.dist-info}/entry_points.txt +0 -0
  287. {ethyca_fides-2.66.2rc0.dist-info → ethyca_fides-2.67.0rc0.dist-info}/licenses/LICENSE +0 -0
  288. {ethyca_fides-2.66.2rc0.dist-info → ethyca_fides-2.67.0rc0.dist-info}/top_level.txt +0 -0
  289. /fides/ui-build/static/admin/_next/static/{8108ANFxs99VY7KZ_Xev2 → GKmhMPa_1gMto8JZO8ENy}/_ssgManifest.js +0 -0
  290. /fides/ui-build/static/admin/_next/static/chunks/{2921-455e6357b74d2f76.js → 2921-86f1547ac40a5cdf.js} +0 -0
  291. /fides/ui-build/static/admin/_next/static/chunks/{3923-6cc911dafccc5f63.js → 3923-13a6b4da2d51bf8f.js} +0 -0
  292. /fides/ui-build/static/admin/_next/static/chunks/{401-1b529d5800aa1f3a.js → 401-3cc1fee61494e3bd.js} +0 -0
  293. /fides/ui-build/static/admin/_next/static/chunks/{5574-b13021775a15bfd2.js → 5574-9312f97b637d9ee2.js} +0 -0
  294. /fides/ui-build/static/admin/_next/static/chunks/{7630-9aac73191ed5ed13.js → 7630-b1c93688013ef013.js} +0 -0
  295. /fides/ui-build/static/admin/_next/static/chunks/{9826-111aaee8bd8dbd09.js → 9826-3c578665c6d3b21d.js} +0 -0
  296. /fides/ui-build/static/admin/_next/static/chunks/pages/{404-aece2c920ea14514.js → 404-2d803dab6a00f353.js} +0 -0
  297. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-dc75dc6e37e52f05.js → multiple-8ff7f37913ad736a.js} +0 -0
  298. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-24d226b5a8de5c74.js → add-vendors-d00c9034cdeb0236.js} +0 -0
  299. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-6a8ef51138ac926a.js → configure-0e1ca0f4c8e7f4da.js} +0 -0
  300. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-6f86ab63a08a6528.js → properties-057cad65e7414a44.js} +0 -0
  301. /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-73d3cbf68f7c3a31.js → consent-e17c56eec8d91371.js} +0 -0
  302. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-6ba9e160dae64695.js → [projectUrn]-80a6cc8e8573514a.js} +0 -0
  303. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-7648bbd4f6711e4d.js → resources-6c3714ee97a718c1.js} +0 -0
  304. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-393e20924c83373e.js → [resourceUrn]-31e6c54794a9883e.js} +0 -0
  305. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-8733807dad4bc96e.js → detection-2822a423a7ad0550.js} +0 -0
  306. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-006b695e5af5ef24.js → [datasetId]-a8e8b5f4ee7af86c.js} +0 -0
  307. /fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-c391c6fad56eec48.js → datastore-connection-0f29b47402292070.js} +0 -0
  308. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-53fecfb9dd6a1e0c.js → [id]-5627d0d0668077f9.js} +0 -0
  309. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-76b01cec5fde10a9.js → add-template-feca66ad5c5fe54a.js} +0 -0
  310. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-5c08e8447c45ce44.js → ant-components-64a322d01aae5ca7.js} +0 -0
  311. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-06ad5f34585480aa.js → AntForm-8bca16a7726e7eb2.js} +0 -0
  312. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-6f071c2bc9446cb0.js → FormikAntFormItem-b0f246fc3b67ebf7.js} +0 -0
  313. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-efcc38c58991ac9e.js → FormikControlled-1a0852b090bfc392.js} +0 -0
  314. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-430ba5c979abfb7c.js → FormikField-11f3de1b45e36583.js} +0 -0
  315. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-5c561880bf131afb.js → forms-1b73a1c2b6c6285f.js} +0 -0
  316. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-d888a69a3bbe040e.js → configure-e551a860ec727802.js} +0 -0
  317. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-d3d8e3d7583ec635.js → [id]-dd99183f93763ae4.js} +0 -0
  318. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-1af10ed303815d46.js → add-property-0bdbc1fcbf553b8f.js} +0 -0
  319. /fides/ui-build/static/admin/_next/static/chunks/pages/{properties-cebc0dc186be499a.js → properties-e959378bb32b6b73.js} +0 -0
  320. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/{alpha-5e1322de868d615e.js → alpha-8f98a4895e74725e.js} +0 -0
  321. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-241f95e372b65d0f.js → about-8155a35a62fdb5ae.js} +0 -0
  322. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-41242f805599feda.js → domain-records-51333dbd21cb37c8.js} +0 -0
  323. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-2e885f74c92f669c.js → domains-bde86e5f6c09da5a.js} +0 -0
  324. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-ff112655ad5f41e5.js → email-templates-4f9a5cc8bea7725b.js} +0 -0
  325. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-86062a18e081a52a.js → regulations-102efd9199e87124.js} +0 -0
  326. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-a2524414e968f862.js → new-bc4eb541906781e6.js} +0 -0
fides/_version.py CHANGED
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-07-29T12:24:25-0400",
11
+ "date": "2025-07-30T16:22:05-0400",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "0d085cb0c09afcc5309f42f6c24de184d443af13",
15
- "version": "2.66.2rc0"
14
+ "full-revisionid": "1b5a5cfbc8dfd15b989a5fc4778c2155aef1a36d",
15
+ "version": "2.67.0rc0"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -0,0 +1,60 @@
1
+ """adding masking secrets
2
+
3
+ Revision ID: 7e9a2b52f498
4
+ Revises: d0031087eacb
5
+ Create Date: 2024-12-23 23:29:53.557951
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ import sqlalchemy_utils
11
+ from alembic import op
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "7e9a2b52f498"
15
+ down_revision = "d0031087eacb"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade():
21
+ op.create_table(
22
+ "masking_secret",
23
+ sa.Column("id", sa.String(length=255), nullable=False),
24
+ sa.Column(
25
+ "created_at",
26
+ sa.DateTime(timezone=True),
27
+ server_default=sa.text("now()"),
28
+ nullable=True,
29
+ ),
30
+ sa.Column(
31
+ "updated_at",
32
+ sa.DateTime(timezone=True),
33
+ server_default=sa.text("now()"),
34
+ nullable=True,
35
+ ),
36
+ sa.Column("privacy_request_id", sa.String(), nullable=False),
37
+ sa.Column(
38
+ "secret",
39
+ sqlalchemy_utils.types.encrypted.encrypted_type.StringEncryptedType(),
40
+ nullable=False,
41
+ ),
42
+ sa.Column("masking_strategy", sa.String(), nullable=False),
43
+ sa.Column(
44
+ "secret_type",
45
+ sa.String(),
46
+ nullable=False,
47
+ ),
48
+ sa.ForeignKeyConstraint(
49
+ ["privacy_request_id"], ["privacyrequest.id"], ondelete="CASCADE"
50
+ ),
51
+ sa.PrimaryKeyConstraint("id"),
52
+ )
53
+ op.create_index(
54
+ op.f("ix_masking_secret_id"), "masking_secret", ["id"], unique=False
55
+ )
56
+
57
+
58
+ def downgrade():
59
+ op.drop_index(op.f("ix_masking_secret_id"), table_name="masking_secret")
60
+ op.drop_table("masking_secret")
@@ -0,0 +1,65 @@
1
+ """add finalized fields to privacy request
2
+
3
+ Revision ID: a7065df4dcf1
4
+ Revises: 7e9a2b52f498
5
+ Create Date: 2025-07-01 14:07:36.779437
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "a7065df4dcf1"
14
+ down_revision = "7e9a2b52f498"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade():
20
+ # ### commands auto generated by Alembic - please adjust! ###
21
+ op.add_column(
22
+ "privacyrequest",
23
+ sa.Column("finalized_at", sa.DateTime(timezone=True), nullable=True),
24
+ )
25
+ op.add_column(
26
+ "privacyrequest", sa.Column("finalized_by", sa.String(), nullable=True)
27
+ )
28
+ op.create_foreign_key(
29
+ "privacyrequest_fidesuser_id_fkey",
30
+ "privacyrequest",
31
+ "fidesuser",
32
+ ["finalized_by"],
33
+ ["id"],
34
+ ondelete="SET NULL",
35
+ )
36
+ op.execute(
37
+ "alter type privacyrequeststatus add value 'requires_manual_finalization'"
38
+ )
39
+ # ### end Alembic commands ###
40
+
41
+
42
+ def downgrade():
43
+ # ### commands auto generated by Alembic - please adjust! ###
44
+ op.drop_constraint(
45
+ "privacyrequest_fidesuser_id_fkey", "privacyrequest", type_="foreignkey"
46
+ )
47
+ op.drop_column("privacyrequest", "finalized_by")
48
+ op.drop_column("privacyrequest", "finalized_at")
49
+
50
+ op.execute(
51
+ "delete from privacyrequest where status in ('requires_manual_finalization')"
52
+ )
53
+
54
+ op.execute("alter type privacyrequeststatus rename to privacyrequeststatus_old")
55
+ op.execute(
56
+ "create type privacyrequeststatus as enum('identity_unverified', 'requires_input', 'pending', 'in_processing', 'complete', 'pending', 'error', 'paused', 'approved', 'denied', 'canceled', 'awaiting_email_send')"
57
+ )
58
+ op.execute(
59
+ (
60
+ "alter table privacyrequest alter column status type privacyrequeststatus using "
61
+ "status::text::privacyrequeststatus"
62
+ )
63
+ )
64
+ op.execute("drop type privacyrequeststatus_old")
65
+ # ### end Alembic commands ###
@@ -0,0 +1,106 @@
1
+ """create ManualTaskConditionalDependency table
2
+
3
+ Revision ID: d0031087eacb
4
+ Revises: 9e3dab26f75f
5
+ Create Date: 2025-07-17 21:28:20.937945
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+ from sqlalchemy.dialects import postgresql
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "d0031087eacb"
15
+ down_revision = "9e3dab26f75f"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade():
21
+ # ### commands auto generated by Alembic - please adjust! ###
22
+
23
+ op.create_table(
24
+ "manual_task_conditional_dependency",
25
+ sa.Column(
26
+ "created_at",
27
+ sa.DateTime(timezone=True),
28
+ server_default=sa.text("now()"),
29
+ nullable=True,
30
+ ),
31
+ sa.Column(
32
+ "updated_at",
33
+ sa.DateTime(timezone=True),
34
+ server_default=sa.text("now()"),
35
+ nullable=True,
36
+ ),
37
+ sa.Column("id", sa.String(length=255), nullable=False),
38
+ sa.Column("manual_task_id", sa.String(), nullable=False),
39
+ sa.Column("parent_id", sa.String(), nullable=True),
40
+ sa.Column(
41
+ "condition_type",
42
+ sa.String(), # Use String instead of Enum to avoid auto-creation
43
+ nullable=False,
44
+ ),
45
+ sa.Column("field_address", sa.String(), nullable=True),
46
+ sa.Column("operator", sa.String(), nullable=True),
47
+ sa.Column("value", postgresql.JSONB(astext_type=sa.Text()), nullable=True),
48
+ sa.Column("logical_operator", sa.String(), nullable=True),
49
+ sa.Column("sort_order", sa.Integer(), nullable=False),
50
+ sa.ForeignKeyConstraint(
51
+ ["manual_task_id"], ["manual_task.id"], ondelete="CASCADE"
52
+ ),
53
+ sa.ForeignKeyConstraint(
54
+ ["parent_id"], ["manual_task_conditional_dependency.id"], ondelete="CASCADE"
55
+ ),
56
+ sa.PrimaryKeyConstraint("id"),
57
+ )
58
+
59
+ op.create_index(
60
+ "ix_manual_task_conditional_dependency_condition_type",
61
+ "manual_task_conditional_dependency",
62
+ ["condition_type"],
63
+ unique=False,
64
+ )
65
+ op.create_index(
66
+ "ix_manual_task_conditional_dependency_manual_task_id",
67
+ "manual_task_conditional_dependency",
68
+ ["manual_task_id"],
69
+ unique=False,
70
+ )
71
+ op.create_index(
72
+ "ix_manual_task_conditional_dependency_parent_id",
73
+ "manual_task_conditional_dependency",
74
+ ["parent_id"],
75
+ unique=False,
76
+ )
77
+ op.create_index(
78
+ "ix_manual_task_conditional_dependency_sort_order",
79
+ "manual_task_conditional_dependency",
80
+ ["sort_order"],
81
+ unique=False,
82
+ )
83
+ # ### end Alembic commands ###
84
+
85
+
86
+ def downgrade():
87
+ # ### commands auto generated by Alembic - please adjust! ###
88
+ op.drop_index(
89
+ "ix_manual_task_conditional_dependency_sort_order",
90
+ table_name="manual_task_conditional_dependency",
91
+ )
92
+ op.drop_index(
93
+ "ix_manual_task_conditional_dependency_parent_id",
94
+ table_name="manual_task_conditional_dependency",
95
+ )
96
+ op.drop_index(
97
+ "ix_manual_task_conditional_dependency_manual_task_id",
98
+ table_name="manual_task_conditional_dependency",
99
+ )
100
+ op.drop_index(
101
+ "ix_manual_task_conditional_dependency_condition_type",
102
+ table_name="manual_task_conditional_dependency",
103
+ )
104
+
105
+ op.drop_table("manual_task_conditional_dependency")
106
+ # ### end Alembic commands ###
@@ -1,7 +1,7 @@
1
1
  from typing import Annotated, Any, Dict, List, Optional
2
2
 
3
3
  import yaml
4
- from fastapi import Depends, HTTPException, Request
4
+ from fastapi import Depends, HTTPException, Query, Request
5
5
  from fastapi.encoders import jsonable_encoder
6
6
  from fastapi.params import Security
7
7
  from fastapi_pagination import Page, Params
@@ -68,10 +68,18 @@ from fides.api.models.sql_models import ( # type: ignore[attr-defined] # isort:
68
68
  )
69
69
 
70
70
  X_YAML = "application/x-yaml"
71
+ MAX_DATASET_CONFIGS_FOR_INTEGRATION_FORM = 1000
71
72
 
72
73
  router = APIRouter(tags=["Dataset Configs"], prefix=V1_URL_PREFIX)
73
74
 
74
75
 
76
+ # Custom Params class with higher limit for dataset configs
77
+ class DatasetConfigParams(Params):
78
+ size: int = Query(
79
+ 50, ge=1, le=MAX_DATASET_CONFIGS_FOR_INTEGRATION_FORM, description="Page size"
80
+ )
81
+
82
+
75
83
  # Helper method to inject the parent ConnectionConfig into these child routes
76
84
  def _get_connection_config(
77
85
  connection_key: FidesKey, db: Session = Depends(deps.get_db)
@@ -131,7 +139,7 @@ def validate_dataset(
131
139
  response_model=BulkPutDataset,
132
140
  )
133
141
  def put_dataset_configs(
134
- dataset_pairs: Annotated[List[DatasetConfigCtlDataset], Field(max_length=50)], # type: ignore
142
+ dataset_pairs: Annotated[List[DatasetConfigCtlDataset], Field(max_length=MAX_DATASET_CONFIGS_FOR_INTEGRATION_FORM)], # type: ignore
135
143
  db: Session = Depends(deps.get_db),
136
144
  dataset_config_service: DatasetConfigService = Depends(get_dataset_config_service),
137
145
  connection_config: ConnectionConfig = Depends(_get_connection_config),
@@ -181,7 +189,7 @@ def put_dataset_configs(
181
189
  response_model=BulkPutDataset,
182
190
  )
183
191
  def patch_dataset_configs(
184
- dataset_pairs: Annotated[List[DatasetConfigCtlDataset], Field(max_length=50)], # type: ignore
192
+ dataset_pairs: Annotated[List[DatasetConfigCtlDataset], Field(max_length=MAX_DATASET_CONFIGS_FOR_INTEGRATION_FORM)], # type: ignore
185
193
  dataset_config_service: DatasetConfigService = Depends(get_dataset_config_service),
186
194
  connection_config: ConnectionConfig = Depends(_get_connection_config),
187
195
  ) -> BulkPutDataset:
@@ -217,7 +225,7 @@ def patch_dataset_configs(
217
225
  response_model=BulkPutDataset,
218
226
  )
219
227
  def patch_datasets(
220
- datasets: Annotated[List[FideslangDataset], Field(max_length=50)], # type: ignore
228
+ datasets: Annotated[List[FideslangDataset], Field(max_length=1000)], # type: ignore
221
229
  dataset_config_service: DatasetConfigService = Depends(get_dataset_config_service),
222
230
  connection_config: ConnectionConfig = Depends(_get_connection_config),
223
231
  ) -> BulkPutDataset:
@@ -367,7 +375,7 @@ def get_dataset(
367
375
  )
368
376
  def get_dataset_configs(
369
377
  db: Session = Depends(deps.get_db),
370
- params: Params = Depends(),
378
+ params: DatasetConfigParams = Depends(),
371
379
  connection_config: ConnectionConfig = Depends(_get_connection_config),
372
380
  ) -> AbstractPage[DatasetConfig]:
373
381
  """Returns all Dataset Configs attached to current Connection Config."""
@@ -125,7 +125,13 @@ async def create_drp_privacy_request(
125
125
  "Decrypting identity for DRP privacy request {}", privacy_request.id
126
126
  )
127
127
 
128
- cache_data(privacy_request, policy, mapped_identity, None, data)
128
+ cache_data(privacy_request, mapped_identity, None, data)
129
+
130
+ if masking_secrets := policy.generate_masking_secrets():
131
+ logger.info(
132
+ "Caching masking secrets for privacy request {}", privacy_request.id
133
+ )
134
+ privacy_request.persist_masking_secrets(masking_secrets)
129
135
 
130
136
  queue_privacy_request(privacy_request.id)
131
137
 
@@ -4,7 +4,7 @@ import csv
4
4
  import io
5
5
  import json
6
6
  from collections import defaultdict
7
- from datetime import datetime
7
+ from datetime import datetime, timezone
8
8
  from typing import (
9
9
  Annotated,
10
10
  Any,
@@ -146,6 +146,7 @@ from fides.common.api.v1.urn_registry import (
146
146
  PRIVACY_REQUEST_BULK_SOFT_DELETE,
147
147
  PRIVACY_REQUEST_DENY,
148
148
  PRIVACY_REQUEST_FILTERED_RESULTS,
149
+ PRIVACY_REQUEST_FINALIZE,
149
150
  PRIVACY_REQUEST_MANUAL_WEBHOOK_ACCESS_INPUT,
150
151
  PRIVACY_REQUEST_MANUAL_WEBHOOK_ERASURE_INPUT,
151
152
  PRIVACY_REQUEST_NOTIFICATIONS,
@@ -1862,6 +1863,48 @@ def resume_privacy_request_from_requires_input(
1862
1863
  return privacy_request # type: ignore[return-value]
1863
1864
 
1864
1865
 
1866
+ @router.post(
1867
+ PRIVACY_REQUEST_FINALIZE,
1868
+ status_code=HTTP_200_OK,
1869
+ response_model=PrivacyRequestResponse,
1870
+ dependencies=[Security(verify_oauth_client, scopes=[PRIVACY_REQUEST_REVIEW])],
1871
+ )
1872
+ def finalize_privacy_request(
1873
+ privacy_request_id: str,
1874
+ *,
1875
+ db: Session = Depends(deps.get_db),
1876
+ client: ClientDetail = Security(
1877
+ verify_oauth_client,
1878
+ scopes=[PRIVACY_REQUEST_REVIEW],
1879
+ ),
1880
+ ) -> PrivacyRequestResponse:
1881
+ """
1882
+ Finalizes a privacy request, moving it from the 'requires_finalization' state to 'complete'.
1883
+ This is done by re-queueing the request, which will then hit the finalization logic in the
1884
+ request runner service. This logic marks the privacy request as complete
1885
+ and sends out any configured messaging to the user.
1886
+ """
1887
+ privacy_request = get_privacy_request_or_error(db, privacy_request_id)
1888
+
1889
+ if privacy_request.status != PrivacyRequestStatus.requires_manual_finalization:
1890
+ raise HTTPException(
1891
+ status_code=HTTP_400_BAD_REQUEST,
1892
+ detail=f"Cannot manually finalize privacy request '{privacy_request_id}': status is {privacy_request.status}, not requires_manual_finalization.",
1893
+ )
1894
+
1895
+ # Set finalized_by and finalized_at here, so the request runner service knows not to
1896
+ # put the request back into the requires_finalization state.
1897
+ privacy_request.finalized_at = datetime.now(timezone.utc)
1898
+ privacy_request.finalized_by = client.user_id
1899
+ privacy_request.save(db=db)
1900
+
1901
+ queue_privacy_request(
1902
+ privacy_request_id=privacy_request_id,
1903
+ )
1904
+
1905
+ return privacy_request # type: ignore[return-value]
1906
+
1907
+
1865
1908
  @router.get(
1866
1909
  REQUEST_TASKS,
1867
1910
  dependencies=[Security(verify_oauth_client, scopes=[PRIVACY_REQUEST_READ])],
@@ -6,6 +6,7 @@ from typing import List, Optional
6
6
 
7
7
  import jose.exceptions
8
8
  from fastapi import Depends, HTTPException, Security
9
+ from fastapi.security import SecurityScopes
9
10
  from fastapi_pagination import Page, Params
10
11
  from fastapi_pagination.bases import AbstractPage
11
12
  from fastapi_pagination.ext.sqlalchemy import paginate
@@ -39,7 +40,9 @@ from fides.api.oauth.roles import APPROVER, VIEWER
39
40
  from fides.api.oauth.utils import (
40
41
  create_temporary_user_for_login_flow,
41
42
  extract_payload,
43
+ extract_token_and_load_client,
42
44
  get_current_user,
45
+ has_permissions,
43
46
  oauth2_scheme,
44
47
  verify_oauth_client,
45
48
  )
@@ -65,6 +68,7 @@ from fides.common.api.scope_registry import (
65
68
  USER_DELETE,
66
69
  USER_PASSWORD_RESET,
67
70
  USER_READ,
71
+ USER_READ_OWN,
68
72
  USER_UPDATE,
69
73
  )
70
74
  from fides.common.api.v1 import urn_registry as urls
@@ -107,6 +111,37 @@ def _validate_current_user(user_id: str, user_from_token: FidesUser) -> None:
107
111
  )
108
112
 
109
113
 
114
+ def verify_user_read_scopes(
115
+ authorization: str = Security(oauth2_scheme),
116
+ db: Session = Depends(get_db),
117
+ ) -> ClientDetail:
118
+ """
119
+ Custom dependency that verifies the user has either USER_READ or USER_READ_OWN scope.
120
+ Returns the client if authorized.
121
+ """
122
+ token_data, client = extract_token_and_load_client(authorization, db)
123
+
124
+ # Try USER_READ first
125
+ if has_permissions(
126
+ token_data=token_data,
127
+ client=client,
128
+ endpoint_scopes=SecurityScopes([USER_READ]),
129
+ ):
130
+ return client
131
+
132
+ if has_permissions(
133
+ token_data=token_data,
134
+ client=client,
135
+ endpoint_scopes=SecurityScopes([USER_READ_OWN]),
136
+ ):
137
+ return client
138
+
139
+ raise HTTPException(
140
+ status_code=HTTP_403_FORBIDDEN,
141
+ detail="Not authorized.",
142
+ )
143
+
144
+
110
145
  @router.put(
111
146
  urls.USER_DETAIL,
112
147
  dependencies=[Security(verify_oauth_client)],
@@ -498,14 +533,38 @@ def delete_user(
498
533
 
499
534
  @router.get(
500
535
  urls.USER_DETAIL,
501
- dependencies=[Security(verify_oauth_client, scopes=[USER_READ])],
536
+ dependencies=[Security(verify_user_read_scopes)],
502
537
  response_model=UserResponse,
503
538
  )
504
- def get_user(*, db: Session = Depends(get_db), user_id: str) -> FidesUser:
505
- """Returns a User based on an Id"""
539
+ def get_user(
540
+ *,
541
+ db: Session = Depends(get_db),
542
+ user_id: str,
543
+ client: ClientDetail = Security(verify_user_read_scopes),
544
+ authorization: str = Security(oauth2_scheme),
545
+ ) -> FidesUser:
546
+ """Returns a User based on an Id. Users with USER_READ_OWN scope can only access their own data."""
506
547
  user: Optional[FidesUser] = FidesUser.get_by_key_or_id(db, data={"id": user_id})
507
548
  if user is None:
508
549
  raise HTTPException(status_code=HTTP_404_NOT_FOUND, detail="User not found")
550
+ token_data, _ = extract_token_and_load_client(authorization, db)
551
+ # Check if user has USER_READ_OWN scope and is trying to access someone else's data
552
+ # The verify_user_read_scopes dependency already verified the user has either USER_READ or USER_READ_OWN
553
+ # We need to check if they have USER_READ_OWN and are accessing their own data
554
+ if has_permissions(
555
+ token_data=token_data,
556
+ client=client,
557
+ endpoint_scopes=SecurityScopes([USER_READ]),
558
+ ):
559
+ logger.debug("Returning user with id: '{}'.", user_id)
560
+ return user
561
+
562
+ # User has USER_READ_OWN scope, check if they're accessing their own data
563
+ if user.id != client.user_id:
564
+ raise HTTPException(
565
+ status_code=HTTP_403_FORBIDDEN,
566
+ detail="You can only access your own user data with USER_READ_OWN scope.",
567
+ )
509
568
 
510
569
  logger.debug("Returning user with id: '{}'.", user_id)
511
570
  return user
@@ -513,7 +572,7 @@ def get_user(*, db: Session = Depends(get_db), user_id: str) -> FidesUser:
513
572
 
514
573
  @router.get(
515
574
  urls.USERS,
516
- dependencies=[Security(verify_oauth_client, scopes=[USER_READ])],
575
+ dependencies=[Security(verify_user_read_scopes)],
517
576
  response_model=Page[UserResponse],
518
577
  )
519
578
  def get_users(
@@ -521,11 +580,28 @@ def get_users(
521
580
  db: Session = Depends(get_db),
522
581
  params: Params = Depends(),
523
582
  username: Optional[str] = None,
583
+ client: ClientDetail = Security(verify_user_read_scopes),
584
+ authorization: str = Security(oauth2_scheme),
524
585
  ) -> AbstractPage[FidesUser]:
525
- """Returns a paginated list of all users"""
586
+ """Returns a paginated list of users. Users with USER_READ_OWN scope only see their own data."""
526
587
  query = FidesUser.query(db)
527
- if username:
528
- query = query.filter(FidesUser.username.ilike(f"%{escape_like(username)}%"))
588
+
589
+ # Check if user has USER_READ_OWN scope and filter accordingly
590
+ # The verify_user_read_scopes dependency already verified the user has either USER_READ or USER_READ_OWN
591
+ token_data, _ = extract_token_and_load_client(authorization, db)
592
+ if has_permissions(
593
+ token_data=token_data,
594
+ client=client,
595
+ endpoint_scopes=SecurityScopes([USER_READ]),
596
+ ):
597
+ # User has USER_READ scope, can see all users
598
+ if username:
599
+ query = query.filter(FidesUser.username.ilike(f"%{escape_like(username)}%"))
600
+ else:
601
+ # User has USER_READ_OWN scope, only show their own data
602
+ query = query.filter(FidesUser.id == client.user_id)
603
+ if username:
604
+ query = query.filter(FidesUser.username.ilike(f"%{escape_like(username)}%"))
529
605
 
530
606
  logger.debug("Returning a paginated list of users.")
531
607
 
fides/api/app_setup.py CHANGED
@@ -171,8 +171,9 @@ async def run_database_startup(app: FastAPI) -> None:
171
171
  if CONFIG.database.automigrate:
172
172
  try:
173
173
  configure_db(CONFIG.database.sync_database_uri)
174
- with get_autoclose_db_session() as session:
175
- seed_db(session)
174
+ if not CONFIG.test_mode:
175
+ with get_autoclose_db_session() as session:
176
+ seed_db(session)
176
177
  if CONFIG.database.load_samples:
177
178
  async with get_async_autoclose_db_session() as async_session:
178
179
  await seed.load_samples(async_session)
@@ -283,6 +283,10 @@ class MalisciousUrlException(Exception):
283
283
  """Fides has detected a potentially maliscious URL."""
284
284
 
285
285
 
286
+ class MaskingSecretsExpired(BaseException):
287
+ """The cached masking secrets have expired for the given privacy request."""
288
+
289
+
286
290
  class AuthenticationError(HTTPException):
287
291
  """To be raised when attempting to fetch an access token using
288
292
  invalid credentials.
fides/api/db/base.py CHANGED
@@ -33,6 +33,7 @@ from fides.api.models.identity_salt import IdentitySalt
33
33
  from fides.api.models.location_regulation_selections import LocationRegulationSelections
34
34
  from fides.api.models.manual_task import (
35
35
  ManualTask,
36
+ ManualTaskConditionalDependency,
36
37
  ManualTaskConfig,
37
38
  ManualTaskConfigField,
38
39
  ManualTaskInstance,
fides/api/db/database.py CHANGED
@@ -123,7 +123,7 @@ def get_db_health(
123
123
 
124
124
 
125
125
  def seed_db(session: Session) -> None:
126
- """Load default resources into the database, and optionally load samples."""
126
+ """Load default resources into the database"""
127
127
  load_default_resources(session)
128
128
 
129
129
 
@@ -1,6 +1,7 @@
1
1
  from typing import Any, Callable, Dict, List, Optional, Set, Tuple
2
2
 
3
3
  from fideslang.validation import FidesKey
4
+ from loguru import logger
4
5
 
5
6
  from fides.api.graph.config import (
6
7
  Collection,
@@ -117,6 +118,8 @@ class ExecutionNode(Contextualizable): # pylint: disable=too-many-instance-attr
117
118
  The values are cast based on field types, if those types are specified.
118
119
  """
119
120
  out = {}
121
+ failed_conversions: Dict[str, Dict[str, Any]] = {}
122
+
120
123
  for key, values in input_data.items():
121
124
  path: FieldPath = FieldPath.parse(key)
122
125
  field: Optional[Field] = self.collection.field(path)
@@ -126,4 +129,31 @@ class ExecutionNode(Contextualizable): # pylint: disable=too-many-instance-attr
126
129
  filtered = list(filter(lambda x: x is not None, cast_values))
127
130
  if filtered:
128
131
  out[key] = filtered
132
+ elif values: # Had input values but all failed conversion
133
+ # Track conversion failures for logging
134
+ failed_conversions[key] = {"field": field, "input_values": values}
135
+
136
+ # Log conversion failures if any occurred
137
+ if failed_conversions:
138
+ field_details = []
139
+ for field_name, failure_info in failed_conversions.items():
140
+ field = failure_info["field"]
141
+ values = failure_info["input_values"]
142
+
143
+ expected_type = field.data_type() if field else "unknown"
144
+ actual_types = {type(v).__name__ for v in values if v is not None}
145
+ actual_type_str = (
146
+ ", ".join(sorted(actual_types)) if actual_types else "NoneType"
147
+ )
148
+
149
+ field_details.append(
150
+ f"{field_name} (expected: {expected_type}, got: {actual_type_str})"
151
+ )
152
+
153
+ logger.warning(
154
+ "Type conversion failures for {}: {}",
155
+ self.address,
156
+ "; ".join(field_details),
157
+ )
158
+
129
159
  return out
fides/api/graph/graph.py CHANGED
@@ -180,8 +180,19 @@ class DatasetGraph:
180
180
  this is a destructive operation on the input datasets, as it
181
181
  will alter references within them"""
182
182
 
183
- # build nodes
184
- nodes = [Node(dr, ds) for dr in datasets for ds in dr.collections]
183
+ # build nodes, filtering out collections with skip_processing=True
184
+ nodes = []
185
+ for dr in datasets:
186
+ for ds in dr.collections:
187
+ if ds.skip_processing:
188
+ logger.debug(
189
+ "Skipping collection {} on dataset {} marked with skip_processing",
190
+ ds.name,
191
+ dr.name,
192
+ )
193
+ continue
194
+ nodes.append(Node(dr, ds))
195
+
185
196
  self.nodes: dict[CollectionAddress, Node] = {
186
197
  node.address: node for node in nodes
187
198
  }