ethyca-fides 2.67.3b1__py2.py3-none-any.whl → 2.68.0rc1__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 (209) hide show
  1. {ethyca_fides-2.67.3b1.dist-info → ethyca_fides-2.68.0rc1.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.67.3b1.dist-info → ethyca_fides-2.68.0rc1.dist-info}/RECORD +207 -206
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/2f3c1a2d6b10_disallow_dot_in_monitor_key_and_update_refs.py +439 -0
  5. fides/api/db/base_class.py +19 -1
  6. fides/api/models/db_cache.py +8 -0
  7. fides/api/models/detection_discovery/core.py +14 -1
  8. fides/ui-build/static/admin/404.html +1 -1
  9. fides/ui-build/static/admin/_next/static/chunks/{1817-b78b58ae3b75d75a.js → 1817-c90365325f8a3d75.js} +1 -1
  10. fides/ui-build/static/admin/_next/static/chunks/{1975.7d4634a0e823a02b.js → 1975.e5cc7a1ccd477671.js} +1 -1
  11. fides/ui-build/static/admin/_next/static/chunks/{203-cd78ea279cecba60.js → 203-0c6cadcda98bdd33.js} +1 -1
  12. fides/ui-build/static/admin/_next/static/chunks/{2921-86f1547ac40a5cdf.js → 2921-46f9465c2852a46b.js} +1 -1
  13. fides/ui-build/static/admin/_next/static/chunks/{3450-69f4e16978971bb8.js → 3450-9314e1b15df8a8da.js} +1 -1
  14. fides/ui-build/static/admin/_next/static/chunks/{3855-509ca7ac99b5eada.js → 3855-4267fd8193e7f525.js} +1 -1
  15. fides/ui-build/static/admin/_next/static/chunks/{3872-0a0f0032ca39a93f.js → 3872-ac5feefd40b61ae3.js} +1 -1
  16. fides/ui-build/static/admin/_next/static/chunks/{3923-13a6b4da2d51bf8f.js → 3923-a33633feba5e655e.js} +1 -1
  17. fides/ui-build/static/admin/_next/static/chunks/{401-3cc1fee61494e3bd.js → 401-741bb31b586b7c96.js} +1 -1
  18. fides/ui-build/static/admin/_next/static/chunks/{409-ea70638a59296659.js → 409-5bc4369b80a8c11d.js} +1 -1
  19. fides/ui-build/static/admin/_next/static/chunks/{4121-877e19d3fa078c7b.js → 4121-94354b50a41f8497.js} +1 -1
  20. fides/ui-build/static/admin/_next/static/chunks/{4230-114e31621c19ea69.js → 4230-1ebc8c0ab293a077.js} +1 -1
  21. fides/ui-build/static/admin/_next/static/chunks/{431-1db919f6569a4021.js → 431-a34d7ceff17c2169.js} +1 -1
  22. fides/ui-build/static/admin/_next/static/chunks/{4608-f16f281f2d05d963.js → 4608-557fb24665b2e4bf.js} +1 -1
  23. fides/ui-build/static/admin/_next/static/chunks/{5309-d9a488457898263b.js → 5309-ffdec884eec79d29.js} +1 -1
  24. fides/ui-build/static/admin/_next/static/chunks/{5574-9312f97b637d9ee2.js → 5574-831167a8da90e2e6.js} +1 -1
  25. fides/ui-build/static/admin/_next/static/chunks/{6084-ddbad3149364725d.js → 6084-02abe12327fc3dbc.js} +1 -1
  26. fides/ui-build/static/admin/_next/static/chunks/{6662-ef0edd3598b1d431.js → 6662-499c189f932a35aa.js} +1 -1
  27. fides/ui-build/static/admin/_next/static/chunks/{6780-b42a27e72707936d.js → 6780-7d28e030f6516e5d.js} +1 -1
  28. fides/ui-build/static/admin/_next/static/chunks/{6853-d0190d2cca9dbde2.js → 6853-270261ef5537a106.js} +1 -1
  29. fides/ui-build/static/admin/_next/static/chunks/{6882-59ea739e3616ce83.js → 6882-7cc1d14e27a80c10.js} +1 -1
  30. fides/ui-build/static/admin/_next/static/chunks/{6954-ba98e778a5b45ebf.js → 6954-7784e8d5ad6b8110.js} +1 -1
  31. fides/ui-build/static/admin/_next/static/chunks/{7476-cc0d9a94ed7aad53.js → 7476-4de465016d3433b4.js} +1 -1
  32. fides/ui-build/static/admin/_next/static/chunks/{7630-b1c93688013ef013.js → 7630-2a5c57787632693d.js} +1 -1
  33. fides/ui-build/static/admin/_next/static/chunks/{7725-539d3a906f627531.js → 7725-c79513b04113112b.js} +1 -1
  34. fides/ui-build/static/admin/_next/static/chunks/{787-c57185ad89c4e288.js → 787-5ba991cad1f7664a.js} +1 -1
  35. fides/ui-build/static/admin/_next/static/chunks/{79-2aab56be75e16187.js → 79-98cfab20bb831137.js} +1 -1
  36. fides/ui-build/static/admin/_next/static/chunks/{796-3bdda2a7868464af.js → 796-0b768155bf20505f.js} +1 -1
  37. fides/ui-build/static/admin/_next/static/chunks/{8735-40caf91800a3610c.js → 8735-f84afcc50885883c.js} +1 -1
  38. fides/ui-build/static/admin/_next/static/chunks/{9046-7085a401297c5520.js → 9046-97a972cc8a8ed24d.js} +1 -1
  39. fides/ui-build/static/admin/_next/static/chunks/{9226-2dcac54ab3fb94be.js → 9226-318dadf1c050ecda.js} +1 -1
  40. fides/ui-build/static/admin/_next/static/chunks/{9676.7fbcb6b554cda098.js → 9676.9e6828b42ef05e06.js} +1 -1
  41. fides/ui-build/static/admin/_next/static/chunks/{9826-3c578665c6d3b21d.js → 9826-8c81c97a72510fcf.js} +1 -1
  42. fides/ui-build/static/admin/_next/static/chunks/{9951-7c6639e5d062779e.js → 9951-4df2b67e0def5500.js} +1 -1
  43. fides/ui-build/static/admin/_next/static/chunks/pages/{404-2d803dab6a00f353.js → 404-9174cdb70126c2c5.js} +1 -1
  44. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-750d6bd16c971bb9.js → _app-65723cd4b8fc36ac.js} +18 -18
  45. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-2a655ff3a97f2492.js → manual-621416493c89ef01.js} +1 -1
  46. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-8ff7f37913ad736a.js → multiple-0b9908c3e1dfe49e.js} +1 -1
  47. fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-0902f0bb4080643e.js → add-systems-18e96ce81dab51a4.js} +1 -1
  48. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-d00c9034cdeb0236.js → add-vendors-5bb1b31ae8752250.js} +1 -1
  49. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-0e1ca0f4c8e7f4da.js → configure-54d7c7310763c66d.js} +1 -1
  50. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-f22ddd9b48a5c418.js → [id]-4e4d9426743b5cb4.js} +1 -1
  51. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-21f997c69fc3b4c2.js → privacy-experience-d72460348fadcab8.js} +1 -1
  52. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-da4124b7600a2a1d.js → [id]-3e7ddc252da00c98.js} +1 -1
  53. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-a57d251c88ce68ae.js → new-35a7c305beee9428.js} +1 -1
  54. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-ad105181bc91209b.js → privacy-notices-6bc3b73a21576869.js} +1 -1
  55. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-057cad65e7414a44.js → properties-ab96939421639153.js} +1 -1
  56. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-b0c4235fe6d0b0c8.js → reporting-fe3d6887fecf0f86.js} +1 -1
  57. fides/ui-build/static/admin/_next/static/chunks/pages/{consent-e17c56eec8d91371.js → consent-13240e3ca77acfeb.js} +1 -1
  58. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-80a6cc8e8573514a.js → [projectUrn]-bd37b407c80c6986.js} +1 -1
  59. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-29784a11fe0fbd0a.js → projects-e4770acf7044e2f5.js} +1 -1
  60. fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-7770a8dc34bd0fc0.js → data-catalog-0db635c3483c9da8.js} +1 -1
  61. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/{[systemId]-3e5725cd06d7fe6c.js → [systemId]-0c0e0a7798345541.js} +1 -1
  62. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-92b0bd97d8e79340.js → [monitorId]-3c56e5fe072a44c6.js} +1 -1
  63. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-ee3c0a103346fc06.js → action-center-53a763e49ce34a74.js} +1 -1
  64. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-ad6a84a6276f914c.js → activity-6a90131dcecd694c.js} +1 -1
  65. fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-d23b3ae139f0428b.js → datamap-8f88dc31c5144ea8.js} +1 -1
  66. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-15301bd6bf7cf718.js → [...subfieldNames]-145fe9e4cfcb231d.js} +1 -1
  67. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-0fa72873e464f581.js → [collectionName]-8a1e5d140785c1e9.js} +1 -1
  68. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-a8e8b5f4ee7af86c.js → [datasetId]-227b5db4b472a6a7.js} +1 -1
  69. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-0d50084fbdf9b84c.js → new-8401f17fe5d9a1dc.js} +1 -1
  70. fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-f3348d0a92543bab.js → dataset-7d77b3ad069be268.js} +1 -1
  71. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-7d6027570d05c57f.js → [id]-67a7fe58b96ea739.js} +1 -1
  72. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-c6614583b14dc9f2.js → new-90a8df230cb89877.js} +1 -1
  73. fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-3bd77864da523d41.js → datastore-connection-cfb25b02abb8da71.js} +1 -1
  74. fides/ui-build/static/admin/_next/static/chunks/pages/{index-fbf9b845bb901238.js → index-876bfd7210040cec.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-330475705adbd36f.js → [id]-766e57bcf38b5b1e.js} +1 -1
  76. fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-7f15cd8538cdc24d.js → integrations-3fdc55d4c129e618.js} +1 -1
  77. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-5627d0d0668077f9.js → [id]-6e796c3fe632280b.js} +1 -1
  78. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-feca66ad5c5fe54a.js → add-template-fa0f3841c5bdfdeb.js} +1 -1
  79. fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-1bae386d8c190348.js → messaging-8f9c006b6166f002.js} +1 -1
  80. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-64a322d01aae5ca7.js → ant-components-6ba7ae4f26c06cb0.js} +1 -1
  81. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-8bca16a7726e7eb2.js → AntForm-11503454a62d8d7b.js} +1 -1
  82. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-b0f246fc3b67ebf7.js → FormikAntFormItem-a504941807bdb7f1.js} +1 -1
  83. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-1a0852b090bfc392.js → FormikControlled-0119403c8ff97f83.js} +1 -1
  84. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-11f3de1b45e36583.js → FormikField-94f6d57d6c94ddf7.js} +1 -1
  85. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-1b73a1c2b6c6285f.js → forms-ed1a3ae09d72df89.js} +1 -1
  86. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-05616e2ae20ff4f8.js → table-migration-e8db3ad525e7ddbd.js} +1 -1
  87. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-c14dd24592369467.js +1 -0
  88. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{messaging-f1d818242d8550f8.js → messaging-100d7d03930629a8.js} +1 -1
  89. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{storage-d40a26bddb126c5c.js → storage-6f8d1b3ec83cfcf0.js} +1 -1
  90. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-e551a860ec727802.js → configure-3ce15577435d47cb.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/pages/{privacy-requests-96a08c4431b5462c.js → privacy-requests-f43a988542813110.js} +1 -1
  92. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-dd99183f93763ae4.js → [id]-41976b28503623cd.js} +1 -1
  93. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-0bdbc1fcbf553b8f.js → add-property-cb438d8f5ec6007a.js} +1 -1
  94. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-e959378bb32b6b73.js → properties-b6db7036993709b3.js} +1 -1
  95. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-9d1840f8309b706e.js → datamap-4bc3e281409265cc.js} +1 -1
  96. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/{alpha-1066f0c202ef744c.js → alpha-1ea40fcd6b4268bf.js} +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-37ba24a72a06862e.js → about-65c7600fadc6e55a.js} +1 -1
  98. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-e891d01ece59669e.js → [purpose_id]-33dab986141b3663.js} +1 -1
  99. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-f61b87e79367865b.js → consent-1195042727c399ed.js} +1 -1
  100. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-f8eea5d508c60c64.js → custom-fields-71b98858ecb4e097.js} +1 -1
  101. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-51333dbd21cb37c8.js → domain-records-386368bf7cb31771.js} +1 -1
  102. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-bde86e5f6c09da5a.js → domains-cf427e04f862b5d2.js} +1 -1
  103. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-4f9a5cc8bea7725b.js → email-templates-eabeeec5bf2773c6.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-ed6a140b362c5baa.js → locations-b41fb5ad277088ab.js} +1 -1
  105. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-ff9a34264d48c35f.js → organization-ee56698ae3a6a78b.js} +1 -1
  106. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-102efd9199e87124.js → regulations-a94dfeea43fbca7d.js} +1 -1
  107. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-a4b6d41ca679298b.js → test-datasets-0e2e98cc38ee5499.js} +1 -1
  108. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-c8f5fbaa83dd9945.js → [id]-18b316e2dad73731.js} +1 -1
  109. fides/ui-build/static/admin/_next/static/chunks/pages/{systems-c05b49ddec1a1b4f.js → systems-c32589c86081b750.js} +1 -1
  110. fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-df0d88716578e295.js → taxonomy-a8f09bf8f3204ca7.js} +1 -1
  111. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-da68efc31998dc66.js → [id]-3237881945acc0ee.js} +1 -1
  112. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-e98dfc7d4f2a4e16.js → user-management-a3a50d9d79066935.js} +1 -1
  113. fides/ui-build/static/admin/_next/static/chunks/{webpack-90e8ec1fc5c6455b.js → webpack-69658aeaf6155d89.js} +1 -1
  114. fides/ui-build/static/admin/_next/static/css/{8bc1833f1fa53ff0.css → 073713cd1eddda79.css} +1 -1
  115. fides/ui-build/static/admin/_next/static/css/{ab65b8cc3144bfc8.css → 0b4b1b65cc874774.css} +1 -1
  116. fides/ui-build/static/admin/_next/static/css/{d9924caa849931b3.css → e1628f15dd5f019b.css} +1 -1
  117. fides/ui-build/static/admin/_next/static/nd386tKRkuP7h0W5NiKwd/_buildManifest.js +1 -0
  118. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  119. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  120. fides/ui-build/static/admin/add-systems.html +1 -1
  121. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  122. fides/ui-build/static/admin/consent/configure.html +1 -1
  123. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  124. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  125. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  126. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  127. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  128. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  129. fides/ui-build/static/admin/consent/properties.html +1 -1
  130. fides/ui-build/static/admin/consent/reporting.html +1 -1
  131. fides/ui-build/static/admin/consent.html +1 -1
  132. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  133. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  134. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  135. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  136. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  137. fides/ui-build/static/admin/data-catalog.html +1 -1
  138. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  139. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  140. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  141. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  142. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  143. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  144. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  145. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  146. fides/ui-build/static/admin/datamap.html +1 -1
  147. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  148. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  149. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  150. fides/ui-build/static/admin/dataset/new.html +1 -1
  151. fides/ui-build/static/admin/dataset.html +1 -1
  152. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  153. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  154. fides/ui-build/static/admin/datastore-connection.html +1 -1
  155. fides/ui-build/static/admin/index.html +1 -1
  156. fides/ui-build/static/admin/integrations/[id].html +1 -1
  157. fides/ui-build/static/admin/integrations.html +1 -1
  158. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  159. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  160. fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
  161. fides/ui-build/static/admin/lib/fides.js +3 -3
  162. fides/ui-build/static/admin/login/[provider].html +1 -1
  163. fides/ui-build/static/admin/login.html +1 -1
  164. fides/ui-build/static/admin/messaging/[id].html +1 -1
  165. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  166. fides/ui-build/static/admin/messaging.html +1 -1
  167. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  168. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  169. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  170. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  171. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  172. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  173. fides/ui-build/static/admin/poc/forms.html +1 -1
  174. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  175. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  176. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  177. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  178. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  179. fides/ui-build/static/admin/privacy-requests.html +1 -1
  180. fides/ui-build/static/admin/properties/[id].html +1 -1
  181. fides/ui-build/static/admin/properties/add-property.html +1 -1
  182. fides/ui-build/static/admin/properties.html +1 -1
  183. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  184. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  185. fides/ui-build/static/admin/settings/about.html +1 -1
  186. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  187. fides/ui-build/static/admin/settings/consent.html +1 -1
  188. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  189. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  190. fides/ui-build/static/admin/settings/domains.html +1 -1
  191. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  192. fides/ui-build/static/admin/settings/locations.html +1 -1
  193. fides/ui-build/static/admin/settings/organization.html +1 -1
  194. fides/ui-build/static/admin/settings/regulations.html +1 -1
  195. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  196. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  197. fides/ui-build/static/admin/systems.html +1 -1
  198. fides/ui-build/static/admin/taxonomy.html +1 -1
  199. fides/ui-build/static/admin/user-management/new.html +1 -1
  200. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  201. fides/ui-build/static/admin/user-management.html +1 -1
  202. fides/ui-build/static/admin/_next/static/KAV7vwBbSuOInfCyClBs2/_buildManifest.js +0 -1
  203. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-79f1576b1126975c.js +0 -1
  204. {ethyca_fides-2.67.3b1.dist-info → ethyca_fides-2.68.0rc1.dist-info}/WHEEL +0 -0
  205. {ethyca_fides-2.67.3b1.dist-info → ethyca_fides-2.68.0rc1.dist-info}/entry_points.txt +0 -0
  206. {ethyca_fides-2.67.3b1.dist-info → ethyca_fides-2.68.0rc1.dist-info}/licenses/LICENSE +0 -0
  207. {ethyca_fides-2.67.3b1.dist-info → ethyca_fides-2.68.0rc1.dist-info}/top_level.txt +0 -0
  208. /fides/ui-build/static/admin/_next/static/chunks/{5596-4378b2927dae65b2.js → 5596-bb601cbf40e47a0f.js} +0 -0
  209. /fides/ui-build/static/admin/_next/static/{KAV7vwBbSuOInfCyClBs2 → nd386tKRkuP7h0W5NiKwd}/_ssgManifest.js +0 -0
