ethyca-fides 2.71.0rc4__py2.py3-none-any.whl → 2.71.1b1__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 (182) hide show
  1. {ethyca_fides-2.71.0rc4.dist-info → ethyca_fides-2.71.1b1.dist-info}/METADATA +2 -2
  2. {ethyca_fides-2.71.0rc4.dist-info → ethyca_fides-2.71.1b1.dist-info}/RECORD +158 -154
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/3efe14d4469a_adds_new_experience_configs_for_vendor_.py +79 -0
  5. fides/api/alembic/migrations/versions/918aefc950c9_create_digest_conditional_dependencies.py +125 -0
  6. fides/api/alembic/migrations/versions/9caf76161e55_make_user_assigned_data_uses_nullable_.py +64 -0
  7. fides/api/alembic/migrations/versions/f108fa05c579_adds_optional_duration_field_to_assets.py +28 -0
  8. fides/api/api/v1/endpoints/generic_overrides.py +9 -3
  9. fides/api/db/base.py +1 -1
  10. fides/api/models/asset.py +14 -1
  11. fides/api/models/conditional_dependency/conditional_dependency_base.py +253 -24
  12. fides/api/models/detection_discovery/core.py +57 -3
  13. fides/api/models/digest/__init__.py +5 -1
  14. fides/api/models/digest/conditional_dependencies.py +267 -1
  15. fides/api/models/digest/digest_config.py +34 -9
  16. fides/api/models/fides_user.py +9 -0
  17. fides/api/models/manual_task/conditional_dependency.py +16 -18
  18. fides/api/models/privacy_experience.py +10 -0
  19. fides/api/models/privacy_notice.py +139 -20
  20. fides/api/task/manual/manual_task_conditional_evaluation.py +1 -1
  21. fides/service/dataset/dataset_service.py +39 -0
  22. fides/service/privacy_request/privacy_request_service.py +103 -48
  23. fides/ui-build/static/admin/404.html +1 -1
  24. fides/ui-build/static/admin/_next/static/_IxwgneyQjdSaZFEF3Tqu/_buildManifest.js +1 -0
  25. fides/ui-build/static/admin/_next/static/chunks/155-b4337d0826d5addc.js +1 -0
  26. fides/ui-build/static/admin/_next/static/chunks/1817-1ad037b7d6d2f6d2.js +1 -0
  27. fides/ui-build/static/admin/_next/static/chunks/{3585-efd5d41f08e180c4.js → 3585-f728d32fda6f1ac1.js} +1 -1
  28. fides/ui-build/static/admin/_next/static/chunks/3855-ed226b8a8050bd40.js +1 -0
  29. fides/ui-build/static/admin/_next/static/chunks/409-5c3d31163028339f.js +1 -0
  30. fides/ui-build/static/admin/_next/static/chunks/4558-8305aee48def1dcd.js +1 -0
  31. fides/ui-build/static/admin/_next/static/chunks/4608-0c6ef78e30a51f84.js +1 -0
  32. fides/ui-build/static/admin/_next/static/chunks/{4718-6585c97c26647e65.js → 4718-3a412bdb90add82f.js} +1 -1
  33. fides/ui-build/static/admin/_next/static/chunks/502-0d9f4ac29ef34a1c.js +1 -0
  34. fides/ui-build/static/admin/_next/static/chunks/5279-12c9cbdc67ad7b14.js +1 -0
  35. fides/ui-build/static/admin/_next/static/chunks/6277-182efc294d413f64.js +1 -0
  36. fides/ui-build/static/admin/_next/static/chunks/{7045-f15044a4d4525946.js → 7045-14e955890f1147e4.js} +1 -1
  37. fides/ui-build/static/admin/_next/static/chunks/7079-50571e9f3269d74d.js +1 -0
  38. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-a77584f9ad3334af.js → _app-c1c2f757b1f3da12.js} +1 -1
  39. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-75e99306393938e8.js → manual-4ec03eed67572861.js} +1 -1
  40. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-19214babd1f219e3.js +1 -0
  41. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-fd41ffaff543e05a.js → [id]-e1e2fd704ac2d71d.js} +1 -1
  42. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-e74cb5ea87f15b40.js → new-a5e738a234dadc7e.js} +1 -1
  43. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-9c23fbe813c997d0.js → [id]-5fc78b78a51c239c.js} +1 -1
  44. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-0e5e38bbcfe59fd2.js → new-b79bcb93b5f4c734.js} +1 -1
  45. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-c1a3caf3c286bf5d.js +1 -0
  46. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-5b57f9132426fe52.js +1 -0
  47. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-a28cc0e23bbe4fc8.js +1 -0
  48. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-7d22222608ec3aac.js +1 -0
  49. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d514cd4ec62e3b03.js +1 -0
  50. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-153eb88ab4e7dc6d.js +1 -0
  51. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-331544e9b85c4ac2.js +1 -0
  52. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-479890582973deaf.js +1 -0
  53. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-4d658222ec800511.js +1 -0
  54. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-2fcd95c41e578d57.js +1 -0
  55. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{privacy-requests-8cbdfd08e0fa88fb.js → privacy-requests-97221067330c0c27.js} +1 -1
  56. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-547c6ef0ad52b85d.js → [id]-4d470bbf199a2f9c.js} +1 -1
  57. fides/ui-build/static/admin/_next/static/chunks/pages/systems-6c91bdea40875227.js +1 -0
  58. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-3059aba38adefa56.js +1 -0
  59. fides/ui-build/static/admin/_next/static/css/{64fac6fb884435c2.css → 295d729ea1b11885.css} +1 -1
  60. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  61. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  62. fides/ui-build/static/admin/add-systems.html +1 -1
  63. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  64. fides/ui-build/static/admin/consent/configure.html +1 -1
  65. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  66. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  67. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  68. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  69. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  70. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  71. fides/ui-build/static/admin/consent/properties.html +1 -1
  72. fides/ui-build/static/admin/consent/reporting.html +1 -1
  73. fides/ui-build/static/admin/consent.html +1 -1
  74. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  75. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  76. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  77. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  78. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  79. fides/ui-build/static/admin/data-catalog.html +1 -1
  80. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  81. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  82. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  83. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  84. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  85. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  86. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  87. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  88. fides/ui-build/static/admin/datamap.html +1 -1
  89. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  90. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  91. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  92. fides/ui-build/static/admin/dataset/new.html +1 -1
  93. fides/ui-build/static/admin/dataset.html +1 -1
  94. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  95. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  96. fides/ui-build/static/admin/datastore-connection.html +1 -1
  97. fides/ui-build/static/admin/index.html +1 -1
  98. fides/ui-build/static/admin/integrations/[id].html +1 -1
  99. fides/ui-build/static/admin/integrations.html +1 -1
  100. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  101. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  102. fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
  103. fides/ui-build/static/admin/lib/fides.js +3 -3
  104. fides/ui-build/static/admin/login/[provider].html +1 -1
  105. fides/ui-build/static/admin/login.html +1 -1
  106. fides/ui-build/static/admin/messaging/[id].html +1 -1
  107. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  108. fides/ui-build/static/admin/messaging.html +1 -1
  109. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  110. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  111. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  112. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  113. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  114. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  115. fides/ui-build/static/admin/poc/forms.html +1 -1
  116. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  117. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  118. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  119. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  120. fides/ui-build/static/admin/privacy-requests.html +1 -1
  121. fides/ui-build/static/admin/properties/[id].html +1 -1
  122. fides/ui-build/static/admin/properties/add-property.html +1 -1
  123. fides/ui-build/static/admin/properties.html +1 -1
  124. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  125. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  126. fides/ui-build/static/admin/settings/about.html +1 -1
  127. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  128. fides/ui-build/static/admin/settings/consent.html +1 -1
  129. fides/ui-build/static/admin/settings/custom-fields/[id].html +1 -1
  130. fides/ui-build/static/admin/settings/custom-fields/new.html +1 -1
  131. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  132. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  133. fides/ui-build/static/admin/settings/domains.html +1 -1
  134. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  135. fides/ui-build/static/admin/settings/locations.html +1 -1
  136. fides/ui-build/static/admin/settings/messaging-providers/[key].html +1 -1
  137. fides/ui-build/static/admin/settings/messaging-providers/new.html +1 -1
  138. fides/ui-build/static/admin/settings/messaging-providers.html +1 -1
  139. fides/ui-build/static/admin/settings/organization.html +1 -1
  140. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  141. fides/ui-build/static/admin/settings/regulations.html +1 -1
  142. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  143. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  144. fides/ui-build/static/admin/systems.html +1 -1
  145. fides/ui-build/static/admin/taxonomy.html +1 -1
  146. fides/ui-build/static/admin/user-management/new.html +1 -1
  147. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  148. fides/ui-build/static/admin/user-management.html +1 -1
  149. fides/ui-build/static/admin/_next/static/chunks/155-047c3806cc41295e.js +0 -1
  150. fides/ui-build/static/admin/_next/static/chunks/1817-ca6473f31a67a804.js +0 -1
  151. fides/ui-build/static/admin/_next/static/chunks/3700-08e0703b1ef770da.js +0 -1
  152. fides/ui-build/static/admin/_next/static/chunks/3855-12ee1dfbbe47fd28.js +0 -1
  153. fides/ui-build/static/admin/_next/static/chunks/409-c1256ecda1b15db6.js +0 -1
  154. fides/ui-build/static/admin/_next/static/chunks/4558-de5ced790b3380dc.js +0 -1
  155. fides/ui-build/static/admin/_next/static/chunks/4608-a9941d0c236ebca1.js +0 -1
  156. fides/ui-build/static/admin/_next/static/chunks/502-d3ecae97b67befbd.js +0 -1
  157. fides/ui-build/static/admin/_next/static/chunks/6084-d0943ee628bf4388.js +0 -1
  158. fides/ui-build/static/admin/_next/static/chunks/6416-0ccadfefcdad00cc.js +0 -1
  159. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-58920afe2b67f952.js +0 -1
  160. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-ae4909cad9b67822.js +0 -1
  161. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-2e1e2b7808d3b21f.js +0 -1
  162. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-2635ef588bf06145.js +0 -1
  163. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-15616bea02397ef4.js +0 -1
  164. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-ea198c4a7869f402.js +0 -1
  165. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-01e025f878ba806c.js +0 -1
  166. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-14120a529d7dac27.js +0 -1
  167. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-648d775d0fce49dc.js +0 -1
  168. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-e5d781b28f8e29c8.js +0 -1
  169. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-5edfec10a945ca43.js +0 -1
  170. fides/ui-build/static/admin/_next/static/chunks/pages/systems-0f1d833282f09684.js +0 -1
  171. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-a8cfa7de4948b374.js +0 -1
  172. fides/ui-build/static/admin/_next/static/kdnucJIsIefS6ViqY-8w3/_buildManifest.js +0 -1
  173. {ethyca_fides-2.71.0rc4.dist-info → ethyca_fides-2.71.1b1.dist-info}/WHEEL +0 -0
  174. {ethyca_fides-2.71.0rc4.dist-info → ethyca_fides-2.71.1b1.dist-info}/entry_points.txt +0 -0
  175. {ethyca_fides-2.71.0rc4.dist-info → ethyca_fides-2.71.1b1.dist-info}/licenses/LICENSE +0 -0
  176. {ethyca_fides-2.71.0rc4.dist-info → ethyca_fides-2.71.1b1.dist-info}/top_level.txt +0 -0
  177. /fides/ui-build/static/admin/_next/static/{kdnucJIsIefS6ViqY-8w3 → _IxwgneyQjdSaZFEF3Tqu}/_ssgManifest.js +0 -0
  178. /fides/ui-build/static/admin/_next/static/chunks/{6882-10296485ec326e6b.js → 6882-dbe0a25dcf1a8ee0.js} +0 -0
  179. /fides/ui-build/static/admin/_next/static/chunks/{9046-2a332fe338535c84.js → 9046-b6616ba7b59d947e.js} +0 -0
  180. /fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-56fd0f3e465e52b6.js → data-catalog-b7326c51d88cc2cc.js} +0 -0
  181. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-d4031e438c363fff.js → [...subfieldNames]-0abd30eada811b5b.js} +0 -0
  182. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-9463af37079762d0.js → [collectionName]-007965429368d9a3.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-29T11:59:41-0300",
