diff --git a/CHANGELOG.md b/CHANGELOG.md index 6311552560..23cc59ec1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ The types of changes are: ## [Unreleased](https://github.com/ethyca/fides/compare/2.43.0...main) +### Fixed +- Ignore `404` errors on Oracle Responsys deletions [#5203](https://github.com/ethyca/fides/pull/5203) ## [2.43.0](https://github.com/ethyca/fides/compare/2.42.1...2.43.0) @@ -29,6 +31,7 @@ The types of changes are: - Add function to return list of StagedResource objs according to list of URNs [#5192](https://github.com/ethyca/fides/pull/5192) - Add DSR Support for ScyllaDB [#5140](https://github.com/ethyca/fides/pull/5140) - Added support for nested fields in BigQuery in D&D result views [#5175](https://github.com/ethyca/fides/pull/5175) +- Added support for Vendor Count in Fides-JS overlay descriptions [#5210](https://github.com/ethyca/fides/pull/5210) ### Fixed - Fixed the OAuth2 configuration for the Snap integration [#5158](https://github.com/ethyca/fides/pull/5158) @@ -45,6 +48,7 @@ The types of changes are: - Model changes to support consent signals (Fidesplus) [#5190](https://github.com/ethyca/fides/pull/5190) - Updated Datasets page with new UI for better usability and consistency with Detection and Discovery UI [#5191](https://github.com/ethyca/fides/pull/5191) - Updated the Yotpo Reviews integration to use email and phone number identities instead of external ID [#5169](https://github.com/ethyca/fides/pull/5169) +- Update TCF banner button layout and styles [#5204](https://github.com/ethyca/fides/pull/5204) ### Developer Experience diff --git a/README.md b/README.md index 1b0a769f69..734d23a46c 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ In order to get started quickly with Fides, a sample project is bundled within t > [!TIP] > We highly recommend setting up a Python virtual environment such as `venv` to install Fides into. For example: -> +> > ```sh > mkdir ~/fides > cd ~/fides @@ -131,7 +131,7 @@ Fides is created and sponsored by Ethyca: a developer tools company building the By default, running `pip install ethyca-fides` locally will not install the optional Python libraries needed for Microsoft SQL Server, since these rely on additional system dependencies (`freetds`)! However, if you *do* want to connect to MSSQL, you have two options: 1. Use our pre-built Docker images which install these optional dependencies automatically: [`ethyca/fides`](https://hub.docker.com/r/ethyca/fides). See our [Deployment Guide](https://ethyca.com/docs/dev-docs/configuration/deployment) for more! -2. Install the required dependencies on your local development machine and run `pip install ethyca-fides[all]` to include "all" the optional libraries. Keep reading to learn more about this! +2. Install the required dependencies on your local development machine and run `pip install "ethyca-fides[all]"` to include "all" the optional libraries. Keep reading to learn more about this! For local development setup on macOS, follow these steps: 1. Install the required development libraries from Homebrew: diff --git a/clients/fides-js/src/components/ConsentBanner.tsx b/clients/fides-js/src/components/ConsentBanner.tsx index 65821f88d3..dfdb9a9d54 100644 --- a/clients/fides-js/src/components/ConsentBanner.tsx +++ b/clients/fides-js/src/components/ConsentBanner.tsx @@ -3,7 +3,6 @@ import { useEffect } from "preact/hooks"; import { getConsentContext } from "../lib/consent-context"; import { GpcStatus } from "../lib/consent-types"; -import { useMediaQuery } from "../lib/hooks/useMediaQuery"; import { I18n, messageExists } from "../lib/i18n"; import CloseButton from "./CloseButton"; import ExperienceDescription from "./ExperienceDescription"; @@ -38,7 +37,6 @@ const ConsentBanner: FunctionComponent = ({ className, isEmbedded, }) => { - const isMobile = useMediaQuery("(max-width: 768px)"); const showGpcBadge = getConsentContext().globalPrivacyControl; useEffect(() => { @@ -122,9 +120,8 @@ const ConsentBanner: FunctionComponent = ({ {children} - {!isMobile && renderButtonGroup()} - {isMobile && renderButtonGroup()} + {renderButtonGroup()} diff --git a/clients/fides-js/src/components/ConsentButtons.tsx b/clients/fides-js/src/components/ConsentButtons.tsx index 3908e5cb9e..9d0774ebd3 100644 --- a/clients/fides-js/src/components/ConsentButtons.tsx +++ b/clients/fides-js/src/components/ConsentButtons.tsx @@ -55,6 +55,14 @@ export const ConsentButtons = ({ {!!renderFirstButton && renderFirstButton()} {!hideOptInOut && ( + {isTCF && !!onManagePreferencesClick && ( + + {parts[0]} + {!onVendorPageClick && vendorCount && ( + {vendorCount} + )} + {onVendorPageClick && vendorCount && ( + + )} + {parts[1]} ); } diff --git a/clients/fides-js/src/components/fides.css b/clients/fides-js/src/components/fides.css index a6865e8ccd..319fc0998b 100644 --- a/clients/fides-js/src/components/fides.css +++ b/clients/fides-js/src/components/fides.css @@ -63,7 +63,6 @@ --fides-overlay-font-size-title: var(--16px); --fides-overlay-font-size-buttons: var(--14px); --fides-overlay-padding: 24px; - --fides-overlay-padding-tcf: 40px; --fides-overlay-button-border-radius: 6px; --fides-overlay-button-padding: 8px 16px; --fides-overlay-link-v-padding: 4px; @@ -215,16 +214,6 @@ div#fides-banner-inner-description { grid-row: 1; } -div#fides-tcf-banner-inner { - grid-column: 2; - grid-row: 1 / 3; - height: 0; - min-height: 100%; - margin-top: 40px; - overflow-y: auto; - scrollbar-gutter: stable; -} - div#fides-banner-heading { display: flex; margin-right: 13px; @@ -468,13 +457,6 @@ div#fides-consent-content .fides-modal-description { gap: 36px; } -.fides-tcf-banner-container - div#fides-banner - div#fides-banner-inner - div#fides-button-group { - gap: 12px; -} - .fides-no-scroll { overflow-y: hidden; } @@ -527,12 +509,6 @@ div#fides-banner .fides-close-button { margin-bottom: 16px; } -div#fides-banner-inner .fides-privacy-policy { - display: block; - text-align: center; - color: var(--fides-overlay-primary-color); -} - .fides-privacy-policy { display: block; text-align: center; @@ -540,7 +516,7 @@ div#fides-banner-inner .fides-privacy-policy { font-family: var(--fides-overlay-font-family); } -div#fides-banner-inner .fides-privacy-policy, +.fides-privacy-policy, button.fides-banner-button.fides-banner-button-tertiary, div.fides-i18n-pseudo-button { margin: 0; @@ -715,10 +691,6 @@ div#fides-overlay-wrapper .fides-toggle .fides-toggle-display { transform: translateY(2px) rotate(-45deg); } -#fides-tcf-banner-inner .fides-disclosure-visible { - padding: 12px 12px; -} - .fides-notice-toggle .fides-disclosure-visible { display: flex; flex-direction: column; @@ -904,43 +876,6 @@ div#fides-overlay-wrapper .fides-toggle .fides-toggle-display { justify-content: space-between; } -/* TCF toggles */ -.fides-tcf-toggle-content { - margin-right: 60px; - font-size: var(--fides-overlay-font-size-body-small); - font-weight: 400; -} - -.fides-tcf-purpose-vendor-title { - font-weight: 600; - display: flex; - justify-content: space-between; -} - -.fides-tcf-illustration { - font-size: var(--fides-overlay-font-size-body-small); - padding: 13px; - padding-right: 60px; - border-radius: var(--fides-overlay-component-border-radius); -} - -.fides-tcf-purpose-vendor { - padding: 13px; - border-radius: var(--fides-overlay-component-border-radius); -} - -.fides-tcf-purpose-vendor-list { - font-weight: 400; - padding-left: 0; - list-style: none; - margin-left: 0; - margin-bottom: 0; -} - -.fides-tcf-vendor-toggles { - display: flex; -} - /* Vendor purpose table */ .fides-vendor-details-table { width: 100%; @@ -978,25 +913,6 @@ div#fides-overlay-wrapper .fides-toggle .fides-toggle-display { margin-right: 16px; } -/* Vendor info (initial layer) */ -.fides-vendor-info-banner { - display: flex; - flex-direction: row; - padding: 16px 12px; - border-radius: var(--fides-overlay-component-border-radius); - justify-content: space-around; - position: sticky; - top: 0; - gap: 30px; - margin-bottom: 16px; -} - -.fides-vendor-info-label { - font-weight: 600; - font-size: var(--fides-overlay-font-size-body-small); - margin-right: 4px; -} - /* Info box */ .fides-info-box { background-color: var(--fides-overlay-hover-color); @@ -1017,124 +933,6 @@ div#fides-overlay-wrapper .fides-toggle .fides-toggle-display { display: none; } -/* Responsive banner */ -@media screen and (min-width: 768px) { - div#fides-banner { - width: 75%; - border-radius: var(--fides-overlay-component-border-radius); - border: 1px solid var(--fides-overlay-primary-color); - } - - div#fides-banner-container.fides-banner-bottom { - bottom: var(--fides-overlay-banner-offset); - } -} - -@media only screen and (min-width: 1280px) { - div#fides-banner { - width: 60%; - border: 1px solid var(--fides-overlay-primary-color); - } -} - -@media screen and (max-width: 992px) { - .fides-vendor-info-banner { - flex-direction: column; - gap: 16px; - } -} - -@media screen and (max-width: 768px) { - div#fides-banner { - padding: 24px; - width: 100%; - } - - div#fides-banner-description { - margin-bottom: 0px; - } - - div#fides-banner-inner div#fides-button-group { - flex-direction: column; - align-items: flex-start; - gap: 12px; - padding-top: 24px; - } - - .fides-banner-button-group { - flex-direction: column; - width: 100%; - } - - button.fides-banner-button { - margin: 0px; - width: 100%; - } - - div#fides-tcf-banner-inner { - margin-top: 24px; - overflow-y: revert; - min-height: revert; - } - - div#fides-banner-inner-container { - display: flex; - flex-direction: column; - max-height: 50vh; - overflow-y: auto; - scrollbar-gutter: stable; - } - - div#fides-privacy-policy-link { - order: 1; - width: 100%; - } - .fides-modal-footer { - max-width: 100%; - } - .fides-tcf-banner-container - div#fides-banner - div#fides-banner-inner - div#fides-button-group - .fides-banner-button-group { - padding-left: 0; - } - .fides-banner-secondary-actions { - gap: 12px; - } - - /* ordering needs to be specific for mobile to work well and - varies from the desktop ordering beyond simple `column-reverse` */ - .fides-banner-secondary-actions .fides-manage-preferences-button { - order: 0; - } - .fides-banner-secondary-actions #fides-privacy-policy-link { - order: 1; - } - .fides-banner-secondary-actions .fides-i18n-menu { - order: 2; - } -} -/* TCF should always be full width and not floating */ -.fides-tcf-banner-container { - bottom: 0 !important; -} -.fides-tcf-banner-container #fides-banner { - width: 100%; - border-radius: 0; - border-width: 1px 0 0 0; - padding: var(--fides-overlay-padding) var(--fides-overlay-padding-tcf) - var(--fides-overlay-padding-tcf) var(--fides-overlay-padding-tcf); -} -.fides-tcf-banner-container #fides-privacy-policy-link { - margin: auto; -} -@media screen and (max-width: 768px) { - .fides-tcf-banner-container #fides-banner { - padding: var(--fides-overlay-padding); - } -} - /* Paging */ .fides-paging-buttons { @@ -1185,17 +983,6 @@ div#fides-overlay-wrapper .fides-toggle .fides-toggle-display { ); } -@media screen and (max-width: 768px) { - .fides-banner-button-group.fides-button-group-i18n { - min-height: 68px; - } - .fides-i18n-menu { - position: absolute; - left: var(--fides-overlay-padding); - bottom: var(--fides-overlay-padding); - } -} - div.fides-i18n-pseudo-button { /* looks like a button, but for a11y reasons don't actually make it a button (not focusable) */ cursor: pointer; @@ -1276,3 +1063,96 @@ button.fides-banner-button.fides-menu-item[aria-pressed="true"]::before { button.fides-banner-button.fides-menu-item:not([aria-pressed="true"]):hover { background: var(--fides-overlay-secondary-button-background-hover-color); } + +/* Responsive banner */ +@media (min-width: 768px) { + div#fides-banner { + width: 75%; + border-radius: var(--fides-overlay-component-border-radius); + border: 1px solid var(--fides-overlay-primary-color); + } + + div#fides-banner-container.fides-banner-bottom { + bottom: var(--fides-overlay-banner-offset); + } +} + +@media (min-width: 1280px) { + div#fides-banner { + width: 60%; + } +} + +@media (max-width: 992px) { + .fides-vendor-info-banner { + flex-direction: column; + gap: 16px; + } +} + +@media (max-width: 768px) { + div#fides-banner { + padding: 24px; + width: 100%; + } + + div#fides-banner-description { + margin-bottom: 0px; + } + + div#fides-banner-inner div#fides-button-group { + flex-direction: column; + align-items: flex-start; + gap: 12px; + padding-top: 24px; + } + + .fides-banner-button-group { + flex-direction: column; + width: 100%; + } + + button.fides-banner-button { + margin: 0px; + width: 100%; + } + + div#fides-banner-inner-container { + display: flex; + flex-direction: column; + max-height: 50vh; + overflow-y: auto; + scrollbar-gutter: stable; + } + + div.fides-privacy-policy-link { + width: 100%; + } + .fides-modal-footer { + max-width: 100%; + } + .fides-banner-secondary-actions { + gap: 12px; + } + + /* ordering needs to be specific for mobile to work well and + varies from the desktop ordering beyond simple `column-reverse` */ + .fides-banner-secondary-actions .fides-manage-preferences-button { + order: 0; + } + .fides-banner-secondary-actions .fides-privacy-policy { + order: 1; + } + .fides-banner-secondary-actions .fides-i18n-menu { + order: 2; + } + + .fides-banner-button-group.fides-button-group-i18n { + min-height: 68px; + } + .fides-i18n-menu { + position: absolute; + left: var(--fides-overlay-padding); + bottom: var(--fides-overlay-padding); + } +} diff --git a/clients/fides-js/src/components/tcf/TcfOverlay.tsx b/clients/fides-js/src/components/tcf/TcfOverlay.tsx index 5277dc0da8..243d58e692 100644 --- a/clients/fides-js/src/components/tcf/TcfOverlay.tsx +++ b/clients/fides-js/src/components/tcf/TcfOverlay.tsx @@ -1,4 +1,5 @@ import "../fides.css"; +import "./fides-tcf.css"; import { FunctionComponent, h } from "preact"; import { useCallback, useEffect, useMemo, useState } from "preact/hooks"; @@ -40,6 +41,7 @@ import type { TCFVendorLegitimateInterestsRecord, TCFVendorSave, } from "../../lib/tcf/types"; +import { useVendorButton } from "../../lib/tcf/vendor-button-context"; import { fetchGvlTranslations } from "../../services/api"; import Button from "../Button"; import ConsentBanner from "../ConsentBanner"; @@ -204,6 +206,8 @@ const TcfOverlay: FunctionComponent = ({ cookie, savedConsent, }) => { + const { setVendorCount } = useVendorButton(); + const initialEnabledIds: EnabledIds = useMemo(() => { const { tcf_purpose_consents: consentPurposes = [], @@ -251,6 +255,12 @@ const TcfOverlay: FunctionComponent = ({ setCurrentLocale(locale); }; + useEffect(() => { + if (experience.vendor_count && setVendorCount) { + setVendorCount(experience.vendor_count); + } + }, [experience, setVendorCount]); + useEffect(() => { if (!currentLocale && locale && defaultLocale) { if (locale !== defaultLocale) { diff --git a/clients/fides-js/src/components/tcf/VendorInfoBanner.tsx b/clients/fides-js/src/components/tcf/VendorInfoBanner.tsx index 965c547324..4175d6c5a9 100644 --- a/clients/fides-js/src/components/tcf/VendorInfoBanner.tsx +++ b/clients/fides-js/src/components/tcf/VendorInfoBanner.tsx @@ -1,8 +1,9 @@ import { h } from "preact"; -import { useMemo } from "preact/hooks"; +import { useEffect, useMemo } from "preact/hooks"; import { PrivacyExperience } from "../../lib/consent-types"; import type { I18n } from "../../lib/i18n"; +import { useVendorButton } from "../../lib/tcf/vendor-button-context"; const VendorInfo = ({ label, @@ -38,6 +39,7 @@ const VendorInfoBanner = ({ i18n: I18n; goToVendorTab: () => void; }) => { + const { setVendorCount } = useVendorButton(); const counts = useMemo(() => { const { tcf_vendor_consents: consentVendors = [], @@ -57,6 +59,12 @@ const VendorInfoBanner = ({ return { total, consent, legint }; }, [experience]); + useEffect(() => { + if (counts.total && setVendorCount) { + setVendorCount(counts.total); + } + }, [counts.total, setVendorCount]); + return (
>; } -const I18nContext = createContext({} as I18nContextProps); +const I18nContext = createContext>({}); export const I18nProvider: FunctionComponent = ({ children }) => { const [currentLocale, setCurrentLocale] = useState(); @@ -41,7 +41,7 @@ export const I18nProvider: FunctionComponent = ({ children }) => { export const useI18n = () => { const context = useContext(I18nContext); - if (!context) { + if (!context || Object.keys(context).length === 0) { throw new Error("useI18n must be used within a I18nProvider"); } return context; diff --git a/clients/fides-js/src/lib/tcf/renderOverlay.tsx b/clients/fides-js/src/lib/tcf/renderOverlay.tsx index 1a8098d5ac..99922e6ab5 100644 --- a/clients/fides-js/src/lib/tcf/renderOverlay.tsx +++ b/clients/fides-js/src/lib/tcf/renderOverlay.tsx @@ -4,6 +4,7 @@ import TcfOverlay from "../../components/tcf/TcfOverlay"; import { OverlayProps } from "../../components/types"; import { I18nProvider } from "../i18n/i18n-context"; import { loadTcfMessagesFromFiles } from "./i18n/tcf-i18n-utils"; +import { VendorButtonProvider } from "./vendor-button-context"; export const renderOverlay = (props: OverlayProps, parent: ContainerNode) => { /** @@ -18,7 +19,9 @@ export const renderOverlay = (props: OverlayProps, parent: ContainerNode) => { render( - + + + , parent, ); diff --git a/clients/fides-js/src/lib/tcf/vendor-button-context.tsx b/clients/fides-js/src/lib/tcf/vendor-button-context.tsx new file mode 100644 index 0000000000..d5a5460ab9 --- /dev/null +++ b/clients/fides-js/src/lib/tcf/vendor-button-context.tsx @@ -0,0 +1,46 @@ +import { createContext, h } from "preact"; +import { FC } from "preact/compat"; +import { + Dispatch, + StateUpdater, + useContext, + useMemo, + useState, +} from "preact/hooks"; + +interface VendorButtonContextProps { + vendorCount?: number; + setVendorCount: Dispatch>; +} + +export const VendorButtonContext = createContext< + VendorButtonContextProps | Record +>({}); + +export const VendorButtonProvider: FC = ({ children }) => { + const [vendorCount, setVendorCount] = useState(); + + const value: VendorButtonContextProps = useMemo( + () => ({ + vendorCount, + setVendorCount, + }), + [vendorCount, setVendorCount], + ); + + return ( + + {children} + + ); +}; + +export const useVendorButton = () => { + const context = useContext(VendorButtonContext); + if (!context || Object.keys(context).length === 0) { + throw new Error( + "useVendorButton must be used within a VendorButtonProvider", + ); + } + return context; +}; diff --git a/clients/privacy-center/cypress/e2e/consent-banner-tcf.cy.ts b/clients/privacy-center/cypress/e2e/consent-banner-tcf.cy.ts index a573f4a71b..2854096cd0 100644 --- a/clients/privacy-center/cypress/e2e/consent-banner-tcf.cy.ts +++ b/clients/privacy-center/cypress/e2e/consent-banner-tcf.cy.ts @@ -275,7 +275,14 @@ describe("Fides-js TCF", () => { }); }); - it("can open the modal", () => { + it("can open the modal from vendor count", () => { + cy.get("div#fides-banner").within(() => { + cy.get(".fides-vendor-count").first().should("have.text", "2").click(); + }); + cy.get("#fides-tab-vendors"); + }); + + it("can open the modal from preferences button", () => { cy.get("div#fides-banner").within(() => { cy.get("#fides-button-group").within(() => { cy.get("button").contains("Manage preferences").click(); diff --git a/clients/privacy-center/cypress/e2e/consent-i18n.cy.ts b/clients/privacy-center/cypress/e2e/consent-i18n.cy.ts index 46bbba4eb8..b22cf0d168 100644 --- a/clients/privacy-center/cypress/e2e/consent-i18n.cy.ts +++ b/clients/privacy-center/cypress/e2e/consent-i18n.cy.ts @@ -153,6 +153,8 @@ const ENGLISH_NOTICES: TestNoticeTranslations[] = [ const ENGLISH_TCF_BANNER: TestTcfBannerTranslations = { ...ENGLISH_BANNER, ...{ + banner_description: + "[banner] We, and our 2 vendors, use cookies and similar", vendors_count: "Vendors", vendors_consent_count: "Vendors using consent", vendors_legint_count: "Vendors using legitimate interest", diff --git a/clients/privacy-center/cypress/fixtures/consent/experience_tcf.json b/clients/privacy-center/cypress/fixtures/consent/experience_tcf.json index 7be4fb12ab..1b53ef4985 100644 --- a/clients/privacy-center/cypress/fixtures/consent/experience_tcf.json +++ b/clients/privacy-center/cypress/fixtures/consent/experience_tcf.json @@ -17,7 +17,7 @@ "language": "en", "accept_button_label": "Opt in to all", "acknowledge_button_label": "OK", - "banner_description": "[banner] We use cookies and similar methods to recognize visitors and remember their preferences. We may also use these technologies to gauge the effectiveness of advertising campaigns, target advertisements, and analyze website traffic. Some of these technologies are essential for ensuring the proper functioning of the service or website and cannot be disabled, while others are optional but serve to enhance the user experience in various ways.\n\nWe, in collaboration with our partners, store and/or access information on a user's device, including but not limited to IP addresses, unique identifiers, and browsing data stored in cookies, in order to process personal data. You have the option to manage your preferences by selecting the 'Manage Preferences' option located in the page's footer. To review or object to instances where our partners assert a legitimate interest in utilizing your data, please visit our vendors page.\n", + "banner_description": "[banner] We, and our ${VENDOR_COUNT_LINK} vendors, use cookies and similar methods to recognize visitors and remember their preferences. We may also use these technologies to gauge the effectiveness of advertising campaigns, target advertisements, and analyze website traffic. Some of these technologies are essential for ensuring the proper functioning of the service or website and cannot be disabled, while others are optional but serve to enhance the user experience in various ways.\n\nWe, in collaboration with our partners, store and/or access information on a user's device, including but not limited to IP addresses, unique identifiers, and browsing data stored in cookies, in order to process personal data. You have the option to manage your preferences by selecting the 'Manage Preferences' option located in the page's footer. To review or object to instances where our partners assert a legitimate interest in utilizing your data, please visit our vendors page.\n", "banner_title": "[banner] Manage your consent preferences", "description": "We use cookies and similar methods to recognize visitors and remember their preferences. We may also use these technologies to gauge the effectiveness of advertising campaigns, target advertisements, and analyze website traffic. Some of these technologies are essential for ensuring the proper functioning of the service or website and cannot be disabled, while others are optional but serve to enhance the user experience in various ways.\n\nWe, in collaboration with our partners, store and/or access information on a user's device, including but not limited to IP addresses, unique identifiers, and browsing data stored in cookies, in order to process personal data. You have the option to manage your preferences by selecting the 'Manage Preferences' option located in the page's footer. To review or object to instances where our partners assert a legitimate interest in utilizing your data, please visit our vendors page.\n", "modal_link_label": "Manage my consent preferences", diff --git a/data/saas/config/oracle_responsys_config.yml b/data/saas/config/oracle_responsys_config.yml index 7660ed9780..819e867949 100644 --- a/data/saas/config/oracle_responsys_config.yml +++ b/data/saas/config/oracle_responsys_config.yml @@ -3,7 +3,7 @@ saas_config: name: Oracle Responsys type: oracle_responsys description: A sample schema representing the Oracle Responsys connector for Fides - version: 0.0.2 + version: 0.0.3 connector_params: - name: domain diff --git a/src/fides/api/alembic/migrations/versions/ffee79245c9a_add_openid_provider.py b/src/fides/api/alembic/migrations/versions/ffee79245c9a_add_openid_provider.py index 8804f6c5f5..7e247246e4 100644 --- a/src/fides/api/alembic/migrations/versions/ffee79245c9a_add_openid_provider.py +++ b/src/fides/api/alembic/migrations/versions/ffee79245c9a_add_openid_provider.py @@ -18,7 +18,6 @@ def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### op.create_table( "openid_provider", sa.Column("id", sa.String(length=255), nullable=False), @@ -66,13 +65,10 @@ def upgrade(): ["identifier"], unique=True, ) - # ### end Alembic commands ### def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### op.drop_index(op.f("ix_openid_provider_identifier"), table_name="openid_provider") op.drop_index(op.f("ix_openid_provider_id"), table_name="openid_provider") op.drop_table("openid_provider") op.execute("DROP TYPE providerenum") - # ### end Alembic commands ### diff --git a/src/fides/api/service/saas_request/override_implementations/oracle_responsys_request_overrides.py b/src/fides/api/service/saas_request/override_implementations/oracle_responsys_request_overrides.py index e9d5e8dd8a..a091fee0d3 100644 --- a/src/fides/api/service/saas_request/override_implementations/oracle_responsys_request_overrides.py +++ b/src/fides/api/service/saas_request/override_implementations/oracle_responsys_request_overrides.py @@ -272,7 +272,8 @@ def oracle_responsys_profile_list_recipients_delete( SaaSRequestParams( method=HTTPMethod.DELETE, path=f"/rest/api/v1.3/lists/{list_id}/members/{responsys_id}", - ) + ), + [404], ) rows_deleted += 1