fides/_version.py CHANGED
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-08-12T12:16:17-0300",
11
+ "date": "2025-08-14T14:29:48-0400",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "f2fdadb60ed78ceb252b30337f5e7a17374ff725",
15
- "version": "2.67.3b1"
14
+ "full-revisionid": "ee3ccac8a775e44563884be1766e9677df8cc909",
15
+ "version": "2.68.0rc1"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -0,0 +1,439 @@
1
+ """
2
+ Disallow dots in monitor keys and update references to monitor keys.
3
+
4
+ This is a data migration.
5
+
6
+ This migration does the following:
7
+ - Fetches a mapping of old monitor keys containing '.' to new, safe keys (replace '.' with '_').
8
+ - Persists the mapping into the dbcache table.
9
+ - Drops the FK constraints on the stagedresourceancestor table.
10
+ - Updates the monitorconfig.key, monitorexecution.monitor_config_key, stagedresource.monitor_config_id, stagedresource.urn, stagedresource.parent, stagedresource.children, stagedresource.meta, stagedresourceancestor.ancestor_urn, and stagedresourceancestor.descendant_urn to reference new keys.
11
+ - Recreates the FK constraints on the stagedresourceancestor table.
12
+ - Adds a CHECK constraint to forbid dots in monitorconfig.key going forward.
13
+
14
+ Revision ID: 2f3c1a2d6b10
15
+ Revises: a7065df4dcf1
16
+ Create Date: 2025-08-11 00:00:00.000000
17
+
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ import json
23
+ from typing import Dict
24
+
25
+ import sqlalchemy as sa
26
+ from alembic import op
27
+ from loguru import logger
28
+ from sqlalchemy.engine import Connection
29
+
30
+ # revision identifiers, used by Alembic.
31
+ revision = "2f3c1a2d6b10"
32
+ down_revision = "a7065df4dcf1"
33
+ branch_labels = None
34
+ depends_on = None
35
+
36
+
37
+ def _fetch_monitor_key_mapping(conn: Connection) -> Dict[str, str]:
38
+ """
39
+ Build a mapping of old monitor keys containing '.' to new, safe keys (replace '.' with '_').
40
+ Ensures uniqueness by appending a short numeric suffix when needed.
41
+ """
42
+ rows = conn.execute(
43
+ sa.text(
44
+ """
45
+ SELECT key FROM monitorconfig
46
+ """
47
+ )
48
+ ).fetchall()
49
+ existing_keys = {r[0] for r in rows}
50
+
51
+ mapping: Dict[str, str] = {}
52
+ taken: set[str] = set(existing_keys)
53
+
54
+ for old_key in sorted(existing_keys):
55
+ if "." not in old_key:
56
+ continue
57
+ base = old_key.replace(".", "_")
58
+ new_key = base
59
+ # ensure uniqueness
60
+ if new_key in taken:
61
+ i = 1
62
+ while f"{base}_{i}" in taken:
63
+ i += 1
64
+ new_key = f"{base}_{i}"
65
+ mapping[old_key] = new_key
66
+ taken.add(new_key)
67
+
68
+ if mapping:
69
+ logger.info(
70
+ f"Found {len(mapping)} monitor keys with dots, migrating monitorconfig keys based on mapping: {mapping}"
71
+ )
72
+ return mapping
73
+
74
+
75
+ def _update_monitorconfig_keys(conn: Connection, mapping: Dict[str, str]) -> None:
76
+ """
77
+ Updates `MonitorConfig.key`s based on the mapping of 'old' keys to 'new' keys.
78
+ """
79
+
80
+ logger.info("Updating monitorconfig keys...")
81
+ for old, new in mapping.items():
82
+ conn.execute(
83
+ sa.text(
84
+ """
85
+ UPDATE monitorconfig
86
+ SET key = :new
87
+ WHERE key = :old
88
+ """
89
+ ),
90
+ {"old": old, "new": new},
91
+ )
92
+ logger.info("Finished updating monitorconfig keys.")
93
+
94
+
95
+ def _update_monitorexecution(conn: Connection, mapping: Dict[str, str]) -> None:
96
+ """
97
+ Updates `monitorexecution.monitor_config_key` to reference new `MonitorConfig.key`s.
98
+ """
99
+
100
+ logger.info("Updating monitorexecution monitor_config_key...")
101
+ for old, new in mapping.items():
102
+ conn.execute(
103
+ sa.text(
104
+ """
105
+ UPDATE monitorexecution
106
+ SET monitor_config_key = :new
107
+ WHERE monitor_config_key = :old
108
+ """
109
+ ),
110
+ {"old": old, "new": new},
111
+ )
112
+ logger.info("Finished updating monitorexecution monitor_config_key.")
113
+
114
+
115
+ def _update_stagedresource_monitor_config_id(
116
+ conn: Connection, mapping: Dict[str, str]
117
+ ) -> None:
118
+ """
119
+ Updates `stagedresource.monitor_config_id` to reference new `MonitorConfig.key`s.
120
+ """
121
+ logger.info("Updating stagedresource monitor_config_id...")
122
+ for old, new in mapping.items():
123
+ conn.execute(
124
+ sa.text(
125
+ """
126
+ UPDATE stagedresource
127
+ SET monitor_config_id = :new
128
+ WHERE monitor_config_id = :old
129
+ """
130
+ ),
131
+ {"old": old, "new": new},
132
+ )
133
+ logger.info("Finished updating stagedresource monitor_config_id.")
134
+
135
+
136
+ def _update_stagedresource_urns_and_parent(
137
+ conn: Connection, mapping: Dict[str, str]
138
+ ) -> None:
139
+ """
140
+ Updates `stagedresource.urn`s and `stagedresource.parent`s to reference new `MonitorConfig.key`s.
141
+ """
142
+ logger.info("Updating stagedresource urns and parent...")
143
+ for old, new in mapping.items():
144
+ params = {"old": old, "new": new, "old_prefix": f"{old}.%"}
145
+
146
+ conn.execute(
147
+ sa.text(
148
+ f"""
149
+ UPDATE stagedresource
150
+ SET urn = :new || SUBSTRING(urn FROM CHAR_LENGTH(:old) + 1)
151
+ WHERE urn LIKE :old_prefix AND monitor_config_id = :new
152
+ """
153
+ ),
154
+ params,
155
+ )
156
+
157
+ conn.execute(
158
+ sa.text(
159
+ f"""
160
+ UPDATE stagedresource
161
+ SET parent = :new || SUBSTRING(parent FROM CHAR_LENGTH(:old) + 1)
162
+ WHERE parent LIKE :old_prefix AND monitor_config_id = :new
163
+ """
164
+ ),
165
+ params,
166
+ )
167
+ logger.info("Finished updating stagedresource urns and parent.")
168
+
169
+
170
+ def _update_stagedresource_children_array(
171
+ conn: Connection, mapping: Dict[str, str]
172
+ ) -> None:
173
+ """
174
+ Updates `stagedresource.children` to reference new `MonitorConfig.key`s.
175
+
176
+ Elements from `stagedresource.children` are unnested, updated, and re-aggregated in a single query.
177
+ """
178
+ logger.info("Updating stagedresource children array...")
179
+ for old, new in mapping.items():
180
+
181
+ conn.execute(
182
+ sa.text(
183
+ """
184
+ UPDATE stagedresource
185
+ SET children = (
186
+ SELECT COALESCE(array_agg(
187
+ CASE WHEN val LIKE :old_prefix
188
+ THEN :new || SUBSTRING(val FROM CHAR_LENGTH(:old) + 1)
189
+ ELSE val END
190
+ ), '{}')
191
+ FROM unnest(children) AS val
192
+ )
193
+ WHERE monitor_config_id = :new
194
+ AND children IS NOT NULL
195
+ """
196
+ ),
197
+ {"old": old, "new": new, "old_prefix": f"{old}.%"},
198
+ )
199
+ logger.info("Finished updating stagedresource children array.")
200
+
201
+
202
+ def _update_stagedresource_meta_json(conn: Connection, mapping: Dict[str, str]) -> None:
203
+ """
204
+ Updates necessary keys in `stagedresource.meta` (`direct_child_urns` and `top_level_field_urn`)
205
+ to reference new `MonitorConfig.key`s.
206
+ """
207
+ logger.info("Updating stagedresource meta json...")
208
+
209
+ for old, new in mapping.items():
210
+ params = {"old": old, "new": new, "old_prefix": f"{old}.%"}
211
+
212
+ # updates `stagedresource.meta.direct_child_urns` to reference new `MonitorConfig.key`
213
+ # elements from `stagedresource.meta.direct_child_urns` are unnested, updated, and re-aggregated in a single query.
214
+ conn.execute(
215
+ sa.text(
216
+ """
217
+ UPDATE stagedresource
218
+ SET meta = jsonb_set(
219
+ COALESCE(meta, '{}'::jsonb),
220
+ '{direct_child_urns}',
221
+ (
222
+ SELECT COALESCE(jsonb_agg(
223
+ CASE WHEN elem LIKE :old_prefix
224
+ THEN to_jsonb(:new || SUBSTRING(elem FROM CHAR_LENGTH(:old) + 1))
225
+ ELSE to_jsonb(elem) END
226
+ ), '[]'::jsonb)
227
+ FROM jsonb_array_elements_text(COALESCE(meta->'direct_child_urns','[]'::jsonb)) AS elem
228
+ ),
229
+ true
230
+ )
231
+ WHERE monitor_config_id = :new AND meta ? 'direct_child_urns'
232
+ """
233
+ ),
234
+ params,
235
+ )
236
+
237
+ # updates `stagedresource.meta.top_level_field_urn` to reference new `MonitorConfig.key`
238
+ # we coalesce the value to 'null'::jsonb to ensure a 'JSON null' value is set, not a column-level NULL
239
+ conn.execute(
240
+ sa.text(
241
+ """
242
+ UPDATE stagedresource
243
+ SET meta = jsonb_set(
244
+ COALESCE(meta, '{}'::jsonb),
245
+ '{top_level_field_urn}',
246
+ COALESCE(to_jsonb(
247
+ CASE WHEN (meta->>'top_level_field_urn') LIKE :old_prefix
248
+ THEN :new || SUBSTRING((meta->>'top_level_field_urn') FROM CHAR_LENGTH(:old) + 1)
249
+ ELSE (meta->>'top_level_field_urn') END
250
+ ), 'null'::jsonb),
251
+ true
252
+ )
253
+ WHERE monitor_config_id = :new AND meta ? 'top_level_field_urn'
254
+ """
255
+ ),
256
+ params,
257
+ )
258
+
259
+ logger.info("Finished updating stagedresource meta json.")
260
+
261
+
262
+ def _update_stagedresourceancestor(conn: Connection, mapping: Dict[str, str]) -> None:
263
+ """
264
+ Updates `stagedresourceancestor.ancestor_urn` and `stagedresourceancestor.descendant_urn`
265
+ to reference new `MonitorConfig.key`s.
266
+
267
+ NOTE: StagedResourceAncestor queries cannot be easily scoped by monitor_config_id
268
+ since the table doesn't have a direct reference to it. However, we optimize by
269
+ doing a single table scan to update both columns for all mappings at once.
270
+
271
+ The generated query will look like:
272
+ ```
273
+ UPDATE stagedresourceancestor
274
+ SET
275
+ ancestor_urn = CASE
276
+ WHEN ancestor_urn LIKE 'monitor.config.1.%' THEN 'monitor_config_1' || SUBSTRING(ancestor_urn FROM 17)
277
+ WHEN ancestor_urn LIKE 'monitor.config.2.%' THEN 'monitor_config_2' || SUBSTRING(ancestor_urn FROM 17)
278
+ ELSE ancestor_urn
279
+ END,
280
+ descendant_urn = CASE
281
+ WHEN descendant_urn LIKE 'monitor.config.1.%' THEN 'monitor_config_1' || SUBSTRING(descendant_urn FROM 17)
282
+ WHEN descendant_urn LIKE 'monitor.config.2.%' THEN 'monitor_config_2' || SUBSTRING(descendant_urn FROM 17)
283
+ ELSE descendant_urn
284
+ END
285
+ WHERE ancestor_urn LIKE 'monitor.config.1.%' OR descendant_urn LIKE 'monitor.config.1.%'
286
+ OR ancestor_urn LIKE 'monitor.config.2.%' OR descendant_urn LIKE 'monitor.config.2.%'
287
+ ```
288
+ """
289
+ logger.info("Updating stagedresourceancestor...")
290
+
291
+ if not mapping:
292
+ return
293
+
294
+ ancestor_case_conditions = []
295
+ descendant_case_conditions = []
296
+ where_conditions = []
297
+
298
+ for old, new in mapping.items():
299
+ ancestor_case_conditions.append(
300
+ f"WHEN ancestor_urn LIKE '{old}.%' THEN '{new}' || SUBSTRING(ancestor_urn FROM {len(old) + 1})"
301
+ )
302
+ descendant_case_conditions.append(
303
+ f"WHEN descendant_urn LIKE '{old}.%' THEN '{new}' || SUBSTRING(descendant_urn FROM {len(old) + 1})"
304
+ )
305
+ where_conditions.extend(
306
+ [f"ancestor_urn LIKE '{old}.%'", f"descendant_urn LIKE '{old}.%'"]
307
+ )
308
+
309
+ sql = f"""
310
+ UPDATE stagedresourceancestor
311
+ SET
312
+ ancestor_urn = CASE
313
+ {' '.join(ancestor_case_conditions)}
314
+ ELSE ancestor_urn
315
+ END,
316
+ descendant_urn = CASE
317
+ {' '.join(descendant_case_conditions)}
318
+ ELSE descendant_urn
319
+ END
320
+ WHERE {' OR '.join(where_conditions)}
321
+ """
322
+
323
+ conn.execute(sa.text(sql))
324
+ logger.info("Finished updating stagedresourceancestor.")
325
+
326
+
327
+ def _persist_monitor_key_mapping(conn: Connection, mapping: Dict[str, str]) -> None:
328
+ """
329
+ Persists the mapping of 'old' monitor keys with dots in them to 'new' keys without dots
330
+ into the dbcache table.
331
+
332
+ NOTE: this mapping is persisted only as a temporary measure (i.e. for a few releases)
333
+ just in case we want to revert this data migration for any reason.
334
+
335
+
336
+ TODO: remove the cache entry in a future migration!
337
+ """
338
+ logger.info("Persisting monitor key mapping to dbcache...")
339
+ mapping_json = json.dumps(mapping)
340
+ conn.execute(
341
+ sa.text(
342
+ """
343
+ INSERT INTO dbcache (id, namespace, cache_key, cache_value, created_at, updated_at)
344
+ VALUES ('dbc_' || gen_random_uuid(), :namespace, :cache_key, convert_to(:value, 'UTF8')::bytea, now(), now())
345
+ ON CONFLICT (namespace, cache_key)
346
+ DO UPDATE SET cache_value = EXCLUDED.cache_value, updated_at = now()
347
+ """
348
+ ),
349
+ {
350
+ "namespace": "monitor-config-key-mapping",
351
+ "cache_key": "monitor-config-key-mapping",
352
+ "value": mapping_json,
353
+ },
354
+ )
355
+ logger.info("Finished persisting monitor key mapping to dbcache.")
356
+
357
+
358
+ def _drop_fk_constraints(conn: Connection) -> None:
359
+ """
360
+ Drops the FK constraints on the stagedresourceancestor table.
361
+
362
+ This is done to avoid immediate constraint violations while updating URNs.
363
+ """
364
+ logger.info("Dropping FK constraints...")
365
+ op.drop_constraint(
366
+ "fk_staged_resource_ancestor_ancestor",
367
+ "stagedresourceancestor",
368
+ type_="foreignkey",
369
+ )
370
+ op.drop_constraint(
371
+ "fk_staged_resource_ancestor_descendant",
372
+ "stagedresourceancestor",
373
+ type_="foreignkey",
374
+ )
375
+ logger.info("Finished dropping FK constraints.")
376
+
377
+
378
+ def _recreate_fk_constraints(conn: Connection) -> None:
379
+ """
380
+ Recreates the FK constraints on the stagedresourceancestor table.
381
+ """
382
+ logger.info("Recreating FK constraints...")
383
+ op.create_foreign_key(
384
+ "fk_staged_resource_ancestor_ancestor",
385
+ "stagedresourceancestor",
386
+ "stagedresource",
387
+ ["ancestor_urn"],
388
+ ["urn"],
389
+ ondelete="CASCADE",
390
+ )
391
+ op.create_foreign_key(
392
+ "fk_staged_resource_ancestor_descendant",
393
+ "stagedresourceancestor",
394
+ "stagedresource",
395
+ ["descendant_urn"],
396
+ ["urn"],
397
+ ondelete="CASCADE",
398
+ )
399
+ logger.info("Finished recreating FK constraints.")
400
+
401
+
402
+ def upgrade() -> None:
403
+ conn = op.get_bind()
404
+
405
+ mapping = _fetch_monitor_key_mapping(conn)
406
+ if mapping:
407
+ logger.info("Beginning monitorconfig key 'dot' migration...")
408
+ logger.info(
409
+ f"Found {len(mapping)} monitor configs with dots to migrate: {list(mapping.keys())}"
410
+ )
411
+
412
+ _persist_monitor_key_mapping(conn, mapping)
413
+
414
+ _drop_fk_constraints(conn)
415
+
416
+ _update_monitorconfig_keys(conn, mapping)
417
+ _update_monitorexecution(conn, mapping)
418
+ _update_stagedresource_monitor_config_id(conn, mapping)
419
+ _update_stagedresource_urns_and_parent(conn, mapping)
420
+ _update_stagedresource_children_array(conn, mapping)
421
+ _update_stagedresource_meta_json(conn, mapping)
422
+ _update_stagedresourceancestor(conn, mapping)
423
+
424
+ _recreate_fk_constraints(conn)
425
+
426
+ # Add CHECK constraint to forbid dots in monitorconfig.key going forward
427
+ op.create_check_constraint(
428
+ "ck_monitorconfig_key_no_dots",
429
+ "monitorconfig",
430
+ "key NOT LIKE '%.%'",
431
+ )
432
+
433
+
434
+ def downgrade() -> None:
435
+ # Remove the CHECK constraint
436
+ op.drop_constraint("ck_monitorconfig_key_no_dots", "monitorconfig", type_="check")
437
+ # Data downgrade left blank intentionally - if needed, we have the old key mapping in
438
+ # the dbcache entry and a data migration reversal can be written on an adhoc basis.
439
+ pass
@@ -21,7 +21,12 @@ from fides.api.util.custom_json_encoder import CustomJSONEncoder, _custom_decode
21
21
  from fides.api.util.text import to_snake_case
22
22
 
23
23
  T = TypeVar("T", bound="OrmWrappedFidesBase")
24
- ALLOWED_CHARS = re.compile(r"[A-Za-z0-9\-_]")
24
+ ALLOWED_CHARS_PATTERN = r"[A-Za-z0-9\-_]"
25
+ DISALLOWED_CHARS_PATTERN = (
26
+ r"[^A-Za-z0-9\-_]" # anything that's _not_ matched by ALLOWED_CHARS_PATTERN above
27
+ )
28
+ ALLOWED_CHARS = re.compile(ALLOWED_CHARS_PATTERN)
29
+ DISALLOWED_CHARS = re.compile(DISALLOWED_CHARS_PATTERN)
25
30
 
26
31
 
27
32
  class JSONTypeOverride(JSONType): # pylint: disable=W0223
@@ -109,6 +114,19 @@ class FidesBase:
109
114
  """
