ethyca-fides 2.69.3b0__py2.py3-none-any.whl → 2.69.3b1__py2.py3-none-any.whl

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

Potentially problematic release.


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

Files changed (234) hide show
  1. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/RECORD +226 -214
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/30369bb8ae01_add_webmonitorgroupjob_model.py +67 -0
  5. fides/api/alembic/migrations/versions/67d0e389b003_update_consentstatus_enum.py +47 -0
  6. fides/api/alembic/migrations/versions/f36ce1bde293_add_system_groups.py +132 -0
  7. fides/api/api/v1/endpoints/system.py +140 -55
  8. fides/api/db/base.py +2 -0
  9. fides/api/main.py +2 -0
  10. fides/api/models/asset.py +2 -0
  11. fides/api/models/detection_discovery/web_monitor.py +61 -0
  12. fides/api/models/sql_models.py +8 -0
  13. fides/api/models/system_group.py +85 -0
  14. fides/api/schemas/saas/saas_config.py +2 -17
  15. fides/api/schemas/saas/strategy_configuration.py +12 -0
  16. fides/api/schemas/system.py +8 -0
  17. fides/api/service/async_dsr/async_dsr_service.py +130 -10
  18. fides/api/service/async_dsr/async_dsr_strategy.py +5 -0
  19. fides/api/service/async_dsr/async_dsr_strategy_callback.py +16 -0
  20. fides/api/service/async_dsr/async_dsr_strategy_factory.py +63 -0
  21. fides/api/service/async_dsr/async_dsr_strategy_polling.py +94 -0
  22. fides/api/service/connectors/saas_connector.py +25 -7
  23. fides/api/service/deps.py +7 -0
  24. fides/api/service/privacy_request/request_service.py +29 -20
  25. fides/api/service/strategy.py +6 -3
  26. fides/api/task/graph_task.py +1 -2
  27. fides/api/util/filter_utils.py +0 -3
  28. fides/service/system/__init__.py +0 -0
  29. fides/service/system/system_service.py +138 -0
  30. fides/ui-build/static/admin/404.html +1 -1
  31. fides/ui-build/static/admin/_next/static/_b75ACzlGNz3tZqGUPTE5/_buildManifest.js +1 -0
  32. fides/ui-build/static/admin/_next/static/chunks/{1345-5e1c5b66e25c566e.js → 1345-1961771e9619db39.js} +1 -1
  33. fides/ui-build/static/admin/_next/static/chunks/{1817-0ca16d288fad916d.js → 1817-9423665774c2c08f.js} +1 -1
  34. fides/ui-build/static/admin/_next/static/chunks/1896-49010da5c2705fc5.js +1 -0
  35. fides/ui-build/static/admin/_next/static/chunks/{3620-602eb74dc896d556.js → 3620-34355b0c44325537.js} +1 -1
  36. fides/ui-build/static/admin/_next/static/chunks/3642-c052564812532324.js +1 -0
  37. fides/ui-build/static/admin/_next/static/chunks/{3729-c17ac8031a4c4fd1.js → 3729-c8accd71498f6fe4.js} +1 -1
  38. fides/ui-build/static/admin/_next/static/chunks/{3855-ef5194cdb228beb6.js → 3855-0565d44d150c985a.js} +1 -1
  39. fides/ui-build/static/admin/_next/static/chunks/{3872-f78dec02f0d959ae.js → 3872-c022bb7259a9f323.js} +1 -1
  40. fides/ui-build/static/admin/_next/static/chunks/{4164-355644b916ae0094.js → 4164-cadb4c6528662248.js} +1 -1
  41. fides/ui-build/static/admin/_next/static/chunks/{4608-be8cba73f5d7c326.js → 4608-caa9cb70fb66ac99.js} +1 -1
  42. fides/ui-build/static/admin/_next/static/chunks/{4786-61154adf88e448e1.js → 4786-d2b03ba5c82a02ed.js} +1 -1
  43. fides/ui-build/static/admin/_next/static/chunks/{4831-fd99c0b3784de128.js → 4831-c0d20b2a0b7332bb.js} +1 -1
  44. fides/ui-build/static/admin/_next/static/chunks/{4844-46324c3d848b8b6a.js → 4844-e5064a161a7e5a12.js} +1 -1
  45. fides/ui-build/static/admin/_next/static/chunks/{5258-e880b606a2293803.js → 5258-0062e0a1e4f8c03e.js} +1 -1
  46. fides/ui-build/static/admin/_next/static/chunks/{5487-02d00bad7c6830e0.js → 5487-46774dc9df554af1.js} +1 -1
  47. fides/ui-build/static/admin/_next/static/chunks/{6084-c153669d5567e242.js → 6084-2c7b81cbcae7e3b4.js} +1 -1
  48. fides/ui-build/static/admin/_next/static/chunks/{6853-b17673391117c976.js → 6853-8fb39280a8f0eb89.js} +1 -1
  49. fides/ui-build/static/admin/_next/static/chunks/6954-3b26ff8259c4d5c3.js +1 -0
  50. fides/ui-build/static/admin/_next/static/chunks/{7476-45c5088baa8b66af.js → 7476-fdd0eb08a12e0334.js} +1 -1
  51. fides/ui-build/static/admin/_next/static/chunks/{787-a8c7eab617e2fceb.js → 787-f2eca25837ff7305.js} +1 -1
  52. fides/ui-build/static/admin/_next/static/chunks/{79-65674011d455af4d.js → 79-68834fd07d69f428.js} +1 -1
  53. fides/ui-build/static/admin/_next/static/chunks/{8002-24af20d679efc04e.js → 8002-193a97fe4de8b779.js} +1 -1
  54. fides/ui-build/static/admin/_next/static/chunks/{9046-712156d461165f56.js → 9046-1afcfb1c4dbdd6c6.js} +1 -1
  55. fides/ui-build/static/admin/_next/static/chunks/{9951-a88367a129b724ba.js → 9951-0c8a80f01e431957.js} +1 -1
  56. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-fcdad91f6f66292b.js → _app-a653cee14ce2366b.js} +9 -9
  57. fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-bd0d82078e67cac3.js → add-systems-0a2b2f4a30245089.js} +1 -1
  58. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-9dda4de5ec580279.js → privacy-experience-dff842dbed2bc6c8.js} +1 -1
  59. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-23d3e50db42f31b3.js +1 -0
  60. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-28b192e2c074b0f3.js → reporting-75be0acd400cf527.js} +1 -1
  61. fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-30108b00ac769fc3.js → data-catalog-9fa11c01b44ba8f1.js} +1 -1
  62. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-fb16cb8fd2b3826f.js +1 -0
  63. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-a481a5be96dede96.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-9a81d42a474e1e48.js → action-center-6c65b86a61340753.js} +1 -1
  65. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-b6ae7adb8ef0b525.js → activity-7fe1ca395914f77f.js} +1 -1
  66. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-e32fccc4ca520d2b.js → new-85b28db67d96f201.js} +1 -1
  67. fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-7c59a6abf6ba6207.js → dataset-409fe1a086fb7d38.js} +1 -1
  68. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-927b7e476c4b47d0.js → [id]-785205655317b1d3.js} +1 -1
  69. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-cbe100d50df34285.js → new-a6985f77afbc5bc0.js} +1 -1
  70. fides/ui-build/static/admin/_next/static/chunks/pages/{index-6cd8708106331b8d.js → index-bf3042fdbfb12b3d.js} +1 -1
  71. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-5d40db1ce8810e1d.js → [id]-e545f8ef5c945f45.js} +1 -1
  72. fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-95402b5001c07ef2.js → integrations-f297e6cdb9fe97b9.js} +1 -1
  73. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-0f25a76dd18c5e20.js → [id]-6e864b293571a508.js} +1 -1
  74. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{messaging-ad6ad3e5bd72765d.js → messaging-0fc3f1f3b1cd6f2a.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{storage-6032d82f0fc2893d.js → storage-089c166287a89166.js} +1 -1
  76. fides/ui-build/static/admin/_next/static/chunks/pages/{privacy-requests-baf31c3e4b081046.js → privacy-requests-73be3cfaaa95ece4.js} +1 -1
  77. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-6903f42a0412bfa6.js → datamap-adbea0f9fd21ff3a.js} +1 -1
  78. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-9495e2eb506606c7.js → [purpose_id]-c64b87694eda4785.js} +1 -1
  79. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-93a978443bf299db.js → consent-d502bf1e7580df06.js} +1 -1
  80. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-9ecb803099082bf4.js → custom-fields-b841d63011827b43.js} +1 -1
  81. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-2e635dcd11b78224.js → locations-e29384f7a3db5221.js} +1 -1
  82. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-f547f1f33c12faf3.js → organization-88f6badc1bb38b97.js} +1 -1
  83. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-20b1193ed76c56b0.js → test-datasets-0366184eda09a933.js} +1 -1
  84. fides/ui-build/static/admin/_next/static/chunks/pages/systems-f4bf47ed2c4746ba.js +1 -0
  85. fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-4d7827fc9c46b6b8.js → taxonomy-2d9548cfa6086e8f.js} +1 -1
  86. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-64452dfae2c5e614.js → [id]-763861f5eb207db5.js} +1 -1
  87. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-9cec020f89544426.js → user-management-98a3277820e232c7.js} +1 -1
  88. fides/ui-build/static/admin/_next/static/css/018c12b58ee7f861.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/consent/configure/add-vendors.html +1 -1
  93. fides/ui-build/static/admin/consent/configure.html +1 -1
  94. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  95. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  96. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  97. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  98. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  99. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  100. fides/ui-build/static/admin/consent/properties.html +1 -1
  101. fides/ui-build/static/admin/consent/reporting.html +1 -1
  102. fides/ui-build/static/admin/consent.html +1 -1
  103. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  104. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  105. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  106. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  107. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  108. fides/ui-build/static/admin/data-catalog.html +1 -1
  109. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  110. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  111. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  112. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  113. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  114. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  115. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  116. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  117. fides/ui-build/static/admin/datamap.html +1 -1
  118. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  119. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  120. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  121. fides/ui-build/static/admin/dataset/new.html +1 -1
  122. fides/ui-build/static/admin/dataset.html +1 -1
  123. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  124. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  125. fides/ui-build/static/admin/datastore-connection.html +1 -1
  126. fides/ui-build/static/admin/index.html +1 -1
  127. fides/ui-build/static/admin/integrations/[id].html +1 -1
  128. fides/ui-build/static/admin/integrations.html +1 -1
  129. fides/ui-build/static/admin/login/[provider].html +1 -1
  130. fides/ui-build/static/admin/login.html +1 -1
  131. fides/ui-build/static/admin/messaging/[id].html +1 -1
  132. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  133. fides/ui-build/static/admin/messaging.html +1 -1
  134. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  135. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  136. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  137. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  138. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  139. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  140. fides/ui-build/static/admin/poc/forms.html +1 -1
  141. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  142. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  143. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  144. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  145. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  146. fides/ui-build/static/admin/privacy-requests.html +1 -1
  147. fides/ui-build/static/admin/properties/[id].html +1 -1
  148. fides/ui-build/static/admin/properties/add-property.html +1 -1
  149. fides/ui-build/static/admin/properties.html +1 -1
  150. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  151. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  152. fides/ui-build/static/admin/settings/about.html +1 -1
  153. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  154. fides/ui-build/static/admin/settings/consent.html +1 -1
  155. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  156. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  157. fides/ui-build/static/admin/settings/domains.html +1 -1
  158. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  159. fides/ui-build/static/admin/settings/locations.html +1 -1
  160. fides/ui-build/static/admin/settings/organization.html +1 -1
  161. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  162. fides/ui-build/static/admin/settings/regulations.html +1 -1
  163. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  164. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  165. fides/ui-build/static/admin/systems.html +1 -1
  166. fides/ui-build/static/admin/taxonomy.html +1 -1
  167. fides/ui-build/static/admin/user-management/new.html +1 -1
  168. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  169. fides/ui-build/static/admin/user-management.html +1 -1
  170. fides/ui-build/static/admin/_next/static/FFd0ddRZhjxA7iBCrjLzA/_buildManifest.js +0 -1
  171. fides/ui-build/static/admin/_next/static/chunks/3847-f08c58d074858f48.js +0 -1
  172. fides/ui-build/static/admin/_next/static/chunks/6954-5296188c19d7d0ac.js +0 -1
  173. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-94c13aad1499eea9.js +0 -1
  174. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-3b0bcb9e98fab95c.js +0 -1
  175. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-9403d5b239e318d2.js +0 -1
  176. fides/ui-build/static/admin/_next/static/chunks/pages/systems-fbc8761ef4d55516.js +0 -1
  177. fides/ui-build/static/admin/_next/static/css/650df9c348000a26.css +0 -1
  178. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/WHEEL +0 -0
  179. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/entry_points.txt +0 -0
  180. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/licenses/LICENSE +0 -0
  181. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/top_level.txt +0 -0
  182. /fides/ui-build/static/admin/_next/static/{FFd0ddRZhjxA7iBCrjLzA → _b75ACzlGNz3tZqGUPTE5}/_ssgManifest.js +0 -0
  183. /fides/ui-build/static/admin/_next/static/chunks/{1099-79646e64f26d62fa.js → 1099-718ce18b9bd70cdb.js} +0 -0
  184. /fides/ui-build/static/admin/_next/static/chunks/{2921-52328140bc420d0f.js → 2921-765918f8aa37fdb2.js} +0 -0
  185. /fides/ui-build/static/admin/_next/static/chunks/{3923-bb2417b8dcade7a4.js → 3923-23df37eef17d6ea2.js} +0 -0
  186. /fides/ui-build/static/admin/_next/static/chunks/{401-4af0a912e249d30f.js → 401-45f399d4d1325340.js} +0 -0
  187. /fides/ui-build/static/admin/_next/static/chunks/{4808-dd4157aa72648068.js → 4808-57c5ac15fd8b0d81.js} +0 -0
  188. /fides/ui-build/static/admin/_next/static/chunks/{549-38ea1d91ee2addaa.js → 549-170c96caa601e15a.js} +0 -0
  189. /fides/ui-build/static/admin/_next/static/chunks/{7630-7ed6c6117775dffe.js → 7630-8613916021366672.js} +0 -0
  190. /fides/ui-build/static/admin/_next/static/chunks/{796-9e1ca1a4030707c5.js → 796-8fbae2fc714e7a3a.js} +0 -0
  191. /fides/ui-build/static/admin/_next/static/chunks/{9826-dbae8dee941a7fac.js → 9826-d49a56431e896acb.js} +0 -0
  192. /fides/ui-build/static/admin/_next/static/chunks/pages/{404-471a6b18e712f050.js → 404-8d9c703c96662265.js} +0 -0
  193. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-ace203dfacacbdc4.js → manual-adaec1ec185160af.js} +0 -0
  194. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-920fb469e0dda1d2.js → multiple-20050dbae806179d.js} +0 -0
  195. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-406170eaae4329c6.js → add-vendors-7b8cec88b5ad53d1.js} +0 -0
  196. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-7207ab23bdb36ce8.js → configure-b7b7fb3e8b2ea816.js} +0 -0
  197. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-f80cf2d3966816fd.js → [id]-c30382719d6f797a.js} +0 -0
  198. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-b378576cba255609.js → [id]-074cdbfc678ba791.js} +0 -0
  199. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2ca1de7b88094ab0.js → new-bcddda632b4df409.js} +0 -0
  200. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-226efa1dcd41437f.js → properties-17cdca29c6d4cdd6.js} +0 -0
  201. /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-3e8bdefe714254ec.js → consent-9b4e0a08ae6216c7.js} +0 -0
  202. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-2c29ff7a01198f30.js → [resourceUrn]-d0dbba5bff738b57.js} +0 -0
  203. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-04cfe2cfba7b7cd8.js → [projectUrn]-8ffd8d148269d323.js} +0 -0
  204. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-5f2d7b24804f861f.js → projects-25c5916c8357f98d.js} +0 -0
  205. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-8eb581024bc0172f.js → [resourceUrn]-cfc118e68285405c.js} +0 -0
  206. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-de704de849960f01.js → resources-9b7e4b86b1e8a40a.js} +0 -0
  207. /fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-c7390e046b2e2b7f.js → datamap-ea1eabce2a3fc2c7.js} +0 -0
  208. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-dfd71c1e9c458b89.js → [...subfieldNames]-3c629aecee30c575.js} +0 -0
  209. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-7cdc42ec5493b83d.js → [collectionName]-a13ea13e0316d5a2.js} +0 -0
  210. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-e12b11ba15bc3fc1.js → [datasetId]-a6ae353b3b1536cc.js} +0 -0
  211. /fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-cce20440b177050b.js → datastore-connection-93d5c01dd927bad2.js} +0 -0
  212. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-3c6dc2f6e6bae960.js → [id]-f03f1fdaa1f5a0c6.js} +0 -0
  213. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-4a6d4023a7791be8.js → add-template-8f90e275e932940b.js} +0 -0
  214. /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-76b204c9b98d656f.js → messaging-68385a251c7ade5f.js} +0 -0
  215. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-bc0e2adf6e0d3ac7.js → ant-components-fc7d652910f3ad8d.js} +0 -0
  216. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-86ffcc1ad3fa912e.js → AntForm-fb6e6f4b276b6189.js} +0 -0
  217. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-ec04f595465bdf69.js → FormikAntFormItem-00869abf79950a9a.js} +0 -0
  218. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-41d309754ff0c1de.js → FormikControlled-5716d749236c9f70.js} +0 -0
  219. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-cab1f78cec7808f9.js → FormikField-d6dfb9daa3935db3.js} +0 -0
  220. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-eb6058221403b156.js → forms-9697549bce7060be.js} +0 -0
  221. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-48500551fd6a7602.js → table-migration-888656ae0bd40f62.js} +0 -0
  222. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-d83e5bd52a638234.js → configure-5a3cd9b14a37ef27.js} +0 -0
  223. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-e784c05d056b2371.js → [id]-3d2a77cb07aa8dc0.js} +0 -0
  224. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-0a7a2db148a7561a.js → add-property-210e7e3b3d776d44.js} +0 -0
  225. /fides/ui-build/static/admin/_next/static/chunks/pages/{properties-da734840e4f9d04b.js → properties-18257b6a70fa8a97.js} +0 -0
  226. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/{alpha-a82f3df840d5c1b5.js → alpha-b678e7577eef5e5c.js} +0 -0
  227. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-d06fb16487705b9d.js → about-3f3039c7e86cab2f.js} +0 -0
  228. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-16fdd91a81074dd1.js → domain-records-50f9b26c6907d6de.js} +0 -0
  229. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-4cdd6001e7cb9aee.js → domains-5ae0d30eb3b770ab.js} +0 -0
  230. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-1914de830ce5cfc4.js → email-templates-f5924e64a15a0dc3.js} +0 -0
  231. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{privacy-requests-2ecc073f41628f62.js → privacy-requests-d5f8db89c7e91a02.js} +0 -0
  232. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-7c02e469d8c5bd74.js → regulations-46d06037fcadaf00.js} +0 -0
  233. /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-6e15332935f6b538.js → [id]-a659f18a30ef89f3.js} +0 -0
  234. /fides/ui-build/static/admin/_next/static/chunks/{webpack-678e89d68dbcd94f.js → webpack-606818148553db7b.js} +0 -0
