ethyca-fides 2.62.1rc0__py2.py3-none-any.whl → 2.63.0__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 (358) hide show
  1. {ethyca_fides-2.62.1rc0.dist-info → ethyca_fides-2.63.0.dist-info}/METADATA +2 -1
  2. {ethyca_fides-2.62.1rc0.dist-info → ethyca_fides-2.63.0.dist-info}/RECORD +250 -238
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/2263583b0e44_add_shared_monitor_config.py +82 -0
  5. fides/api/alembic/migrations/versions/440a5b9a3493_add_fides_user_respondent_email_.py +80 -0
  6. fides/api/alembic/migrations/versions/5474a47c77da_create_staged_resource_ancestor_link_table.py +72 -0
  7. fides/api/alembic/migrations/versions/bf713b5a021d_staged_resource_ancestor_link_data_.py +259 -0
  8. fides/api/alembic/migrations/versions/c586a56c25e7_remove_child_diff_statuses.py +40 -0
  9. fides/api/api/v1/endpoints/privacy_request_endpoints.py +2 -2
  10. fides/api/db/base.py +3 -0
  11. fides/api/main.py +4 -1
  12. fides/api/migrations/post_upgrade_index_creation.py +269 -0
  13. fides/api/models/attachment.py +117 -10
  14. fides/api/models/audit_log.py +0 -3
  15. fides/api/models/detection_discovery.py +189 -24
  16. fides/api/models/fides_user.py +51 -4
  17. fides/api/models/fides_user_permissions.py +25 -7
  18. fides/api/models/fides_user_respondent_email_verification.py +112 -0
  19. fides/api/models/privacy_request/privacy_request.py +40 -1
  20. fides/api/oauth/roles.py +19 -0
  21. fides/api/service/connectors/query_configs/saas_query_config.py +3 -8
  22. fides/api/service/connectors/saas_connector.py +7 -4
  23. fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +4 -2
  24. fides/api/service/privacy_request/request_runner_service.py +47 -18
  25. fides/api/service/privacy_request/request_service.py +4 -15
  26. fides/api/service/storage/s3.py +40 -15
  27. fides/api/tasks/storage.py +6 -5
  28. fides/api/util/lock.py +44 -0
  29. fides/api/util/storage_util.py +14 -8
  30. fides/common/api/scope_registry.py +6 -0
  31. fides/config/config_proxy.py +0 -1
  32. fides/config/execution_settings.py +0 -4
  33. fides/ui-build/static/admin/404.html +1 -1
  34. fides/ui-build/static/admin/_next/static/chunks/1099-667e84655846e78c.js +1 -0
  35. fides/ui-build/static/admin/_next/static/chunks/1100-0b01f500b1eaf60d.js +1 -0
  36. fides/ui-build/static/admin/_next/static/chunks/{1817-721fdeb29c07c6be.js → 1817-951f58ddd5d46081.js} +1 -1
  37. fides/ui-build/static/admin/_next/static/chunks/{1904-7e5354990377a849.js → 1904-361e37a5811ed7fc.js} +1 -1
  38. fides/ui-build/static/admin/_next/static/chunks/2310-744354001d01f366.js +1 -0
  39. fides/ui-build/static/admin/_next/static/chunks/2921-49af55ad7c631c93.js +1 -0
  40. fides/ui-build/static/admin/_next/static/chunks/3119-e36ae5071c8f27a5.js +1 -0
  41. fides/ui-build/static/admin/_next/static/chunks/3505-113f9c95d34b7aae.js +1 -0
  42. fides/ui-build/static/admin/_next/static/chunks/3513-5c2d412a84a78971.js +1 -0
  43. fides/ui-build/static/admin/_next/static/chunks/3662-f6a1ddca5ee42076.js +1 -0
  44. fides/ui-build/static/admin/_next/static/chunks/3670-2abd9b2f17770872.js +1 -0
  45. fides/ui-build/static/admin/_next/static/chunks/3872-45cc725e241211f0.js +1 -0
  46. fides/ui-build/static/admin/_next/static/chunks/3923-b4f701ada3ef0ee0.js +1 -0
  47. fides/ui-build/static/admin/_next/static/chunks/3983-17ae9c232bddc413.js +1 -0
  48. fides/ui-build/static/admin/_next/static/chunks/401-7e800aed05537126.js +1 -0
  49. fides/ui-build/static/admin/_next/static/chunks/4060-90a52a9afc655bfc.js +1 -0
  50. fides/ui-build/static/admin/_next/static/chunks/4121-66b0e00d5e7ae817.js +1 -0
  51. fides/ui-build/static/admin/_next/static/chunks/4132-9b1731bfec6ee537.js +1 -0
  52. fides/ui-build/static/admin/_next/static/chunks/4481-7f6710c928bb0cb0.js +1 -0
  53. fides/ui-build/static/admin/_next/static/chunks/5258-2079138c8cc34f6c.js +1 -0
  54. fides/ui-build/static/admin/_next/static/chunks/5404-2694509cf5fa96da.js +1 -0
  55. fides/ui-build/static/admin/_next/static/chunks/5487-2cbd8d2169eb2a65.js +1 -0
  56. fides/ui-build/static/admin/_next/static/chunks/5683-37137111b3e769fb.js +1 -0
  57. fides/ui-build/static/admin/_next/static/chunks/6202-081545c7822d09af.js +1 -0
  58. fides/ui-build/static/admin/_next/static/chunks/6277-459e054b2702c60e.js +1 -0
  59. fides/ui-build/static/admin/_next/static/chunks/641-7e4eef3222cbda70.js +1 -0
  60. fides/ui-build/static/admin/_next/static/chunks/6659-b2088f525bf13c17.js +1 -0
  61. fides/ui-build/static/admin/_next/static/chunks/{6853-0cee00c9da26a40e.js → 6853-688df0b88fe65fd5.js} +1 -1
  62. fides/ui-build/static/admin/_next/static/chunks/69-00cba94689b9e740.js +1 -0
  63. fides/ui-build/static/admin/_next/static/chunks/6954-4e313b4599b8763d.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/7553-08bc3d9f66695111.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/79-fc548561beed136f.js +1 -0
  66. fides/ui-build/static/admin/_next/static/chunks/796-d6586308ed44334b.js +1 -0
  67. fides/ui-build/static/admin/_next/static/chunks/7980-736f9fd1e749ddd2.js +1 -0
  68. fides/ui-build/static/admin/_next/static/chunks/8032-74d94f7bd5b81c89.js +1 -0
  69. fides/ui-build/static/admin/_next/static/chunks/8433-51870336908fb253.js +1 -0
  70. fides/ui-build/static/admin/_next/static/chunks/8499-1fd392d0be9e8ee4.js +1 -0
  71. fides/ui-build/static/admin/_next/static/chunks/9033-fdd87182c15b91e2.js +1 -0
  72. fides/ui-build/static/admin/_next/static/chunks/9327-6a53461c9764b16f.js +1 -0
  73. fides/ui-build/static/admin/_next/static/chunks/{9392.bfca299d4f39a9e0.js → 9392.81edc11e3a175275.js} +1 -1
  74. fides/ui-build/static/admin/_next/static/chunks/9494-1ffb888b95289891.js +1 -0
  75. fides/ui-build/static/admin/_next/static/chunks/9676.61cf5f6d6a083175.js +1 -0
  76. fides/ui-build/static/admin/_next/static/chunks/9767-afd674014a1d1152.js +1 -0
  77. fides/ui-build/static/admin/_next/static/chunks/pages/404-ec04f826f3dd79ea.js +1 -0
  78. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-371b155655c83a1e.js → _app-33bc23b79bffe07c.js} +69 -69
  79. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-1bec086d567aacff.js +1 -0
  80. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-f68bf100e4e60e88.js +1 -0
  81. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-effde5cfe49de55f.js +1 -0
  82. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/add-vendors-ec95ed8cb0712828.js +1 -0
  83. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-4cc195e15e0c3cc8.js +1 -0
  84. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/[id]-be8972c79fb39705.js +1 -0
  85. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-7f38473ce267348a.js → new-a0039f216fb3eb93.js} +1 -1
  86. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-ccf96207de3b74ea.js +1 -0
  87. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/[id]-b9823cc008372cee.js +1 -0
  88. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/new-373f5772ab41bc93.js +1 -0
  89. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-b9beeee1bde5ca79.js +1 -0
  90. fides/ui-build/static/admin/_next/static/chunks/pages/consent/properties-6ab3a5baafebd199.js +1 -0
  91. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-8562790ae07f17c9.js +1 -0
  92. fides/ui-build/static/admin/_next/static/chunks/pages/consent-42d4d2d6e0253671.js +1 -0
  93. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-7ddf45ffd49533b0.js → [resourceUrn]-18e3faf7963962e4.js} +1 -1
  94. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-9d1df6d890671b0c.js +1 -0
  95. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-7eb08af333baaa8e.js +1 -0
  96. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-ed213bc1b7041aa2.js → [resourceUrn]-7320524a47104798.js} +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-1f033ca5a0702018.js → resources-51d99174c8006eb5.js} +1 -1
  98. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-bb57eed84f59a932.js +1 -0
  99. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-47eb34aef3e31ac6.js +1 -0
  100. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-76cefefc53e84c7f.js +1 -0
  101. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-9d8e84a8b4bf568d.js +1 -0
  102. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-c3eaadd88a2e6caa.js +1 -0
  103. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-f38b3ef885a29ea6.js → [resourceUrn]-4c526db0c30c488a.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-29fd0d5a73f13a00.js → detection-6f27dbb7c8edc69d.js} +1 -1
  105. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-9a80241f1028c470.js → [resourceUrn]-562d2b8ae90dd1f0.js} +1 -1
  106. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-c58333981b1522c9.js → discovery-fe7f51502eda57c9.js} +1 -1
  107. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-db45aa864e9dda8a.js +1 -0
  108. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-d5cfdebc74654337.js +1 -0
  109. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-618b89228f83435e.js +1 -0
  110. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-12fc86f15a4c764e.js +1 -0
  111. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-c23d18a9b56c2e3c.js +1 -0
  112. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-e3b2d8e3980ab093.js +1 -0
  113. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-6e27257eccf65f01.js +1 -0
  114. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-bbac1f624424282d.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-84eb56f5a07bdf4f.js +1 -0
  116. fides/ui-build/static/admin/_next/static/chunks/pages/index-773182b5e35d0045.js +1 -0
  117. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-eb28c927da5bd653.js +1 -0
  118. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-781808bca01f8048.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-b51bee8680d66b20.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-1de479533f733fbd.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-7dc295b3ed3d2224.js +1 -0
  122. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-f64dac3392f5ded7.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-eb020bfac4bee532.js +1 -0
  124. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-0bd62e28b539e114.js +1 -0
  125. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-936877004113c2a6.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-6416f01524482af9.js +1 -0
  127. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-3f4e1313d1f2969b.js +1 -0
  128. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-1db7a54437db7db0.js +1 -0
  129. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-64236fd0141414fd.js +1 -0
  130. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-8cab04871908cfeb.js +1 -0
  131. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-150d40428245ee0c.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-b6c876dceb16ad1b.js +1 -0
  133. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-20cdb2c8a03deae1.js +1 -0
  134. fides/ui-build/static/admin/_next/static/chunks/pages/properties/[id]-54bcc875592d1fb9.js +1 -0
  135. fides/ui-build/static/admin/_next/static/chunks/pages/properties/add-property-644dc669b508a79a.js +1 -0
  136. fides/ui-build/static/admin/_next/static/chunks/pages/properties-9a88220d03e7e02f.js +1 -0
  137. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-70dc1081df37ea69.js +1 -0
  138. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-3c71b4dbcb6fd6c9.js +1 -0
  139. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-7cb16e0000dd16c9.js +1 -0
  140. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-a18d8f12ee8dcf5d.js +1 -0
  141. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-dc220e116ad5c09e.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-55ddc5f25b86f28e.js +1 -0
  143. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-5ca7decded228bc8.js +1 -0
  144. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-a6fafa1be2834c40.js +1 -0
  145. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-e633750d2b45ddd6.js +1 -0
  146. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-4fbab6716326060d.js → locations-3948686cbd372969.js} +1 -1
  147. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-04ece499c22d23f4.js +1 -0
  148. fides/ui-build/static/admin/_next/static/chunks/pages/settings/regulations-7752305084280cca.js +1 -0
  149. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-9e5f9066be6f218d.js +1 -0
  150. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-86de9e6d72098e45.js +1 -0
  151. fides/ui-build/static/admin/_next/static/chunks/pages/systems-cac52e6c3abf6a15.js +1 -0
  152. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-60d5930b6855679b.js +1 -0
  153. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-b0f4c34752d32c73.js +1 -0
  154. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-c0b2113b44f46112.js → user-management-7dee83dd6d9292aa.js} +1 -1
  155. fides/ui-build/static/admin/_next/static/chunks/{webpack-abd3efcb23c0bb03.js → webpack-8457bad7859c44f0.js} +1 -1
  156. fides/ui-build/static/admin/_next/static/css/1fdf5c593349dbc6.css +1 -0
  157. fides/ui-build/static/admin/_next/static/css/5ded47c57dae5baf.css +1 -0
  158. fides/ui-build/static/admin/_next/static/css/e458b5f1afdbb7fc.css +1 -0
  159. fides/ui-build/static/admin/_next/static/lb6RRZ8JumokYwsENumlw/_buildManifest.js +1 -0
  160. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  161. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  162. fides/ui-build/static/admin/add-systems.html +1 -1
  163. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  164. fides/ui-build/static/admin/consent/configure.html +1 -1
  165. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  166. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  167. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  168. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  169. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  170. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  171. fides/ui-build/static/admin/consent/properties.html +1 -1
  172. fides/ui-build/static/admin/consent/reporting.html +1 -1
  173. fides/ui-build/static/admin/consent.html +1 -1
  174. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  175. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  176. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  177. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  178. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  179. fides/ui-build/static/admin/data-catalog.html +1 -1
  180. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  181. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  182. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  183. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  184. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  185. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  186. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  187. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  188. fides/ui-build/static/admin/datamap.html +1 -1
  189. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  190. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  191. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  192. fides/ui-build/static/admin/dataset/new.html +1 -1
  193. fides/ui-build/static/admin/dataset.html +1 -1
  194. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  195. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  196. fides/ui-build/static/admin/datastore-connection.html +1 -1
  197. fides/ui-build/static/admin/index.html +1 -1
  198. fides/ui-build/static/admin/integrations/[id].html +1 -1
  199. fides/ui-build/static/admin/integrations.html +1 -1
  200. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  201. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  202. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  203. fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
  204. fides/ui-build/static/admin/lib/fides.js +2 -2
  205. fides/ui-build/static/admin/login/[provider].html +1 -1
  206. fides/ui-build/static/admin/login.html +1 -1
  207. fides/ui-build/static/admin/messaging/[id].html +1 -1
  208. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  209. fides/ui-build/static/admin/messaging.html +1 -1
  210. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  211. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  212. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  213. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  214. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  215. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  216. fides/ui-build/static/admin/poc/forms.html +1 -1
  217. fides/ui-build/static/admin/poc/table-migration.html +1 -0
  218. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  219. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  220. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  221. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  222. fides/ui-build/static/admin/privacy-requests.html +1 -1
  223. fides/ui-build/static/admin/properties/[id].html +1 -1
  224. fides/ui-build/static/admin/properties/add-property.html +1 -1
  225. fides/ui-build/static/admin/properties.html +1 -1
  226. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  227. fides/ui-build/static/admin/settings/about/alpha.html +1 -0
  228. fides/ui-build/static/admin/settings/about.html +1 -1
  229. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  230. fides/ui-build/static/admin/settings/consent.html +1 -1
  231. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  232. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  233. fides/ui-build/static/admin/settings/domains.html +1 -1
  234. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  235. fides/ui-build/static/admin/settings/locations.html +1 -1
  236. fides/ui-build/static/admin/settings/organization.html +1 -1
  237. fides/ui-build/static/admin/settings/regulations.html +1 -1
  238. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  239. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  240. fides/ui-build/static/admin/systems.html +1 -1
  241. fides/ui-build/static/admin/taxonomy.html +1 -1
  242. fides/ui-build/static/admin/user-management/new.html +1 -1
  243. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  244. fides/ui-build/static/admin/user-management.html +1 -1
  245. fides/service/error_handling/__init__.py +0 -0
  246. fides/service/error_handling/error_handler.py +0 -202
  247. fides/ui-build/static/admin/_next/static/K1_4-1GhwfL7h4fYYQBvB/_buildManifest.js +0 -1
  248. fides/ui-build/static/admin/_next/static/chunks/1099-98458e8e9ff67508.js +0 -1
  249. fides/ui-build/static/admin/_next/static/chunks/1100-4106d99f5e1ebd75.js +0 -1
  250. fides/ui-build/static/admin/_next/static/chunks/1327-92a38135ee8d55ec.js +0 -1
  251. fides/ui-build/static/admin/_next/static/chunks/2310-0d63c66c2685e83c.js +0 -1
  252. fides/ui-build/static/admin/_next/static/chunks/2921-ca04a0476e2e56c5.js +0 -1
  253. fides/ui-build/static/admin/_next/static/chunks/3119-e441b14cdab4320e.js +0 -1
  254. fides/ui-build/static/admin/_next/static/chunks/3426-e49cb4766324b2dd.js +0 -1
  255. fides/ui-build/static/admin/_next/static/chunks/3505-e58b93f9c1cbdcad.js +0 -1
  256. fides/ui-build/static/admin/_next/static/chunks/3513-87b54d931698986f.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/355-e4340980d72b4faa.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/3872-6b828cb00fb2ce93.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/4060-9593a3f98e600487.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/4121-5c3af879cdd8b3be.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/4294-5b3aa9d605217915.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/4481-8398edf74aabb8ea.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/4723-4c3c7a375e998c15.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/5258-e000d07844eccf7e.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/5487-62955c11bab63734.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/5626-1b636798faad78e1.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/5683-44966a05fa5ad566.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/570-c99f07161bd339cd.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/5826-ce34f25ac2eeb807.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/5973-56d90405c3616068.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/6277-c35c8cc806f7571f.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/6834-dcda0a8ed484775e.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/69-dc52e39d26a4ad14.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/6954-d02d474ba30756b2.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/79-e5884e6878fc1bbb.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/7980-e17dda2f50ec76b8.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/8433-a77c2cd1c1a6887e.js +0 -1
  279. fides/ui-build/static/admin/_next/static/chunks/8499-34a34015c91fc38b.js +0 -1
  280. fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +0 -1
  281. fides/ui-build/static/admin/_next/static/chunks/9327-a25347d72bfbe680.js +0 -1
  282. fides/ui-build/static/admin/_next/static/chunks/9494-0df032fe6ee531a5.js +0 -1
  283. fides/ui-build/static/admin/_next/static/chunks/9676.97fdbec9c2a48c68.js +0 -1
  284. fides/ui-build/static/admin/_next/static/chunks/9767-74320abc2e9a4550.js +0 -1
  285. fides/ui-build/static/admin/_next/static/chunks/pages/404-c00773c4c6e930af.js +0 -1
  286. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-7d789458fb296270.js +0 -1
  287. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-90320455052466cd.js +0 -1
  288. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-a69f8946466471aa.js +0 -1
  289. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/add-vendors-bcc515a765c0119d.js +0 -1
  290. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-49b9f1b56262dfdc.js +0 -1
  291. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/[id]-d4137bb7fdc1ac6e.js +0 -1
  292. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-5ef03041a530b0e2.js +0 -1
  293. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/[id]-a5a95ac63b1ce206.js +0 -1
  294. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/new-946ce1a2aa1500d4.js +0 -1
  295. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-12f3ba4609bc2ba5.js +0 -1
  296. fides/ui-build/static/admin/_next/static/chunks/pages/consent/properties-ffa15d7ff64a9f05.js +0 -1
  297. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-b959d61c2a3682b3.js +0 -1
  298. fides/ui-build/static/admin/_next/static/chunks/pages/consent-7797e367dd946a18.js +0 -1
  299. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-ecf23116a845188a.js +0 -1
  300. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-79f8e613827c55c1.js +0 -1
  301. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-e950d41b75f86c85.js +0 -1
  302. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-84ead584a88ab662.js +0 -1
  303. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-90f1975f559fff3e.js +0 -1
  304. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-4b820a3173f35504.js +0 -1
  305. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-beedbc38ee2b0094.js +0 -1
  306. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-2d6f95b2769a0936.js +0 -1
  307. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-3536ae978741b659.js +0 -1
  308. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-8b5afe14cf42a4ac.js +0 -1
  309. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-b8dca4298b5bb085.js +0 -1
  310. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-1e26702b1a7e0e12.js +0 -1
  311. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-1f0c4e2e5d0b5bf6.js +0 -1
  312. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-ebf54ea9874c59ae.js +0 -1
  313. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-c39e8e2269883796.js +0 -1
  314. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-9db81467fa254996.js +0 -1
  315. fides/ui-build/static/admin/_next/static/chunks/pages/index-868b60407eae35da.js +0 -1
  316. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-ebc41649161f7fb9.js +0 -1
  317. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-b89b9f68ccc69c1b.js +0 -1
  318. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-22812f08e81bd4f3.js +0 -1
  319. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-ca22869201847ccc.js +0 -1
  320. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-5f41afae411cd8a4.js +0 -1
  321. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-173bd3ad45ea61c6.js +0 -1
  322. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-4dfe984ad80927cd.js +0 -1
  323. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-f790e1ea5cbc26c0.js +0 -1
  324. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-af9e682ec620e990.js +0 -1
  325. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-6ce407101daa6000.js +0 -1
  326. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-9ee8cf14a93eaa4a.js +0 -1
  327. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-928430cd40c35ef2.js +0 -1
  328. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-07ef58b04404479d.js +0 -1
  329. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-595ed9f6ca438020.js +0 -1
  330. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-25a3add8e7982e43.js +0 -1
  331. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-b3384299166bcd1e.js +0 -1
  332. fides/ui-build/static/admin/_next/static/chunks/pages/properties/[id]-081f13526443e0a6.js +0 -1
  333. fides/ui-build/static/admin/_next/static/chunks/pages/properties/add-property-17fb474e458b63e7.js +0 -1
  334. fides/ui-build/static/admin/_next/static/chunks/pages/properties-f00530710b699afd.js +0 -1
  335. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-6a6016708efb5f4f.js +0 -1
  336. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-177919b4ccf8f660.js +0 -1
  337. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-ba15c12c89ee10f8.js +0 -1
  338. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-0f2daeec241bd1a2.js +0 -1
  339. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-0401208a3128fa4d.js +0 -1
  340. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-0daa256958675a23.js +0 -1
  341. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-26810d1ffedcd156.js +0 -1
  342. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-eb78b645d0c1d4ea.js +0 -1
  343. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-9404a6b0b2951992.js +0 -1
  344. fides/ui-build/static/admin/_next/static/chunks/pages/settings/regulations-0a3aa951ef4a44ba.js +0 -1
  345. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-48be14ad09ed4133.js +0 -1
  346. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-b03403fed4dd8805.js +0 -1
  347. fides/ui-build/static/admin/_next/static/chunks/pages/systems-ae591953b24e2fc9.js +0 -1
  348. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-913efe5371344de6.js +0 -1
  349. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-dc11ba29dbd4708b.js +0 -1
  350. fides/ui-build/static/admin/_next/static/css/92c81f666644c594.css +0 -1
  351. fides/ui-build/static/admin/_next/static/css/b89fc4b36b501cf6.css +0 -1
  352. fides/ui-build/static/admin/_next/static/css/c0c2eb63ad3e7390.css +0 -1
  353. {ethyca_fides-2.62.1rc0.dist-info → ethyca_fides-2.63.0.dist-info}/WHEEL +0 -0
  354. {ethyca_fides-2.62.1rc0.dist-info → ethyca_fides-2.63.0.dist-info}/entry_points.txt +0 -0
  355. {ethyca_fides-2.62.1rc0.dist-info → ethyca_fides-2.63.0.dist-info}/licenses/LICENSE +0 -0
  356. {ethyca_fides-2.62.1rc0.dist-info → ethyca_fides-2.63.0.dist-info}/top_level.txt +0 -0
  357. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-69176abe09cf9b52.js → new-b124cc24b930c9e1.js} +0 -0
  358. /fides/ui-build/static/admin/_next/static/{K1_4-1GhwfL7h4fYYQBvB → lb6RRZ8JumokYwsENumlw}/_ssgManifest.js +0 -0