11
+ "date": "2025-10-01T18:54:14+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "031b1c59b7eacf0e8fdbe63fc9d8464619010f74",
15
- "version": "2.71.0rc4"
14
+ "full-revisionid": "ed0d3226e0f8af1ecab0ac2d2dabff1ee209680d",
15
+ "version": "2.71.1b1"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -0,0 +1,79 @@
1
+ """adds new experience configs for vendor asset disclosure
2
+
3
+ Revision ID: 3efe14d4469a
4
+ Revises: f108fa05c579
5
+ Create Date: 2025-09-09 11:19:24.060587
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 = "3efe14d4469a"
15
+ down_revision = "f108fa05c579"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade():
21
+ # ### commands auto generated by Alembic - please adjust! ###
22
+ op.add_column(
23
+ "experienceconfigtemplate",
24
+ sa.Column(
25
+ "asset_disclosure_include_types",
26
+ postgresql.ARRAY(sa.String()),
27
+ nullable=True,
28
+ ),
29
+ )
30
+ op.add_column(
31
+ "experienceconfigtemplate",
32
+ sa.Column(
33
+ "allow_vendor_asset_disclosure",
34
+ sa.Boolean(),
35
+ server_default="f",
36
+ nullable=False,
37
+ ),
38
+ )
39
+ op.add_column(
40
+ "privacyexperienceconfig",
41
+ sa.Column(
42
+ "asset_disclosure_include_types",
43
+ postgresql.ARRAY(sa.String()),
44
+ nullable=True,
45
+ ),
46
+ )
47
+ op.add_column(
48
+ "privacyexperienceconfig",
49
+ sa.Column(
50
+ "allow_vendor_asset_disclosure",
51
+ sa.Boolean(),
52
+ server_default="f",
53
+ nullable=False,
54
+ ),
55
+ )
56
+ op.add_column(
57
+ "privacyexperienceconfighistory",
58
+ sa.Column("allow_vendor_asset_disclosure", sa.Boolean(), nullable=True),
59
+ )
60
+ op.add_column(
61
+ "privacyexperienceconfighistory",
62
+ sa.Column(
63
+ "asset_disclosure_include_types",
64
+ postgresql.ARRAY(sa.String()),
65
+ nullable=True,
66
+ ),
67
+ )
68
+ # ### end Alembic commands ###
69
+
70
+
71
+ def downgrade():
72
+ # ### commands auto generated by Alembic - please adjust! ###
73
+ op.drop_column("privacyexperienceconfighistory", "asset_disclosure_include_types")
74
+ op.drop_column("privacyexperienceconfighistory", "allow_vendor_asset_disclosure")
75
+ op.drop_column("privacyexperienceconfig", "allow_vendor_asset_disclosure")
76
+ op.drop_column("privacyexperienceconfig", "asset_disclosure_include_types")
77
+ op.drop_column("experienceconfigtemplate", "allow_vendor_asset_disclosure")
78
+ op.drop_column("experienceconfigtemplate", "asset_disclosure_include_types")
79
+ # ### end Alembic commands ###
@@ -0,0 +1,125 @@
1
+ """create digest conditional dependencies
2
+
3
+ Revision ID: 918aefc950c9
4
+ Revises: e2cda8d6abc3
5
+ Create Date: 2025-09-18 21:04:23.620675
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 = "918aefc950c9"
15
+ down_revision = "e2cda8d6abc3"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade():
21
+
22
+ op.create_table(
23
+ "digest_condition",
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("id", sa.String(length=255), nullable=False),
37
+ sa.Column("digest_config_id", sa.String(length=255), nullable=False),
38
+ sa.Column("parent_id", sa.String(length=255), nullable=True),
39
+ sa.Column("digest_condition_type", sa.String(), nullable=False),
40
+ sa.Column("condition_type", sa.String(), nullable=False),
41
+ sa.Column("field_address", sa.String(length=255), nullable=True),
42
+ sa.Column("operator", sa.String(), nullable=True),
43
+ sa.Column("value", postgresql.JSONB(astext_type=sa.Text()), nullable=True),
44
+ sa.Column("logical_operator", sa.String(), nullable=True),
45
+ sa.Column("sort_order", sa.Integer(), nullable=False),
46
+ sa.ForeignKeyConstraint(
47
+ ["digest_config_id"], ["digest_config.id"], ondelete="CASCADE"
48
+ ),
49
+ sa.ForeignKeyConstraint(
50
+ ["parent_id"], ["digest_condition.id"], ondelete="CASCADE"
51
+ ),
52
+ sa.PrimaryKeyConstraint("id"),
53
+ )
54
+
55
+ op.create_index(
56
+ "ix_digest_condition_condition_type",
57
+ "digest_condition",
58
+ ["condition_type"],
59
+ unique=False,
60
+ )
61
+ op.create_index(
62
+ "ix_digest_condition_digest_condition_type",
63
+ "digest_condition",
64
+ ["digest_condition_type"],
65
+ unique=False,
66
+ )
67
+ op.create_index(
68
+ "ix_digest_condition_digest_config_id",
69
+ "digest_condition",
70
+ ["digest_config_id"],
71
+ unique=False,
72
+ )
73
+ op.create_index(
74
+ "ix_digest_condition_parent_id",
75
+ "digest_condition",
76
+ ["parent_id"],
77
+ unique=False,
78
+ )
79
+ op.create_index(
80
+ "ix_digest_condition_sort_order",
81
+ "digest_condition",
82
+ ["sort_order"],
83
+ unique=False,
84
+ )
85
+
86
+ # Unique constraint to ensure only one root condition per digest_condition_type per digest_config
87
+ op.create_index(
88
+ "ix_digest_condition_unique_root_per_type",
89
+ "digest_condition",
90
+ ["digest_config_id", "digest_condition_type"],
91
+ unique=True,
92
+ postgresql_where=sa.text("parent_id IS NULL"),
93
+ )
94
+ # ### end Alembic commands ###
95
+
96
+
97
+ def downgrade():
98
+
99
+ op.drop_index(
100
+ "ix_digest_condition_unique_root_per_type",
101
+ table_name="digest_condition",
102
+ )
103
+ op.drop_index(
104
+ "ix_digest_condition_sort_order",
105
+ table_name="digest_condition",
106
+ )
107
+ op.drop_index(
108
+ "ix_digest_condition_parent_id",
109
+ table_name="digest_condition",
110
+ )
111
+ op.drop_index(
112
+ "ix_digest_condition_digest_config_id",
113
+ table_name="digest_condition",
114
+ )
115
+ op.drop_index(
116
+ "ix_digest_condition_digest_condition_type",
117
+ table_name="digest_condition",
118
+ )
119
+ op.drop_index(
120
+ "ix_digest_condition_condition_type",
121
+ table_name="digest_condition",
122
+ )
123
+
124
+ op.drop_table("digest_condition")
125
+ # ### end Alembic commands ###
@@ -0,0 +1,64 @@
1
+ """Update user_assigned_data_uses so it's nullable and defaults to none
2
+
3
+ Revision ID: 9caf76161e55
4
+ Revises: 918aefc950c9
5
+ Create Date: 2025-09-29 14:14:37.837616
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 = "9caf76161e55"
15
+ down_revision = "918aefc950c9"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade():
21
+ # ### commands auto generated by Alembic - please adjust! ###
22
+ op.alter_column(
23
+ "stagedresource",
24
+ "user_assigned_data_uses",
25
+ existing_type=postgresql.ARRAY(sa.VARCHAR()),
26
+ nullable=True,
27
+ server_default=None,
28
+ default=None,
29
+ existing_server_default=sa.text("'{}'::character varying[]"),
30
+ )
31
+
32
+ # Update web monitor resources with empty array to null
33
+ op.execute(
34
+ """
35
+ UPDATE stagedresource
36
+ SET user_assigned_data_uses = NULL
37
+ WHERE
38
+ resource_type IN ('Cookie', 'Browser request', 'Image', 'iFrame', 'Javascript tag')
39
+ AND user_assigned_data_uses = '{}'
40
+ """
41
+ )
42
+ # ### end Alembic commands ###
43
+
44
+
45
+ def downgrade():
46
+ # ### commands auto generated by Alembic - please adjust! ###
47
+ op.execute(
48
+ """
49
+ UPDATE stagedresource
50
+ SET user_assigned_data_uses = '{}'
51
+ WHERE user_assigned_data_uses IS NULL
52
+ """
53
+ )
54
+
55
+ op.alter_column(
56
+ "stagedresource",
57
+ "user_assigned_data_uses",
58
+ existing_type=postgresql.ARRAY(sa.VARCHAR()),
59
+ nullable=False,
60
+ server_default=sa.text("'{}'::character varying[]"),
61
+ existing_server_default=None,
62
+ default=dict,
63
+ )
64
+ # ### end Alembic commands ###
@@ -0,0 +1,28 @@
1
+ """adds optional duration field to assets
2
+
3
+ Revision ID: f108fa05c579
4
+ Revises: 9caf76161e55
5
+ Create Date: 2025-08-22 12:47:31.374493
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "f108fa05c579"
14
+ down_revision = "9caf76161e55"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade():
20
+ # ### commands auto generated by Alembic - please adjust! ###
21
+ op.add_column("asset", sa.Column("duration", sa.String(), nullable=True))
22
+ # ### end Alembic commands ###
23
+
24
+
25
+ def downgrade():
26
+ # ### commands auto generated by Alembic - please adjust! ###
27
+ op.drop_column("asset", "duration")
28
+ # ### end Alembic commands ###
@@ -54,6 +54,7 @@ from fides.common.api.v1.urn_registry import DATASETS_CLEAN, V1_URL_PREFIX
54
54
  from fides.service.dataset.dataset_service import (
55
55
  DatasetNotFoundException,
56
56
  DatasetService,
57
+ LinkedDatasetException,
57
58
  )