fides/_version.py CHANGED
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-09-04T14:43:27-0600",
11
+ "date": "2025-09-08T12:08:59-0300",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "a95760a6703aeb620d8d3df8a983363d1595279f",
15
- "version": "2.69.3b0"
14
+ "full-revisionid": "4e4ef38fde9cbb24f1b053bb67af1945cf409477",
15
+ "version": "2.69.3b1"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -0,0 +1,67 @@
1
+ """Add WebMonitorGroupJob model
2
+
3
+ Revision ID: 30369bb8ae01
4
+ Revises: 67d0e389b003
5
+ Create Date: 2025-09-04 13:18:41.306744
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+ from sqlalchemy.dialects import postgresql
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "30369bb8ae01"
15
+ down_revision = "67d0e389b003"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade():
21
+ # ### commands auto generated by Alembic - please adjust! ###
22
+ op.create_table(
23
+ "web_monitor_group_job",
24
+ sa.Column("id", sa.String(length=255), nullable=False),
25
+ sa.Column(
26
+ "created_at",
27
+ sa.DateTime(timezone=True),
28
+ server_default=sa.text("now()"),
29
+ nullable=True,
30
+ ),
31
+ sa.Column(
32
+ "updated_at",
33
+ sa.DateTime(timezone=True),
34
+ server_default=sa.text("now()"),
35
+ nullable=True,
36
+ ),
37
+ sa.Column("group_id", sa.String(), nullable=False, unique=True),
38
+ sa.Column(
39
+ "raw_experiences_data",
40
+ postgresql.JSONB(astext_type=sa.Text()),
41
+ nullable=True,
42
+ ),
43
+ sa.Column(
44
+ "processed_experiences_data",
45
+ postgresql.JSONB(astext_type=sa.Text()),
46
+ nullable=True,
47
+ ),
48
+ sa.Column("is_test_run", sa.Boolean(), nullable=False),
49
+ sa.PrimaryKeyConstraint("id"),
50
+ sa.UniqueConstraint("group_id"),
51
+ )
52
+ op.create_index(
53
+ op.f("ix_web_monitor_group_job_id"),
54
+ "web_monitor_group_job",
55
+ ["id"],
56
+ unique=False,
57
+ )
58
+ # ### end Alembic commands ###
59
+
60
+
61
+ def downgrade():
62
+ # ### commands auto generated by Alembic - please adjust! ###
63
+ op.drop_index(
64
+ op.f("ix_web_monitor_group_job_id"), table_name="web_monitor_group_job"
65
+ )
66
+ op.drop_table("web_monitor_group_job")
67
+ # ### end Alembic commands ###
@@ -0,0 +1,47 @@
1
+ """Update ConsentStatus enum
2
+
3
+ Revision ID: 67d0e389b003
4
+ Revises: f36ce1bde293
5
+ Create Date: 2025-09-02 19:32:05.025508
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "67d0e389b003"
14
+ down_revision = "f36ce1bde293"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade():
20
+ # ### commands auto generated by Alembic - please adjust! ###
21
+ op.execute("ALTER TYPE consentstatus ADD VALUE 'pre_consent'")
22
+ op.execute("ALTER TYPE consentstatus ADD VALUE 'cmp_error'")
23
+ # ### end Alembic commands ###
24
+
25
+
26
+ def downgrade():
27
+ # ### commands auto generated by Alembic - please adjust! ###
28
+ # Remove any records that have the new enum values before dropping them
29
+ op.execute(
30
+ "UPDATE asset SET consent_status = 'unknown' WHERE consent_status IN ('pre_consent', 'cmp_error')"
31
+ )
32
+
33
+ # Recreate the enum without the new values
34
+ op.execute("ALTER TYPE consentstatus RENAME TO consentstatus_old")
35
+ op.execute(
36
+ "CREATE TYPE consentstatus AS ENUM ('with_consent', 'without_consent', 'exempt', 'unknown')"
37
+ )
38
+
39
+ # Drop default, change type, and set default back
40
+ op.execute("ALTER TABLE asset ALTER COLUMN consent_status DROP DEFAULT")
41
+ op.execute(
42
+ "ALTER TABLE asset ALTER COLUMN consent_status TYPE consentstatus USING "
43
+ "consent_status::text::consentstatus"
44
+ )
45
+ op.execute("ALTER TABLE asset ALTER COLUMN consent_status SET DEFAULT 'unknown'")
46
+ op.execute("DROP TYPE consentstatus_old")
47
+ # ### end Alembic commands ###
@@ -0,0 +1,132 @@
1
+ """add system groups
2
+
3
+ Revision ID: f36ce1bde293
4
+ Revises: 78dbe23d8204
5
+ Create Date: 2025-08-18 21:36:19.279969
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+ from citext import CIText
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "f36ce1bde293"
15
+ down_revision = "78dbe23d8204"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade():
21
+ op.create_table(
22
+ "system_group",
23
+ sa.Column("id", sa.String(length=255), nullable=False),
24
+ sa.Column(
25
+ "created_at",
26
+ sa.DateTime(timezone=True),
27
+ server_default=sa.text("now()"),
28
+ nullable=True,
29
+ ),
30
+ sa.Column(
31
+ "updated_at",
32
+ sa.DateTime(timezone=True),
33
+ server_default=sa.text("now()"),
34
+ nullable=True,
35
+ ),
36
+ sa.Column("fides_key", sa.String(), nullable=False),
37
+ sa.Column(
38
+ "label_color",
39
+ sa.Enum(
40
+ "taxonomy_white",
41
+ "taxonomy_red",
42
+ "taxonomy_orange",
43
+ "taxonomy_yellow",
44
+ "taxonomy_green",
45
+ "taxonomy_blue",
46
+ "taxonomy_purple",
47
+ "sandstone",
48
+ "minos",
49
+ name="customtaxonomycolor",
50
+ ),
51
+ nullable=True,
52
+ ),
53
+ sa.Column("data_steward_username", CIText(), nullable=True),
54
+ sa.Column(
55
+ "data_uses", sa.ARRAY(sa.String()), server_default="{}", nullable=False
56
+ ),
57
+ sa.ForeignKeyConstraint(
58
+ ["data_steward_username"], ["fidesuser.username"], ondelete="SET NULL"
59
+ ),
60
+ sa.ForeignKeyConstraint(
61
+ ["fides_key"], ["taxonomy_element.fides_key"], ondelete="CASCADE"
62
+ ),
63
+ sa.PrimaryKeyConstraint("id"),
64
+ )
65
+ op.create_index(
66
+ op.f("ix_system_group_data_steward_username"),
67
+ "system_group",
68
+ ["data_steward_username"],
69
+ unique=False,
70
+ )
71
+ op.create_index(
72
+ op.f("ix_system_group_fides_key"), "system_group", ["fides_key"], unique=True
73
+ )
74
+ op.create_index(op.f("ix_system_group_id"), "system_group", ["id"], unique=False)
75
+ op.create_table(
76
+ "system_group_member",
77
+ sa.Column("id", sa.String(length=255), nullable=False),
78
+ sa.Column(
79
+ "created_at",
80
+ sa.DateTime(timezone=True),
81
+ server_default=sa.text("now()"),
82
+ nullable=True,
83
+ ),
84
+ sa.Column(
85
+ "updated_at",
86
+ sa.DateTime(timezone=True),
87
+ server_default=sa.text("now()"),
88
+ nullable=True,
89
+ ),
90
+ sa.Column("system_group_id", sa.String(length=255), nullable=True),
91
+ sa.Column("system_id", sa.String(length=255), nullable=True),
92
+ sa.ForeignKeyConstraint(
93
+ ["system_group_id"], ["system_group.id"], ondelete="CASCADE"
94
+ ),
95
+ sa.ForeignKeyConstraint(["system_id"], ["ctl_systems.id"], ondelete="CASCADE"),
96
+ sa.PrimaryKeyConstraint("id"),
97
+ sa.UniqueConstraint(
98
+ "system_group_id", "system_id", name="uq_system_group_member_group_system"
99
+ ),
100
+ )
101
+ op.create_index(
102
+ op.f("ix_system_group_member_id"), "system_group_member", ["id"], unique=False
103
+ )
104
+ op.create_index(
105
+ op.f("ix_system_group_member_system_group_id"),
106
+ "system_group_member",
107
+ ["system_group_id"],
108
+ unique=False,
109
+ )
110
+ op.create_index(
111
+ op.f("ix_system_group_member_system_id"),
112
+ "system_group_member",
113
+ ["system_id"],
114
+ unique=False,
115
+ )
116
+
117
+
118
+ def downgrade():
119
+ op.drop_index(
120
+ op.f("ix_system_group_member_system_id"), table_name="system_group_member"
121
+ )
122
+ op.drop_index(
123
+ op.f("ix_system_group_member_system_group_id"), table_name="system_group_member"
124
+ )
125
+ op.drop_index(op.f("ix_system_group_member_id"), table_name="system_group_member")
126
+ op.drop_table("system_group_member")
127
+ op.drop_index(op.f("ix_system_group_id"), table_name="system_group")
128
+ op.drop_index(op.f("ix_system_group_fides_key"), table_name="system_group")
129
+ op.drop_index(
130
+ op.f("ix_system_group_data_steward_username"), table_name="system_group"
131
+ )
132
+ op.drop_table("system_group")
@@ -1,29 +1,27 @@
1
- import datetime
2
1
  from typing import Annotated, Dict, List, Optional, Union
3
2
 
4
3
  from fastapi import Depends, HTTPException, Query, Response, Security
5
4
  from fastapi_pagination import Page, Params
6
5
  from fastapi_pagination.bases import AbstractPage
7
- from fastapi_pagination.ext.async_sqlalchemy import paginate as async_paginate
8
6
  from fastapi_pagination.ext.sqlalchemy import paginate
9
7
  from fideslang.models import System as SystemSchema
10
8
  from fideslang.validation import FidesKey
11
9
  from loguru import logger
12
10
  from pydantic import Field
13
- from sqlalchemy import or_
14
11
  from sqlalchemy.ext.asyncio import AsyncSession
15
12
  from sqlalchemy.future import select
16
13
  from sqlalchemy.orm import Session
17
14
  from starlette import status
18
- from starlette.status import HTTP_200_OK, HTTP_204_NO_CONTENT, HTTP_404_NOT_FOUND
15
+ from starlette.status import (
16
+ HTTP_200_OK,
17
+ HTTP_204_NO_CONTENT,
18
+ HTTP_400_BAD_REQUEST,
19
+ HTTP_404_NOT_FOUND,
20
+ )
19
21
 
20
22
  from fides.api.api import deps
21
23
  from fides.api.api.v1.endpoints.saas_config_endpoints import instantiate_connection
22
- from fides.api.db.crud import (
23
- get_resource,
24
- get_resource_with_custom_fields,
25
- list_resource,
26
- )
24
+ from fides.api.db.crud import get_resource, get_resource_with_custom_fields
27
25
  from fides.api.db.ctl_session import get_async_db
28
26
  from fides.api.db.system import (
29
27
  create_system,
@@ -34,10 +32,8 @@ from fides.api.db.system import (
34
32
  )
35
33
  from fides.api.models.connectionconfig import ConnectionConfig, ConnectionType
36
34
  from fides.api.models.fides_user import FidesUser
37
- from fides.api.models.sql_models import ( # type:ignore[attr-defined]
38
- PrivacyDeclaration,
39
- System,
40
- )
35
+ from fides.api.models.sql_models import System # type:ignore[attr-defined]
36
+ from fides.api.oauth.roles import APPROVER
41
37
  from fides.api.oauth.system_manager_oauth_util import (
42
38
  verify_oauth_client_for_system_from_fides_key,
43
39
  verify_oauth_client_for_system_from_request_body_cli,
@@ -56,8 +52,12 @@ from fides.api.schemas.connection_configuration.connection_secrets import (
56
52
  from fides.api.schemas.connection_configuration.saas_config_template_values import (
57
53
  SaasConnectionTemplateValues,
58
54
  )
59
- from fides.api.schemas.filter_params import FilterParams
60
- from fides.api.schemas.system import BasicSystemResponse, SystemResponse
55
+ from fides.api.schemas.system import (
56
+ AssignStewardRequest,
57
+ BasicSystemResponse,
58
+ SystemResponse,
59
+ )
60
+ from fides.api.service.deps import get_system_service
61
61
  from fides.api.util.api_router import APIRouter
62
62
  from fides.api.util.connection_util import (
63
63
  connection_status,
@@ -66,7 +66,6 @@ from fides.api.util.connection_util import (
66
66
  patch_connection_configs,
67
67
  validate_secrets,
68
68
  )
69
- from fides.api.util.filter_utils import apply_filters_to_query
70
69
  from fides.common.api.scope_registry import (
71
70
  CONNECTION_CREATE_OR_UPDATE,
72
71
  CONNECTION_DELETE,
@@ -82,6 +81,7 @@ from fides.common.api.v1.urn_registry import (
82
81
  SYSTEM_CONNECTIONS,
83
82
  V1_URL_PREFIX,
84
83
  )
84
+ from fides.service.system.system_service import SystemService
85
85
 
86
86
  SYSTEM_ROUTER = APIRouter(tags=["System"], prefix=f"{V1_URL_PREFIX}/system")
87
87
  SYSTEM_CONNECTIONS_ROUTER = APIRouter(
@@ -349,6 +349,123 @@ async def delete(
349
349
  }
350
350
 
351
351
 
352
+ @SYSTEM_ROUTER.post(
353
+ "/bulk-delete",
354
+ dependencies=[
355
+ Security(
356
+ verify_oauth_client_prod,
357
+ scopes=[SYSTEM_DELETE],
358
+ )
359
+ ],
360
+ status_code=status.HTTP_200_OK,
361
+ )
362
+ async def system_bulk_delete(
363
+ fides_keys: List[str],
364
+ db: AsyncSession = Depends(get_async_db),
365
+ ) -> Dict:
366
+ """Delete multiple systems by their fides_keys."""
367
+
368
+ deleted: List[Dict] = []
369
+
370
+ async with db.begin():
371
+ # Retrieve all systems within the same transactional context
372
+ stmt = select(System).filter(System.fides_key.in_(fides_keys))
373
+ result = await db.execute(stmt)
374
+ systems_to_delete = result.scalars().all()
375
+
376
+ for system in systems_to_delete:
377
+ await db.delete(system)
378
+ deleted.append(SystemSchema.model_validate(system).model_dump(mode="json"))
379
+
380
+ return {
381
+ "message": f"Deleted {len(deleted)} system(s)",
382
+ "deleted": deleted,
383
+ }
384
+
385
+
386
+ @SYSTEM_ROUTER.post(
387
+ "/assign-steward",
388
+ dependencies=[
389
+ Security(
390
+ verify_oauth_client_prod,
391
+ scopes=[SYSTEM_UPDATE],
392
+ )
393
+ ],
394
+ )
395
+ async def bulk_assign_steward(
396
+ data: AssignStewardRequest,
397
+ db: Session = Depends(deps.get_db),
398
+ ) -> Dict:
399
+ """Assign the given `data_steward` (username) as a system manager for the list of `system_keys`.
400
+
401
+ This mirrors the behavior of the user permissions endpoint that assigns systems to a given user but
402
+ from the perspective of the System API. It validates that:
403
+
404
+ 1. The provided user exists.
405
+ 2. The user already has permissions (cannot be None).
406
+ 3. The user is not an approver (approvers are explicitly disallowed from being system managers).
407
+ 4. All provided `system_keys` resolve to existing System records.
408
+ 5. There are no duplicate keys in the payload.
409
+ """
410
+
411
+ data_steward = data.data_steward
412
+ system_keys = data.system_keys
413
+
414
+ user: Optional[FidesUser] = FidesUser.get_by(
415
+ db, field="username", value=data_steward
416
+ )
417
+ if not user:
418
+ raise HTTPException(
419
+ status_code=HTTP_404_NOT_FOUND,
420
+ detail=f"No user found with username {data_steward}.",
421
+ )
422
+
423
+ # Validate user has permissions assigned
424
+ if not (user.permissions and user.permissions.roles): # type: ignore[attr-defined]
425
+ raise HTTPException(
426
+ status_code=HTTP_400_BAD_REQUEST,
427
+ detail=f"User {data_steward} needs permissions before they can be assigned as system manager.",
428
+ )
429
+
430
+ # Approvers are not allowed to be system managers
431
+ if APPROVER in user.permissions.roles: # type: ignore[attr-defined]
432
+ raise HTTPException(
433
+ status_code=HTTP_400_BAD_REQUEST,
434
+ detail=f"User {data_steward} is an {APPROVER} and cannot be assigned as a system manager.",
435
+ )
436
+
437
+ # Check for duplicate system keys
438
+ if len(set(system_keys)) != len(system_keys):
439
+ raise HTTPException(
440
+ status_code=HTTP_400_BAD_REQUEST,
441
+ detail=f"Cannot add user {data_steward} as system manager. Duplicate systems in request body.",
442
+ )
443
+
444
+ # Retrieve systems and validate existence
445
+ systems_query = db.query(System).filter(System.fides_key.in_(system_keys))
446
+ if systems_query.count() != len(system_keys):
447
+ raise HTTPException(
448
+ status_code=HTTP_404_NOT_FOUND,
449
+ detail=f"Cannot add user {data_steward} as system manager. System(s) not found.",
450
+ )
451
+
452
+ systems = systems_query.all()
453
+
454
+ logger.info(
455
+ "Assigning user {} as data steward for {} systems", data_steward, len(systems)
456
+ )
457
+
458
+ updated_count = 0
459
+ for system in systems:
460
+ if user not in system.data_stewards:
461
+ user.set_as_system_manager(db, system)
462
+ updated_count += 1
463
+
464
+ return {
465
+ "message": f"User {data_steward} assigned as data steward to {updated_count} system(s)",
466
+ }
467
+
468
+
352
469
  @SYSTEM_ROUTER.post(
353
470
  "/",
354
471
  response_model=SystemResponse,
@@ -384,62 +501,30 @@ async def create(
384
501
  name="List systems (optionally paginated)",
385
502
  )
386
503
  async def ls( # pylint: disable=invalid-name
387
- db: AsyncSession = Depends(get_async_db),
504
+ system_service: SystemService = Depends(get_system_service),
388
505
  size: Optional[int] = Query(None, ge=1, le=100),
389
506
  page: Optional[int] = Query(None, ge=1),
390
507
  search: Optional[str] = None,
391
508
  data_uses: Optional[List[FidesKey]] = Query(None),
392
509
  data_categories: Optional[List[FidesKey]] = Query(None),
393
510
  data_subjects: Optional[List[FidesKey]] = Query(None),
394
- show_deleted: Optional[bool] = Query(False),
395
- ) -> List:
511
+ show_deleted: bool = Query(False),
512
+ ) -> Union[List[System], Page[System]]:
396
513
  """Get a list of all of the Systems.