110
115
  return f"{self.__tablename__}.id"
111
116
 
117
+ @classmethod
118
+ def sanitize_key(cls, proposed_key: str) -> str:
119
+ """
120
+ Sanitize the key by removing invalid characters.
121
+
122
+ Invalid characters are based on the allowed characters defined in this module.
123
+ Note that this differs slightly from the allowed characters in `sanitize_fides_key`
124
+ from `core/utils.py`; specifically, `.` are disallowed (converted to `_`) here, while
125
+ they are allowed in `sanitize_fides_key`. This is because `.` must be allowed in
126
+ `fides_key`s, but they are not allowed in `key`s.
127
+ """
128
+ return DISALLOWED_CHARS.sub("_", proposed_key)
129
+
112
130
  id = Column(String(255), primary_key=True, index=True, default=generate_uuid)
113
131
  created_at = Column(DateTime(timezone=True), server_default=func.now())
114
132
  updated_at = Column(
@@ -14,6 +14,14 @@ class DBCacheNamespace(Enum):
14
14
 
15
15
  LIST_PRIVACY_EXPERIENCE = "list-privacy-experience"
16
16
 
17
+ # NOTE: monitor config key mapping entry is populated by migration
18
+ # 2f3c1a2d6b10_disallow_dot_in_monitor_key_and_update_refs as a temporary means of
19
+ # storing the mapping of 'old' monitor config keys with dots in them
20
+ # to their new keys without dots.
21
+ # This is a safety measure, in case we need to revert that data migration for whatever reason.
22
+ # TODO: remove this cache entry in a future migration.
23
+ MONITOR_CONFIG_KEY_MAPPING = "monitor-config-key-mapping"
24
+
17
25
 
18
26
  class DBCache(Base):
19
27
  """
@@ -9,6 +9,7 @@ from loguru import logger
9
9
  from sqlalchemy import (
10
10
  ARRAY,
11
11
  Boolean,
12
+ CheckConstraint,
12
13
  Column,
13
14
  DateTime,
14
15
  ForeignKey,
@@ -23,7 +24,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
23
24
  from sqlalchemy.ext.declarative import declared_attr
24
25
  from sqlalchemy.ext.mutable import MutableDict
25
26
  from sqlalchemy.future import select
26
- from sqlalchemy.orm import RelationshipProperty, Session, relationship
27
+ from sqlalchemy.orm import RelationshipProperty, Session, relationship, validates
27
28
  from sqlalchemy.orm.query import Query
28
29
 
29
30
  from fides.api.db.base_class import Base, FidesBase
@@ -172,6 +173,12 @@ class MonitorConfig(Base):
172
173
 
173
174
  shared_config = relationship(SharedMonitorConfig)
174
175
 
176
+ __table_args__ = (
177
+ CheckConstraint( # type: ignore
178
+ "key NOT LIKE '%.%'", name="ck_monitorconfig_key_no_dots"
179
+ ),
180
+ )
181
+
175
182
  @property
176
183
  def classify_params(self) -> dict:
177
184
  """
@@ -332,6 +339,12 @@ class MonitorConfig(Base):
332
339
  cron_trigger_dict["month"] = execution_start_date.month
333
340
  data["monitor_execution_trigger"] = cron_trigger_dict
334
341
 
342
+ @validates("key")
343
+ def validate_key_no_dots(self, _key: str, value: str) -> str:
344
+ if value and "." in value:
345
+ raise ValueError('MonitorConfig.key cannot contain "." characters')
346
+ return value
347
+
335
348
 
336
349
  class StagedResourceAncestor(Base):
337
350
  """
@@ -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/d9924caa849931b3.css" as="style"/><link rel="stylesheet" href="/_next/static/css/d9924caa849931b3.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-90e8ec1fc5c6455b.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-750d6bd16c971bb9.js" defer=""></script><script src="/_next/static/chunks/pages/404-2d803dab6a00f353.js" defer=""></script><script src="/_next/static/KAV7vwBbSuOInfCyClBs2/_buildManifest.js" defer=""></script><script src="/_next/static/KAV7vwBbSuOInfCyClBs2/_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":"KAV7vwBbSuOInfCyClBs2","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/e1628f15dd5f019b.css" as="style"/><link rel="stylesheet" href="/_next/static/css/e1628f15dd5f019b.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-69658aeaf6155d89.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-65723cd4b8fc36ac.js" defer=""></script><script src="/_next/static/chunks/pages/404-9174cdb70126c2c5.js" defer=""></script><script src="/_next/static/nd386tKRkuP7h0W5NiKwd/_buildManifest.js" defer=""></script><script src="/_next/static/nd386tKRkuP7h0W5NiKwd/_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":"nd386tKRkuP7h0W5NiKwd","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>