58
59
  from fides.service.taxonomy.taxonomy_service import TaxonomyService
59
60
 
@@ -126,7 +127,7 @@ async def update_dataset(
126
127
  except DatasetNotFoundException as e:
127
128
  raise HTTPException(
128
129
  status_code=HTTP_404_NOT_FOUND,
129
- detail={"message": str(e)},
130
+ detail=str(e),
130
131
  )
131
132
 
132
133
 
@@ -248,7 +249,7 @@ async def get_dataset(
248
249
  except DatasetNotFoundException as e:
249
250
  raise HTTPException(
250
251
  status_code=HTTP_404_NOT_FOUND,
251
- detail={"message": str(e)},
252
+ detail=str(e),
252
253
  )
253
254
 
254
255
 
@@ -275,7 +276,12 @@ async def delete_dataset(
275
276
  except DatasetNotFoundException as e:
276
277
  raise HTTPException(
277
278
  status_code=HTTP_404_NOT_FOUND,
278
- detail={"message": str(e)},
279
+ detail=str(e),
280
+ )
281
+ except LinkedDatasetException as e:
282
+ raise HTTPException(
283
+ status_code=HTTP_400_BAD_REQUEST,
284
+ detail=str(e),
279
285
  )
280
286
 
281
287
 
fides/api/db/base.py CHANGED
@@ -23,7 +23,7 @@ from fides.api.models.detection_discovery.monitor_task import (
23
23
  MonitorTaskExecutionLog,
24
24
  )
25
25
  from fides.api.models.detection_discovery.web_monitor import WebMonitorGroupJob
26
- from fides.api.models.digest import DigestConfig
26
+ from fides.api.models.digest import DigestCondition, DigestConfig
27
27
  from fides.api.models.event_audit import EventAudit
28
28
  from fides.api.models.experience_notices import ExperienceNotices
29
29
  from fides.api.models.fides_cloud import FidesCloud
fides/api/models/asset.py CHANGED
@@ -17,7 +17,7 @@ from sqlalchemy import (
17
17
  from sqlalchemy.dialects.postgresql import JSONB
18
18
  from sqlalchemy.ext.asyncio import AsyncSession
19
19
  from sqlalchemy.ext.mutable import MutableDict
20
- from sqlalchemy.orm import relationship
20
+ from sqlalchemy.orm import relationship, selectinload
21
21
 
22
22
  from fides.api.db.base_class import Base
23
23
  from fides.api.db.util import EnumColumn
@@ -47,6 +47,7 @@ class Asset(Base):
47
47
  name = Column(String, index=True, nullable=False)
48
48
  asset_type = Column(String, index=True, nullable=False)
49
49
  domain = Column(String, index=True)
50
+ duration = Column(String, nullable=True)
50
51
  parent = Column(ARRAY(String), server_default="{}", nullable=False)
51
52
  parent_domain = Column(String)
52
53
  locations = Column(ARRAY(String), server_default="{}", nullable=False)
@@ -190,5 +191,17 @@ class Asset(Base):
190
191
  .where(System.fides_key == system_fides_key)
191
192
  )
192
193
 
194
+ # Explicitly eager load the `system` relationship to make this query's
195
+ # performance predictable and prevent N+1 issues.
196
+ query = query.options(selectinload(cls.system)) # type: ignore[attr-defined]
193
197
  result = await async_session.execute(query)
194
198
  return result.scalars().all()
199
+
200
+ # Expose related System attributes for API serialization convenience
201
+ @property
202
+ def system_name(self) -> Optional[str]:
203
+ return self.system.name if self.system else None
204
+
205
+ @property
206
+ def system_fides_key(self) -> Optional[str]:
207
+ return self.system.fides_key if self.system else None