ethyca-fides 2.64.5rc1__py2.py3-none-any.whl → 2.64.6b0__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.
Files changed (286) hide show
  1. {ethyca_fides-2.64.5rc1.dist-info → ethyca_fides-2.64.6b0.dist-info}/METADATA +3 -3
  2. {ethyca_fides-2.64.5rc1.dist-info → ethyca_fides-2.64.6b0.dist-info}/RECORD +237 -246
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/41a634d8c669_manual_task_restrict_deletes.py +257 -0
  5. fides/api/alembic/migrations/versions/6a76a1fa4f3f_add_manual_task_instance_table.py +256 -0
  6. fides/api/alembic/migrations/versions/aadfe83c5644_add_manual_task_to_connectiontype_enum.py +46 -0
  7. fides/api/api/v1/api.py +2 -0
  8. fides/api/api/v1/endpoints/partitioning_endpoints.py +108 -0
  9. fides/api/db/base.py +6 -3
  10. fides/api/db/database.py +27 -2
  11. fides/api/graph/config.py +16 -9
  12. fides/api/models/attachment.py +15 -3
  13. fides/api/models/comment.py +23 -5
  14. fides/api/models/connectionconfig.py +11 -0
  15. fides/api/models/db_cache.py +1 -1
  16. fides/api/models/detection_discovery/core.py +15 -15
  17. fides/api/models/fides_user_respondent_email_verification.py +27 -2
  18. fides/api/models/manual_task.py +965 -0
  19. fides/api/models/tcf_publisher_restrictions.py +16 -4
  20. fides/api/schemas/partitioning/__init__.py +17 -0
  21. fides/api/schemas/partitioning/bigquery_time_based_partitioning.py +31 -0
  22. fides/api/schemas/partitioning/time_based_partitioning.py +1376 -0
  23. fides/api/service/connectors/query_configs/bigquery_query_config.py +44 -22
  24. fides/api/service/connectors/query_configs/query_config.py +5 -2
  25. fides/api/util/connection_util.py +25 -2
  26. fides/common/api/v1/urn_registry.py +4 -0
  27. fides/ui-build/static/admin/404.html +1 -1
  28. fides/ui-build/static/admin/_next/static/7-nocO64klVotMrKmugnq/_buildManifest.js +1 -0
  29. fides/ui-build/static/admin/_next/static/chunks/{1040-c1c1372a7f909aef.js → 1040-d246ed641088a416.js} +1 -1
  30. fides/ui-build/static/admin/_next/static/chunks/1169-ae67fde0c6d69abc.js +1 -0
  31. fides/ui-build/static/admin/_next/static/chunks/1807-3beab149351d5ded.js +1 -0
  32. fides/ui-build/static/admin/_next/static/chunks/{1817-96182c1558f80b63.js → 1817-60f08a3619b9139c.js} +1 -1
  33. fides/ui-build/static/admin/_next/static/chunks/{2921-f5608275555bd7d9.js → 2921-85515257dd94ef4d.js} +1 -1
  34. fides/ui-build/static/admin/_next/static/chunks/{3450-272f26c102f3510d.js → 3450-4e472b9e2754fa47.js} +1 -1
  35. fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +1 -0
  36. fides/ui-build/static/admin/_next/static/chunks/{3855-beb58821d1ddba89.js → 3855-2d045674fbf72a3c.js} +1 -1
  37. fides/ui-build/static/admin/_next/static/chunks/{3872-82482e55e69b5a93.js → 3872-056ddf3ed9d10b51.js} +1 -1
  38. fides/ui-build/static/admin/_next/static/chunks/{3923-a54c286a2ba0a47a.js → 3923-257df982a95371b5.js} +1 -1
  39. fides/ui-build/static/admin/_next/static/chunks/{401-d2ce0a5a9120e056.js → 401-3f2160e3910d075b.js} +1 -1
  40. fides/ui-build/static/admin/_next/static/chunks/{409-86f4f687105917fb.js → 409-3e2248a63dd60e58.js} +1 -1
  41. fides/ui-build/static/admin/_next/static/chunks/4121-10bfa009892586fa.js +1 -0
  42. fides/ui-build/static/admin/_next/static/chunks/{4230-63abbdfb9e9016b9.js → 4230-38c6e446801a8729.js} +1 -1
  43. fides/ui-build/static/admin/_next/static/chunks/{431-77d59d43e90058ca.js → 431-13b0ef67d5a3df2f.js} +1 -1
  44. fides/ui-build/static/admin/_next/static/chunks/{5309-10f68cf805817cfb.js → 5309-fd8cd5aedd45f7c1.js} +1 -1
  45. fides/ui-build/static/admin/_next/static/chunks/{5574-b6db9d62362e72d9.js → 5574-028ef28c3cf16995.js} +1 -1
  46. fides/ui-build/static/admin/_next/static/chunks/570-c99f07161bd339cd.js +1 -0
  47. fides/ui-build/static/admin/_next/static/chunks/6084-fa1c82d03f6c256a.js +1 -0
  48. fides/ui-build/static/admin/_next/static/chunks/6662-d8ae12f69d325004.js +1 -0
  49. fides/ui-build/static/admin/_next/static/chunks/{6853-8a1b8e1c8b249f2f.js → 6853-2644f28976b46c25.js} +1 -1
  50. fides/ui-build/static/admin/_next/static/chunks/{6882-6c94583bffe85ba7.js → 6882-ea071425d25dd2b0.js} +1 -1
  51. fides/ui-build/static/admin/_next/static/chunks/{6954-dc3540389daf94da.js → 6954-bb360fb60aac9440.js} +1 -1
  52. fides/ui-build/static/admin/_next/static/chunks/7476-7073ec015f84a3e0.js +1 -0
  53. fides/ui-build/static/admin/_next/static/chunks/7630-302a13c63f9bfb45.js +1 -0
  54. fides/ui-build/static/admin/_next/static/chunks/787-b393c03ade9d93dc.js +1 -0
  55. fides/ui-build/static/admin/_next/static/chunks/{79-26ccd45dfd6653a7.js → 79-b67ba449b0f2cc9c.js} +1 -1
  56. fides/ui-build/static/admin/_next/static/chunks/{796-38c0f7e6755ad359.js → 796-b7608f09607288b8.js} +1 -1
  57. fides/ui-build/static/admin/_next/static/chunks/827-c6fe34fb336467ae.js +1 -0
  58. fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +1 -0
  59. fides/ui-build/static/admin/_next/static/chunks/{9046-bbce3c73af16daf9.js → 9046-ece5efe762b810cb.js} +1 -1
  60. fides/ui-build/static/admin/_next/static/chunks/{905-742074a074be1055.js → 905-ffdbd0b14167e8bd.js} +1 -1
  61. fides/ui-build/static/admin/_next/static/chunks/{9226-5e0ce31cfdedd5ee.js → 9226-c9111590692341b1.js} +1 -1
  62. fides/ui-build/static/admin/_next/static/chunks/{9392.25024e070026343d.js → 9392.9a948112de74781b.js} +1 -1
  63. fides/ui-build/static/admin/_next/static/chunks/{9676.e60a53f1f5890847.js → 9676.cc515c853b8cf578.js} +1 -1
  64. fides/ui-build/static/admin/_next/static/chunks/9767-277a0229aae7662a.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/9826-82c473dcaf892d00.js +1 -0
  66. fides/ui-build/static/admin/_next/static/chunks/{9951-d3d5d0fe4c4edb86.js → 9951-dbd76d7f3a7f1b9a.js} +1 -1
  67. fides/ui-build/static/admin/_next/static/chunks/pages/{404-d41660858638adee.js → 404-ef01376efb8427e1.js} +1 -1
  68. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-6b3539f8d82ce9ae.js → _app-1650bbc3cb8c2299.js} +92 -89
  69. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-7c5e1e845372c99b.js → manual-4057c399f58d331e.js} +1 -1
  70. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-87e78f52af21c4a9.js → multiple-2726ca51f0327347.js} +1 -1
  71. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-a2457d5da25aa854.js +1 -0
  72. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-6374a3a7747df964.js → add-vendors-9fe46ed10a7e7a1a.js} +1 -1
  73. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-0512151e2ed0f4c1.js → configure-095828301f22cdaa.js} +1 -1
  74. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-09435f4ab2deafd2.js → [id]-de60a5b74f6b20ff.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-a0039f216fb3eb93.js → new-06bb3b0bf097fcdb.js} +1 -1
  76. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-cd036518b5d4efbe.js → privacy-experience-1ee05fd0bc012ec6.js} +1 -1
  77. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-0e534580abf670be.js → [id]-5a2e61c7d88bdda1.js} +1 -1
  78. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-bb1790eb87b63109.js → new-1bc69669215fa55c.js} +1 -1
  79. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-67e9846f877a3f38.js → privacy-notices-fa8394d2e1072aba.js} +1 -1
  80. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-69a92b6ddbc2bae2.js → properties-213c5405e9e4219c.js} +1 -1
  81. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-d07d05f4b898a5ed.js → reporting-44aa77149d71a6fe.js} +1 -1
  82. fides/ui-build/static/admin/_next/static/chunks/pages/{consent-23e886d692ab6d1a.js → consent-23ab7bd613a0ad53.js} +1 -1
  83. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-c623d6f1a61c8ea9.js → [resourceUrn]-11d52f1570759c4d.js} +1 -1
  84. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-6c766c766dc97c5c.js → [projectUrn]-dae11464a091537f.js} +1 -1
  85. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-28937a8da3d73145.js → projects-7442023478422295.js} +1 -1
  86. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-57bd5cdf784f059f.js → [resourceUrn]-b83afa5565d0c84e.js} +1 -1
  87. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-51d99174c8006eb5.js → resources-d8db234a44a2ddf4.js} +1 -1
  88. fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-627fbf19dce88e81.js → data-catalog-5597d2e691313bb0.js} +1 -1
  89. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/{[systemId]-ed1629b05519a370.js → [systemId]-da06d05d255d0cd0.js} +1 -1
  90. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-ad307bfc5f51fd9d.js → [monitorId]-895591fe32af0f4c.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-07cbd61ede6e18ac.js → action-center-a932a39e29ac3489.js} +1 -1
  92. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-6a2aaed8d0e66d82.js → activity-2cfdf4d55a7594ba.js} +1 -1
  93. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-06edce289876dea1.js → [resourceUrn]-393e20924c83373e.js} +1 -1
  94. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-faf326a6200637d0.js → detection-8733807dad4bc96e.js} +1 -1
  95. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-64acf269256ee74f.js → [resourceUrn]-14bd7500362ff224.js} +1 -1
  96. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-8c3e4be6d36da66d.js → discovery-9e7dfd5a6acc2e8f.js} +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-b576a94b583a7940.js → datamap-07881d1a5fc03d41.js} +1 -1
  98. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-4912858ffde4621a.js → [...subfieldNames]-57be9d40c67b0acb.js} +1 -1
  99. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-df21dd7ca0f35718.js → [collectionName]-bd78d6c6264e2467.js} +1 -1
  100. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-5ce28a329e8f667f.js → [datasetId]-3c9103487b55e76f.js} +1 -1
  101. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-e30a546a8cfb6658.js +1 -0
  102. fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-c6fab547396df6ac.js → dataset-500610c0b60f9e7e.js} +1 -1
  103. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-d04c9925d324eee1.js → [id]-34958fe8183d9479.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-656abd09ea5ee39a.js → new-761294dbaf59bbe1.js} +1 -1
  105. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-59abd36059863e05.js +1 -0
  106. fides/ui-build/static/admin/_next/static/chunks/pages/{index-b66687e8194495a2.js → index-ae100a873eb66d59.js} +1 -1
  107. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-8eee4d0314c83e50.js +1 -0
  108. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-bf3b87b0dd702551.js +1 -0
  109. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-b74db8488e2e4b58.js → [id]-2aada2c7b9156053.js} +1 -1
  110. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-a607018ff097b6c2.js → add-template-fbb7b0c43dedf072.js} +1 -1
  111. fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-4a1a04c5179d2053.js → messaging-7230d7ee21368cef.js} +1 -1
  112. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-1567c9770a5f05aa.js → ant-components-7c234412502f8102.js} +1 -1
  113. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-4949fe7f1815462b.js → AntForm-72791aab60f3a4bf.js} +1 -1
  114. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-6085f73850302d55.js → FormikAntFormItem-da7d11d6146fa746.js} +1 -1
  115. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-a3158e8217c13850.js → FormikControlled-3045d24344e99017.js} +1 -1
  116. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-8576f1ef5c67d87d.js → FormikField-5b5b165d3f41a1de.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-341e67462b5e3352.js → forms-3afd8b6ba6234366.js} +1 -1
  118. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-52d50286216bcb8c.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-ee8d27e2f17563a0.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-535b6e5003d892eb.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-7ded688a1e832c63.js +1 -0
  122. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-d24230b890b13762.js → configure-08e0863d432b3348.js} +1 -1
  123. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-7d625b170911a072.js +1 -0
  124. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-2bedc5013e13ab52.js → [id]-b8dcb1f5213521ef.js} +1 -1
  125. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-9d68bd70299dd945.js → add-property-7d8418bb7cb9e1fd.js} +1 -1
  126. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-c3116b6bfe2e695e.js → properties-537003822f360ae7.js} +1 -1
  127. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-6dfa7091b99d8321.js → datamap-ac25749935da453b.js} +1 -1
  128. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/{alpha-9751059905bba190.js → alpha-647d59bb0aa060bf.js} +1 -1
  129. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-ad29d77012ec9dba.js → about-73adc03fe0182e3f.js} +1 -1
  130. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-32e3190c1ad00b40.js → [purpose_id]-ffa9e9e79ad75828.js} +1 -1
  131. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-4fb6c8c4bd9cdb3f.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-d2c0aac32f5d2930.js → custom-fields-94c1b7bfc6cec4d2.js} +1 -1
  133. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-a10674380f94d014.js → domain-records-e9838b8e49e64e57.js} +1 -1
  134. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-0de16778ad2f8865.js +1 -0
  135. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-aac71677024210ad.js +1 -0
  136. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-cc7d629433fa6d44.js → locations-f43e238571b21643.js} +1 -1
  137. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-f5e0a34f6ae473ad.js +1 -0
  138. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-64a813cb2741683b.js → regulations-05d3c86ca3ca4d5d.js} +1 -1
  139. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-31fcf7b52d8028b0.js +1 -0
  140. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-fb3d094e4f4585f6.js → [id]-6db01a1afe2f82d5.js} +1 -1
  141. fides/ui-build/static/admin/_next/static/chunks/pages/{systems-c2df5b7b0596a9cb.js → systems-8ec7472a7032301f.js} +1 -1
  142. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-84caae0fc02f8ae1.js +1 -0
  143. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-b124cc24b930c9e1.js → new-a2524414e968f862.js} +1 -1
  144. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-fd2ff6b13052c54e.js → [id]-e452541827698b1f.js} +1 -1
  145. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-fa052b0439920ef6.js → user-management-530be849391d2425.js} +1 -1
  146. fides/ui-build/static/admin/_next/static/chunks/{webpack-e61d457474e00565.js → webpack-e25ccaae1ef867a2.js} +1 -1
  147. fides/ui-build/static/admin/_next/static/css/23391a3311f80cfe.css +1 -0
  148. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  149. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  150. fides/ui-build/static/admin/add-systems.html +1 -1
  151. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  152. fides/ui-build/static/admin/consent/configure.html +1 -1
  153. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  154. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  155. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  156. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  157. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  158. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  159. fides/ui-build/static/admin/consent/properties.html +1 -1
  160. fides/ui-build/static/admin/consent/reporting.html +1 -1
  161. fides/ui-build/static/admin/consent.html +1 -1
  162. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  163. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  164. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  165. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  166. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  167. fides/ui-build/static/admin/data-catalog.html +1 -1
  168. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  169. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  170. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  171. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  172. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  173. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  174. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  175. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  176. fides/ui-build/static/admin/datamap.html +1 -1
  177. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  178. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  179. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  180. fides/ui-build/static/admin/dataset/new.html +1 -1
  181. fides/ui-build/static/admin/dataset.html +1 -1
  182. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  183. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  184. fides/ui-build/static/admin/datastore-connection.html +1 -1
  185. fides/ui-build/static/admin/index.html +1 -1
  186. fides/ui-build/static/admin/integrations/[id].html +1 -1
  187. fides/ui-build/static/admin/integrations.html +1 -1
  188. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  189. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  190. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  191. fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
  192. fides/ui-build/static/admin/lib/fides.js +2 -2
  193. fides/ui-build/static/admin/login/[provider].html +1 -1
  194. fides/ui-build/static/admin/login.html +1 -1
  195. fides/ui-build/static/admin/messaging/[id].html +1 -1
  196. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  197. fides/ui-build/static/admin/messaging.html +1 -1
  198. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  199. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  200. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  201. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  202. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  203. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  204. fides/ui-build/static/admin/poc/forms.html +1 -1
  205. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  206. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  207. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  208. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  209. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  210. fides/ui-build/static/admin/privacy-requests.html +1 -1
  211. fides/ui-build/static/admin/properties/[id].html +1 -1
  212. fides/ui-build/static/admin/properties/add-property.html +1 -1
  213. fides/ui-build/static/admin/properties.html +1 -1
  214. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  215. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  216. fides/ui-build/static/admin/settings/about.html +1 -1
  217. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  218. fides/ui-build/static/admin/settings/consent.html +1 -1
  219. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  220. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  221. fides/ui-build/static/admin/settings/domains.html +1 -1
  222. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  223. fides/ui-build/static/admin/settings/locations.html +1 -1
  224. fides/ui-build/static/admin/settings/organization.html +1 -1
  225. fides/ui-build/static/admin/settings/regulations.html +1 -1
  226. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  227. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  228. fides/ui-build/static/admin/systems.html +1 -1
  229. fides/ui-build/static/admin/taxonomy.html +1 -1
  230. fides/ui-build/static/admin/user-management/new.html +1 -1
  231. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  232. fides/ui-build/static/admin/user-management.html +1 -1
  233. fides/api/models/manual_tasks/__init__.py +0 -14
  234. fides/api/models/manual_tasks/manual_task.py +0 -120
  235. fides/api/models/manual_tasks/manual_task_config.py +0 -136
  236. fides/api/models/manual_tasks/manual_task_log.py +0 -104
  237. fides/api/schemas/manual_tasks/__init__.py +0 -0
  238. fides/api/schemas/manual_tasks/manual_task_config.py +0 -311
  239. fides/api/schemas/manual_tasks/manual_task_schemas.py +0 -79
  240. fides/api/schemas/manual_tasks/manual_task_status.py +0 -151
  241. fides/service/manual_tasks/__init__.py +0 -0
  242. fides/service/manual_tasks/manual_task_config_service.py +0 -370
  243. fides/service/manual_tasks/manual_task_service.py +0 -294
  244. fides/service/manual_tasks/utils.py +0 -185
  245. fides/ui-build/static/admin/_next/static/chunks/1100-3fdbdf211c3c2a5b.js +0 -1
  246. fides/ui-build/static/admin/_next/static/chunks/2430-b480401d44c55416.js +0 -1
  247. fides/ui-build/static/admin/_next/static/chunks/3505-192986c86dc47869.js +0 -1
  248. fides/ui-build/static/admin/_next/static/chunks/3513-a563133845dc990f.js +0 -1
  249. fides/ui-build/static/admin/_next/static/chunks/3670-2abd9b2f17770872.js +0 -1
  250. fides/ui-build/static/admin/_next/static/chunks/3983-17ae9c232bddc413.js +0 -1
  251. fides/ui-build/static/admin/_next/static/chunks/4060-3486b45081151b69.js +0 -1
  252. fides/ui-build/static/admin/_next/static/chunks/4121-f0aecb2abd384945.js +0 -1
  253. fides/ui-build/static/admin/_next/static/chunks/4481-d181a9db72984adf.js +0 -1
  254. fides/ui-build/static/admin/_next/static/chunks/6060-cb1ab5be7067bf7b.js +0 -4
  255. fides/ui-build/static/admin/_next/static/chunks/6277-ccdb50f676a1b336.js +0 -1
  256. fides/ui-build/static/admin/_next/static/chunks/6659-b2088f525bf13c17.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/6662-42940a2b00933e79.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/69-943b19d39da339d9.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/7553-e7ae268701f3dcfe.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/8433-1e065c55c8da73b0.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/9767-96ed554a043c3c4d.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-68955d8441e60668.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-5287c76ecf600281.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-23fbec0590c8d192.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-906bc5f05702efb0.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-024a1facb9be04d0.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-6f0e64f0c52bd68f.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-6971c7773dbf9b51.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-303bd2182da03088.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-831572cc7f42615f.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-569ff31eff637034.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-13a17a4ace7293d1.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-78449b0e02bced88.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-7d299c4cb3199036.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-a9fa55c40fa570a6.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-547b0cfe1e49e6d2.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-261deb6fb3e51cb3.js +0 -1
  279. fides/ui-build/static/admin/_next/static/css/c693338e3bc8dcc6.css +0 -1
  280. fides/ui-build/static/admin/_next/static/css/e458b5f1afdbb7fc.css +0 -1
  281. fides/ui-build/static/admin/_next/static/wyqNbL8A-USLbXV5z1vV0/_buildManifest.js +0 -1
  282. {ethyca_fides-2.64.5rc1.dist-info → ethyca_fides-2.64.6b0.dist-info}/WHEEL +0 -0
  283. {ethyca_fides-2.64.5rc1.dist-info → ethyca_fides-2.64.6b0.dist-info}/entry_points.txt +0 -0
  284. {ethyca_fides-2.64.5rc1.dist-info → ethyca_fides-2.64.6b0.dist-info}/licenses/LICENSE +0 -0
  285. {ethyca_fides-2.64.5rc1.dist-info → ethyca_fides-2.64.6b0.dist-info}/top_level.txt +0 -0
  286. /fides/ui-build/static/admin/_next/static/{wyqNbL8A-USLbXV5z1vV0 → 7-nocO64klVotMrKmugnq}/_ssgManifest.js +0 -0