@@ -52,7 +52,6 @@ from fides.api.util.saas_util import (
52
52
  get_identities,
53
53
  )
54
54
  from fides.common.api.v1.urn_registry import REQUEST_TASK_CALLBACK, V1_URL_PREFIX
55
- from fides.config.config_proxy import ConfigProxy
56
55
 
57
56
  T = TypeVar("T")
58
57
 
@@ -144,16 +143,12 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
144
143
  """
145
144
  Returns a tuple of the preferred action and SaaSRequest to use for masking.
146
145
  An update request is preferred, but we can use a gdpr delete endpoint or
147
- delete endpoint if not MASKING_STRICT.
146
+ delete endpoint.
148
147
  """
149
148
 
150
149
  update: Optional[SaaSRequest] = self.get_erasure_request_by_action("update")
151
- gdpr_delete: Optional[SaaSRequest] = None
152
- delete: Optional[SaaSRequest] = None
153
-
154
- if not ConfigProxy(db).execution.masking_strict:
155
- gdpr_delete = self.data_protection_request
156
- delete = self.get_erasure_request_by_action("delete")
150
+ gdpr_delete: Optional[SaaSRequest] = self.data_protection_request
151
+ delete: Optional[SaaSRequest] = self.get_erasure_request_by_action("delete")
157
152
 