397
514
  If any parameters or filters are provided the response will be paginated and/or filtered.
398
515
  Otherwise all Systems will be returned (this may be a slow operation if there are many systems,
399
516
  so using the pagination parameters is recommended).
400
517
  """
401
- if not (size or page or search or data_uses or data_categories or data_subjects):
402
- # if no advanced parameters are passed, we return a very basic list of all System resources
403
- # to maintain backward compatibility of the original API, which backs some important client usages, e.g. the fides CLI
404
518
 
405
- return await list_resource(System, db)
406
-
407
- query = select(System)
408
-
409
- pagination_params = Params(page=page or 1, size=size or 50)
410
- # Need to join with PrivacyDeclaration in order to be able to filter
411
- # by data use, data category, and data subject
412
- if any([data_uses, data_categories, data_subjects]):
413
- query = query.outerjoin(
414
- PrivacyDeclaration, System.id == PrivacyDeclaration.system_id
415
- )
416
-
417
- # Filter out any vendor deleted systems, unless explicitly asked for
418
- if not show_deleted:
419
- query = query.filter(
420
- or_(
421
- System.vendor_deleted_date.is_(None),
422
- System.vendor_deleted_date >= datetime.datetime.now(),
423
- )
424
- )
425
-
426
- filter_params = FilterParams(
519
+ return await system_service.get_systems(
427
520
  search=search,
428
521
  data_uses=data_uses,
429
522
  data_categories=data_categories,
430
523
  data_subjects=data_subjects,
524
+ size=size,
525
+ page=page,
526
+ show_deleted=show_deleted,
431
527
  )
432
- filtered_query = apply_filters_to_query(
433
- query=query,
434
- filter_params=filter_params,
435
- search_model=System,
436
- taxonomy_model=PrivacyDeclaration,
437
- )
438
-
439
- # Add a distinct so we only get one row per system
440
- duplicates_removed = filtered_query.distinct(System.id)
441
-
442
- return await async_paginate(db, duplicates_removed, pagination_params)
443
528
 
444
529
 
445
530
  @SYSTEM_ROUTER.patch(
fides/api/db/base.py CHANGED
@@ -21,6 +21,7 @@ from fides.api.models.detection_discovery.monitor_task import (
21
21
  MonitorTask,
22
22
  MonitorTaskExecutionLog,
23
23
  )
24
+ from fides.api.models.detection_discovery.web_monitor import WebMonitorGroupJob
24
25
  from fides.api.models.experience_notices import ExperienceNotices
25
26
  from fides.api.models.fides_cloud import FidesCloud
26
27
  from fides.api.models.fides_user import FidesUser
@@ -77,6 +78,7 @@ from fides.api.models.property import (
77
78
  from fides.api.models.registration import UserRegistration
78
79
  from fides.api.models.storage import StorageConfig
79
80
  from fides.api.models.system_compass_sync import SystemCompassSync
81
+ from fides.api.models.system_group import SystemGroup, SystemGroupMember
80
82
  from fides.api.models.system_history import SystemHistory
81
83
  from fides.api.models.system_manager import SystemManager
82
84
  from fides.api.models.taxonomy import (
fides/api/main.py CHANGED
@@ -45,6 +45,7 @@ from fides.api.service.privacy_request.email_batch_service import (
45
45
  initiate_scheduled_batch_email_send,
46
46
  )
47
47
  from fides.api.service.privacy_request.request_service import (
48
+ initiate_async_tasks_status_polling,
48
49
  initiate_interrupted_task_requeue_poll,
49
50
  initiate_poll_for_exited_privacy_request_tasks,
50
51
  initiate_scheduled_dsr_data_removal,
@@ -102,6 +103,7 @@ async def lifespan(wrapped_app: FastAPI) -> AsyncGenerator[None, None]:
102
103
  initiate_poll_for_exited_privacy_request_tasks()
103
104
  initiate_scheduled_dsr_data_removal()
104
105
  initiate_interrupted_task_requeue_poll()
106
+ initiate_async_tasks_status_polling()
105
107
  initiate_bcrypt_migration_task()
106
108
  initiate_post_upgrade_index_creation()
107
109
 
fides/api/models/asset.py CHANGED
@@ -29,6 +29,8 @@ class ConsentStatus(str, Enum):
29
29
  Consent status of the asset
30
30
  """
