ethyca-fides 2.58.0rc1__py2.py3-none-any.whl → 2.58.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.
Files changed (90) hide show
  1. {ethyca_fides-2.58.0rc1.dist-info → ethyca_fides-2.58.1b1.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.58.0rc1.dist-info → ethyca_fides-2.58.1b1.dist-info}/RECORD +90 -89
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/67d01c4e124e_add_reject_all_mechanism_to_privacy_.py +56 -0
  5. fides/api/db/base.py +1 -0
  6. fides/api/models/attachment.py +80 -11
  7. fides/api/models/comment.py +45 -15
  8. fides/api/models/privacy_experience.py +41 -0
  9. fides/api/models/privacy_request/privacy_request.py +23 -6
  10. fides/api/service/storage/s3.py +14 -1
  11. fides/ui-build/static/admin/404.html +1 -1
  12. fides/ui-build/static/admin/_next/static/chunks/{main-24f422f93845a596.js → main-090643377c8254e6.js} +1 -1
  13. fides/ui-build/static/admin/_next/static/chunks/{main-app-94a0711202e08b15.js → main-app-59156a9331ac7bce.js} +1 -1
  14. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  15. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  16. fides/ui-build/static/admin/add-systems.html +1 -1
  17. fides/ui-build/static/admin/ant-poc.html +1 -1
  18. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  19. fides/ui-build/static/admin/consent/configure.html +1 -1
  20. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  21. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  22. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  23. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  24. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  25. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  26. fides/ui-build/static/admin/consent/properties.html +1 -1
  27. fides/ui-build/static/admin/consent/reporting.html +1 -1
  28. fides/ui-build/static/admin/consent.html +1 -1
  29. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  30. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  31. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  32. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  33. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  34. fides/ui-build/static/admin/data-catalog.html +1 -1
  35. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  36. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  37. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  38. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  39. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  40. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  41. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  42. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  43. fides/ui-build/static/admin/datamap.html +1 -1
  44. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  45. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  46. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  47. fides/ui-build/static/admin/dataset/new.html +1 -1
  48. fides/ui-build/static/admin/dataset.html +1 -1
  49. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  50. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  51. fides/ui-build/static/admin/datastore-connection.html +1 -1
  52. fides/ui-build/static/admin/index.html +1 -1
  53. fides/ui-build/static/admin/integrations/[id].html +1 -1
  54. fides/ui-build/static/admin/integrations.html +1 -1
  55. fides/ui-build/static/admin/login/[provider].html +1 -1
  56. fides/ui-build/static/admin/login.html +1 -1
  57. fides/ui-build/static/admin/messaging/[id].html +1 -1
  58. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  59. fides/ui-build/static/admin/messaging.html +1 -1
  60. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  61. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  62. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  63. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  64. fides/ui-build/static/admin/privacy-requests.html +1 -1
  65. fides/ui-build/static/admin/properties/[id].html +1 -1
  66. fides/ui-build/static/admin/properties/add-property.html +1 -1
  67. fides/ui-build/static/admin/properties.html +1 -1
  68. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  69. fides/ui-build/static/admin/settings/about.html +1 -1
  70. fides/ui-build/static/admin/settings/consent.html +1 -1
  71. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  72. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  73. fides/ui-build/static/admin/settings/domains.html +1 -1
  74. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  75. fides/ui-build/static/admin/settings/locations.html +1 -1
  76. fides/ui-build/static/admin/settings/organization.html +1 -1
  77. fides/ui-build/static/admin/settings/regulations.html +1 -1
  78. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  79. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  80. fides/ui-build/static/admin/systems.html +1 -1
  81. fides/ui-build/static/admin/taxonomy.html +1 -1
  82. fides/ui-build/static/admin/user-management/new.html +1 -1
  83. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  84. fides/ui-build/static/admin/user-management.html +1 -1
  85. {ethyca_fides-2.58.0rc1.dist-info → ethyca_fides-2.58.1b1.dist-info}/LICENSE +0 -0
  86. {ethyca_fides-2.58.0rc1.dist-info → ethyca_fides-2.58.1b1.dist-info}/WHEEL +0 -0
  87. {ethyca_fides-2.58.0rc1.dist-info → ethyca_fides-2.58.1b1.dist-info}/entry_points.txt +0 -0
  88. {ethyca_fides-2.58.0rc1.dist-info → ethyca_fides-2.58.1b1.dist-info}/top_level.txt +0 -0
  89. /fides/ui-build/static/admin/_next/static/{DpiXCv-bQD-zlO6wF2wgY → RyPMNiUshVruI8xu8t8kI}/_buildManifest.js +0 -0
  90. /fides/ui-build/static/admin/_next/static/{DpiXCv-bQD-zlO6wF2wgY → RyPMNiUshVruI8xu8t8kI}/_ssgManifest.js +0 -0