@@ -0,0 +1,108 @@
1
+ from typing import List
2
+
3
+ from fastapi import HTTPException, Security, status
4
+ from loguru import logger
5
+ from sqlalchemy_bigquery import BigQueryDialect
6
+
7
+ from fides.api.oauth.utils import verify_oauth_client
8
+ from fides.api.schemas.partitioning.time_based_partitioning import (
9
+ TimeBasedPartitioning,
10
+ combine_partitions,
11
+ )
12
+ from fides.api.util.api_router import APIRouter
13
+ from fides.common.api.scope_registry import CTL_DATASET_READ
14
+ from fides.common.api.v1.urn_registry import V1_URL_PREFIX
15
+
16
+ router = APIRouter(tags=["Partitions"], prefix=V1_URL_PREFIX)
17
+
18
+
19
+ @router.post(
20
+ "/dataset/partitions/verify",
21
+ dependencies=[Security(verify_oauth_client, scopes=[CTL_DATASET_READ])],
22
+ response_model=List[str],
23
+ status_code=status.HTTP_200_OK,
24
+ name="Verify dataset partitioning schemas",
25
+ summary="Verify dataset partitioning schemas",
26
+ description="Validate the provided partitioning specs and return the rendered SQL WHERE clauses in the BigQuery dialect.",
27
+ openapi_extra={
28
+ "requestBody": {
29
+ "content": {
30
+ "application/json": {
31
+ "schema": {
32
+ "type": "array",
33
+ "items": {"$ref": "#/components/schemas/TimeBasedPartitioning"},
34
+ },
35
+ "examples": {
36
+ "recent_data_weekly": {
37
+ "summary": "Recent data partitioned weekly",
38
+ "description": "Partition the last 30 days of data into weekly chunks",
39
+ "value": [
40
+ {
41
+ "field": "created_at",
42
+ "start": "NOW() - 30 DAYS",
43
+ "end": "NOW()",
44
+ "interval": "7 DAYS",
45
+ }
46
+ ],
47
+ },
48
+ "historical_data_monthly": {
49
+ "summary": "Historical data partitioned monthly",
50
+ "description": "Partition a specific year of data into monthly chunks",
51
+ "value": [
52
+ {
53
+ "field": "order_date",
54
+ "start": "2024-01-01",
55
+ "end": "2024-12-31",
56
+ "interval": "1 MONTH",
57
+ }
58
+ ],
59
+ },
60
+ "multiple_partitions": {
61
+ "summary": "Multiple time ranges",
62
+ "description": "Combine historical monthly data with recent daily data",
63
+ "value": [
64
+ {
65
+ "field": "event_timestamp",
66
+ "start": "2023-01-01",
67
+ "end": "2023-12-31",
68
+ "interval": "1 MONTH",
69
+ },
70
+ {
71
+ "field": "event_timestamp",
72
+ "start": "NOW() - 14 DAYS",
73
+ "end": "NOW()",
74
+ "interval": "1 DAY",
75
+ },
76
+ ],
77
+ },
78
+ "open_ended_partition": {
79
+ "summary": "Open-ended partition",
80
+ "description": "Partition all data from a specific date onwards",
81
+ "value": [
82
+ {"field": "user_created_at", "start": "2024-01-01"}
83
+ ],
84
+ },
85
+ },
86
+ }
87
+ }
88
+ }
89
+ },
90
+ )
91
+ async def verify_dataset_partitioning(
92
+ partitions: List[TimeBasedPartitioning],
93
+ ) -> List[str]:
94
+ """Validate the provided partitioning specs and return the rendered SQL WHERE clauses in the BigQuery dialect."""
95
+ try:
96
+ expressions = combine_partitions(partitions)
97
+ dialect = BigQueryDialect()
98
+ compiled_clauses: List[str] = [
99
+ str(expr.compile(dialect=dialect, compile_kwargs={"literal_binds": True}))
100
+ for expr in expressions
101
+ ]
102
+ return compiled_clauses
103
+ except Exception as exc:
104
+ logger.error("Partitioning verification failed", exc_info=True)
105
+ raise HTTPException(
106
+ status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
107
+ detail=str(exc),
108
+ )
fides/api/db/base.py CHANGED
@@ -31,12 +31,15 @@ from fides.api.models.fides_user_respondent_email_verification import (
31
31
  )