158
153
  try:
159
154
  # Return first viable option
@@ -530,11 +530,15 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
530
530
 
531
531
  session = Session.object_session(privacy_request)
532
532
  masking_request = query_config.get_masking_request(session)
533
+ rows_updated = 0
534
+
533
535
  if not masking_request:
534
- raise Exception(
535
- f"Either no masking request configured or no valid masking request for {node.address.collection}. "
536
- f"Check that MASKING_STRICT env var is appropriately set"
536
+ logger.info(
537
+ "No masking request found for the '{}' collection in {}",
538
+ self.current_collection_name,
539
+ self.saas_config.fides_key, # type: ignore
537
540
  )
541
+ return rows_updated
538
542
 
539
543
  self.set_saas_request_state(masking_request)
540
544
 
@@ -565,7 +569,6 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
565
569
  cast(Optional[List[PostProcessorStrategy]], masking_request.postprocessors),
566
570
  )
567
571
 
568
- rows_updated = 0
569
572
  client = self.create_client()
570
573
  for row in rows:
571
574
  try:
@@ -11,7 +11,7 @@ from jinja2 import Environment, FileSystemLoader
11
11
 
12
12
  from fides.api.models.privacy_request import PrivacyRequest
13
13
  from fides.api.schemas.policy import ActionType
