ethyca-fides 2.68.1b1__py2.py3-none-any.whl → 2.68.1b3__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 (309) hide show
  1. {ethyca_fides-2.68.1b1.dist-info → ethyca_fides-2.68.1b3.dist-info}/METADATA +3 -1
  2. {ethyca_fides-2.68.1b1.dist-info → ethyca_fides-2.68.1b3.dist-info}/RECORD +247 -224
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/3baf42d251a6_add_generic_taxonomy_models.py +239 -0
  5. fides/api/alembic/migrations/versions/90502bcda282_update_request_tasks_add_polling_async.py +35 -0
  6. fides/api/api/v1/endpoints/generic_overrides.py +64 -167
  7. fides/api/api/v1/endpoints/privacy_request_endpoints.py +1 -1
  8. fides/api/common_exceptions.py +12 -3
  9. fides/api/db/base.py +6 -0
  10. fides/api/models/detection_discovery/core.py +6 -0
  11. fides/api/models/privacy_request/request_task.py +25 -0
  12. fides/api/models/taxonomy.py +275 -0
  13. fides/api/schemas/privacy_center_config.py +48 -19
  14. fides/api/schemas/storage/storage.py +2 -0
  15. fides/api/service/async_dsr/__init__.py +0 -0
  16. fides/api/service/async_dsr/async_dsr_service.py +75 -0
  17. fides/api/service/connectors/saas_connector.py +5 -6
  18. fides/api/service/deps.py +5 -0
  19. fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +6 -4
  20. fides/api/service/privacy_request/request_service.py +56 -3
  21. fides/api/service/storage/storage_uploader_service.py +80 -5
  22. fides/api/service/storage/streaming/__init__.py +42 -0
  23. fides/api/service/storage/streaming/base_storage_client.py +61 -0
  24. fides/api/service/storage/streaming/dsr_storage.py +98 -0
  25. fides/api/service/storage/streaming/retry.py +282 -0
  26. fides/api/service/storage/streaming/s3/__init__.py +5 -0
  27. fides/api/service/storage/streaming/s3/s3_storage_client.py +113 -0
  28. fides/api/service/storage/streaming/s3/streaming_s3.py +196 -0
  29. fides/api/service/storage/streaming/schemas.py +173 -0
  30. fides/api/service/storage/streaming/smart_open_client.py +265 -0
  31. fides/api/service/storage/streaming/smart_open_streaming_storage.py +998 -0
  32. fides/api/service/storage/streaming/storage_client_factory.py +60 -0
  33. fides/api/task/graph_task.py +4 -4
  34. fides/api/task/manual/manual_task_graph_task.py +14 -4
  35. fides/api/util/connection_type.py +68 -33
  36. fides/config/execution_settings.py +4 -0
  37. fides/data/sample_project/docker-compose.yml +3 -3
  38. fides/service/privacy_request/privacy_request_service.py +1 -9
  39. fides/service/taxonomy/__init__.py +0 -0
  40. fides/service/taxonomy/handlers/__init__.py +11 -0
  41. fides/service/taxonomy/handlers/base.py +42 -0
  42. fides/service/taxonomy/handlers/legacy_handler.py +95 -0
  43. fides/service/taxonomy/taxonomy_service.py +261 -0
  44. fides/service/taxonomy/utils.py +160 -0
  45. fides/ui-build/static/admin/404.html +1 -1
  46. fides/ui-build/static/admin/_next/static/_BLI2ArqQzY5XnXbrcxa2/_buildManifest.js +1 -0
  47. fides/ui-build/static/admin/_next/static/chunks/1099-7b2085a3931da9e4.js +1 -0
  48. fides/ui-build/static/admin/_next/static/chunks/1138-0d846ffef62c580f.js +1 -0
  49. fides/ui-build/static/admin/_next/static/chunks/1345-ab756811e19ff4fc.js +1 -0
  50. fides/ui-build/static/admin/_next/static/chunks/{1817-c90365325f8a3d75.js → 1817-fd21f1f5ef0faffa.js} +1 -1
  51. fides/ui-build/static/admin/_next/static/chunks/{1975.e5cc7a1ccd477671.js → 1975.16126463309143e3.js} +1 -1
  52. fides/ui-build/static/admin/_next/static/chunks/{2921-46f9465c2852a46b.js → 2921-0e5cc63a82e31830.js} +1 -1
  53. fides/ui-build/static/admin/_next/static/chunks/3620-6cceae71bae5b531.js +1 -0
  54. fides/ui-build/static/admin/_next/static/chunks/3729-7d2d52400f1f7413.js +1 -0
  55. fides/ui-build/static/admin/_next/static/chunks/3855-64541570e2f838fb.js +1 -0
  56. fides/ui-build/static/admin/_next/static/chunks/3872-7a18d18a5e287e4e.js +1 -0
  57. fides/ui-build/static/admin/_next/static/chunks/{3923-a33633feba5e655e.js → 3923-5c87b3d7f1626678.js} +1 -1
  58. fides/ui-build/static/admin/_next/static/chunks/{401-741bb31b586b7c96.js → 401-3902e3e98790d401.js} +1 -1
  59. fides/ui-build/static/admin/_next/static/chunks/{4121-94354b50a41f8497.js → 4121-64ef70ef906bbdd0.js} +1 -1
  60. fides/ui-build/static/admin/_next/static/chunks/431-86ad2beeb93c95c9.js +1 -0
  61. fides/ui-build/static/admin/_next/static/chunks/4608-70521532195124de.js +1 -0
  62. fides/ui-build/static/admin/_next/static/chunks/4786-53ef1662f2d0d98c.js +1 -0
  63. fides/ui-build/static/admin/_next/static/chunks/4808-8713433c84a62efe.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/4844-351f99b6644b654e.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/5258-c6f96dc740eb5fb1.js +1 -0
  66. fides/ui-build/static/admin/_next/static/chunks/5487-338800277d36b8d7.js +1 -0
  67. fides/ui-build/static/admin/_next/static/chunks/549-e6453a3526023e85.js +1 -0
  68. fides/ui-build/static/admin/_next/static/chunks/602-80d113e801d7407d.js +1 -0
  69. fides/ui-build/static/admin/_next/static/chunks/{6084-02abe12327fc3dbc.js → 6084-da63f20d9416a982.js} +1 -1
  70. fides/ui-build/static/admin/_next/static/chunks/{6853-270261ef5537a106.js → 6853-1d947b75eb07188c.js} +1 -1
  71. fides/ui-build/static/admin/_next/static/chunks/6954-24f9a4f27d67b732.js +1 -0
  72. fides/ui-build/static/admin/_next/static/chunks/7476-a0dd03bfccf60d0c.js +1 -0
  73. fides/ui-build/static/admin/_next/static/chunks/7630-9fbe06cfb98266fe.js +1 -0
  74. fides/ui-build/static/admin/_next/static/chunks/{787-5ba991cad1f7664a.js → 787-3dd31844cf7fec55.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/79-dcd20e8b09501c17.js +1 -0
  76. fides/ui-build/static/admin/_next/static/chunks/796-8773e04b64ce2260.js +1 -0
  77. fides/ui-build/static/admin/_next/static/chunks/8002-dcd02da6e5649a1c.js +1 -0
  78. fides/ui-build/static/admin/_next/static/chunks/9046-57eab238570b8bf4.js +1 -0
  79. fides/ui-build/static/admin/_next/static/chunks/9676.bf0a8a6ff6dfd2af.js +1 -0
  80. fides/ui-build/static/admin/_next/static/chunks/{9826-8c81c97a72510fcf.js → 9826-756c958aecab59a2.js} +1 -1
  81. fides/ui-build/static/admin/_next/static/chunks/9951-cdf73904a3adb27b.js +1 -0
  82. fides/ui-build/static/admin/_next/static/chunks/pages/{404-9174cdb70126c2c5.js → 404-dd625a559ada46ca.js} +1 -1
  83. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-65723cd4b8fc36ac.js → _app-b6b09b2878b77b21.js} +136 -135
  84. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-621416493c89ef01.js → manual-92cf5e313be1f9e2.js} +1 -1
  85. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-0b9908c3e1dfe49e.js → multiple-d6c525ee731a2993.js} +1 -1
  86. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-5664a3ea796e5ffb.js +1 -0
  87. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-5bb1b31ae8752250.js → add-vendors-78f13de90111fd80.js} +1 -1
  88. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-0fc678f3d6d2fcec.js +1 -0
  89. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-4e4d9426743b5cb4.js → [id]-126db59dc25ca326.js} +1 -1
  90. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-d72460348fadcab8.js → privacy-experience-289605267d6cce7e.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-3e7ddc252da00c98.js → [id]-e9fd9b28ac9705af.js} +1 -1
  92. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-35a7c305beee9428.js → new-28c003b6043bd16c.js} +1 -1
  93. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-c643eff04525298e.js +1 -0
  94. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-ab96939421639153.js → properties-3ef5d01779a26455.js} +1 -1
  95. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-baa4a2f8f08ac224.js +1 -0
  96. fides/ui-build/static/admin/_next/static/chunks/pages/{consent-13240e3ca77acfeb.js → consent-8d4be9e7ec7d2a35.js} +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-aad6047a4604b945.js → [resourceUrn]-f27ec4578c674181.js} +1 -1
  98. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-bd37b407c80c6986.js → [projectUrn]-27b6c255bd9e73b6.js} +1 -1
  99. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-0f66dac32040519c.js +1 -0
  100. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-b6b98cea25dd94fa.js → [resourceUrn]-3b938562df81c4b0.js} +1 -1
  101. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-ebf5e7fa4e2ffb49.js +1 -0
  102. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-b27c660039d951c9.js +1 -0
  103. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-8ce5d24af470888e.js +1 -0
  104. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-8e35e33928abbcdc.js +1 -0
  105. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-21c141279e66237a.js +1 -0
  106. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-31e6c54794a9883e.js → [resourceUrn]-3bc6a207693fd175.js} +1 -1
  107. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-2822a423a7ad0550.js → detection-da16e73df395ad1d.js} +1 -1
  108. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-f98dd251babb7e28.js → [resourceUrn]-04b242632a114405.js} +1 -1
  109. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-56eb4c014f0d96a3.js → discovery-900fe50183a40d72.js} +1 -1
  110. fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-8f88dc31c5144ea8.js → datamap-4f1f7c3a9531a8f4.js} +1 -1
  111. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-343294dcb10d9532.js +1 -0
  112. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-1c097a0809fa5b6f.js +1 -0
  113. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-b47fa2498b534719.js +1 -0
  114. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-a31f881cab25704a.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-858c59c9e67e318d.js +1 -0
  116. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-67a7fe58b96ea739.js → [id]-16c28d272225afb6.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-90a8df230cb89877.js → new-68f502d8b0b5792c.js} +1 -1
  118. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-1eb9acb17b133fd1.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/pages/{index-876bfd7210040cec.js → index-fec557d99211f577.js} +1 -1
  120. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-766e57bcf38b5b1e.js → [id]-e613543818d6cbd2.js} +1 -1
  121. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-8069f7c33695fd45.js +1 -0
  122. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-6e796c3fe632280b.js → [id]-4a08ca7762a19700.js} +1 -1
  123. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-fa0f3841c5bdfdeb.js → add-template-343a965dcdb3d11e.js} +1 -1
  124. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-3ade4c54b1c8a11e.js +1 -0
  125. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-9103bfb854f71410.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-11503454a62d8d7b.js → AntForm-3b97029bd4d3c3ea.js} +1 -1
  127. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-a504941807bdb7f1.js → FormikAntFormItem-9d9beb8f0d8a278c.js} +1 -1
  128. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-0119403c8ff97f83.js → FormikControlled-84a4d8fc60f839ed.js} +1 -1
  129. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-94f6d57d6c94ddf7.js → FormikField-1fccf542ab2e33bf.js} +1 -1
  130. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-ed1a3ae09d72df89.js → forms-aa75263ae1ba67bb.js} +1 -1
  131. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-db334a1cbb102255.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-11c1e4545c8f528c.js +1 -0
  133. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-192a986f61c23268.js +1 -0
  134. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-9216ac993d71387e.js +1 -0
  135. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-e55ec84d5380401d.js +1 -0
  136. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-48f447b31c786b80.js +1 -0
  137. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-41976b28503623cd.js → [id]-a74b51b704b80cb2.js} +1 -1
  138. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-cb438d8f5ec6007a.js → add-property-8d23f0c55ff6510a.js} +1 -1
  139. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-b6db7036993709b3.js → properties-77acceac4f99e7af.js} +1 -1
  140. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-4bc3e281409265cc.js → datamap-e60d398e255f4e00.js} +1 -1
  141. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-6aad3f563ed03b3f.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-c1b8f3606d160bb1.js +1 -0
  143. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-d9f7f78810d58d08.js +1 -0
  144. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-ee2c7dde99b1dafb.js +1 -0
  145. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-a4dad8ca9de2d07b.js +1 -0
  146. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-386368bf7cb31771.js → domain-records-31c270d228e00581.js} +1 -1
  147. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-996b3f250dd3ea1f.js +1 -0
  148. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-ee94981326ddcbf4.js +1 -0
  149. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-b41fb5ad277088ab.js → locations-0b831c58966782b8.js} +1 -1
  150. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-94271ba4a224a353.js +1 -0
  151. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-a94dfeea43fbca7d.js → regulations-41b8136e50320fd3.js} +1 -1
  152. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-52b45569cbc82e60.js +1 -0
  153. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-18b316e2dad73731.js → [id]-36d74e93e54aabaf.js} +1 -1
  154. fides/ui-build/static/admin/_next/static/chunks/pages/systems-24dfc8e2279ced2e.js +1 -0
  155. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-d9675cf5e6083b27.js +1 -0
  156. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-3237881945acc0ee.js → [id]-866826d7959df487.js} +1 -1
  157. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-a3a50d9d79066935.js → user-management-e63b61a8f99ccd57.js} +1 -1
  158. fides/ui-build/static/admin/_next/static/chunks/{webpack-69658aeaf6155d89.js → webpack-6d0a487039bcf30c.js} +1 -1
  159. fides/ui-build/static/admin/_next/static/css/92441453b27e9c34.css +1 -0
  160. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  161. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  162. fides/ui-build/static/admin/add-systems.html +1 -1
  163. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  164. fides/ui-build/static/admin/consent/configure.html +1 -1
  165. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  166. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  167. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  168. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  169. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  170. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  171. fides/ui-build/static/admin/consent/properties.html +1 -1
  172. fides/ui-build/static/admin/consent/reporting.html +1 -1
  173. fides/ui-build/static/admin/consent.html +1 -1
  174. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  175. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  176. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  177. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  178. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  179. fides/ui-build/static/admin/data-catalog.html +1 -1
  180. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  181. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  182. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  183. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  184. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  185. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  186. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  187. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  188. fides/ui-build/static/admin/datamap.html +1 -1
  189. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  190. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  191. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  192. fides/ui-build/static/admin/dataset/new.html +1 -1
  193. fides/ui-build/static/admin/dataset.html +1 -1
  194. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  195. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  196. fides/ui-build/static/admin/datastore-connection.html +1 -1
  197. fides/ui-build/static/admin/index.html +1 -1
  198. fides/ui-build/static/admin/integrations/[id].html +1 -1
  199. fides/ui-build/static/admin/integrations.html +1 -1
  200. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  201. fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
  202. fides/ui-build/static/admin/lib/fides.js +1 -1
  203. fides/ui-build/static/admin/login/[provider].html +1 -1
  204. fides/ui-build/static/admin/login.html +1 -1
  205. fides/ui-build/static/admin/messaging/[id].html +1 -1
  206. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  207. fides/ui-build/static/admin/messaging.html +1 -1
  208. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  209. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  210. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  211. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  212. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  213. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  214. fides/ui-build/static/admin/poc/forms.html +1 -1
  215. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  216. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  217. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  218. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  219. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  220. fides/ui-build/static/admin/privacy-requests.html +1 -1
  221. fides/ui-build/static/admin/properties/[id].html +1 -1
  222. fides/ui-build/static/admin/properties/add-property.html +1 -1
  223. fides/ui-build/static/admin/properties.html +1 -1
  224. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  225. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  226. fides/ui-build/static/admin/settings/about.html +1 -1
  227. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  228. fides/ui-build/static/admin/settings/consent.html +1 -1
  229. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  230. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  231. fides/ui-build/static/admin/settings/domains.html +1 -1
  232. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  233. fides/ui-build/static/admin/settings/locations.html +1 -1
  234. fides/ui-build/static/admin/settings/organization.html +1 -1
  235. fides/ui-build/static/admin/settings/regulations.html +1 -1
  236. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  237. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  238. fides/ui-build/static/admin/systems.html +1 -1
  239. fides/ui-build/static/admin/taxonomy.html +1 -1
  240. fides/ui-build/static/admin/user-management/new.html +1 -1
  241. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  242. fides/ui-build/static/admin/user-management.html +1 -1
  243. fides/ui-build/static/admin/_next/static/chunks/203-0c6cadcda98bdd33.js +0 -1
  244. fides/ui-build/static/admin/_next/static/chunks/3450-9314e1b15df8a8da.js +0 -1
  245. fides/ui-build/static/admin/_next/static/chunks/3855-4267fd8193e7f525.js +0 -1
  246. fides/ui-build/static/admin/_next/static/chunks/3872-ac5feefd40b61ae3.js +0 -1
  247. fides/ui-build/static/admin/_next/static/chunks/409-5bc4369b80a8c11d.js +0 -1
  248. fides/ui-build/static/admin/_next/static/chunks/4230-1ebc8c0ab293a077.js +0 -1
  249. fides/ui-build/static/admin/_next/static/chunks/431-a34d7ceff17c2169.js +0 -1
  250. fides/ui-build/static/admin/_next/static/chunks/4608-557fb24665b2e4bf.js +0 -1
  251. fides/ui-build/static/admin/_next/static/chunks/5309-ffdec884eec79d29.js +0 -1
  252. fides/ui-build/static/admin/_next/static/chunks/5574-831167a8da90e2e6.js +0 -1
  253. fides/ui-build/static/admin/_next/static/chunks/6662-499c189f932a35aa.js +0 -1
  254. fides/ui-build/static/admin/_next/static/chunks/6780-7d28e030f6516e5d.js +0 -1
  255. fides/ui-build/static/admin/_next/static/chunks/6882-7cc1d14e27a80c10.js +0 -1
  256. fides/ui-build/static/admin/_next/static/chunks/6954-7784e8d5ad6b8110.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/7476-4de465016d3433b4.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/7630-2a5c57787632693d.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/7725-c79513b04113112b.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/79-98cfab20bb831137.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/796-0b768155bf20505f.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/8735-f84afcc50885883c.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/9046-97a972cc8a8ed24d.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/9226-318dadf1c050ecda.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/9676.9e6828b42ef05e06.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/9951-4df2b67e0def5500.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-18e96ce81dab51a4.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-54d7c7310763c66d.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-6bc3b73a21576869.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-fe3d6887fecf0f86.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-e4770acf7044e2f5.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-0db635c3483c9da8.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-0c0e0a7798345541.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-3c56e5fe072a44c6.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-53a763e49ce34a74.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-6a90131dcecd694c.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-145fe9e4cfcb231d.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-8a1e5d140785c1e9.js +0 -1
  279. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-227b5db4b472a6a7.js +0 -1
  280. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-8401f17fe5d9a1dc.js +0 -1
  281. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-7d77b3ad069be268.js +0 -1
  282. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-cfb25b02abb8da71.js +0 -1
  283. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-3fdc55d4c129e618.js +0 -1
  284. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-8f9c006b6166f002.js +0 -1
  285. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-6ba7ae4f26c06cb0.js +0 -1
  286. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-e8db3ad525e7ddbd.js +0 -1
  287. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-c14dd24592369467.js +0 -1
  288. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-100d7d03930629a8.js +0 -1
  289. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-6f8d1b3ec83cfcf0.js +0 -1
  290. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-3ce15577435d47cb.js +0 -1
  291. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-f43a988542813110.js +0 -1
  292. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-1ea40fcd6b4268bf.js +0 -1
  293. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-65c7600fadc6e55a.js +0 -1
  294. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-33dab986141b3663.js +0 -1
  295. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-1195042727c399ed.js +0 -1
  296. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-71b98858ecb4e097.js +0 -1
  297. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-cf427e04f862b5d2.js +0 -1
  298. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-eabeeec5bf2773c6.js +0 -1
  299. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-ee56698ae3a6a78b.js +0 -1
  300. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-0e2e98cc38ee5499.js +0 -1
  301. fides/ui-build/static/admin/_next/static/chunks/pages/systems-c32589c86081b750.js +0 -1
  302. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-a8f09bf8f3204ca7.js +0 -1
  303. fides/ui-build/static/admin/_next/static/css/e1628f15dd5f019b.css +0 -1
  304. fides/ui-build/static/admin/_next/static/tzF4yti8NslASlGnxnZ8m/_buildManifest.js +0 -1
  305. {ethyca_fides-2.68.1b1.dist-info → ethyca_fides-2.68.1b3.dist-info}/WHEEL +0 -0
  306. {ethyca_fides-2.68.1b1.dist-info → ethyca_fides-2.68.1b3.dist-info}/entry_points.txt +0 -0
  307. {ethyca_fides-2.68.1b1.dist-info → ethyca_fides-2.68.1b3.dist-info}/licenses/LICENSE +0 -0
  308. {ethyca_fides-2.68.1b1.dist-info → ethyca_fides-2.68.1b3.dist-info}/top_level.txt +0 -0
  309. /fides/ui-build/static/admin/_next/static/{tzF4yti8NslASlGnxnZ8m → _BLI2ArqQzY5XnXbrcxa2}/_ssgManifest.js +0 -0