31
31
 
32
+ cmp_error = "cmp_error"
33
+ pre_consent = "pre_consent"
32
34
  with_consent = "with_consent"
33
35
  without_consent = "without_consent"
34
36
  exempt = "exempt"
@@ -0,0 +1,61 @@
1
+ from typing import Any, Optional
2
+
3
+ from sqlalchemy import Boolean, Column, String, insert, select
4
+ from sqlalchemy.dialects.postgresql import JSONB
5
+ from sqlalchemy.ext.asyncio import AsyncSession
6
+ from sqlalchemy.ext.declarative import declared_attr
7
+
8
+ from fides.api.db.base_class import Base
9
+
10
+
11
+ class WebMonitorGroupJob(Base):
12
+ """SQL model for storing data returned from a web monitor group job"""
13
+
14
+ @declared_attr
15
+ def __tablename__(self) -> str:
16
+ return "web_monitor_group_job"
17
+
18
+ # The id for the web monitor group on the web monitor service
19
+ group_id = Column(String, nullable=False, unique=True)
20
+
21
+ # The raw experiences data obtained for that group from the web monitor service
22
+ raw_experiences_data = Column(JSONB, nullable=True)
23
+ # The processed experiences data, used to calculate an StagedResource's consent status
24
+ processed_experiences_data = Column(JSONB, nullable=True)
25
+
26
+ # Whether this data is from a test_website monitor rather than a real one
27
+ is_test_run = Column(Boolean, nullable=False, default=False)
28
+
29
+ @classmethod
30
+ async def create_async(
31
+ cls,
32
+ async_session: AsyncSession,
33
+ *,
34
+ group_id: str,
35
+ is_test_run: Optional[bool] = False,
36
+ raw_experiences_data: Optional[dict[str, Any]] = None,
37
+ processed_experiences_data: Optional[dict[str, Any]] = None,
38
+ ) -> "WebMonitorGroupJob":
39
+ """Create a new WebMonitorGroupJob"""
40
+ values = {
41
+ "group_id": group_id,
42
+ "is_test_run": is_test_run,
43
+ "raw_experiences_data": raw_experiences_data,
44
+ "processed_experiences_data": processed_experiences_data,
45
+ }
46
+ stmt = insert(cls.__table__).values(**values).returning(*cls.__table__.columns)
47
+ result = await async_session.execute(stmt)
48
+ row = result.first()
49
+ return cls(**dict(row))
50
+
51
+ @classmethod
52
+ async def get_by_group_id_async(
53
+ cls, async_session: AsyncSession, group_id: str
54
+ ) -> Optional["WebMonitorGroupJob"]:
55
+ """Get a WebMonitorGroupJob by group_id"""
56
+ stmt = select(*cls.__table__.columns).where(
57
+ cls.__table__.c.group_id == group_id
58
+ )
59
+ result = await async_session.execute(stmt)
60
+ row = result.first()
61
+ return cls(**dict(row)) if row else None
@@ -461,6 +461,14 @@ class System(Base, FidesBase):
461
461
  "Asset", back_populates="system", lazy="selectin", uselist=True, viewonly=True
462
462
  )
463
463
 
464
+ system_groups = relationship(
465
+ "SystemGroup",
466
+ secondary="system_group_member",
467
+ back_populates="systems",
468
+ lazy="selectin",
469
+ viewonly=True,
470
+ )
471
+
464
472
  @classmethod
465
473
  def get_data_uses(
466
474
  cls: Type[System], systems: List[System], include_parents: bool = True