14
- from fides.api.util.storage_util import storage_json_encoder
14
+ from fides.api.util.storage_util import StorageJSONEncoder
15
15
 
16
16
  DSR_DIRECTORY = Path(__file__).parent.resolve()
17
17
 
@@ -41,7 +41,9 @@ class DsrReportBuilder:
41
41
 
42
42
  # Jinja template environment initialization
43
43
  def pretty_print(value: str, indent: int = 4) -> str:
44
- return json.dumps(value, indent=indent, default=storage_json_encoder)
44
+ return json.dumps(
45
+ value, indent=indent, default=StorageJSONEncoder().default
46
+ )
45
47
 
46
48
  jinja2.filters.FILTERS["pretty_print"] = pretty_print
47
49
  self.template_loader = Environment(
@@ -1,3 +1,4 @@
1
+ import time
1
2
  from datetime import datetime, timedelta
2
3
  from typing import Any, Dict, List, Optional, Set, Tuple
3
4
 
@@ -67,6 +68,7 @@ from fides.api.tasks import DatabaseTask, celery_app
67
68
  from fides.api.tasks.scheduled.scheduler import scheduler
68
69
  from fides.api.util.collection_util import Row
69
70
  from fides.api.util.logger import Pii, _log_exception, _log_warning
71
+ from fides.api.util.logger_context_utils import LoggerContextKeys, log_context
70
72
  from fides.common.api.v1.urn_registry import (
71
73
  PRIVACY_REQUEST_TRANSFER_TO_PARENT,
72
74
  V1_URL_PREFIX,
@@ -200,6 +202,11 @@ def run_webhooks_and_report_status(
200
202
  return True
201
203
 
202
204
 
205
+ @log_context(
206
+ capture_args={
207
+ "privacy_request_id": LoggerContextKeys.privacy_request_id,
208
+ }
209
+ )
203
210
  def upload_access_results( # pylint: disable=R0912
204
211
  session: Session,
205
212
  policy: Policy,
@@ -210,6 +217,7 @@ def upload_access_results( # pylint: disable=R0912
210
217
  fides_connector_datasets: Set[str],
211
218
  ) -> List[str]:
212
219
  """Process the data uploads after the access portion of the privacy request has completed"""
220
+ start_time = time.time()
213
221
  download_urls: List[str] = []
214
222
  if not access_result:
215
223
  logger.info("No results returned for access request")
@@ -251,12 +259,30 @@ def upload_access_results( # pylint: disable=R0912
251
259
  )
252
260
  if download_url:
253
261
  download_urls.append(download_url)
262
+ privacy_request.add_success_execution_log(
263
+ session,
264
+ connection_key=None,
265
+ dataset_name="Access Package Upload",
266
+ collection_name=None,
267
+ message="Access Package Upload successful for privacy request.",
268
+ action_type=ActionType.access,
269
+ )
270
+ logger.bind(
271
+ time_taken=time.time() - start_time,
272
+ ).info("Access Package Upload successful for privacy request.")
254
273
  except common_exceptions.StorageUploadError as exc:
255
- logger.error(
256
- "Error uploading subject access data for rule {} on policy {}: {}",
257
- rule.key,
258
- policy.key,
259
- Pii(str(exc)),
274
+ logger.bind(
275
+ policy_key=policy.key,
276
+ rule_key=rule.key,
277
+ error=Pii(str(exc)),
278
+ ).error("Error uploading subject access data for rule.")
279
+ privacy_request.add_error_execution_log(
280
+ session,
281
+ connection_key=None,
282
+ dataset_name="Access Package Upload",
283
+ collection_name=None,
284
+ message="Access Package Upload failed for privacy request.",
285
+ action_type=ActionType.access,
260
286
  )
261
287
  privacy_request.status = PrivacyRequestStatus.error
262
288
  # Save the results we uploaded to the user for later retrieval
@@ -596,19 +622,22 @@ def run_privacy_request(
596
622
  # If dev mode, log traceback
597
623
  _log_exception(e, CONFIG.dev_mode)
598
624
  return
599
- privacy_request.finished_processing_at = datetime.utcnow()
600
- AuditLog.create(
601
- db=session,
602
- data={
603
- "user_id": "system",
604
- "privacy_request_id": privacy_request.id,
605
- "action": AuditLogAction.finished,
606
- "message": "",
607
- },
608
- )
609
- privacy_request.status = PrivacyRequestStatus.complete
610
- logger.info("Privacy request run completed.")
611
- privacy_request.save(db=session)
625
+
626
+ # Only mark as complete if not in error state
627
+ if privacy_request.status != PrivacyRequestStatus.error:
628
+ privacy_request.finished_processing_at = datetime.utcnow()
629
+ AuditLog.create(
630
+ db=session,
631
+ data={
632
+ "user_id": "system",
633
+ "privacy_request_id": privacy_request.id,
634
+ "action": AuditLogAction.finished,
635
+ "message": "",
636
+ },
637
+ )
638
+ privacy_request.status = PrivacyRequestStatus.complete
639
+ logger.info("Privacy request run completed.")
640
+ privacy_request.save(db=session)
612
641
 
613
642
 
614
643
  def initiate_privacy_request_completion_email(
@@ -35,6 +35,7 @@ from fides.api.util.cache import (
35
35
  get_async_task_tracking_cache_key,
36
36
  get_cache,
37
37
  )
38
+ from fides.api.util.lock import redis_lock
38
39
  from fides.common.api.v1.urn_registry import PRIVACY_REQUESTS, V1_URL_PREFIX
39
40
  from fides.config import CONFIG
40
41
 
@@ -432,18 +433,9 @@ def requeue_interrupted_tasks(self: DatabaseTask) -> None:
432
433
  """
433
434
  redis_conn: FidesopsRedis = get_cache()
434
435
 
435
- # Create a lock with a timeout of 10 minutes (600 seconds)
436
- # This ensures the lock is eventually released even if the process crashes
437
- lock = redis_conn.lock(REQUEUE_INTERRUPTED_TASKS_LOCK, timeout=600)
438
-
439
- # Try to acquire the lock without blocking
440
- if not lock.acquire(blocking=False):
441
- logger.info(
442
- "Another instance of requeue_interrupted_tasks is already running. Skipping this execution."
443
- )
444
- return
445
-
446
- try:
436
+ with redis_lock(REQUEUE_INTERRUPTED_TASKS_LOCK, 600) as lock:
437
+ if not lock:
438
+ return
447
439
  with self.get_new_session() as db:
448
440
  logger.debug("Starting check for interrupted tasks to requeue")
449
441
 
@@ -545,6 +537,3 @@ def requeue_interrupted_tasks(self: DatabaseTask) -> None:
545
537
  _requeue_privacy_request(db, privacy_request)
546
538
  except PrivacyRequestError as exc:
547
539
  logger.error(exc.message)
548
- finally:
549
- # Always release the lock, even if an exception occurs
550
- lock.release()
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import IO, Any, Dict, Tuple
3
+ from typing import IO, Any, Dict, Tuple, Union
4
4
 
5
5
  from boto3.s3.transfer import TransferConfig
6
6
  from botocore.exceptions import ClientError, ParamValidationError
@@ -129,25 +129,38 @@ def generic_retrieve_from_s3(
129
129
  bucket_name: str,
130
130
  file_key: str,
131
131
  auth_method: str,
132
- ) -> Tuple[int, AnyHttpUrlString]:
132
+ get_content: bool = False,
133
+ ) -> Tuple[int, Union[str, bytes]]:
133
134
  """
134
- Retrieves file metadata and generates a presigned URL for downloading an S3 object.
135
+ Retrieves a file from S3 and returns its size and either a presigned URL or the actual content.
135
136
 
136
- :param storage_secrets: S3 storage secrets
137
- :param bucket_name: Name of the S3 bucket
138
- :param file_key: Key of the file in the bucket
139
- :param auth_method: Authentication method for S3
140
- :return: Tuple containing (file_size, presigned_url)
137
+ Args:
138
+ storage_secrets: Dictionary containing S3 credentials
139
+ bucket_name: Name of the S3 bucket
140
+ file_key: Key of the file in the bucket
141
+ auth_method: Authentication method to use
142
+ get_content: If True, returns the actual content instead of a presigned URL
143
+
144
+ Returns:
145
+ Tuple containing (file_size, presigned_url_or_content)
141
146
  """
142
147
  logger.info("Retrieving S3 object: {}", file_key)
148
+ s3_client = get_s3_client(auth_method, storage_secrets)
143
149
 
144
- s3_client = maybe_get_s3_client(auth_method, storage_secrets)
145
150
  try:
146
- get_allowed_file_type_or_raise(file_key)
147
- file_size = get_file_size(s3_client, bucket_name, file_key)
148
- return file_size, create_presigned_url_for_s3(s3_client, bucket_name, file_key)
149
- except Exception as e:
150
- logger.error("Encountered error while retrieving S3 object: {}", e)
151
+ if get_content:
152
+ # Get the actual content
153
+ response = s3_client.get_object(Bucket=bucket_name, Key=file_key)
154
+ content = response["Body"].read()
155
+ return response["ContentLength"], content
156
+
157
+ # Get presigned URL
158
+ presigned_url = create_presigned_url_for_s3(s3_client, bucket_name, file_key)
159
+ # Get file size
160
+ response = s3_client.head_object(Bucket=bucket_name, Key=file_key)
161
+ return int(response["ContentLength"]), str(presigned_url)
162
+ except ClientError as e:
163
+ logger.error(f"Error retrieving file from S3: {e}")
151
164
  raise e
152
165
 
153
166
 
@@ -158,7 +171,8 @@ def generic_delete_from_s3(
158
171
  auth_method: str,
159
172
  ) -> None:
160
173
  """
161
- Deletes arbitrary data from s3
174
+ Deletes arbitrary data from s3. If file_key ends with a filename, deletes just that file.
175
+ If file_key ends with a '/', deletes all objects with that prefix.
162
176
 
163
177
  :param storage_secrets: S3 storage secrets
164
178
  :param bucket_name: Name of the S3 bucket
@@ -169,6 +183,17 @@ def generic_delete_from_s3(
169
183
 
170
184
  s3_client = maybe_get_s3_client(auth_method, storage_secrets)
171
185
  try:
186
+ # If the file_key ends with a '/', it's a folder prefix
187
+ if file_key.endswith("/"):
188
+ # List all objects with the prefix, handling pagination
189
+ paginator = s3_client.get_paginator("list_objects_v2")
190
+ for page in paginator.paginate(Bucket=bucket_name, Prefix=file_key):
191
+ if "Contents" in page:
192
+ for obj in page["Contents"]:
193
+ s3_client.delete_object(Bucket=bucket_name, Key=obj["Key"])
194
+ return
195
+
196
+ # Delete single object
172
197
  s3_client.delete_object(Bucket=bucket_name, Key=file_key)
173
198
  except Exception as e:
174
199
  logger.error("Encountered error while deleting s3 object: {}", e)
@@ -11,6 +11,7 @@ from botocore.exceptions import ClientError, ParamValidationError
11
11
  from fideslang.validation import AnyHttpUrlString
12
12
  from loguru import logger
13
13
 
14
+ from fides.api.common_exceptions import StorageUploadError
14
15
  from fides.api.cryptography.cryptographic_util import bytes_to_b64_str
15
16
  from fides.api.schemas.storage.storage import ResponseFormat, StorageSecrets
16
17
  from fides.api.service.privacy_request.dsr_package.dsr_report_builder import (
@@ -30,7 +31,7 @@ from fides.api.util.cache import get_cache, get_encryption_cache_key
30
31
  from fides.api.util.encryption.aes_gcm_encryption_scheme import (
31
32
  encrypt_to_bytes_verify_secrets_length,
32
33
  )
33
- from fides.api.util.storage_util import storage_json_encoder
34
+ from fides.api.util.storage_util import StorageJSONEncoder
34
35
  from fides.config import CONFIG
35
36
 
36
37
  if TYPE_CHECKING:
@@ -75,7 +76,7 @@ def write_to_in_memory_buffer(
75
76
  logger.debug("Writing data to in-memory buffer")
76
77
 
77
78
  if resp_format == ResponseFormat.json.value:
78
- json_str = json.dumps(data, indent=2, default=storage_json_encoder)
79
+ json_str = json.dumps(data, indent=2, default=StorageJSONEncoder().default)
79
80
  return BytesIO(
80
81
  encrypt_access_request_results(json_str, privacy_request.id).encode(
81
82
  CONFIG.security.encoding
@@ -160,9 +161,9 @@ def upload_to_s3( # pylint: disable=R0913
160
161
  logger.error(
161
162
  "Encountered error while uploading and generating link for s3 object: {}", e
162
163
  )
163
- raise e
164
+ raise StorageUploadError(f"Error uploading to S3: {e}")
164
165
  except ParamValidationError as e:
165
- raise ValueError(f"The parameters you provided are incorrect: {e}")
166
+ raise StorageUploadError(f"The parameters you provided are incorrect: {e}")
166
167
 
167
168
 
168
169
  def upload_to_gcs(
@@ -205,7 +206,7 @@ def upload_to_gcs(
205
206
  "Encountered error while uploading and generating link for Google Cloud Storage object: {}",
206
207
  e,
207
208
  )
208
- raise e
209
+ raise StorageUploadError(f"Error uploading to Google Cloud Storage: {e}")
209
210
 
210
211
 
211
212
  def upload_to_local(
fides/api/util/lock.py ADDED
@@ -0,0 +1,44 @@
1
+ from __future__ import annotations
2
+
3
+ from contextlib import contextmanager
4
+ from typing import Generator
5
+
6
+ from loguru import logger
7
+ from redis.lock import Lock
8
+
9
+ from fides.api.util.cache import FidesopsRedis, get_cache
10
+
11
+
12
+ def get_redis_lock(lock_key: str, timeout: int) -> Lock:
13
+ """
14
+ Creates and returns a Redis lock object.
15
+ """
16
+ redis: FidesopsRedis = get_cache()
17
+ return redis.lock(lock_key, timeout=timeout)
18
+
19
+
20
+ @contextmanager
21
+ def redis_lock(lock_key: str, timeout: int) -> Generator[Lock | None, None, None]:
22
+ """
23
+ A context manager for acquiring a Redis lock.
24
+ If the lock is acquired, it yields the lock object.
25
+ If the lock is not acquired, it yields None.
26
+ The lock is automatically released on exiting the context.
27
+ """
28
+ lock = get_redis_lock(lock_key, timeout)
29
+
30
+ if not lock.acquire(blocking=False):
31
+ logger.info(
32
+ f"Another process is already running for lock '{lock_key}'. Skipping this execution."
33
+ )
34
+ yield None
35
+ return
36
+
37
+ try:
38
+ logger.info(f"Acquired lock for '{lock_key}'.")
39
+ yield lock
40
+ finally:
41
+ # Always release the lock if we own it
42
+ if lock.owned():
43
+ lock.release()
44
+ logger.info(f"Released lock for '{lock_key}'.")
@@ -1,5 +1,5 @@
1
1
  from datetime import datetime
2
- from typing import Any, Dict, Union
2
+ from typing import Any, Union
3
3
 
4
4
  from bson import ObjectId
5
5
  from pydantic import ValidationError
@@ -11,6 +11,7 @@ from fides.api.schemas.storage.storage import (
11
11
  StorageType,
12
12
  )
13
13
  from fides.api.schemas.storage.storage_secrets_docs_only import possible_storage_secrets
14
+ from fides.api.util.custom_json_encoder import CustomJSONEncoder
14
15
 
15
16
 
16
17
  def get_schema_for_secrets(
@@ -48,10 +49,15 @@ def get_schema_for_secrets(
48
49
  raise ValueError(errors)
49
50
 
50
51
 
51
- def storage_json_encoder(field: Any) -> Union[str, Dict[str, str]]:
52
- """Specify str format for datetime objects"""
53
- if isinstance(field, datetime):
54
- return field.strftime("%Y-%m-%dT%H:%M:%S")
55
- if isinstance(field, ObjectId):
56
- return {"$oid": str(field)}
57
- return field
52
+ class StorageJSONEncoder(CustomJSONEncoder):
53
+ """
54
+ A JSON encoder specifically for storage operations that maintains the original
55
+ format for datetime and ObjectId while inheriting other functionality from CustomJSONEncoder.
56
+ """
57
+
58
+ def default(self, o: Any) -> Any:
59
+ if isinstance(o, datetime):
60
+ return o.strftime("%Y-%m-%dT%H:%M:%S")
61
+ if isinstance(o, ObjectId):
62
+ return {"$oid": str(o)}
63
+ return super().default(o)
@@ -37,6 +37,7 @@ EXEC = "exec"
37
37
  FIDES_TAXONOMY = "fides_taxonomy"
38
38
  GENERATE = "generate"
39
39
  INSTANTIATE = "instantiate"
40
+ MANUAL_STEPS = "manual-steps"
40
41
  MASKING = "masking"
41
42
  MESSAGING = "messaging"
42
43
  ORGANIZATION = "organization"
@@ -51,6 +52,7 @@ PRIVACY_REQUEST_NOTIFICATIONS = "privacy-request-notifications"
51
52
  READ = "read"
52
53
  REGISTER = "register"
53
54
  RESET = "reset"
55
+ RESPOND = "respond"
54
56
  RESUME = "resume"
55
57
  REVIEW = "review"
56
58
  RULE = "rule"
@@ -174,6 +176,8 @@ PRIVACY_PREFERENCE_HISTORY_READ = f"{PRIVACY_PREFERENCE_HISTORY}:{READ}"
174
176
  PRIVACY_REQUEST_CALLBACK_RESUME = f"{PRIVACY_REQUEST}:{RESUME}" # User has permission to restart a paused privacy request
175
177
  PRIVACY_REQUEST_CREATE = f"{PRIVACY_REQUEST}:{CREATE}"
176
178
  PRIVACY_REQUEST_DELETE = f"{PRIVACY_REQUEST}:{DELETE}"
179
+ PRIVACY_REQUEST_MANUAL_STEPS_REVIEW = f"{PRIVACY_REQUEST}:{MANUAL_STEPS}:{REVIEW}"
180
+ PRIVACY_REQUEST_MANUAL_STEPS_RESPOND = f"{PRIVACY_REQUEST}:{MANUAL_STEPS}:{RESPOND}"
177
181
  PRIVACY_REQUEST_NOTIFICATIONS_CREATE_OR_UPDATE = (
178
182
  f"{PRIVACY_REQUEST_NOTIFICATIONS}:{CREATE_OR_UPDATE}"
179
183
  )
@@ -312,6 +316,8 @@ SCOPE_DOCS = {
312
316
  PRIVACY_REQUEST_CALLBACK_RESUME: "Restart paused privacy requests",
313
317
  PRIVACY_REQUEST_READ_ACCESS_RESULTS: "Download access data for the privacy request",
314
318
  PRIVACY_REQUEST_DELETE: "Remove privacy requests",
319
+ PRIVACY_REQUEST_MANUAL_STEPS_RESPOND: "Respond to manual steps for the privacy request",
320
+ PRIVACY_REQUEST_MANUAL_STEPS_REVIEW: "Review manual steps for the privacy request",
315
321
  PRIVACY_REQUEST_NOTIFICATIONS_CREATE_OR_UPDATE: "",
316
322
  PRIVACY_REQUEST_NOTIFICATIONS_READ: "",
317
323
  PRIVACY_REQUEST_READ: "View privacy requests",
@@ -106,7 +106,6 @@ class ExecutionSettingsProxy(ConfigProxyBase):
106
106
  subject_identity_verification_required: bool
107
107
  disable_consent_identity_verification: bool
108
108
  require_manual_request_approval: bool
109
- masking_strict: bool
110
109
 
111
110
  def __getattribute__(self, name: str) -> Any:
112
111
  """
@@ -11,10 +11,6 @@ ENV_PREFIX = "FIDES__EXECUTION__"
11
11
  class ExecutionSettings(FidesSettings):
12
12
  """Configuration settings for DSR execution."""
13
13
 
14
- masking_strict: bool = Field(
15
- default=True,
16
- description="If set to True, only use UPDATE requests to mask data. If False, Fides will use any defined DELETE or GDPR DELETE endpoints to remove PII, which may extend beyond the specific data categories that configured in your execution policy.",
17
- )
18
14
  privacy_request_delay_timeout: int = Field(
19
15
  default=3600,
20
16
  description="The amount of time to wait for actions which delay privacy requests (e.g., pre- and post-processing webhooks).",
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/c0c2eb63ad3e7390.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c0c2eb63ad3e7390.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-abd3efcb23c0bb03.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-371b155655c83a1e.js" defer=""></script><script src="/_next/static/chunks/pages/404-c00773c4c6e930af.js" defer=""></script><script src="/_next/static/K1_4-1GhwfL7h4fYYQBvB/_buildManifest.js" defer=""></script><script src="/_next/static/K1_4-1GhwfL7h4fYYQBvB/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"K1_4-1GhwfL7h4fYYQBvB","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-33bc23b79bffe07c.js" defer=""></script><script src="/_next/static/chunks/pages/404-ec04f826f3dd79ea.js" defer=""></script><script src="/_next/static/lb6RRZ8JumokYwsENumlw/_buildManifest.js" defer=""></script><script src="/_next/static/lb6RRZ8JumokYwsENumlw/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"lb6RRZ8JumokYwsENumlw","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1099],{95372:function(e){e.exports=function(e,t,n,a){for(var i=e.length,r=n+(a?1:-1);a?r--:++r<i;)if(t(e[r],r,e))return r;return -1}},56632:function(e,t,n){var a=n(89278),i=n(80068),r=n(50098);e.exports=function(e){return function(t,n,o){var s=Object(t);if(!i(t)){var l=a(n,3);t=r(t),n=function(e){return l(s[e],e,s)}}var c=e(t,n,o);return c>-1?s[l?t[c]:c]:void 0}}},64925:function(e,t,n){var a=n(56632)(n(66259));e.exports=a},66259:function(e,t,n){var a=n(95372),i=n(89278),r=n(47991),o=Math.max;e.exports=function(e,t,n){var s=null==e?0:e.length;if(!s)return -1;var l=null==n?0:r(n);return l<0&&(l=o(s+l,0)),a(e,i(t,3),l)}},94919:function(e,t,n){var a=n(91936),i=1/0;e.exports=function(e){return e?(e=a(e))===i||e===-i?(e<0?-1:1)*17976931348623157e292:e==e?e:0:0===e?e:0}},47991:function(e,t,n){var a=n(94919);e.exports=function(e){var t=a(e),n=t%1;return t==t?n?t-n:t:0}},12627:function(e,t,n){"use strict";var a=n(24246),i=n(79283),r=n(34929);t.Z=e=>{let{selectedTaxonomies:t,showDisabled:n=!1,...o}=e,{getDataCategoryDisplayNameProps:s,getDataCategories:l}=(0,r.Z)(),c=(n?l():l().filter(e=>e.active)).filter(e=>!t.includes(e.fides_key)).map(e=>{let{name:t,primaryName:n}=s(e.fides_key);return{value:e.fides_key,name:t,primaryName:n,description:e.description||""}});return(0,a.jsx)(i.l,{options:c,...o})}},79283:function(e,t,n){"use strict";n.d(t,{l:function(){return l}});var a=n(24246),i=n(4454),r=n(72707),o=n.n(r);let s=e=>{let{data:t}=e;return(0,a.jsxs)(i.jqI,{gap:12,title:"".concat(t.primaryName||"").concat(t.primaryName?": ":"").concat(t.name," - ").concat(t.description),children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("strong",{children:t.primaryName||t.name}),t.primaryName&&": ".concat(t.name)]}),(0,a.jsx)("em",{children:t.description})]})},l=e=>{let{options:t,...n}=e,r=null==t?void 0:t.map(e=>({...e,className:o().option}));return(0,a.jsx)(i.WPr,{options:r,autoFocus:!0,variant:"borderless",optionRender:s,dropdownStyle:{minWidth:"500px"},className:"w-full p-0","data-testid":"taxonomy-select",...n})}},34929:function(e,t,n){"use strict";var a=n(24246),i=n(64925),r=n.n(i),o=n(27378),s=n(16134),l=n(30002),c=n(28079),d=n(57072);let u=()=>{let{isLoading:e}=(0,c.fd)(),t=(0,s.C)(c.U3),{isLoading:n}=(0,d.MO)(),a=(0,s.C)(d.qb),{isLoading:i}=(0,l.te)();return{dataUses:t,dataSubjects:(0,s.C)(l.ZL),dataCategories:a,isLoading:e||n||i}};t.Z=()=>{let{dataUses:e,dataCategories:t,dataSubjects:n,isLoading:i}=u(),s=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return e.split(".").slice(0,t).join(".")},l=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,a=t(e);if(!a)return{};let i=t(s(e,n)),r=!!a.parent_key;return{name:a.name||void 0,primaryName:r&&(null==i?void 0:i.name)!==a.name&&(null==i?void 0:i.name)||void 0}},c=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,{name:i,primaryName:r}=l(e,t,n);return i?r?(0,a.jsxs)(o.Fragment,{children:[(0,a.jsxs)("strong",{children:[r,":"]})," ",i]},e):(0,a.jsx)("strong",{children:i},e):e},d=t=>r()(e,{fides_key:t}),f=e=>r()(t,{fides_key:e}),g=e=>r()(n,{fides_key:e});return{getDataUses:()=>e,getDataUseByKey:d,getDataUseDisplayName:e=>c(e,d,1),getDataUseDisplayNameProps:e=>l(e,d,1),getDataCategories:()=>t,getDataCategoryByKey:f,getDataCategoryDisplayName:e=>c(e,f,2),getDataCategoryDisplayNameProps:e=>l(e,f,2),getDataSubjects:()=>n,getDataSubjectByKey:g,getDataSubjectDisplayName:e=>{let t=g(e);return t?t.name:e},getPrimaryKey:s,isLoading:i}}},61099:function(e,t,n){"use strict";var a=n(24246),i=n(4454),r=n(27378),o=n(12627),s=n(34929),l=n(26183),c=n(70675);t.Z=e=>{var t,n,d;let{resource:u}=e,[f,g]=(0,r.useState)(!1),{getDataCategoryDisplayName:p}=(0,s.Z)(),[m]=(0,c.NA)(),v=(null===(t=u.classifications)||void 0===t?void 0:t.length)?u.classifications[0].label:null,x=null!==(d=u.user_assigned_data_categories)&&void 0!==d?d:[],h=!v&&!(null==x?void 0:x.length),_=null===(n=u.sub_field_urns)||void 0===n?void 0:n.length,j=e=>{m({staged_resource_urn:u.urn,monitor_config_id:u.monitor_config_id,user_assigned_data_categories:[...x,e]})},y=e=>{var t;m({staged_resource_urn:u.urn,monitor_config_id:u.monitor_config_id,user_assigned_data_categories:null!==(t=null==x?void 0:x.filter(t=>t!==e))&&void 0!==t?t:[]})},b=!f&&!!x.length,N=!f&&!!v&&!x.length;return(0,a.jsxs)(l.Z,{"data-testid":"edit-category-cell",children:[h&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.j8w,{"data-testid":"no-classifications",color:"white",children:"None"}),!_&&(0,a.jsx)(i.j8w,{onClick:()=>g(!0),addable:!0,"data-testid":"taxonomy-add-btn","aria-label":"Add category"})]}),b&&(0,a.jsxs)(a.Fragment,{children:[x.map(e=>(0,a.jsx)(i.j8w,{"data-testid":"user-classification-".concat(e),color:"white",closable:!0,onClose:()=>y(e),closeButtonLabel:"Remove category",children:p(e)},e)),(0,a.jsx)(i.j8w,{onClick:()=>g(!0),addable:!0,"data-testid":"taxonomy-add-btn","aria-label":"Add category"})]}),N&&(0,a.jsxs)(i.j8w,{onClick:()=>g(!0),color:"white","data-testid":"classification-".concat(v),hasSparkle:!0,children:[p(v),(0,a.jsx)(i.PJP.I8b,{size:10})]}),f&&(0,a.jsx)(i.xuv,{className:"select-wrapper",position:"absolute",zIndex:10,top:"0",left:"0",width:"100%",height:"max",bgColor:"#fff",children:(0,a.jsx)(o.Z,{selectedTaxonomies:x,onChange:e=>{g(!1),j(e)},onBlur:()=>g(!1),open:!0})})]})}},26183:function(e,t,n){"use strict";var a=n(24246);n(27378),t.Z=e=>{let{children:t,className:n,...i}=e;return(0,a.jsx)("div",{className:"relative flex w-full flex-wrap items-center gap-2 overflow-x-auto py-2 ".concat(n||""),...i,children:t})}},72707:function(e){e.exports={option:"TaxonomySelect_option__vY6v2"}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1100],{58754:function(e,t,n){var r=n(24246),i=n(4454),s=n(70788);t.Z=e=>{let{heading:t,breadcrumbItems:n,isSticky:a=!0,children:l,rightContent:o,style:u,...c}=e;return(0,r.jsxs)("div",{...c,style:a?{position:"sticky",top:"-24px",paddingTop:"24px",paddingBottom:"24px",paddingLeft:"40px",marginLeft:"-40px",paddingRight:"40px",marginRight:"-40px",marginTop:"-24px",left:0,zIndex:20,backgroundColor:"white",...u}:{paddingBottom:"24px",...u},children:[(0,r.jsxs)(i.jqI,{justify:"space-between",children:["string"==typeof t?(0,r.jsx)(i.lQT,{className:n||l?"pb-4":void 0,level:1,"data-testid":"page-heading",children:t}):t,o&&(0,r.jsx)("div",{"data-testid":"page-header-right-content",children:o})]}),!!n&&(0,r.jsx)(s.m,{className:l?"pb-4":void 0,items:n,"data-testid":"page-breadcrumb"}),l]})}},10342:function(e,t,n){var r=n(24246),i=n(4454),s=n(46238);t.Z=e=>{let{title:t,tooltip:n,children:a,...l}=e;return(0,r.jsxs)(i.xuv,{borderRadius:"md",border:"1px solid",borderColor:"gray.200",...l,children:[(0,r.jsxs)(i.X6q,{as:"h3",fontSize:"sm",fontWeight:"semibold",color:"gray.700",py:4,px:6,backgroundColor:"gray.50",borderRadius:"md",textAlign:"left",children:[t,n?(0,r.jsx)(i.xvT,{as:"span",mx:1,children:(0,r.jsx)(s.b,{label:n})}):void 0]}),(0,r.jsx)(i.Kqy,{p:6,spacing:6,children:a})]})}},70788:function(e,t,n){n.d(t,{m:function(){return u}});var r=n(24246),i=n(4454),s=n(79894),a=n.n(s),l=n(27378);let{Text:o}=i.AntTypography,u=e=>{let{items:t,...n}=e,s=(0,l.useMemo)(()=>null==t?void 0:t.map((e,n)=>{let s=n===t.length-1,l={...e},u=l.onClick&&!l.href;return("string"==typeof l.title&&(l.title=(0,r.jsx)(o,{style:{color:"inherit",maxWidth:s?void 0:400},ellipsis:!s,children:l.title})),u)?l.title=(0,r.jsx)(i.wpx,{type:"text",size:"small",icon:l.icon,onClick:l.onClick,className:"ant-breadcrumb-link -mt-px px-1 text-inherit",children:l.title}):(l.icon&&(l.title=(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("span",{className:"anticon align-text-bottom",children:l.icon}),l.title]})),l.href&&l.title&&(l.title=(0,r.jsx)(a(),{href:l.href,className:"ant-breadcrumb-link",children:l.title}),delete l.href)),l}),[t]);return(0,r.jsx)(i.zrq,{items:s,...n})}},67810:function(e,t,n){n.d(t,{Z:function(){return s}}),(r=i||(i={})).PRIVACY_REQUEST_REVIEW_APPROVE="privacy_request_review_approve",r.PRIVACY_REQUEST_REVIEW_DENY="privacy_request_review_deny",r.PRIVACY_REQUEST_RECEIPT="privacy_request_receipt",r.PRIVACY_REQUEST_COMPLETE_ACCESS="privacy_request_complete_access",r.PRIVACY_REQUEST_COMPLETE_DELETION="privacy_request_complete_deletion",r.SUBJECT_IDENTITY_VERIFICATION="subject_identity_verification";var r,i,s={[i.PRIVACY_REQUEST_COMPLETE_ACCESS]:"Access request completed",[i.PRIVACY_REQUEST_COMPLETE_DELETION]:"Erasure request completed",[i.PRIVACY_REQUEST_RECEIPT]:"Privacy request received",[i.PRIVACY_REQUEST_REVIEW_APPROVE]:"Privacy request approved",[i.PRIVACY_REQUEST_REVIEW_DENY]:"Privacy request denied",[i.SUBJECT_IDENTITY_VERIFICATION]:"Subject identity verification"}},20149:function(e,t,n){var r=n(24246),i=n(77830),s=n(4454),a=n(34090),l=n(86677),o=n(16134),u=n(10342),c=n(40324),d=n(51472),p=n(67810),m=n(64826);let g=()=>{var e;let t=(0,o.C)(m.Zp),n=(0,o.C)(m.G1);(0,m.gz)({page:t,size:n});let i=(0,o.C)(m.YO),{values:s,setFieldValue:l}=(0,a.u6)();return(0,r.jsx)(d.Z,{label:"Associated properties",addButtonLabel:"Add property",idField:"id",nameField:"name",allItems:i.map(e=>({id:e.id,name:e.name})),values:null!==(e=s.properties)&&void 0!==e?e:[],setValues:e=>l("properties",e),draggable:!0,maxHeight:100,baseTestId:"property"})};t.Z=e=>{let{template:t,handleSubmit:n,handleDelete:o}=e,d=(0,l.useRouter)(),m=()=>{d.push(i.q)},f={type:t.type,content:t.content,properties:t.properties||[],is_enabled:t.is_enabled,id:t.id||""};return(0,r.jsx)(a.J9,{enableReinitialize:!0,initialValues:f,onSubmit:n,children:e=>{let{dirty:t,isValid:n,isSubmitting:i}=e;return(0,r.jsxs)(a.l0,{style:{paddingTop:"12px",paddingBottom:"12px"},children:[(0,r.jsx)(s.xuv,{py:3,children:(0,r.jsxs)(u.Z,{title:"".concat(p.Z[f.type]),children:[(0,r.jsx)(c.j0,{isRequired:!0,label:"Email subject",name:"content.subject",variant:"stacked"}),(0,r.jsx)(c.Ks,{isRequired:!0,label:"Message body",name:"content.body",value:"test",variant:"stacked",resize:!0}),(0,r.jsx)(s.xuv,{py:3,children:(0,r.jsx)(g,{})}),(0,r.jsx)(c.w8,{name:"is_enabled",label:"Enable message",variant:"switchFirst"})]})}),(0,r.jsxs)(s.kCb,{justifyContent:"space-between",width:"100%",paddingTop:2,children:[f.id&&o&&(0,r.jsx)(s.wpx,{"data-testid":"delete-template-button",loading:!1,className:"mr-3",onClick:o,children:"Delete"}),(0,r.jsxs)(s.kCb,{justifyContent:"right",width:"100%",paddingTop:2,children:[(0,r.jsx)(s.wpx,{loading:!1,className:"mr-3",onClick:m,children:"Cancel"}),(0,r.jsx)(s.wpx,{htmlType:"submit",type:"primary",disabled:i||!t||!n,loading:i,"data-testid":"submit-btn",children:"Save"})]})]})]})}})}},5058:function(e,t,n){n.d(t,{Vw:function(){return s},ms:function(){return r},pS:function(){return i},vm:function(){return a}});let{useGetSummaryMessagingTemplatesQuery:r,usePutMessagingTemplateByIdMutation:i,useCreateMessagingTemplateByTypeMutation:s,usePatchMessagingTemplateByIdMutation:a}=n(78780).u.injectEndpoints({endpoints:e=>({getSummaryMessagingTemplates:e.query({query:e=>({method:"GET",url:"plus/messaging/templates/summary",params:e}),providesTags:()=>["Property-Specific Messaging Templates"]}),putMessagingTemplateById:e.mutation({query:e=>{let{templateId:t,template:n}=e;return{url:"plus/messaging/templates/".concat(t),method:"PUT",body:n}},invalidatesTags:()=>["Property-Specific Messaging Templates"]}),patchMessagingTemplateById:e.mutation({query:e=>{let{templateId:t,template:n}=e;return{url:"plus/messaging/templates/".concat(t),method:"PATCH",body:n}},invalidatesTags:()=>["Property-Specific Messaging Templates"]}),createMessagingTemplateByType:e.mutation({query:e=>{let{templateType:t,template:n}=e;return{url:"plus/messaging/templates/".concat(t),method:"POST",body:n}},invalidatesTags:()=>["Property-Specific Messaging Templates"]})})})},47466:function(e,t,n){n.d(t,{KC:function(){return a},ew:function(){return l},gQ:function(){return s},jM:function(){return r},lE:function(){return i}});let{useGetMessagingTemplatesQuery:r,useUpdateMessagingTemplatesMutation:i,useGetMessagingTemplateByIdQuery:s,useGetMessagingTemplateDefaultQuery:a,useDeleteMessagingTemplateByIdMutation:l}=n(78780).u.injectEndpoints({endpoints:e=>({getMessagingTemplates:e.query({query:()=>({url:"messaging/templates"}),providesTags:()=>["Messaging Templates"]}),updateMessagingTemplates:e.mutation({query:e=>({url:"messaging/templates",method:"PUT",body:e}),invalidatesTags:()=>["Messaging Templates"]}),getMessagingTemplateById:e.query({query:e=>({url:"/messaging/templates/".concat(e)}),providesTags:()=>["Property-Specific Messaging Templates"]}),getMessagingTemplateDefault:e.query({query:e=>({url:"/messaging/templates/default/".concat(e)})}),deleteMessagingTemplateById:e.mutation({query:e=>({url:"/messaging/templates/".concat(e),method:"DELETE"}),invalidatesTags:()=>["Property-Specific Messaging Templates"]})})})},31883:function(e,t,n){n.d(t,{Bw:function(){return r.Bw},D4:function(){return r.D4}});var r=n(19043)},11055:function(e,t,n){n.d(t,{M:function(){return d}});var r=n(24246),i=n(29427),s=n(27378),a=n(40976),l=n(18397),o=n(42308),u=n(25431),c=n(39556);let d=(0,s.forwardRef)(function({children:e,as:t="ul",axis:n="y",onReorder:d,values:g,...f},y){let h=(0,o.h)(()=>l.E[t]),x=[],E=(0,s.useRef)(!1);return(0,i.k)(!!g,"Reorder.Group must be provided a values prop"),(0,s.useEffect)(()=>{E.current=!1}),(0,r.jsx)(h,{...f,ref:y,ignoreStrict:!0,children:(0,r.jsx)(a.Y.Provider,{value:{axis:n,registerItem:(e,t)=>{let r=x.findIndex(t=>e===t.value);-1!==r?x[r].layout=t[n]:x.push({value:e,layout:t[n]}),x.sort(m)},updateOrder:(e,t,n)=>{if(E.current)return;let r=function(e,t,n,r){if(!r)return e;let i=e.findIndex(e=>e.value===t);if(-1===i)return e;let s=r>0?1:-1,a=e[i+s];if(!a)return e;let l=e[i],o=a.layout,d=(0,c.t)(o.min,o.max,.5);return 1===s&&l.layout.max+n>d||-1===s&&l.layout.min+n<d?(0,u.uo)(e,i,i+s):e}(x,e,t,n);x!==r&&(E.current=!0,d(r.map(p).filter(e=>-1!==g.indexOf(e))))}},children:e})})});function p(e){return e.value}function m(e,t){return e.layout.min-t.layout.min}},7078:function(e,t,n){n.d(t,{e:function(){return T}});var r=n(24246),i=n(29427),s=n(27378),a=n(40976),l=n(18397),o=n(42308),u=n(69222),c=n(67412);function d(e){let t=(0,o.h)(()=>(0,u.BX)(e)),{isStatic:n}=(0,s.useContext)(c._);if(n){let[,n]=(0,s.useState)(e);(0,s.useEffect)(()=>t.on("change",n),[])}return t}var p=n(13998);let m=e=>e&&"object"==typeof e&&e.mix,g=e=>m(e)?e.mix:void 0;var f=n(64306),y=n(95984);function h(e,t){let n=d(t()),r=()=>n.set(t());return r(),(0,f.L)(()=>{let t=()=>y.Wi.preRender(r,!1,!0),n=e.map(e=>e.on("change",t));return()=>{n.forEach(e=>e()),(0,y.Pn)(r)}}),n}function x(e,t){let n=(0,o.h)(()=>[]);return h(e,()=>{n.length=0;let r=e.length;for(let t=0;t<r;t++)n[t]=e[t].get();return t(n)})}var E=n(3522);function v(e,t=0){return(0,E.i)(e)?e:d(t)}let T=(0,s.forwardRef)(function({children:e,style:t={},value:n,as:c="li",onDrag:d,layout:m=!0,...f},y){let E=(0,o.h)(()=>l.E[c]),T=(0,s.useContext)(a.Y),b={x:v(t.x),y:v(t.y)},_=function(e,t,n,r){if("function"==typeof e)return function(e){u.S1.current=[],e();let t=h(u.S1.current,e);return u.S1.current=void 0,t}(e);let i="function"==typeof t?t:function(...e){let t=!Array.isArray(e[0]),n=t?0:-1,r=e[0+n],i=e[1+n],s=e[2+n],a=e[3+n],l=(0,p.s)(i,s,{mixer:g(s[0]),...a});return t?l(r):l}(t,void 0,void 0);return Array.isArray(e)?x(e,i):x([e],([e])=>i(e))}([b.x,b.y],([e,t])=>e||t?1:"unset");(0,i.k)(!!T,"Reorder.Item must be a child of Reorder.Group");let{axis:C,registerItem:j,updateOrder:R}=T;return(0,r.jsx)(E,{drag:C,...f,dragSnapToOrigin:!0,style:{...t,x:b.x,y:b.y,zIndex:_},layout:m,onDrag:(e,t)=>{let{velocity:r}=t;r[C]&&R(n,b[C].get(),r[C]),d&&d(e,t)},onLayoutMeasure:e=>j(n,e),ref:y,ignoreStrict:!0,children:e})})},40976:function(e,t,n){n.d(t,{Y:function(){return r}});let r=(0,n(27378).createContext)(null)},47397:function(e,t,n){n.d(t,{o:function(){return a}});var r=n(42308);class i{constructor(){this.componentControls=new Set}subscribe(e){return this.componentControls.add(e),()=>this.componentControls.delete(e)}start(e,t){this.componentControls.forEach(n=>{n.start(e.nativeEvent||e,t)})}}let s=()=>new i;function a(){return(0,r.h)(s)}},76649:function(e,t,n){n.d(t,{Ln:function(){return r}});let r=(e,t)=>s(e,t),i=Symbol("SOME"),s=(e,t)=>"string"==typeof e?e===typeof t:Array.isArray(e)?i in e?e.some(e=>s(e,t)):!!Array.isArray(t)&&(0===e.length||t.every(t=>e.some(e=>s(e,t)))):"object"==typeof t&&null!==t&&Object.entries(e).every(([e,n])=>s(n,t[e]));class a{static narrow(e){return new a(t=>r(e,t))}constructor(e){this.NF=void 0,this.NF=e}satisfied(e){return this.NF(e)}build(e){return e}and(e){let t=this.NF,n=e instanceof a?e.NF:e instanceof Function?e:t=>r(e,t);return new a(e=>t(e)&&n(e))}}new a(e=>!0)}}]);