@@ -48,6 +48,20 @@ class Layer1ButtonOption(Enum):
48
48
  OPT_IN_OPT_OUT = "opt_in_opt_out"
49
49
 
50
50
 
51
+ class RejectAllMechanism(Enum):
52
+ """
53
+ Reject all mechanism options - not formalized in the db.
54
+ Used to configure the behavior of the reject all button in TCF experiences
55
+ """
56
+
57
+ # Reject both consent and legitimate interest preferences (all purposes, special features, vendors)
58
+ # This is the default behavior
59
+ REJECT_ALL = "reject_all"
60
+ # Reject only consent preferences (all purposes, special features, vendors).
61
+ # Do not reject any legitimate interest preferences.
62
+ REJECT_CONSENT_ONLY = "reject_consent_only"
63
+
64
+
51
65
  # Fides JS UX Types - there should only be one of these defined per region
52
66
  FidesJSUXTypes: List[ComponentType] = [
53
67
  ComponentType.banner_and_modal,
@@ -179,6 +193,10 @@ class PrivacyExperienceConfig(PrivacyExperienceConfigBase, Base):
179
193
  The Privacy Experience Configuration model that stores shared configuration for Privacy Experiences.
180
194
 
181
195
  - Translations, Notices, and Regions (via Privacy Experiences) are linked to this resource.
196
+
197
+ If you're adding a new PrivacyExperienceConfig, make sure to use the `create` method since it has
198
+ custom logic that ensures other resources are created/updated as needed, as well as setting the
199
+ expected values for some fields in the experience config itself.
182
200
  """
183
201
 
184
202
  allow_language_selection = Column(
@@ -203,6 +221,13 @@ class PrivacyExperienceConfig(PrivacyExperienceConfigBase, Base):
203
221
  String, ForeignKey(ExperienceConfigTemplate.id_field_path)
204
222
  ) # The template from which this config was created if applicable
205
223
 
224
+ # Mechanism to use when the reject all button is clicked in a TCF experience
225
+ # Nullable because this is not applicable for other experience types
226
+ reject_all_mechanism = Column(
227
+ EnumColumn(RejectAllMechanism),
228
+ nullable=True,
229
+ )
230
+
206
231
  # Relationships
207
232
  experiences = relationship(
208
233
  "PrivacyExperience",
@@ -304,6 +329,15 @@ class PrivacyExperienceConfig(PrivacyExperienceConfigBase, Base):
304
329
  # Link Properties to this Privacy Experience config via the PrivacyExperienceConfigProperty table
305
330
  link_properties_to_experience_config(db, properties, experience_config)
306
331
 
332
+ # If the reject all mechanism is not set and the experience config is a TCF experience,
333
+ # set the reject all mechanism to REJECT_ALL
334
+ if (
335
+ experience_config.component == ComponentType.tcf_overlay
336
+ and experience_config.reject_all_mechanism is None
337
+ ):
338
+ experience_config.reject_all_mechanism = RejectAllMechanism.REJECT_ALL # type: ignore
339
+ experience_config.save(db)
340
+
307
341
  return experience_config
308
342
 
309
343
  def update(self, db: Session, *, data: dict[str, Any]) -> PrivacyExperienceConfig:
@@ -507,6 +541,13 @@ class PrivacyExperienceConfigHistory(
507
541
  index=True,
508
542
  ) # If a translation is deleted, this is set to null, but the overall record remains in the database for reporting purposes
509
543
 
544
+ # Mechanism to use when the reject all button is clicked in a TCF experience
545
+ # Nullable because this is not applicable for other experience types
546
+ reject_all_mechanism = Column(
547
+ EnumColumn(RejectAllMechanism),
548
+ nullable=True,
549
+ )
550
+
510
551
  version = Column(Float, nullable=False, default=1.0)
511
552
 
512
553
 
@@ -39,10 +39,14 @@ from fides.api.graph.config import (
39
39
  CollectionAddress,
40
40
  )
41
41
  from fides.api.migrations.hash_migration_mixin import HashMigrationMixin
42
- from fides.api.models.attachment import Attachment, AttachmentReference
42
+ from fides.api.models.attachment import (
43
+ Attachment,
44
+ AttachmentReference,
45
+ AttachmentReferenceType,
46
+ )
43
47
  from fides.api.models.audit_log import AuditLog
44
48
  from fides.api.models.client import ClientDetail
45
- from fides.api.models.comment import Comment, CommentReference
49
+ from fides.api.models.comment import Comment, CommentReference, CommentReferenceType
46
50
  from fides.api.models.fides_user import FidesUser
47
51
  from fides.api.models.manual_webhook import AccessManualWebhook
48
52
  from fides.api.models.policy import (
@@ -169,18 +173,25 @@ class PrivacyRequest(
169
173
  backref="privacy_requests",
170
174
  )
171
175
  attachments = relationship(
172
- Attachment,
176
+ "Attachment",
173
177
  secondary="attachment_reference",
174
- primaryjoin="PrivacyRequest.id == AttachmentReference.reference_id",
178
+ primaryjoin="and_(PrivacyRequest.id == AttachmentReference.reference_id, "
179
+ "AttachmentReference.reference_type == 'privacy_request')",
175
180
  secondaryjoin="Attachment.id == AttachmentReference.attachment_id",
176
181
  order_by="Attachment.created_at",
182
+ viewonly=True,
183
+ uselist=True,
177
184
  )
185
+
178
186
  comments = relationship(
179
- Comment,
187
+ "Comment",
180
188
  secondary="comment_reference",
181
- primaryjoin="PrivacyRequest.id == CommentReference.reference_id",
189
+ primaryjoin="and_(PrivacyRequest.id == CommentReference.reference_id, "
190
+ "CommentReference.reference_type == 'privacy_request')",
182
191
  secondaryjoin="Comment.id == CommentReference.comment_id",
183
192
  order_by="Comment.created_at",
193
+ viewonly=True,
194
+ uselist=True,
184
195
  )
185
196
  property_id = Column(String, nullable=True)
186
197
 
@@ -323,6 +334,12 @@ class PrivacyRequest(
323
334
  deleting this object from the database
324
335
  """
325
336
  self.clear_cached_values()
337
+ Attachment.delete_attachments_for_reference_and_type(
338
+ db, self.id, AttachmentReferenceType.privacy_request
339
+ )
340
+ Comment.delete_comments_for_reference_and_type(
341
+ db, self.id, CommentReferenceType.privacy_request
342
+ )
326
343
 
327
344
  for provided_identity in self.provided_identities: # type: ignore[attr-defined]
328
345
  provided_identity.delete(db=db)
@@ -64,7 +64,7 @@ def generic_upload_to_s3( # pylint: disable=R0913
64
64
  size_threshold: int = LARGE_FILE_THRESHOLD, # 5 MB threshold
65
65
  ) -> Optional[AnyHttpUrlString]:
66
66
  """
67
- Uploads arbitrary data to S3 returned from an access request.
67
+ Uploads file like objects to S3.
68
68
  Handles both small and large uploads.
69
69
 
70
70
  :param storage_secrets: S3 storage secrets
@@ -75,6 +75,19 @@ def generic_upload_to_s3( # pylint: disable=R0913
75
75
  """
76
76
  logger.info("Starting S3 Upload of {}", file_key)
77
77
 
78
+ # Validate that the document is a file-like object
79
+ if not hasattr(document, "read") or not hasattr(document, "seek"):
80
+ raise TypeError(
81
+ f"The 'document' parameter must be a file-like object supporting 'read' and 'seek'. "
82
+ f"Received: {type(document)}"
83
+ )
84
+
85
+ # Ensure the file pointer is at the beginning
86
+ try:
87
+ document.seek(0)
88
+ except Exception as e:
89
+ raise ValueError(f"Failed to reset file pointer for document: {e}")
90
+
78
91
  s3_client = maybe_get_s3_client(auth_method, storage_secrets)
79
92
 
80
93
  # Define a transfer configuration for multipart uploads
@@ -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/113d823fe71f6af0.css" as="style"/><link rel="stylesheet" href="/_next/static/css/113d823fe71f6af0.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-2c7ccac5843c4d8e.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-24f422f93845a596.js" defer=""></script><script src="/_next/static/chunks/pages/_app-073217715167f9a8.js" defer=""></script><script src="/_next/static/chunks/pages/404-b202c0d8f6fc75c3.js" defer=""></script><script src="/_next/static/DpiXCv-bQD-zlO6wF2wgY/_buildManifest.js" defer=""></script><script src="/_next/static/DpiXCv-bQD-zlO6wF2wgY/_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":"DpiXCv-bQD-zlO6wF2wgY","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/113d823fe71f6af0.css" as="style"/><link rel="stylesheet" href="/_next/static/css/113d823fe71f6af0.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-2c7ccac5843c4d8e.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-073217715167f9a8.js" defer=""></script><script src="/_next/static/chunks/pages/404-b202c0d8f6fc75c3.js" defer=""></script><script src="/_next/static/RyPMNiUshVruI8xu8t8kI/_buildManifest.js" defer=""></script><script src="/_next/static/RyPMNiUshVruI8xu8t8kI/_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":"RyPMNiUshVruI8xu8t8kI","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>