ethyca-fides 2.59.1rc0__py2.py3-none-any.whl → 2.59.2b1__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 (230) hide show
  1. {ethyca_fides-2.59.1rc0.dist-info → ethyca_fides-2.59.2b1.dist-info}/METADATA +2 -2
  2. {ethyca_fides-2.59.1rc0.dist-info → ethyca_fides-2.59.2b1.dist-info}/RECORD +202 -198
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/c9c72b3d550b_data_migration_cookie_asset.py +218 -0
  5. fides/api/api/v1/endpoints/storage_endpoints.py +5 -4
  6. fides/api/db/system.py +1 -121
  7. fides/api/models/asset.py +1 -2
  8. fides/api/models/fides_user.py +1 -0
  9. fides/api/models/privacy_notice.py +14 -19
  10. fides/api/models/sql_models.py +0 -51
  11. fides/api/schemas/application_config.py +1 -0
  12. fides/api/schemas/connection_configuration/connection_secrets_datahub.py +3 -3
  13. fides/api/schemas/connection_configuration/connection_secrets_postgres.py +7 -7
  14. fides/api/schemas/messaging/messaging.py +9 -2
  15. fides/api/schemas/storage/storage.py +35 -1
  16. fides/api/schemas/storage/storage_secrets_docs_only.py +8 -2
  17. fides/api/schemas/system.py +1 -2
  18. fides/api/service/connectors/postgres_connector.py +1 -0
  19. fides/api/service/storage/gcs.py +38 -0
  20. fides/api/service/storage/storage_authenticator_service.py +28 -0
  21. fides/api/service/storage/storage_uploader_service.py +25 -1
  22. fides/api/tasks/storage.py +45 -1
  23. fides/api/util/storage_util.py +2 -0
  24. fides/service/messaging/aws_ses_service.py +25 -16
  25. fides/ui-build/static/admin/404.html +1 -1
  26. fides/ui-build/static/admin/_next/static/4ZsbAUsCLedx18AUPZCUU/_buildManifest.js +1 -0
  27. fides/ui-build/static/admin/_next/static/chunks/146-106021bf1ae6e912.js +1 -0
  28. fides/ui-build/static/admin/_next/static/chunks/{1817-6abbe957a53026d7.js → 1817-11bb237f57d9ad27.js} +1 -1
  29. fides/ui-build/static/admin/_next/static/chunks/{1904-281183a117e26585.js → 1904-3c40738cb0fd2a7c.js} +1 -1
  30. fides/ui-build/static/admin/_next/static/chunks/{2479-b4f7a1c7c711cb65.js → 2479-50f431c0e2c0de3c.js} +1 -1
  31. fides/ui-build/static/admin/_next/static/chunks/3244-4b76482dcc5d576f.js +1 -0
  32. fides/ui-build/static/admin/_next/static/chunks/{3702-3d814671c31eaca3.js → 3702-31d37a0217f82615.js} +1 -1
  33. fides/ui-build/static/admin/_next/static/chunks/{3855-237afbbea7f54707.js → 3855-da54ef27afd56c46.js} +1 -1
  34. fides/ui-build/static/admin/_next/static/chunks/{3872-c53d74aebd12cfd3.js → 3872-68b4ceba8f632bc0.js} +1 -1
  35. fides/ui-build/static/admin/_next/static/chunks/401-49cdd118a89cc343.js +1 -0
  36. fides/ui-build/static/admin/_next/static/chunks/4060-bad5f07013c7bb49.js +1 -0
  37. fides/ui-build/static/admin/_next/static/chunks/{4121-476f657b03a78965.js → 4121-4914fb77e60d31f4.js} +1 -1
  38. fides/ui-build/static/admin/_next/static/chunks/4481-7a992683e9191bc9.js +1 -0
  39. fides/ui-build/static/admin/_next/static/chunks/{5480-1623dbacdf4e6794.js → 5480-d177a83facd21738.js} +1 -1
  40. fides/ui-build/static/admin/_next/static/chunks/{5487-9a2aecb0ec63d567.js → 5487-22de631f1d186527.js} +1 -1
  41. fides/ui-build/static/admin/_next/static/chunks/5973-1020589bef6dd253.js +1 -0
  42. fides/ui-build/static/admin/_next/static/chunks/6277-c46c9eb59177b850.js +1 -0
  43. fides/ui-build/static/admin/_next/static/chunks/{6372-2aee10b79089521a.js → 6372-0ca1b9521b5489fd.js} +1 -1
  44. fides/ui-build/static/admin/_next/static/chunks/6853-7d7eb22f19d3806c.js +1 -0
  45. fides/ui-build/static/admin/_next/static/chunks/{6954-127745bfdc5bc0b3.js → 6954-981a8a444780bedb.js} +1 -1
  46. fides/ui-build/static/admin/_next/static/chunks/{7751-3913b8c055f599e5.js → 7751-09c6424d673d8aa4.js} +1 -1
  47. fides/ui-build/static/admin/_next/static/chunks/{79-77cfed02164241ca.js → 79-7ca48fb1a0b52f96.js} +1 -1
  48. fides/ui-build/static/admin/_next/static/chunks/9572-8f5947db1a6da260.js +1 -0
  49. fides/ui-build/static/admin/_next/static/chunks/9767-162b0f8524990149.js +1 -0
  50. fides/ui-build/static/admin/_next/static/chunks/{9951-66aad0602aadfbe2.js → 9951-8ceba69296972ce9.js} +1 -1
  51. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-13a604eb8d39dffc.js → _app-fc9e922ec354be47.js} +46 -46
  52. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-a8c51c7bdbb405e2.js +1 -0
  53. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-78de4bde88e18b0f.js → [id]-7122d8a8c20e7cd2.js} +1 -1
  54. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-c02b14c50b19bd91.js → new-300fd2800c417d0b.js} +1 -1
  55. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-85ddbe3ae50c7527.js +1 -0
  56. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-75c2ed6ba3de48cd.js → [id]-5a9269aa00a16596.js} +1 -1
  57. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-487ae57dc7e2ded2.js → new-78808c75ba86c0be.js} +1 -1
  58. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-65091908d6296afc.js → privacy-notices-047c409bc5e12d1a.js} +1 -1
  59. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-01d1371e690ae190.js +1 -0
  60. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-d08a38d4f198691a.js +1 -0
  61. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/{[systemId]-6b3d1fe762c747d8.js → [systemId]-cc5431e4fbd6d39e.js} +1 -1
  62. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-61eafb8444bffb76.js → [monitorId]-f073ddcfb916988e.js} +1 -1
  63. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-e7869f658e3017b9.js → activity-73025c2ac5a00347.js} +1 -1
  64. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-5aff1d01c6c30ad6.js → new-f3a6dd67f012b005.js} +1 -1
  65. fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-f4d57b3432c57112.js → dataset-3b703775de1ca75e.js} +1 -1
  66. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-b2b1168d0361baa8.js → [id]-b905c75f68786c2f.js} +1 -1
  67. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-c804349a417a888b.js → new-abd92bec98bdbb66.js} +1 -1
  68. fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-0faa9b3c4555e585.js → datastore-connection-52c3f076edb49944.js} +1 -1
  69. fides/ui-build/static/admin/_next/static/chunks/pages/{index-e72904e316ede1b0.js → index-1bccf315f995267a.js} +1 -1
  70. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-afcf73fd0337dde0.js +1 -0
  71. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-2ce76b506ba8404a.js +1 -0
  72. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-54ea39f203182c53.js → [id]-2fc14bda8d314449.js} +1 -1
  73. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-3219ddeb37d46398.js +1 -0
  74. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-8e17802ab6b2d3fd.js +1 -0
  75. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-9d71495b42f34038.js +1 -0
  76. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-a36cf070c98a6cbd.js +1 -0
  77. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-7986cf3b36456353.js +1 -0
  78. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-f6d6e3d9d556387c.js +1 -0
  79. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-e6c477f2ac098e0b.js +1 -0
  80. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-255655d6c367faad.js +1 -0
  81. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-c01d24583e9485f0.js +1 -0
  82. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-0b47ff26897c1d9a.js → test-datasets-d5f777510ab8dfd2.js} +1 -1
  83. fides/ui-build/static/admin/_next/static/chunks/pages/{systems-820893393f1516ee.js → systems-e9a111ef0c32161e.js} +1 -1
  84. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-517419b35435604a.js +1 -0
  85. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-d527d1d1635541df.js → [id]-32ec340d4b390d07.js} +1 -1
  86. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-facb8c0128a44cb1.js → user-management-c8ca51efbeccf39b.js} +1 -1
  87. fides/ui-build/static/admin/_next/static/chunks/webpack-01277b766c8eb076.js +1 -0
  88. fides/ui-build/static/admin/_next/static/css/72caf4a266697967.css +1 -0
  89. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  90. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  91. fides/ui-build/static/admin/add-systems.html +1 -1
  92. fides/ui-build/static/admin/ant-poc.html +1 -1
  93. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  94. fides/ui-build/static/admin/consent/configure.html +1 -1
  95. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  96. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  97. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  98. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  99. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  100. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  101. fides/ui-build/static/admin/consent/properties.html +1 -1
  102. fides/ui-build/static/admin/consent/reporting.html +1 -1
  103. fides/ui-build/static/admin/consent.html +1 -1
  104. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  105. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  106. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  107. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  108. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  109. fides/ui-build/static/admin/data-catalog.html +1 -1
  110. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  111. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  112. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  113. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  114. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  115. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  116. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  117. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  118. fides/ui-build/static/admin/datamap.html +1 -1
  119. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  120. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  121. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  122. fides/ui-build/static/admin/dataset/new.html +1 -1
  123. fides/ui-build/static/admin/dataset.html +1 -1
  124. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  125. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  126. fides/ui-build/static/admin/datastore-connection.html +1 -1
  127. fides/ui-build/static/admin/index.html +1 -1
  128. fides/ui-build/static/admin/integrations/[id].html +1 -1
  129. fides/ui-build/static/admin/integrations.html +1 -1
  130. fides/ui-build/static/admin/login/[provider].html +1 -1
  131. fides/ui-build/static/admin/login.html +1 -1
  132. fides/ui-build/static/admin/messaging/[id].html +1 -1
  133. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  134. fides/ui-build/static/admin/messaging.html +1 -1
  135. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  136. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  137. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  138. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  139. fides/ui-build/static/admin/privacy-requests.html +1 -1
  140. fides/ui-build/static/admin/properties/[id].html +1 -1
  141. fides/ui-build/static/admin/properties/add-property.html +1 -1
  142. fides/ui-build/static/admin/properties.html +1 -1
  143. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  144. fides/ui-build/static/admin/settings/about.html +1 -1
  145. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -0
  146. fides/ui-build/static/admin/settings/consent.html +1 -1
  147. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  148. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  149. fides/ui-build/static/admin/settings/domains.html +1 -1
  150. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  151. fides/ui-build/static/admin/settings/locations.html +1 -1
  152. fides/ui-build/static/admin/settings/organization.html +1 -1
  153. fides/ui-build/static/admin/settings/regulations.html +1 -1
  154. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  155. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  156. fides/ui-build/static/admin/systems.html +1 -1
  157. fides/ui-build/static/admin/taxonomy.html +1 -1
  158. fides/ui-build/static/admin/user-management/new.html +1 -1
  159. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  160. fides/ui-build/static/admin/user-management.html +1 -1
  161. fides/ui-build/static/admin/_next/static/chunks/1376-92890c17ce39ca0d.js +0 -1
  162. fides/ui-build/static/admin/_next/static/chunks/146-d1820217dc36d46d.js +0 -1
  163. fides/ui-build/static/admin/_next/static/chunks/3244-3d94bf3393366412.js +0 -1
  164. fides/ui-build/static/admin/_next/static/chunks/401-50974f107c2712fc.js +0 -1
  165. fides/ui-build/static/admin/_next/static/chunks/4060-52fd85fb1e15a2b8.js +0 -1
  166. fides/ui-build/static/admin/_next/static/chunks/4481-288d74a33473cff7.js +0 -1
  167. fides/ui-build/static/admin/_next/static/chunks/5973-2db5181149073311.js +0 -1
  168. fides/ui-build/static/admin/_next/static/chunks/6853-ca5dacd25c9ccb7c.js +0 -1
  169. fides/ui-build/static/admin/_next/static/chunks/9572-2b9b10e146130c85.js +0 -1
  170. fides/ui-build/static/admin/_next/static/chunks/9767-bf415d0daea960cd.js +0 -1
  171. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-a6926f7ec7ad10cf.js +0 -1
  172. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-7eeeee3769e73f78.js +0 -1
  173. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-7a1976c0d1aca8b6.js +0 -1
  174. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-75989f9732d90793.js +0 -1
  175. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-59d30d48fcae067c.js +0 -1
  176. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-373fb3a596099fc9.js +0 -1
  177. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-d889076067104e56.js +0 -1
  178. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-3355b4803b2916f3.js +0 -1
  179. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-3ac47981f1e2b0aa.js +0 -1
  180. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-fe743440d7eb007b.js +0 -1
  181. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-cdc866af93898716.js +0 -1
  182. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-a7dc8113067dff42.js +0 -1
  183. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-2f03e981234c40ad.js +0 -1
  184. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-5bcc7a6976e01a56.js +0 -1
  185. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-8fccd670220dbf60.js +0 -1
  186. fides/ui-build/static/admin/_next/static/chunks/webpack-03e375f6d6b2c71b.js +0 -1
  187. fides/ui-build/static/admin/_next/static/css/687135955af5b7e1.css +0 -1
  188. fides/ui-build/static/admin/_next/static/rE0VXR2bXlzSJjVNbhHjr/_buildManifest.js +0 -1
  189. {ethyca_fides-2.59.1rc0.dist-info → ethyca_fides-2.59.2b1.dist-info}/WHEEL +0 -0
  190. {ethyca_fides-2.59.1rc0.dist-info → ethyca_fides-2.59.2b1.dist-info}/entry_points.txt +0 -0
  191. {ethyca_fides-2.59.1rc0.dist-info → ethyca_fides-2.59.2b1.dist-info}/licenses/LICENSE +0 -0
  192. {ethyca_fides-2.59.1rc0.dist-info → ethyca_fides-2.59.2b1.dist-info}/top_level.txt +0 -0
  193. /fides/ui-build/static/admin/_next/static/{rE0VXR2bXlzSJjVNbhHjr → 4ZsbAUsCLedx18AUPZCUU}/_ssgManifest.js +0 -0
  194. /fides/ui-build/static/admin/_next/static/chunks/{1100-45c0634b4f51d10c.js → 1100-22c375e757f23150.js} +0 -0
  195. /fides/ui-build/static/admin/_next/static/chunks/{3086-d1ba90bc6ac9174b.js → 3086-ffd15c92ea81b3d6.js} +0 -0
  196. /fides/ui-build/static/admin/_next/static/chunks/{5102-626b9ff42e904276.js → 5102-3acf312a8f0d7720.js} +0 -0
  197. /fides/ui-build/static/admin/_next/static/chunks/{5826-1f4f74bf3b5348e4.js → 5826-226c8843e715b6ad.js} +0 -0
  198. /fides/ui-build/static/admin/_next/static/chunks/{6395-4224d6d26d1e8bb7.js → 6395-04041b53946664b1.js} +0 -0
  199. /fides/ui-build/static/admin/_next/static/chunks/{8433-c4c765833ab9cc07.js → 8433-dd6d8dae02275d66.js} +0 -0
  200. /fides/ui-build/static/admin/_next/static/chunks/{8934-ffa2b0509bc7a845.js → 8934-6881185f0c5c0f6d.js} +0 -0
  201. /fides/ui-build/static/admin/_next/static/chunks/{9282-1a48b10b114d01f4.js → 9282-23b38e03f897722f.js} +0 -0
  202. /fides/ui-build/static/admin/_next/static/chunks/{9327-4970d356f7000c0b.js → 9327-fb7ef941b5176077.js} +0 -0
  203. /fides/ui-build/static/admin/_next/static/chunks/pages/{404-29560aa2e6a60963.js → 404-a3c57a06ff67cf1f.js} +0 -0
  204. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-58e9256e86916ecd.js → manual-c4c0c42bbe0f5548.js} +0 -0
  205. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-2392e3a101fae073.js → multiple-93907c53f342831f.js} +0 -0
  206. /fides/ui-build/static/admin/_next/static/chunks/pages/{ant-poc-404f3c9018952800.js → ant-poc-8fcf312148606e7e.js} +0 -0
  207. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7dfe37b9f0ff9a3c.js → add-vendors-5e83ee7792c0f75f.js} +0 -0
  208. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-dba7848b760ba227.js → configure-ea7b2c628260c84c.js} +0 -0
  209. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-f67fda6a71d0a46b.js → properties-893753088b9729a3.js} +0 -0
  210. /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-75395dfc224cf44b.js → consent-7e5adfec9134a268.js} +0 -0
  211. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-fa65c67ec8c4b5e6.js → [projectUrn]-4b2c10ff79e46e50.js} +0 -0
  212. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-e76a07ee6ee8d55f.js → projects-05bbb01e37766b80.js} +0 -0
  213. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-38476c697da53480.js → action-center-cf48ed7dc04c3af2.js} +0 -0
  214. /fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-423172d31de8e9c6.js → datamap-6c63a6295668ed4e.js} +0 -0
  215. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-704553f5329fb9d4.js → [...subfieldNames]-7a99a6c5c2fc2abe.js} +0 -0
  216. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-06c19dca941edb14.js → [collectionName]-39aab1de4df0660d.js} +0 -0
  217. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-eac517f43d5f53a8.js → [datasetId]-2cf04998a7521a7d.js} +0 -0
  218. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-66f5fbadd8455805.js → [id]-8950b4aff799099c.js} +0 -0
  219. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-d441abb1f045940f.js → add-template-4cad85d5b6d52734.js} +0 -0
  220. /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-eef56c95b08aa24c.js → messaging-57c7aa44af163623.js} +0 -0
  221. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-b8c94b10ab90b061.js → configure-d8d23d06ce1d9dae.js} +0 -0
  222. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-f4fb941df069b7bf.js → [id]-6cca2c8ebbff78aa.js} +0 -0
  223. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-bccb6ffab25aa214.js → add-property-f09f98007725fa51.js} +0 -0
  224. /fides/ui-build/static/admin/_next/static/chunks/pages/{properties-9a7ac623370b7c00.js → properties-9034bab3d7200d9b.js} +0 -0
  225. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-4412a7b468b6d4bf.js → about-92dada8329e89092.js} +0 -0
  226. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-d9088f5cd9fb2822.js → domain-records-368a4183139ea5e0.js} +0 -0
  227. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-cf09ad896c7396a6.js → email-templates-e4498b6310074705.js} +0 -0
  228. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-759564ca0ae62840.js → locations-18f56b6b76abb71d.js} +0 -0
  229. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-2dce4501fca920b3.js → regulations-0350314337abff11.js} +0 -0
  230. /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-dd053a3bf2a9ca6c.js → [id]-022910a52efbad76.js} +0 -0