32
32
  from fides.api.models.identity_salt import IdentitySalt
33
33
  from fides.api.models.location_regulation_selections import LocationRegulationSelections
34
- from fides.api.models.manual_tasks.manual_task import ManualTask, ManualTaskReference
35
- from fides.api.models.manual_tasks.manual_task_config import (
34
+ from fides.api.models.manual_task import (
35
+ ManualTask,
36
36
  ManualTaskConfig,
37
37
  ManualTaskConfigField,
38
+ ManualTaskInstance,
39
+ ManualTaskLog,
40
+ ManualTaskReference,
41
+ ManualTaskSubmission,
38
42
  )
39
- from fides.api.models.manual_tasks.manual_task_log import ManualTaskLog
40
43
  from fides.api.models.manual_webhook import AccessManualWebhook
41
44
  from fides.api.models.messaging import MessagingConfig
42
45
  from fides.api.models.messaging_template import MessagingTemplate
fides/api/db/database.py CHANGED
@@ -15,8 +15,8 @@ from sqlalchemy_utils.types.encrypted.encrypted_type import InvalidCiphertextErr
15
15
 
16
16
  from fides.api.db.base import Base # type: ignore[attr-defined]
17
17
  from fides.api.db.seed import load_default_resources
18
+ from fides.api.db.session import get_db_engine
18
19
  from fides.api.util.errors import get_full_exception_name
19
- from fides.core.utils import get_db_engine
20
20
 
21
21
  DatabaseHealth = Literal["healthy", "unhealthy", "needs migration"]
22
22
 
@@ -41,6 +41,14 @@ def upgrade_db(alembic_config: Config, revision: str = "head") -> None:
41
41
  command.upgrade(alembic_config, revision)
42
42
 
43
43
 
44
+ def init_db(database_url: str) -> None:
45
+ """
46
+ Runs the migrations and creates all of the database objects.
47
+ """
48
+ alembic_config = get_alembic_config(database_url)
49
+ upgrade_db(alembic_config)
50
+
51
+
44
52
  def downgrade_db(alembic_config: Config, revision: str = "head") -> None:
45
53
  """Downgrade the database to the specified migration revision."""
46
54
  log.info(f"Running database downgrade to revision {revision}")
@@ -78,7 +86,7 @@ def reset_db(database_url: str) -> None:
78
86
  Drops all tables/metadata from the database.
79
87
  """
80
88
  log.info("Resetting database...")
81
- engine = get_db_engine(database_url)
89
+ engine = get_db_engine(database_uri=database_url)
82
90
  with engine.connect() as connection:
83
91
  log.info("Dropping tables...")
84
92
  Base.metadata.drop_all(connection)
@@ -136,3 +144,20 @@ def configure_db(database_url: str, revision: Optional[str] = "head") -> None:
136
144
  log.error("Unable to configure database: {}: {}", error_type, error)
137
145
  log.opt(exception=True).error(error)
138
146
  raise
147
+
148
+
149
+ def check_missing_migrations(database_url: str) -> None:
150
+ """
151
+ Tries to autogenerate migrations, returns True if a migration
152
+ was generated.
153
+ """
154
+
155
+ engine = get_db_engine(database_uri=database_url)
156
+ connection = engine.connect()
157
+
158
+ migration_context = migration.MigrationContext.configure(connection)
159
+ result = command.autogen.compare_metadata(migration_context, Base.metadata) # type: ignore[attr-defined]
160
+
161
+ if result:
162
+ raise SystemExit("Migrations needs to be generated!")
163
+ print("No migrations need to be generated.")
fides/api/graph/config.py CHANGED
@@ -95,6 +95,10 @@ from fides.api.graph.data_type import (
95
95
  DataTypeConverter,
96
96
  get_data_type_converter,
97
97
  )
98
+ from fides.api.schemas.partitioning import TimeBasedPartitioning
99
+ from fides.api.schemas.partitioning.time_based_partitioning import (
100
+ validate_partitioning_list,
101
+ )
98
102
  from fides.api.util.collection_util import merge_dicts
99
103
  from fides.api.util.querytoken import QueryToken
100
104
 
@@ -459,7 +463,7 @@ class Collection(BaseModel):
459
463
  grouped_inputs: Set[str] = set()
460
464
  data_categories: Set[FidesKey] = set()
461
465
  masking_strategy_override: Optional[MaskingStrategyOverride] = None
462
- partitioning: Optional[Dict] = None
466
+ partitioning: Optional[Union[List[TimeBasedPartitioning], Dict[str, Any]]] = None
463
467
 
464
468
  @property
465
469
  def field_dict(self) -> Dict[FieldPath, Field]:
@@ -655,14 +659,12 @@ class Collection(BaseModel):
655
659
  @field_validator("partitioning")
656
660
  @classmethod
657
661
  def validate_partitioning(
658
- cls, partitioning: Optional[Dict[str, Any]]
659
- ) -> Optional[Dict[str, Any]]:
662
+ cls, partitioning: Optional[Union[List[TimeBasedPartitioning], Dict[str, Any]]]
663
+ ) -> Optional[Union[List[TimeBasedPartitioning], Dict[str, Any]]]:
660
664
  """
661
- Validates the `partitioning` dict field.
662
-
663
- The `partitioning` dict field is untyped in Fideslang, but here we enforce
664
- that it has the required and expected `where_clauses` key, whose value must be
665
- a list of strings.
665
+ Validates the `partitioning` field, which may be either a single dict
666
+ or a list of dicts. Each dict must describe either legacy
667
+ `where_clauses` or the required keys for time-based partitioning.
666
668
 
667
669
  The string values are validated to ensure they match the expected syntax, which
668
670
  is strictly prescribed. The string values MUST be a valid SQL clause that defines
@@ -683,7 +685,12 @@ class Collection(BaseModel):
683
685
  in its conditional
684
686
 
685
687
  """
686
- if not partitioning:
688
+
689
+ if partitioning is None:
690
+ return partitioning
691
+
692
+ if isinstance(partitioning, list):
693
+ validate_partitioning_list(partitioning)
687
694
  return partitioning
688
695
 
689
696
  # NOTE: when we deprecate `where_clause` partitioning in favor of a more proper partitioning DSL,
@@ -5,9 +5,9 @@ from typing import IO, TYPE_CHECKING, Any, Tuple
5
5
 
6
6
  from fideslang.validation import AnyHttpUrlString
7
7
  from loguru import logger as log
8
- from sqlalchemy import Column
8
+ from sqlalchemy import Column, DateTime
9
9
  from sqlalchemy import Enum as EnumColumn
10
- from sqlalchemy import ForeignKey, String, UniqueConstraint, orm
10
+ from sqlalchemy import ForeignKey, Index, String, UniqueConstraint, func, orm
11
11
  from sqlalchemy.ext.declarative import declared_attr
12
12
  from sqlalchemy.orm import Session, relationship
13
13
 
@@ -64,8 +64,14 @@ class AttachmentReference(Base):
64
64
  """Overriding base class method to set the table name."""
65
65
  return "attachment_reference"
66
66
 
67
+ created_at = Column(
68
+ DateTime(timezone=True), server_default=func.now(), nullable=False
69
+ )
70
+
67
71
  attachment_id = Column(
68
- String, ForeignKey("attachment.id", ondelete="CASCADE"), nullable=False
72
+ String,
73
+ ForeignKey("attachment.id", name="attachment_reference_attachment_id_fkey"),
74
+ nullable=False,
69
75
  )
70
76
  reference_id = Column(String, nullable=False)
71
77
  reference_type = Column(EnumColumn(AttachmentReferenceType), nullable=False)
@@ -74,6 +80,8 @@ class AttachmentReference(Base):
74
80
  UniqueConstraint(
75
81
  "attachment_id", "reference_id", name="_attachment_reference_uc"
76
82
  ),
83
+ Index("ix_attachment_reference_reference_id", "reference_id"),
84
+ Index("ix_attachment_reference_reference_type", "reference_type"),
77
85
  )
78
86
 
79
87
  # Relationships
@@ -92,6 +100,10 @@ class Attachment(Base):
92
100
  Stores information about an Attachment.
93
101
  """
94
102
 
103
+ created_at = Column(
104
+ DateTime(timezone=True), server_default=func.now(), nullable=False
105
+ )
106
+
95
107
  user_id = Column(
96
108
  String, ForeignKey("fidesuser.id", ondelete="SET NULL"), nullable=True
97
109
  )
@@ -1,13 +1,13 @@
1
1
  from enum import Enum as EnumType
2
2
  from typing import TYPE_CHECKING, Any
3
3
 
4
- from sqlalchemy import Column
4
+ from sqlalchemy import Column, DateTime
5
5
  from sqlalchemy import Enum as EnumColumn
6
- from sqlalchemy import ForeignKey, String, UniqueConstraint, orm
6
+ from sqlalchemy import ForeignKey, Index, String, func, orm
7
7
  from sqlalchemy.ext.declarative import declared_attr
8
8
  from sqlalchemy.orm import Session, relationship
9
9
 
10
- from fides.api.db.base_class import Base
10
+ from fides.api.db.base_class import Base, FidesBase
11
11
  from fides.api.models.attachment import Attachment, AttachmentReferenceType
12
12
 
13
13
  if TYPE_CHECKING:
@@ -36,6 +36,7 @@ class CommentReferenceType(str, EnumType):
36
36
  access_manual_webhook = "access_manual_webhook"
37
37
  erasure_manual_webhook = "erasure_manual_webhook"
38
38
  privacy_request = "privacy_request"
39
+ manual_task_submission = "manual_task_submission"
39
40
 
40
41
 
41
42
  class CommentReference(Base):
@@ -48,12 +49,24 @@ class CommentReference(Base):
48
49
  """Overriding base class method to set the table name."""
49
50
  return "comment_reference"
50
51
 
51
- comment_id = Column(String, ForeignKey("comment.id"), nullable=False)
52
+ id = Column(String(255), primary_key=True, default=FidesBase.generate_uuid)
53
+ created_at = Column(
54
+ DateTime(timezone=True), server_default=func.now(), nullable=False
55
+ )
56
+
57
+ comment_id = Column(
58
+ String,
59
+ ForeignKey(
60
+ "comment.id", name="comment_reference_comment_id_fkey", ondelete="CASCADE"
61
+ ),
62
+ nullable=False,
63
+ )
52
64
  reference_id = Column(String, nullable=False)
53
65
  reference_type = Column(EnumColumn(CommentReferenceType), nullable=False)
54
66
 
55
67
  __table_args__ = (
56
- UniqueConstraint("comment_id", "reference_id", name="comment_reference_uc"),
68
+ Index("ix_comment_reference_reference_id", "reference_id"),
69
+ Index("ix_comment_reference_reference_type", "reference_type"),
57
70
  )
58
71
 
59
72
  comment = relationship(
@@ -75,6 +88,11 @@ class Comment(Base):
75
88
  Stores information about a Comment.
76
89
  """
77
90
 
91
+ id = Column(String(255), primary_key=True, default=FidesBase.generate_uuid)
92
+ created_at = Column(
93
+ DateTime(timezone=True), server_default=func.now(), nullable=False
94
+ )
95
+
78
96
  user_id = Column(
79
97
  String, ForeignKey("fidesuser.id", ondelete="SET NULL"), nullable=True
80
98
  )
@@ -53,6 +53,7 @@ class ConnectionType(enum.Enum):
53
53
  https = "https"
54
54
  manual = "manual" # Deprecated - use manual_webhook instead
55
55
  manual_webhook = "manual_webhook" # Runs upfront before the traversal
56
+ manual_task = "manual_task" # Manual task integration
56
57
  mariadb = "mariadb"
57
58
  mongodb = "mongodb"
58
59
  mssql = "mssql"
@@ -88,6 +89,7 @@ class ConnectionType(enum.Enum):
88
89
  ConnectionType.google_cloud_sql_postgres.value: "Google Cloud SQL for Postgres",
89
90
  ConnectionType.https.value: "Policy Webhook",
90
91
  ConnectionType.manual_webhook.value: "Manual Process",
92
+ ConnectionType.manual_task.value: "Manual Task",
91
93
  ConnectionType.manual.value: "Manual Connector",
92
94
  ConnectionType.mariadb.value: "MariaDB",
93
95
  ConnectionType.mongodb.value: "MongoDB",
@@ -132,6 +134,7 @@ class ConnectionType(enum.Enum):
132
134
  ConnectionType.google_cloud_sql_postgres.value: SystemType.database,
133
135
  ConnectionType.https.value: SystemType.manual,
134
136
  ConnectionType.manual_webhook.value: SystemType.manual,
137
+ ConnectionType.manual_task.value: SystemType.manual,
135
138
  ConnectionType.manual.value: SystemType.manual,
136
139
  ConnectionType.mariadb.value: SystemType.database,
137
140
  ConnectionType.mongodb.value: SystemType.database,
@@ -229,6 +232,14 @@ class ConnectionConfig(Base):
229
232
  uselist=False,
230
233
  )
231
234
 
235
+ manual_task = relationship( # type: ignore[misc]
236
+ "ManualTask",
237
+ primaryjoin="and_(ConnectionConfig.id == foreign(ManualTask.parent_entity_id), "
238
+ "ManualTask.parent_entity_type == 'connection_config')",
239
+ cascade="delete",
240
+ uselist=False,
241
+ )
242
+
232
243
  pre_approval_webhooks = relationship( # type: ignore[misc]
233
244
  "PreApprovalWebhook",
234
245
  back_populates="connection_config",
@@ -32,7 +32,7 @@ class DBCache(Base):
32
32
  cache_value = Column(BYTEA, nullable=False)
33
33
 
34
34
  __table_args__ = (
35
- Index("ix_dbcache_namespace_cache_key", "namespace", "cache_key"),
35
+ Index("ix_dbcache_namespace_cache_key", "namespace", "cache_key", unique=True),
36
36
  )
37
37
 
38
38
  @classmethod
@@ -159,6 +159,8 @@ class MonitorConfig(Base):
159
159
  "MonitorExecution",
160
160
  cascade="all, delete-orphan",
161
161
  backref="monitor_config",
162
+ primaryjoin="MonitorExecution.monitor_config_key == foreign(MonitorConfig.key)",
163
+ single_parent=True,
162
164
  )
163
165
 
164
166
  shared_config_id = Column(
@@ -342,16 +344,16 @@ class StagedResourceAncestor(Base):
342
344
  Its entries should be deleted when the staged resource is deleted, via cascade.
343
345
  """
344
346
 
347
+ id = Column(String(255), primary_key=True, default=FidesBase.generate_uuid)
348
+
345
349
  ancestor_urn = Column(
346
350
  String,
347
351
  ForeignKey("stagedresource.urn", ondelete="CASCADE"),
348
- primary_key=True,
349
352
  nullable=False,
350
353
  )
351
354
  descendant_urn = Column(
352
355
  String,
353
356
  ForeignKey("stagedresource.urn", ondelete="CASCADE"),
354
- primary_key=True,
355
357
  nullable=False,
356
358
  )
357
359
 
@@ -372,6 +374,7 @@ class StagedResourceAncestor(Base):
372
374
  UniqueConstraint(
373
375
  "ancestor_urn", "descendant_urn", name="uq_staged_resource_ancestor"
374
376
  ),
377
+ Index("ix_staged_resource_ancestor_pkey", "id", unique=True),
375
378
  Index("ix_staged_resource_ancestor_ancestor", "ancestor_urn"),
376
379
  Index("ix_staged_resource_ancestor_descendant", "descendant_urn"),
377
380
  )
@@ -470,12 +473,7 @@ class StagedResource(Base):
470
473
  server_default="{}",
471
474
  default=dict,
472
475
  )