fides/api/db/base.py CHANGED
@@ -76,6 +76,12 @@ from fides.api.models.storage import StorageConfig
76
76
  from fides.api.models.system_compass_sync import SystemCompassSync
77
77
  from fides.api.models.system_history import SystemHistory
78
78
  from fides.api.models.system_manager import SystemManager
79
+ from fides.api.models.taxonomy import (
80
+ Taxonomy,
81
+ TaxonomyAllowedUsage,
82
+ TaxonomyElement,
83
+ TaxonomyUsage,
84
+ )
79
85
  from fides.api.models.tcf_publisher_restrictions import (
80
86
  TCFConfiguration,
81
87
  TCFPublisherRestriction,
@@ -432,11 +432,17 @@ class StagedResourceAncestor(Base):
432
432
 
433
433
  # Execute batch when it reaches the desired size
434
434
  if len(current_batch) >= batch_size:
435
+ logger.debug(
436
+ f"Inserting batch of {len(current_batch)} staged resource ancestor links"
437
+ )
435
438
  db.execute(stmt_text, current_batch)
436
439
  current_batch = []
437
440
 
438
441
  # Execute any remaining items in the final batch
439
442
  if current_batch:
443
+ logger.debug(
444
+ f"Inserting batch of {len(current_batch)} staged resource ancestor links"
445
+ )
440
446
  db.execute(stmt_text, current_batch)
441
447
 
442
448
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from enum import Enum as EnumType
5
6
  from typing import TYPE_CHECKING, List, Optional, Tuple
6
7
 
7
8
  from loguru import logger
@@ -15,6 +16,7 @@ from sqlalchemy_utils.types.encrypted.encrypted_type import (
15
16
  )
16
17
 
17
18
  from fides.api.db.base_class import Base, JSONTypeOverride # type: ignore[attr-defined]
19
+ from fides.api.db.util import EnumColumn
18
20
  from fides.api.graph.config import (
19
21
  ROOT_COLLECTION_ADDRESS,
20
22
  TERMINATOR_ADDRESS,
@@ -67,6 +69,24 @@ class TraversalDetails(FidesSchema):
67
69
  )
68
70
 
69
71
 
72
+ class AsyncTaskType(EnumType):
73
+ """
74
+ Enum for asynchronous RequestTask types
75
+
76
+ These tasks differ from our regular tasks in that they are not finished on the same process that they are created,
77
+ but rather are put into a pause state and then triggered to completion by a different process
78
+
79
+ manual: A task that is manually triggered by the user
80
+ polling: A task that is triggered by a polling mechanism
81
+ callback: A task that is triggered by a callback from an external system
82
+
83
+ """
84
+
85
+ manual = "manual"
86
+ polling = "polling"
87
+ callback = "callback"
88
+
89
+
70
90
  # TODO: At some point we will refactor this model to store all task types in a common table that links to tables with specific task attributes.
71
91
  class RequestTask(WorkerTask, Base):
72
92
  """
@@ -145,6 +165,11 @@ class RequestTask(WorkerTask, Base):
145
165
 
146
166
  # For async tasks awaiting callback
147
167
  callback_succeeded = Column(Boolean)
168
+ # to recognize Polling async task
169
+ async_type = Column(
170
+ EnumColumn(AsyncTaskType, native_enum=True),
171
+ nullable=True,
172
+ )
148
173
 
149
174
  # Stores a serialized collection that can be transformed back into a Collection to help
150
175
  # execute the current task
@@ -0,0 +1,275 @@
1
+ # pylint: disable=protected-access
2
+ from __future__ import annotations
3
+
4
+ from enum import Enum
5
+ from typing import Any, Dict, List, Optional, Type
6
+
7
+ from sqlalchemy import (
8
+ BOOLEAN,
9
+ Column,
10
+ ForeignKey,
11
+ ForeignKeyConstraint,
12
+ String,
13
+ Text,
14
+ UniqueConstraint,
15
+ )
16
+ from sqlalchemy.ext.associationproxy import association_proxy
17
+ from sqlalchemy.ext.declarative import declared_attr
18
+ from sqlalchemy.orm import RelationshipProperty, Session, relationship
19
+
20
+ from fides.api.common_exceptions import ValidationError
21
+ from fides.api.db.base_class import Base
22
+ from fides.api.models.sql_models import FidesBase # type: ignore[attr-defined]
23
+
24
+ LEGACY_TAXONOMIES = {"data_categories", "data_uses", "data_subjects"}
25
+
26
+
27
+ class TargetType(str, Enum):
28
+ """Enumeration of target types that taxonomies can apply to."""
29
+
30
+ SYSTEM = "system"
31
+ PRIVACY_DECLARATION = "privacy_declaration"
32
+ TAXONOMY = "taxonomy" # For taxonomy-to-taxonomy relationships
33
+
34
+
35
+ class Taxonomy(Base, FidesBase):
36
+ """The SQL model for taxonomy resources.
37
+
38
+ This is a generic taxonomy model that can be used to create any taxonomy.
39
+ For now we seed the database with the legacy taxonomies (data_category, data use, data subject)
40
+ so that these legacy taxonomy types can be used for allowed usage relationships.
41
+ """
42
+
43
+ # Overriding the id definition from Base so we don't treat this as the primary key
44
+ id = Column(
45
+ String(255),
46
+ nullable=False,
47
+ index=False,
48
+ unique=True,
49
+ default=FidesBase.generate_uuid,
50
+ )
51
+
52
+ # The fides_key is inherited from FidesBase and acts as the primary key
53
+
54
+ # This is private to encourage the use of applies_to (see comment below)
55
+ _allowed_usages: RelationshipProperty[List[TaxonomyAllowedUsage]] = relationship(
56
+ "TaxonomyAllowedUsage",
57
+ back_populates="source_taxonomy",
58
+ cascade="all, delete-orphan",
59
+ lazy="selectin",
60
+ )
61
+
62
+ # Association proxy to simplify access to target_type values
63
+ # This allows getting a list of strings while the actual storage
64
+ # is handled through the TaxonomyAllowedUsage model
65
+ # Updates should be done through the create/update methods
66
+ applies_to: List[str] = association_proxy(
67
+ "_allowed_usages",
68
+ "target_type",
69
+ # Allow setting via strings, the relationship backref will set FK
70
+ creator=lambda target_type: TaxonomyAllowedUsage(target_type=target_type),
71
+ )
72
+
73
+ @classmethod
74
+ def create(
75
+ cls: Type["Taxonomy"],
76
+ db: Session,
77
+ *,
78
+ data: Dict[str, Any],
79
+ check_name: bool = True,
80
+ ) -> "Taxonomy":
81
+ """Create a new Taxonomy with proper handling of applies_to."""
82
+ # Disallow creating taxonomies that represent legacy types
83
+ fides_key = data.get("fides_key")
84
+ if fides_key in LEGACY_TAXONOMIES:
85
+ raise ValidationError(
86
+ f"Cannot create taxonomy '{fides_key}'. This is a taxonomy managed by the system."
87
+ )
88
+ applies_to = data.pop("applies_to", [])
89
+
90
+ # Create the taxonomy
91
+ taxonomy: Taxonomy = super().create(db=db, data=data, check_name=check_name)
92
+
93
+ # Reconcile allowed usages if applies_to was provided
94
+ if applies_to:
95
+ taxonomy._reconcile_allowed_usages(db, applies_to)
96
+
97
+ return cls.persist_obj(db, taxonomy)
98
+
99
+ def update(self, db: Session, *, data: Dict[str, Any]) -> "Taxonomy":
100
+ """Update a Taxonomy with proper handling of applies_to."""
101
+ applies_to = data.pop("applies_to", None)
102
+
103
+ # Update the base fields
104
+ super().update(db=db, data=data)
105
+
106
+ # If applies_to was provided, reconcile allowed usages
107
+ if applies_to is not None:
108
+ self._reconcile_allowed_usages(db, applies_to)
109
+
110
+ return self
111
+
112
+ def save(self, db: Session) -> "Taxonomy":
113
+ """Override save to reconcile any direct `applies_to` edits before persisting.
114
+
115
+ This allows callers to mutate `applies_to` via the association proxy and then call save.
116
+ """
117
+ # Ensure no duplicate target types and reconcile relationship objects to the current values
118
+ self._reconcile_allowed_usages(db, list(self.applies_to))
119
+ return super().save(db) # type: ignore[return-value]
120
+
121
+ def _reconcile_allowed_usages(self, db: Session, applies_to: List[str]) -> None:
122
+ """Ensure `_allowed_usages` matches the provided `applies_to` list.
123
+
124
+ - Deletes usages not in the provided list
125
+ - Creates usages missing from the relationship
126
+ - Deduplicates by target_type
127
+ """
128
+ existing_usages = {usage.target_type: usage for usage in self._allowed_usages}
129
+ desired_types = set(applies_to)
130
+
131
+ # Delete usages that should no longer exist
132
+ for target_type in set(existing_usages.keys()) - desired_types:
133
+ # Remove from relationship; delete-orphan cascade will handle DB delete
134
+ self._allowed_usages.remove(existing_usages[target_type])
135
+
136
+ # Add missing usages
137
+ for target_type in desired_types - set(existing_usages.keys()):
138
+ self._allowed_usages.append(TaxonomyAllowedUsage(target_type=target_type))
139
+
140
+ # Deduplicate any accidental duplicates in-memory
141
+ seen: set[str] = set()
142
+ for usage in list(self._allowed_usages):
143
+ if usage.target_type in seen:
144
+ # Remove duplicate from relationship; delete-orphan will handle DB
145
+ self._allowed_usages.remove(usage)
146
+ else:
147
+ seen.add(usage.target_type)
148
+
149
+
150
+ class TaxonomyAllowedUsage(Base):
151
+ """
152
+ The SQL model for taxonomy allowed usage.
153
+ Defines what types of targets a taxonomy can be applied to.
154
+
155
+ target_type can be either:
156
+ - A generic type: "system", "privacy_declaration", "taxonomy"
157
+ - A taxonomy key: "data_categories", "data_uses", etc.
158
+ """
159
+
160
+ @declared_attr
161
+ def __tablename__(self) -> str:
162
+ return "taxonomy_allowed_usage"
163
+
164
+ id = Column(
165
+ String(255),
166
+ nullable=False,
167
+ index=False,
168
+ unique=True,
169
+ default=FidesBase.generate_uuid,
170
+ )
171
+
172
+ source_taxonomy: RelationshipProperty[Taxonomy] = relationship(
173
+ "Taxonomy",
174
+ back_populates="_allowed_usages",
175
+ )
176
+
177
+ source_taxonomy_key: Column[str] = Column(
178
+ String,
179
+ ForeignKey("taxonomy.fides_key", ondelete="CASCADE"),
180
+ primary_key=True,
181
+ )
182
+ target_type: Column[str] = Column(
183
+ String, primary_key=True
184
+ ) # Can be "system", "dataset", OR a taxonomy key like "data_categories"
185
+
186
+
187
+ class TaxonomyElement(Base, FidesBase):
188
+ """
189
+ The SQL model for taxonomy elements.
190
+
191
+ This is a generic taxonomy element model that can be used to create any taxonomy element.
192
+
193
+ As of now the legacy taxonomy elements still exist in their own tables (ctl_data_categories, ctl_data_uses, ctl_data_subjects),
194
+ but we can migrate them to this model in the future if needed.
195
+ """
196
+
197
+ @declared_attr
198
+ def __tablename__(self) -> str:
199
+ return "taxonomy_element"
200
+
201
+ id = Column(
202
+ String(255),
203
+ nullable=False,
204
+ index=False,
205
+ unique=True,
206
+ default=FidesBase.generate_uuid,
207
+ )
208
+
209
+ # Which taxonomy this element belongs to
210
+ taxonomy_type = Column(
211
+ String,
212
+ ForeignKey("taxonomy.fides_key", ondelete="CASCADE"),
213
+ nullable=False,
214
+ index=True,
215
+ )
216
+
217
+ parent_key = Column(
218
+ Text, ForeignKey("taxonomy_element.fides_key", ondelete="RESTRICT"), index=True
219
+ )
220
+ active = Column(BOOLEAN, default=True, nullable=False, index=True)
221
+
222
+ children: RelationshipProperty[List[TaxonomyElement]] = relationship(
223
+ "TaxonomyElement",
224
+ back_populates="parent",
225
+ cascade="save-update, merge, refresh-expire", # intentionally do not cascade deletes
226
+ passive_deletes="all",
227
+ )
228
+
229
+ parent: RelationshipProperty[Optional[TaxonomyElement]] = relationship(
230
+ "TaxonomyElement",
231
+ back_populates="children",
232
+ remote_side="TaxonomyElement.fides_key",
233
+ )
234
+
235
+
236
+ class TaxonomyUsage(Base):
237
+ """
238
+ The SQL model for taxonomy usage.
239
+ Tracks the application of taxonomy elements to other taxonomy elements.
240
+
241
+ Example: Applying a "high" tag (from sensitivity taxonomy) to "user.contact.email" (from data_categories taxonomy).
242
+ """
243
+
244
+ @declared_attr
245
+ def __tablename__(self) -> str:
246
+ return "taxonomy_usage"
247
+
248
+ # The taxonomy element being applied (e.g., risk)
249
+ source_element_key = Column(String, nullable=False, index=True)
250
+
251
+ # The taxonomy element it's being applied to (e.g., a data category)
252
+ target_element_key = Column(String, nullable=False, index=True)
253
+
254
+ # Denormalized taxonomy types for validation and performance
255
+ source_taxonomy = Column(String, nullable=False, index=True)
256
+ target_taxonomy = Column(String, nullable=False, index=True)
257
+
258
+ __table_args__ = (
259
+ # Validate that this type of usage is allowed
260
+ ForeignKeyConstraint(
261
+ ["source_taxonomy", "target_taxonomy"],
262
+ [
263
+ "taxonomy_allowed_usage.source_taxonomy_key",
264
+ "taxonomy_allowed_usage.target_type",
265
+ ],
266
+ ondelete="RESTRICT",
267
+ name="fk_taxonomy_usage_allowed",
268
+ ),
269
+ # Prevent duplicate applications
270
+ UniqueConstraint(
271
+ "source_element_key",
272
+ "target_element_key",
273
+ name="uq_taxonomy_usage",
274
+ ),
275
+ )
@@ -1,3 +1,4 @@
1
+ from abc import ABC
1
2
  from typing import Any, Dict, List, Literal, Optional, Union
2
3
 
3
4
  from pydantic import ConfigDict, Field, field_validator, model_validator
@@ -12,22 +13,10 @@ class CustomIdentity(FidesSchema):
12
13
  label: str
13
14
 
14
15
 
15
- class LocationIdentityField(FidesSchema):
16
- """Location field configuration that extends the useful parts of CustomPrivacyRequestField"""
17
-
18
- label: str
19
- required: Optional[bool] = True
20
- default_value: Optional[str] = None
21
- query_param_key: Optional[str] = None
22
- ip_geolocation_hint: Optional[bool] = False
23
- # Note: We intentionally omit 'hidden' field as it doesn't make sense for location identity input
24
-
25
-
26
16
  class IdentityInputs(FidesSchema):
27
17
  name: Optional[RequiredType] = None
28
18
  email: Optional[RequiredType] = None
29
19
  phone: Optional[RequiredType] = None
30
- location: Optional[Union[RequiredType, LocationIdentityField]] = None
31
20
  model_config = ConfigDict(extra="allow")
32
21
 
33
22
  def __init__(self, **data: Any):
@@ -42,13 +31,12 @@ class IdentityInputs(FidesSchema):
42
31
  f'Custom identity "{field}" must be an instance of CustomIdentity '
43
32
  '(e.g. {"label": "Field label"})'
44
33
  )
45
- elif field == "location" and isinstance(value, dict):
46
- # Handle location field as LocationIdentityField
47
- data[field] = LocationIdentityField(**value)
48
34
  super().__init__(**data)
49
35
 
50
36
 
51
- class CustomPrivacyRequestField(FidesSchema):
37
+ class BaseCustomPrivacyRequestField(FidesSchema, ABC):
38
+ """Abstract base class for all custom privacy request fields"""
39
+
52
40
  label: str
53
41
  required: Optional[bool] = True
54
42
  default_value: Optional[str] = None
@@ -69,6 +57,41 @@ class CustomPrivacyRequestField(FidesSchema):
69
57
  return values
70
58
 
71
59
 
60
+ class CustomPrivacyRequestField(BaseCustomPrivacyRequestField):
61
+ """Regular custom privacy request field supporting text, select, and multiselect types"""
62
+
63
+ field_type: Optional[Literal["text", "select", "multiselect"]] = None
64
+ options: Optional[List[str]] = None
65
+
66
+
67
+ class LocationCustomPrivacyRequestField(BaseCustomPrivacyRequestField):
68
+ """Location field that doesn't support options and includes IP geolocation hint"""
69
+
70
+ field_type: Literal["location"] = "location"
71
+ ip_geolocation_hint: Optional[bool] = False
72
+
73
+ @model_validator(mode="before")
74
+ @classmethod
75
+ def validate_location_field(cls, values: Dict[str, Any]) -> Dict[str, Any]:
76
+ # Ensure options is not provided for location fields
77
+ if "options" in values:
78
+ raise ValueError(
79
+ "LocationCustomPrivacyRequestField does not support options"
80
+ )
81
+
82
+ # This field cannot be hidden
83
+ if values.get("hidden"):
84
+ raise ValueError("Custom location fields cannot be hidden")
85
+
86
+ return values
87
+
88
+
89
+ # Create a simple union type - Pydantic will use the field_type to determine which model to use
90
+ CustomPrivacyRequestFieldUnion = Union[
91
+ LocationCustomPrivacyRequestField, CustomPrivacyRequestField
92
+ ]
93
+
94
+
72
95
  class PrivacyRequestOption(FidesSchema):
73
96
  locations: Optional[Union[List[PrivacyNoticeRegion], Literal["fallback"]]] = None
74
97
  policy_key: Optional[str] = None
@@ -79,7 +102,9 @@ class PrivacyRequestOption(FidesSchema):
79
102
  confirm_button_text: Optional[str] = Field(alias="confirmButtonText", default=None)
80
103
  cancel_button_text: Optional[str] = Field(alias="cancelButtonText", default=None)
81
104
  identity_inputs: Optional[IdentityInputs] = None
82
- custom_privacy_request_fields: Optional[Dict[str, CustomPrivacyRequestField]] = None
105
+ custom_privacy_request_fields: Optional[
106
+ Dict[str, CustomPrivacyRequestFieldUnion]
107
+ ] = None
83
108
 
84
109
 
85
110
  class ConsentConfigButton(FidesSchema):
@@ -89,7 +114,9 @@ class ConsentConfigButton(FidesSchema):
89
114
  cancel_button_text: Optional[str] = Field(alias="cancelButtonText", default=None)
90
115
  icon_path: str
91
116
  identity_inputs: IdentityInputs
92
- custom_privacy_request_fields: Optional[Dict[str, CustomPrivacyRequestField]] = None
117
+ custom_privacy_request_fields: Optional[
118
+ Dict[str, CustomPrivacyRequestFieldUnion]
119
+ ] = None
93
120
  title: str
94
121
  modal_title: Optional[str] = Field(alias="modalTitle", default=None)
95
122
 
@@ -174,7 +201,9 @@ class PartialPrivacyRequestOption(FidesSchema):
174
201
  policy_key: str
175
202
  title: str
176
203
  identity_inputs: Optional[IdentityInputs] = None
177
- custom_privacy_request_fields: Optional[Dict[str, CustomPrivacyRequestField]] = None
204
+ custom_privacy_request_fields: Optional[
205
+ Dict[str, CustomPrivacyRequestFieldUnion]
206
+ ] = None
178
207
 
179
208
 
180
209
  class PartialPrivacyCenterConfig(FidesSchema):
@@ -37,6 +37,7 @@ class StorageDetails(Enum):
37
37
  NAMING = "naming"
38
38
  MAX_RETRIES = "max_retries"
39
39
  AUTH_METHOD = "auth_method"
40
+ ENABLE_STREAMING = "enable_streaming"
40
41
  model_config = ConfigDict(extra="forbid")
41
42
 
42
43
 
@@ -58,6 +59,7 @@ class StorageDetailsS3(FileBasedStorageDetails):
58
59
  auth_method: AWSAuthMethod
59
60
  bucket: str
60
61
  max_retries: Optional[int] = 0
62
+ enable_streaming: Optional[bool] = False
61
63
  model_config = ConfigDict(use_enum_values=True)
62
64
 
63
65
 
File without changes
@@ -0,0 +1,75 @@
1
+ from loguru import logger
2
+ from sqlalchemy.orm import Session
3
+
4
+ from fides.api.common_exceptions import PrivacyRequestError
5
+ from fides.api.models.connectionconfig import ConnectionConfig
6
+ from fides.api.models.datasetconfig import DatasetConfig
7
+ from fides.api.models.privacy_request import PrivacyRequest, RequestTask
8
+ from fides.api.schemas.privacy_request import PrivacyRequestStatus
9
+ from fides.api.task.task_resources import TaskResources
10
+
11
+
12
+ def requeue_polling_request(
13
+ db: Session,
14
+ async_task: RequestTask,
15
+ ) -> None:
16
+ """Re-queue a Privacy request that polls async tasks for a given privacy request"""
17
+ # Check that the privacy request is approved or in processing
18
+ privacy_request: PrivacyRequest = async_task.privacy_request
19
+
20
+ if privacy_request.status not in [
21
+ PrivacyRequestStatus.approved,
22
+ PrivacyRequestStatus.in_processing,
23
+ ]:
24
+ raise PrivacyRequestError(
25
+ f"Cannot re-queue privacy request {privacy_request.id} with status {privacy_request.status.value}"
26
+ )
27
+
28
+ logger.info(
29
+ "Polling starting for {} task {} {}",
30
+ async_task.action_type,
31
+ async_task.collection_address,
32
+ async_task.id,
33
+ )
34
+
35
+ connection_config = get_connection_config_from_task(db, async_task)
36
+
37
+ with TaskResources(
38
+ privacy_request,
39
+ privacy_request.policy,
40
+ [connection_config],
41
+ async_task,
42
+ db,
43
+ ) as resources:
44
+ # graph_task: GraphTask = create_graph_task(db, async_task, resources)
45
+ # Currently, upstream tasks and "input keys" (which are built by data dependencies)
46
+ # are the same, but they may not be the same in the future.
47
+ # upstream_tasks = async_task.upstream_tasks_objects(db)
48
+ # upstream_access_data: List[List[Row]] = _build_upstream_access_data(
49
+ # graph_task.execution_node.input_keys, upstream_tasks
50
+ # )
51
+ # TODO: Implement the polling strategy
52
+ logger.info(f"found resources: {resources}")
53
+ return None
54
+
55
+
56
+ def get_connection_config_from_task(
57
+ db: Session, request_task: RequestTask
58
+ ) -> ConnectionConfig:
59
+ dataset_config = DatasetConfig.filter(
60
+ db=db,
61
+ conditions=(DatasetConfig.fides_key == request_task.dataset_name),
62
+ ).first()
63
+ if not dataset_config:
64
+ raise PrivacyRequestError(
65
+ f"DatasetConfig with fides_key {request_task.dataset_name} not found."
66
+ )
67
+ connection_config = ConnectionConfig.get(
68
+ db=db, object_id=dataset_config.connection_config_id
69
+ )
70
+ if not connection_config:
71
+ raise PrivacyRequestError(
72
+ f"ConnectionConfig with id {dataset_config.connection_config_id} not found."
73
+ )
74
+
75
+ return connection_config
@@ -11,7 +11,7 @@ from sqlalchemy.orm import Session
11
11
  from starlette.status import HTTP_204_NO_CONTENT
12
12
 
13
13
  from fides.api.common_exceptions import (
14
- AwaitingAsyncTaskCallback,
14
+ AwaitingAsyncTask,
15
15
  FidesopsException,
16
16
  PostProcessingException,
17
17
  SkippingConsentPropagation,
@@ -229,7 +229,6 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
229
229
  query_config: SaaSQueryConfig = self.query_config(node)
230
230
 
231
231
  # generate initial set of requests if read request is defined, otherwise raise an exception
232
-
233
232
  # An endpoint can be defined with multiple 'read' requests if the data for a single
234
233
  # collection can be accessed in multiple ways for example:
235
234
  #
@@ -336,8 +335,8 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
336
335
  if awaiting_async_callback:
337
336
  # If a read request was marked to expect async results, original response data here is ignored.
338
337
  # We'll instead use the data received in the callback URL later.
339
- # Raising an AwaitingAsyncTaskCallback to put this task in an awaiting_processing state
340
- raise AwaitingAsyncTaskCallback()
338
+ # Raising an AwaitingAsyncTask to put this task in an awaiting_processing state
339
+ raise AwaitingAsyncTask()
341
340
 
342
341
  return rows
343
342
 
@@ -641,8 +640,8 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
641
640
  if awaiting_async_callback:
642
641
  # Asynchronous masking request detected in saas config.
643
642
  # If the masking request was marked to expect async results, original responses are ignored
644
- # and we raise an AwaitingAsyncTaskCallback to put this task in an awaiting_processing state.
645
- raise AwaitingAsyncTaskCallback()
643
+ # and we raise an AwaitingAsyncTask to put this task in an awaiting_processing state.
644
+ raise AwaitingAsyncTask()
646
645
  return rows_updated
647
646
 
648
647
  @staticmethod
fides/api/service/deps.py CHANGED
@@ -8,6 +8,7 @@ from fides.service.dataset.dataset_config_service import DatasetConfigService
8
8
  from fides.service.dataset.dataset_service import DatasetService
9
9
  from fides.service.messaging.messaging_service import MessagingService
10
10
  from fides.service.privacy_request.privacy_request_service import PrivacyRequestService
11
+ from fides.service.taxonomy.taxonomy_service import TaxonomyService
11
12
  from fides.service.user.user_service import UserService
12
13
 
13
14
 
@@ -41,3 +42,7 @@ def get_user_service(
41
42
  config_proxy: ConfigProxy = Depends(get_config_proxy),
42
43
  ) -> UserService:
43
44
  return UserService(db, config, config_proxy)
45
+
46
+
47
+ def get_taxonomy_service(db: Session = Depends(get_db)) -> TaxonomyService:
48
+ return TaxonomyService(db)
@@ -5,13 +5,12 @@ import zipfile
5
5
  from collections import defaultdict
6
6
  from io import BytesIO
7
7
  from pathlib import Path
8
- from typing import Any, Optional
8
+ from typing import TYPE_CHECKING, Any, Optional
9
9
 
10
10
  import jinja2
11
11
  from jinja2 import Environment, FileSystemLoader
12
12
  from loguru import logger
13
13
 
14
- from fides.api.models.privacy_request import PrivacyRequest
15
14
  from fides.api.schemas.policy import ActionType
16
15
  from fides.api.util.storage_util import StorageJSONEncoder, format_size
17
16
 
@@ -21,6 +20,9 @@ TEXT_COLOR = "#4A5568"
21
20
  HEADER_COLOR = "#FAFAFA"
22
21
  BORDER_COLOR = "#E2E8F0"
23
22
 
23
+ if TYPE_CHECKING:
24
+ from fides.api.models.privacy_request import PrivacyRequest # pragma: no cover
25
+
24
26
 
25
27
  # pylint: disable=too-many-instance-attributes
26
28
  class DsrReportBuilder:
@@ -42,7 +44,7 @@ class DsrReportBuilder:
42
44
 
43
45
  def __init__(
44
46
  self,
45
- privacy_request: PrivacyRequest,
47
+ privacy_request: "PrivacyRequest",
46
48
  dsr_data: dict[str, Any],
47
49
  ):
48
50
  """
@@ -387,7 +389,7 @@ class DsrReportBuilder:
387
389
  return self.baos
388
390
 
389
391
 
390
- def _map_privacy_request(privacy_request: PrivacyRequest) -> dict[str, Any]:
392
+ def _map_privacy_request(privacy_request: "PrivacyRequest") -> dict[str, Any]:
391
393
  """Creates a map with a subset of values from the privacy request"""
392
394
  request_data: dict[str, Any] = {}
393
395
  request_data["id"] = privacy_request.id