fides/_version.py CHANGED
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-04-16T11:42:20+0200",
11
+ "date": "2025-04-16T22:35:59-0400",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "943a31433f896fe25cd9884d836cc029465c1e3b",
15
- "version": "2.59.1rc0"
14
+ "full-revisionid": "f64e628f1502e4a7c7045e517a74550c9d5cd661",
15
+ "version": "2.59.2b1"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -0,0 +1,218 @@
1
+ """data migration converting existing 'Cookies' resources to 'Asset' resources with type 'Cookie'
2
+
3
+ Revision ID: c9c72b3d550b
4
+ Revises: 9288f729cac4
5
+ Create Date: 2025-02-18 18:33:56.039924
6
+
7
+ """
8
+
9
+ import uuid
10
+ from typing import Dict, Tuple
11
+
12
+ import sqlalchemy as sa
13
+ from alembic import op
14
+ from loguru import logger
15
+
16
+ from fides.api.models.asset import Asset
17
+
18
+ # revision identifiers, used by Alembic.
19
+ revision = "c9c72b3d550b"
20
+ down_revision = "9288f729cac4"
21
+ branch_labels = None
22
+ depends_on = None
23
+
24
+
25
+ def upgrade():
26
+ # migrate existing cookies to assets
27
+ connection = op.get_bind()
28
+ result = connection.execute(
29
+ sa.text(
30
+ "SELECT c.id, c.created_at, c.updated_at, c.name, c.domain, c.system_id, c.path, c.privacy_declaration_id, pd.system_id AS pud_system_id, pd.data_use "
31
+ "FROM cookies c "
32
+ "LEFT JOIN privacydeclaration pd ON c.privacy_declaration_id = pd.id"
33
+ )
34
+ )
35
+
36
+ logger.debug("Converting existing cookies to assets")
37
+ assets_to_create: Dict[str, Asset] = {}
38
+ for row in result:
39
+ if row.privacy_declaration_id is None:
40
+ identifier = f"{row.name}_{row.system_id}"
41
+ if identifier not in assets_to_create.keys():
42
+ assets_to_create[identifier] = Asset(
43
+ id=str(uuid.uuid4()),
44
+ created_at=row.created_at,
45
+ updated_at=row.updated_at,
46
+ name=row.name,
47
+ domain=row.domain,
48
+ system_id=row.system_id,
49
+ data_uses=[],
50
+ asset_type="Cookie",
51
+ )
52
+ continue
53
+
54
+ if row.pud_system_id:
55
+ system_id = row.pud_system_id
56
+ data_uses = [row.data_use]
57
+ else:
58
+ system_id = row.system_id
59
+ data_uses = []
60
+
61
+ # Asset unique identifier is a composite of name, asset_type, domain, base_url, system_id. All assets here are cookies.
62
+ identifier = f"{row.name}_{'Cookie'}_{row.domain}_{row.path}_{system_id}"
63
+ if identifier in assets_to_create.keys():
64
+ # If the asset already exists, append the data_use to the existing asset
65
+ assets_to_create[identifier].data_uses.extend(data_uses)
66
+ else:
67
+ # If the asset does not exist, create a new asset with the data_use
68
+ assets_to_create[identifier] = Asset(
69
+ id=str(uuid.uuid4()),
70
+ created_at=row.created_at,
71
+ updated_at=row.updated_at,
72
+ name=row.name,
73
+ domain=row.domain,
74
+ system_id=system_id,
75
+ data_uses=data_uses,
76
+ asset_type="Cookie",
77
+ )
78
+
79
+ # Insert the assets into the asset table
80
+ assets_list = [
81
+ {
82
+ "id": asset.id if asset.id else str(uuid.uuid4()),
83
+ "created_at": asset.created_at,
84
+ "updated_at": asset.updated_at,
85
+ "name": asset.name,
86
+ "domain": asset.domain,
87
+ "system_id": asset.system_id,
88
+ "data_uses": asset.data_uses,
89
+ "asset_type": "Cookie",
90
+ }
91
+ for asset in assets_to_create.values()
92
+ ]
93
+
94
+ if assets_list:
95
+ logger.debug("Inserting assets into asset table ")
96
+ connection.execute(
97
+ sa.text(
98
+ "INSERT INTO asset (id, created_at, updated_at, name, domain, system_id, data_uses, asset_type, with_consent) "
99
+ "VALUES (:id, :created_at, :updated_at, :name, :domain, :system_id, :data_uses, :asset_type, false) "
100
+ "ON CONFLICT DO NOTHING"
101
+ ),
102
+ assets_list,
103
+ )
104
+ else:
105
+ logger.debug("No assets to insert into asset table. Skipping.")
106
+
107
+ # Delete the cookies table
108
+ logger.debug("Deleting cookies table")
109
+ connection.execute(sa.text("DROP TABLE cookies"))
110
+
111
+
112
+ def downgrade():
113
+ # Recreate the cookies table
114
+ logger.debug("Recreating cookies table")
115
+ op.create_table(
116
+ "cookies",
117
+ sa.Column("id", sa.String(length=255), nullable=False),
118
+ sa.Column(
119
+ "created_at",
120
+ sa.DateTime(timezone=True),
121
+ server_default=sa.text("now()"),
122
+ nullable=True,
123
+ ),
124
+ sa.Column(
125
+ "updated_at",
126
+ sa.DateTime(timezone=True),
127
+ server_default=sa.text("now()"),
128
+ nullable=True,
129
+ ),
130
+ sa.Column("name", sa.String(), nullable=False),
131
+ sa.Column("domain", sa.String(), nullable=True),
132
+ sa.Column("path", sa.String(), nullable=True),
133
+ sa.Column("system_id", sa.String(), nullable=True),
134
+ sa.Column("privacy_declaration_id", sa.String(), nullable=True),
135
+ sa.ForeignKeyConstraint(
136
+ ["privacy_declaration_id"], ["privacydeclaration.id"], ondelete="SET NULL"
137
+ ),
138
+ sa.ForeignKeyConstraint(["system_id"], ["ctl_systems.id"], ondelete="CASCADE"),
139
+ sa.PrimaryKeyConstraint("id"),
140
+ sa.UniqueConstraint(
141
+ "name", "privacy_declaration_id", name="_cookie_name_privacy_declaration_uc"
142
+ ),
143
+ )
144
+ op.create_index(op.f("ix_cookies_id"), "cookies", ["id"], unique=False)
145
+ op.create_index(op.f("ix_cookies_name"), "cookies", ["name"], unique=False)
146
+ op.create_index(
147
+ op.f("ix_cookies_privacy_declaration_id"),
148
+ "cookies",
149
+ ["privacy_declaration_id"],
150
+ unique=False,
151
+ )
152
+ op.create_index(
153
+ op.f("ix_cookies_system_id"), "cookies", ["system_id"], unique=False
154
+ )
155
+ # ### end Alembic commands ###
156
+
157
+ connection = op.get_bind()
158
+ result = connection.execute(
159
+ sa.text(
160
+ "SELECT id, name, domain, system_id, data_uses FROM asset WHERE asset_type = 'Cookie'"
161
+ )
162
+ )
163
+
164
+ # fetch all privacy declarations
165
+ privacy_declarations = connection.execute(
166
+ sa.text("SELECT id, system_id, data_use FROM privacydeclaration")
167
+ ).fetchall()
168
+ # create a mapping of system_id and data_use to privacy_declaration_id
169
+ privacy_declaration_mapping: Dict[Tuple[str, str], str] = {}
170
+ for pud in privacy_declarations:
171
+ privacy_declaration_mapping[(pud.system_id, pud.data_use)] = pud.id
172
+
173
+ logger.debug("Migrating existing assets to cookies")
174
+ for row in result:
175
+ # Find the privacy declaration ID matching the system ID and data use
176
+ privacy_declaration_ids = []
177
+ for data_use in row.data_uses:
178
+ pud_id = privacy_declaration_mapping.get((row.system_id, data_use), None)
179
+ if pud_id:
180
+ privacy_declaration_ids.append(pud_id)
181
+
182
+ cookies_to_insert = []
183
+
184
+ if len(privacy_declaration_ids) == 0:
185
+ # If no privacy declaration match we attach to system_id
186
+ cookies_to_insert.append(
187
+ {
188
+ "id": row.id,
189
+ "name": row.name,
190
+ "domain": row.domain,
191
+ "system_id": row.system_id,
192
+ "privacy_declaration_id": None,
193
+ }
194
+ )
195
+ else:
196
+ for privacy_declaration_id in privacy_declaration_ids:
197
+ # Create a cookie for each privacy declaration ID
198
+ # generate a new ID
199
+ cookie_id = str(uuid.uuid4())
200
+ cookies_to_insert.append(
201
+ {
202
+ "id": cookie_id,
203
+ "name": row.name,
204
+ "domain": row.domain,
205
+ "system_id": None,
206
+ "privacy_declaration_id": privacy_declaration_id,
207
+ }
208
+ )
209
+
210
+ if cookies_to_insert:
211
+ connection.execute(
212
+ sa.text(
213
+ "INSERT INTO cookies (id, created_at, updated_at, name, domain, system_id, privacy_declaration_id) "
214
+ "VALUES (:id, NOW(), NOW(), :name, :domain, :system_id, :privacy_declaration_id) "
215
+ "ON CONFLICT DO NOTHING"
216
+ ),
217
+ cookies_to_insert,
218
+ )
@@ -40,6 +40,7 @@ from fides.api.schemas.storage.storage import (
40
40
  FULLY_CONFIGURED_STORAGE_TYPES,
41
41
  AWSAuthMethod,
42
42
  BulkPutStorageConfigResponse,
43
+ GCSAuthMethod,
43
44
  StorageConfigStatus,
44
45
  StorageConfigStatusMessage,
45
46
  StorageDestination,
@@ -418,10 +419,10 @@ def get_storage_status(
418
419
 
419
420
 
420
421
  def _storage_config_requires_secrets(storage_config: StorageConfig) -> bool:
421
- return (
422
- storage_config.details.get(StorageDetails.AUTH_METHOD.value, None)
423
- == AWSAuthMethod.SECRET_KEYS.value
424
- )
422
+ return storage_config.details.get(StorageDetails.AUTH_METHOD.value, None) in [
423
+ AWSAuthMethod.SECRET_KEYS.value,
424
+ GCSAuthMethod.SERVICE_ACCOUNT_KEYS.value,
425
+ ]
425
426
 
426
427
 
427
428
  @router.put(
fides/api/db/system.py CHANGED
@@ -8,19 +8,15 @@ from typing import Any, Dict, List, Optional, Tuple, Type, Union
8
8
 
9
9
  from deepdiff import DeepDiff
10
10
  from fastapi import HTTPException
11
- from fideslang.models import Cookies as CookieSchema
12
11
  from fideslang.models import System as SystemSchema
13
12
  from fideslang.validation import FidesKey
14
13
  from loguru import logger as log
15
- from sqlalchemy import and_, delete, insert, select, update
16
14
  from sqlalchemy.ext.asyncio import AsyncSession
17
15
  from sqlalchemy.orm import Session
18
- from sqlalchemy.sql.elements import BinaryExpression
19
16
  from starlette.status import HTTP_400_BAD_REQUEST, HTTP_404_NOT_FOUND
20
17
 
21
18
  from fides.api.db.crud import create_resource, get_resource, update_resource
22
19
  from fides.api.models.sql_models import ( # type: ignore[attr-defined]
23
- Cookies,
24
20
  DataCategory,
25
21
  DataSubject,
26
22
  DataUse,
@@ -155,7 +151,6 @@ async def upsert_privacy_declarations(
155
151
  for privacy_declaration in resource.privacy_declarations:
156
152
  # prepare our 'payload' for either create or update
157
153
  data = privacy_declaration.model_dump(mode="json")
158
- privacy_declaration_cookies: List[Dict] = data.pop("cookies", None)
159
154
  data["system_id"] = system.id # include FK back to system
160
155
 
161
156
  # if we find matching declaration, remove it from our map
@@ -168,102 +163,11 @@ async def upsert_privacy_declarations(
168
163
  # otherwise, create a new declaration record
169
164
  declaration = PrivacyDeclaration.create(db, data=data)
170
165
 
171
- # Upsert cookies for the given privacy declaration
172
- await upsert_cookies(
173
- db, privacy_declaration_cookies, declaration, system=None
174
- )
175
-
176
166
  # delete any existing privacy declarations that have not been "matched" in the request
177
167
  for existing_declarations in existing_declarations.values():
178
168
  await db.delete(existing_declarations)
179
169
 
180
170
 
181
- async def upsert_cookies(
182
- async_session: AsyncSession,
183
- cookies: Optional[List[Dict]],
184
- privacy_declaration: Optional[PrivacyDeclaration],
185
- system: Optional[System],
186
- ) -> None:
187
- """
188
- Upsert cookies for the given system or privacy_declaration. Cookies can be attached at the system-level
189
- or the privacy declaration-level.
190
-
191
- Remove any existing cookies that aren't specified here.
192
- """
193
- if not (privacy_declaration or system):
194
- # Dev-level error
195
- raise ValueError(
196
- "Either system or privacy declaration must be supplied to upsert cookies"
197
- )
198
-
199
- if privacy_declaration and system:
200
- # Dev-level error
201
- raise ValueError(
202
- "Supply either system or privacy declaration, not both, to upsert cookies"
203
- )
204
-
205
- parsed_cookies = (
206
- [CookieSchema.model_validate(cookie) for cookie in cookies] if cookies else []
207
- )
208
-
209
- resource_filter: BinaryExpression = (
210
- Cookies.system_id == system.id
211
- if system
212
- else Cookies.privacy_declaration_id == privacy_declaration.id # type: ignore[union-attr]
213
- )
214
-
215
- for cookie_data in parsed_cookies:
216
- # Check if cookie exists on the resource
217
- result = await async_session.execute(
218
- select(Cookies).where(
219
- and_(Cookies.name == cookie_data.name, resource_filter)
220
- )
221
- )
222
- row: Optional[Cookies] = result.scalars().first()
223
- if row:
224
- # Update existing cookie
225
- await async_session.execute(
226
- update(Cookies)
227
- .where(Cookies.id == row.id)
228
- .values(cookie_data.model_dump(mode="json"))
229
- )
230
-
231
- else:
232
- # Insert new cookie
233
- await async_session.execute(
234
- insert(Cookies).values(
235
- {
236
- "name": cookie_data.name,
237
- "path": cookie_data.path,
238
- "domain": cookie_data.domain,
239
- "privacy_declaration_id": (
240
- privacy_declaration.id if privacy_declaration else None
241
- ),
242
- "system_id": system.id if system else None,
243
- }
244
- )
245
- )
246
-
247
- # Select cookies which are currently on the application resource, but not included in the request
248
- delete_result = await async_session.execute(
249
- select(Cookies).where(
250
- and_(
251
- Cookies.name.notin_([cookie.name for cookie in parsed_cookies]),
252
- resource_filter,
253
- )
254
- )
255
- )
256
-
257
- # Remove those cookies altogether
258
- await async_session.execute(
259
- delete(Cookies).where(
260
- Cookies.id.in_(
261
- [cookie.id for cookie in delete_result.scalars().unique().all()]
262
- )
263
- )
264
- )
265
-
266
-
267
171
  async def update_system(
268
172
  resource: SystemSchema, db: AsyncSession, current_user_id: Optional[str] = None
269
173
  ) -> Tuple[Dict, bool]:
@@ -288,18 +192,10 @@ async def update_system(
288
192
  resource, "privacy_declarations"
289
193
  ) # remove the attribute on the system since we've already updated declarations
290
194
 
291
- # Remove system-level cookies from request before updating the system.
292
- # Cookies are upserted separately
293
- proposed_system_cookies: Optional[List[Cookies]] = resource.cookies
294
- delattr(resource, "cookies")
295
-
296
195
  # perform any updates on the system resource itself
297
196
  updated_system = await update_resource(System, resource.model_dump(), db)
298
197
 
299
198
  async with db.begin():
300
- await upsert_cookies(
301
- db, proposed_system_cookies, privacy_declaration=None, system=updated_system
302
- ) # Upsert the associated cookies at the System-level
303
199
 
304
200
  await db.refresh(updated_system)
305
201
 
@@ -400,10 +296,6 @@ async def create_system(
400
296
  # remove the attribute on the system update since the declarations will be created separately
401
297
  delattr(resource, "privacy_declarations")
402
298
 
403
- # Remove system-level cookies from request; these will be processed after the system is added
404
- proposed_system_cookies: Optional[List[Cookies]] = resource.cookies
405
- delattr(resource, "cookies")
406
-
407
299
  # create the system resource using generic creation
408
300
  # the system must be created before the privacy declarations so that it can be referenced
409
301
  resource_dict = resource.model_dump()
@@ -418,27 +310,15 @@ async def create_system(
418
310
  privacy_declaration_exception = None
419
311
  try:
420
312
  async with db.begin():
421
- await upsert_cookies(
422
- db,
423
- proposed_system_cookies,
424
- privacy_declaration=None,
425
- system=created_system,
426
- ) # Create the associated cookies at the System-level
427
313
 
428
314
  # create the specified declarations as records in their own table
429
315
  for privacy_declaration in privacy_declarations:
430
316
  data = privacy_declaration.model_dump(mode="json")
431
317
  data["system_id"] = created_system.id # add FK back to system
432
- privacy_declaration_cookies: List[Dict] = data.pop("cookies", [])
433
318
  privacy_declaration = PrivacyDeclaration.create(
434
319
  db, data=data
435
320
  ) # create the associated PrivacyDeclaration
436
- await upsert_cookies(
437
- db,
438
- privacy_declaration_cookies,
439
- privacy_declaration=privacy_declaration,
440
- system=None,
441
- ) # Create the associated cookies on the Privacy Declaration
321
+
442
322
  except Exception as e:
443
323
  log.error(
444
324
  f"Error adding privacy declarations, reverting system creation: {str(privacy_declaration_exception)}"
fides/api/models/asset.py CHANGED
@@ -25,8 +25,7 @@ from fides.api.models.sql_models import System # type: ignore[attr-defined]
25
25
 
26
26
  class Asset(Base):
27
27
  """
28
- Web assets associated with a system. This model will supersede `Cookies` once we have established
29
- a migration path and backward compatibility with all `Cookies` related APIs.
28
+ Web assets associated with a system
30
29
  """
31
30
 
32
31
  # Common attributes
@@ -23,6 +23,7 @@ from fides.api.db.base_class import Base
23
23
  from fides.api.models.audit_log import AuditLog
24
24
 
25
25
  # Intentionally importing SystemManager here to build the FidesUser.systems relationship
26
+ from fides.api.models.system_manager import SystemManager # type: ignore[unused-import]
26
27
  from fides.api.schemas.user import DisabledReason
27
28
  from fides.config import CONFIG
28
29
 
@@ -20,10 +20,9 @@ from fides.api.models import (
20
20
  dry_update_data,
21
21
  update_if_modified,
22
22
  )
23
+ from fides.api.models.asset import Asset
23
24
  from fides.api.models.location_regulation_selections import DeprecatedNoticeRegion
24
25
  from fides.api.models.sql_models import ( # type: ignore[attr-defined]
25
- Cookies,
26
- PrivacyDeclaration,
27
26
  System,
28
27
  get_system_data_uses,
29
28
  )
@@ -191,24 +190,20 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
191
190
  raise Exception("Invalid notice consent mechanism.")
192
191
 
193
192
  @property
194
- def cookies(self) -> List[Cookies]:
195
- """Return relevant cookie names (via the data use)"""
193
+ def cookies(self) -> List[Asset]:
194
+ """Return relevant assets of type 'cookie' (via the data use)"""
196
195
  db = Session.object_session(self)
197
- return (
198
- db.query(Cookies)
199
- .join(
200
- PrivacyDeclaration,
201
- PrivacyDeclaration.id == Cookies.privacy_declaration_id,
202
- )
203
- .filter(
204
- or_(
205
- *[
206
- PrivacyDeclaration.data_use.like(f"{notice_use}%")
207
- for notice_use in self.data_uses
208
- ]
209
- )
210
- )
211
- ).all()
196
+ or_queries = [
197
+ f"array_to_string(data_uses, ',') ILIKE '{data_use}%'"
198
+ for data_use in self.data_uses
199
+ ]
200
+
201
+ query = db.query(Asset).filter(
202
+ Asset.asset_type == "Cookie",
203
+ or_(*[text(query) for query in or_queries]),
204
+ )
205
+
206
+ return query.all()
212
207
 
213
208
  @property
214
209
  def calculated_systems_applicable(self) -> bool:
@@ -457,10 +457,6 @@ class System(Base, FidesBase):
457
457
  lazy="selectin",
458
458
  )
459
459
 
460
- cookies = relationship(
461
- "Cookies", back_populates="system", lazy="selectin", uselist=True, viewonly=True
462
- )
463
-
464
460
  assets = relationship(
465
461
  "Asset", back_populates="system", lazy="selectin", uselist=True, viewonly=True
466
462
  )
@@ -560,9 +556,6 @@ class PrivacyDeclaration(Base):
560
556
  system = relationship(
561
557
  System, back_populates="privacy_declarations", lazy="selectin"
562
558
  )
563
- cookies = relationship(
564
- "Cookies", back_populates="privacy_declaration", lazy="joined", uselist=True
565
- )
566
559
 
567
560
  @classmethod
568
561
  def create(
@@ -866,50 +859,6 @@ class AuditLogResource(Base):
866
859
  extra_data = Column(JSON, nullable=True)
867
860
 
868
861
 
869
- class Cookies(Base):
870
- """
871
- Stores cookies. Cookies have a FK to system and privacy declaration. If a privacy declaration is deleted,
872
- the cookie can still remain linked to the system but unassociated with a data use.
873
- """
874
-
875
- name = Column(String, index=True, nullable=False)
876
- path = Column(String)
877
- domain = Column(String)
878
-
879
- system_id = Column(
880
- String, ForeignKey(System.id_field_path, ondelete="CASCADE"), index=True
881
- ) # If system is deleted, remove the associated cookies.
882
-
883
- privacy_declaration_id = Column(
884
- String,
885
- ForeignKey(PrivacyDeclaration.id_field_path, ondelete="CASCADE"),
886
- index=True,
887
- ) # If privacy declaration is deleted, remove the associated cookies.
888
-
889
- system = relationship(
890
- "System",
891
- back_populates="cookies",
892
- cascade="all,delete",
893
- uselist=False,
894
- lazy="selectin",
895
- )
896
-
897
- privacy_declaration = relationship(
898
- "PrivacyDeclaration",
899
- back_populates="cookies",
900
- cascade="all,delete",
901
- uselist=False,
902
- lazy="joined", # Joined is intentional, instead of selectin
903
- )
904
-
905
- __table_args__ = (
906
- UniqueConstraint(
907
- "name", "privacy_declaration_id", name="_cookie_name_privacy_declaration_uc"
908
- ),
909
- UniqueConstraint("name", "system_id", name="_cookie_name_system_uc"),
910
- )
911
-
912
-
913
862
  def get_system_data_uses(db: Session, include_parents: bool) -> Set:
914
863
  """Get data uses across all systems and those data uses' parents if include_parents is True
915
864
 
@@ -14,6 +14,7 @@ class StorageTypeApiAccepted(Enum):
14
14
  """Enum for storage destination types accepted in API updates"""
15
15
 
16
16
  s3 = "s3"
17
+ gcs = "gcs"
17
18
  local = "local" # local should be used for testing only, not for processing real-world privacy requests
18
19
 
19
20
 
@@ -20,11 +20,11 @@ class PeriodicIntegrationFrequency(Enum):
20
20
 
21
21
  class DatahubSchema(ConnectionConfigSecretsSchema):
22
22
  datahub_server_url: AnyHttpUrlStringRemovesSlash = Field(
23
- title="DataHub Server URL",
23
+ title="DataHub server URL",
24
24
  description="The URL of your DataHub server.",
25
25
  )
26
26
  datahub_token: str = Field(
27
- title="DataHub Token",
27
+ title="DataHub token",
28
28
  description="The token used to authenticate with your DataHub server.",
29
29
  json_schema_extra={"sensitive": True},
30
30
  )
@@ -33,7 +33,7 @@ class DatahubSchema(ConnectionConfigSecretsSchema):
33
33
  description="The frequency at which the integration should run. Available options are daily, weekly, and monthly.",
34
34
  )
35
35
  glossary_node: str = Field(
36
- title="Glossary Node",
36
+ title="Glossary node",
37
37
  description="The glossary node name to use on Datahub for Fides Data Categories. (e.g. FidesDataCategories)",
38
38
  )
39
39
 
@@ -31,7 +31,13 @@ class PostgreSQLSchema(ConnectionConfigSecretsSchema):
31
31
  description="The password used to authenticate and access the database.",
32
32
  json_schema_extra={"sensitive": True},
33
33
  )
34
- dbname: str = Field(
34
+ ssh_required: bool = Field(
35
+ False,
36
+ title="SSH required",
37
+ description="Indicates whether an SSH tunnel is required for the connection. Enable this option if your PostgreSQL server is behind a firewall and requires SSH tunneling for remote connections.",
38
+ )
39
+ dbname: Optional[str] = Field(
40
+ default=None,
35
41
  title="Database",
36
42
  description="The name of the specific database within the database server that you want to connect to.",
37
43
  )
@@ -40,15 +46,9 @@ class PostgreSQLSchema(ConnectionConfigSecretsSchema):
40
46
  title="Schema",
41
47
  description="The default schema to be used for the database connection (defaults to public).",
42
48
  )
43
- ssh_required: bool = Field(
44
- False,
45
- title="SSH required",
46
- description="Indicates whether an SSH tunnel is required for the connection. Enable this option if your PostgreSQL server is behind a firewall and requires SSH tunneling for remote connections.",
47
- )
48
49
 
49
50
  _required_components: ClassVar[List[str]] = [
50
51
  "host",
51
- "dbname",
52
52
  ]
53
53
 
54
54
 
@@ -286,12 +286,19 @@ class MessagingServiceDetailsTwilioEmail(BaseModel):
286
286
  class MessagingServiceDetailsAWS_SES(BaseModel):
287
287
  """The details required to represent an AWS SES email configuration."""
288
288
 
289
- email_from: str
290
- domain: str
289
+ email_from: Optional[str] = None
290
+ domain: Optional[str] = None
291
291
  aws_region: str
292
292
 
293
293
  model_config = ConfigDict(extra="forbid")
294
294
 
295
+ @model_validator(mode="before")
296
+ @classmethod
297
+ def validate_fields(cls, values: Dict[str, Any]) -> Dict[str, Any]:
298
+ if not values.get("domain") and not values.get("email_from"):
299
+ raise ValueError("Either 'email_from' or 'domain' must be provided.")
300
+ return values
301
+
295
302
 
296
303
  class MessagingServiceSecrets(Enum):
297
304
  """Enum for message service secrets"""