473
- user_assigned_system_id = Column(
474
- String,
475
- ForeignKey(System.id_field_path),
476
- nullable=True,
477
- index=True,
478
- )
476
+ user_assigned_system_id = Column(String, nullable=True, index=True)
479
477
 
480
478
  # pointers to child and parent URNs
481
479
  children = Column(
@@ -527,7 +525,7 @@ class StagedResource(Base):
527
525
 
528
526
  data_uses = Column(
529
527
  ARRAY(String),
530
- nullable=False,
528
+ nullable=True,
531
529
  server_default="{}",
532
530
  default=dict,
533
531
  )
@@ -588,12 +586,14 @@ class MonitorExecution(Base):
588
586
  configuration details used in connecting to the external data store.
589
587
  """
590
588
 
591
- monitor_config_key = Column(
592
- String,
593
- ForeignKey(MonitorConfig.key),
594
- nullable=False,
595
- index=True,
596
- )
589
+ # redefined here because there's a minor, unintended discrepancy between
590
+ # this `id` field and that of the `Base` class, which explicitly sets `index=True`.
591
+ # TODO: we likely should _not_ be setting `index=True` on the `id`
592
+ # attribute of the `Base` class, as `primary_key=True` already specifies a
593
+ # primary key constraint, which will implicitly create an index for the field.
594
+ id = Column(String(255), primary_key=True, default=FidesBase.generate_uuid)
595
+
596
+ monitor_config_key = Column(String, nullable=False, index=True)
597
597
  status = Column(String, nullable=True)
598
598
  started = Column(
599
599
  DateTime(timezone=True),
@@ -3,12 +3,13 @@ from __future__ import annotations
3
3
  from datetime import datetime, timedelta, timezone
4
4
  from typing import TYPE_CHECKING, Any, Optional
5
5
 
6
- from sqlalchemy import Column, DateTime, ForeignKey, String
6
+ from sqlalchemy import Column, DateTime, ForeignKey, Index, String
7
7
  from sqlalchemy.ext.declarative import declared_attr
8
8
  from sqlalchemy.orm import Session, relationship
9
+ from sqlalchemy.sql import func
9
10
 
10
11
  from fides.api.cryptography.cryptographic_util import generate_secure_random_string
11
- from fides.api.db.base_class import Base
12
+ from fides.api.db.base_class import Base, FidesBase
12
13
  from fides.api.util.identity_verification import IdentityVerificationMixin
13
14
  from fides.config import get_config
14
15
 
@@ -40,6 +41,22 @@ class FidesUserRespondentEmailVerification(Base, IdentityVerificationMixin):
40
41
  def __tablename__(self) -> str:
41
42
  return "fides_user_respondent_email_verification"
42
43
 
44
+ # redefined here because there's a minor, unintended discrepancy between
45
+ # this `id` field and that of the `Base` class, which explicitly sets `index=True`.
46
+ # TODO: we likely should _not_ be setting `index=True` on the `id`
47
+ # attribute of the `Base` class, as `primary_key=True` already specifies a
48
+ # primary key constraint, which will implicitly create an index for the field.
49
+ id = Column(String(255), primary_key=True, default=FidesBase.generate_uuid)
50
+ created_at = Column(
51
+ DateTime(timezone=True), server_default=func.now(), nullable=False
52
+ )
53
+ updated_at = Column(
54
+ DateTime(timezone=True),
55
+ server_default=func.now(),
56
+ onupdate=func.now(),
57
+ nullable=False,
58
+ )
59
+
43
60
  user_id = Column(
44
61
  String,
45
62
  ForeignKey("fidesuser.id", ondelete="CASCADE"),
@@ -59,6 +76,14 @@ class FidesUserRespondentEmailVerification(Base, IdentityVerificationMixin):
59
76
  foreign_keys=[user_id],
60
77
  )
61
78
 
79
+ __table_args__ = (
80
+ Index(
81
+ "ix_fides_user_respondent_email_verification_id",
82
+ "id",
83
+ unique=True,
84
+ ),
85
+ )
86
+
62
87
  @classmethod
63
88
  def create(
64
89
  cls, db: Session, *, data: dict[str, Any], check_name: bool = False