diff --git a/.fides/db_dataset.yml b/.fides/db_dataset.yml index 573599401e3..5659af9d491 100644 --- a/.fides/db_dataset.yml +++ b/.fides/db_dataset.yml @@ -697,6 +697,9 @@ dataset: - name: data_categories data_categories: - system.operations + - name: data_purposes + data_categories: + - system.operations - name: description data_categories: - system.operations diff --git a/changelog/7674-dataset-data-purposes.yaml b/changelog/7674-dataset-data-purposes.yaml new file mode 100644 index 00000000000..430a22e04ff --- /dev/null +++ b/changelog/7674-dataset-data-purposes.yaml @@ -0,0 +1,4 @@ +type: Changed +description: Updated fideslang to 3.1.3 to add `data_purposes` support at dataset, collection, field, and sub-field levels +pr: 7674 +labels: [] diff --git a/pyproject.toml b/pyproject.toml index 2b73ddf4594..7497dfd4a7e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,7 +55,7 @@ dependencies = [ "fastapi-cli~=0.0.16", "fastapi-pagination[sqlalchemy]==0.15.0", "fastapi[all]==0.123.3", - "fideslang==3.1.4a1", + "fideslang==3.1.3", "firebase-admin==5.3.0", "flower==2.0.1", "google-auth==2.48.0", diff --git a/src/fides/api/alembic/migrations/versions/xx_2026_03_25_1500_c7e3a9b1d4f2_add_data_purposes_to_datasets.py b/src/fides/api/alembic/migrations/versions/xx_2026_03_25_1500_c7e3a9b1d4f2_add_data_purposes_to_datasets.py new file mode 100644 index 00000000000..77b8bd3d6ed --- /dev/null +++ b/src/fides/api/alembic/migrations/versions/xx_2026_03_25_1500_c7e3a9b1d4f2_add_data_purposes_to_datasets.py @@ -0,0 +1,27 @@ +"""add data_purposes column to ctl_datasets + +Revision ID: c7e3a9b1d4f2 +Revises: 25ffa8bf6a95 +Create Date: 2026-03-25 15:00:00.000000 + +""" + +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = "c7e3a9b1d4f2" +down_revision = "25ffa8bf6a95" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.add_column( + "ctl_datasets", + sa.Column("data_purposes", sa.ARRAY(sa.String()), nullable=True), + ) + + +def downgrade() -> None: + op.drop_column("ctl_datasets", "data_purposes") diff --git a/src/fides/api/models/sql_models.py b/src/fides/api/models/sql_models.py index 316a845dddd..bc7e48eca0e 100644 --- a/src/fides/api/models/sql_models.py +++ b/src/fides/api/models/sql_models.py @@ -406,6 +406,7 @@ class Dataset(Base, FidesBase): meta = Column(JSON) data_categories = Column(ARRAY(String)) + data_purposes = Column(ARRAY(String)) collections = Column(JSON) fides_meta = Column(JSON) diff --git a/src/fides/service/connection/merge_configs_util.py b/src/fides/service/connection/merge_configs_util.py index 0649c2f4ae0..7815c5304b5 100644 --- a/src/fides/service/connection/merge_configs_util.py +++ b/src/fides/service/connection/merge_configs_util.py @@ -328,14 +328,17 @@ def merge_datasets( """ stored_dataset_copy = copy.deepcopy(stored_dataset) upcoming_dataset_copy = copy.deepcopy(upcoming_dataset) + customer_dataset_copy = copy.deepcopy(customer_dataset) normalized_stored_dataset = normalize_dataset(stored_dataset_copy, "stored") normalized_upcoming_dataset = normalize_dataset(upcoming_dataset_copy, "upcoming") + normalized_customer_dataset = normalize_dataset(customer_dataset_copy, "customer") if normalized_stored_dataset is None or normalized_upcoming_dataset is None: return upcoming_dataset stored_dataset_copy = normalized_stored_dataset upcoming_dataset_copy = normalized_upcoming_dataset + customer_dataset = normalized_customer_dataset or customer_dataset # convert dataset to yaml string and then replace the instance key placeholder wrapped_dataset = {"dataset": [stored_dataset_copy]} diff --git a/uv.lock b/uv.lock index e004c27b013..f192dae6af3 100644 --- a/uv.lock +++ b/uv.lock @@ -1102,7 +1102,7 @@ requires-dist = [ { name = "fastapi", extras = ["all"], specifier = "==0.123.3" }, { name = "fastapi-cli", specifier = "~=0.0.16" }, { name = "fastapi-pagination", extras = ["sqlalchemy"], specifier = "==0.15.0" }, - { name = "fideslang", specifier = "==3.1.4a1" }, + { name = "fideslang", specifier = "==3.1.3" }, { name = "filelock", specifier = "~=3.20.0" }, { name = "firebase-admin", specifier = "==5.3.0" }, { name = "flower", specifier = "==2.0.1" }, @@ -1400,16 +1400,16 @@ wheels = [ [[package]] name = "fideslang" -version = "3.1.4a1" +version = "3.1.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "pydantic" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e6/25/f40b2357daf0ebefa234b301a0c33154ea3f76030b82dffa5b39f5e44067/fideslang-3.1.4a1.tar.gz", hash = "sha256:d03f07f4a83fa3ef733c17d2e4891611beec9598288a17e2371403240b5412c4", size = 201457, upload-time = "2025-12-18T02:01:27.318Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/b3/7f7867a074975af22b4f48f19fac52ef1eda362cef74ea00285bc73324d2/fideslang-3.1.3.tar.gz", hash = "sha256:e1a1b377da21b7521df3aeacaadd0c19c3f6367d65a5f97291f9aefcf498fed2", size = 201399, upload-time = "2026-03-25T17:36:28.501Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/12/9563420acabd163519bac3a735ea9776ed2c0e87463742c5a3626045509f/fideslang-3.1.4a1-py3-none-any.whl", hash = "sha256:0f82282593a6ebcef0965e66b9296fbf89a42b2177e77a8252ee755f18013813", size = 47723, upload-time = "2025-12-18T02:01:25.959Z" }, + { url = "https://files.pythonhosted.org/packages/ee/3a/8882bada1bf5c65909e5db43bdebcf57db9bded8677a4129b4a1fe382a7a/fideslang-3.1.3-py3-none-any.whl", hash = "sha256:6741f88b05c924beb103a1a2cd742f64749145f5fe706dcd2b150fafa9cf6365", size = 47592, upload-time = "2026-03-25T17:36:27.121Z" }, ] [[package]]