From b9b475dfea6f4b39f92cef616ffe614c04af81e1 Mon Sep 17 00:00:00 2001 From: speakeasybot Date: Sun, 1 Feb 2026 01:14:22 +0000 Subject: [PATCH 1/2] =?UTF-8?q?##=20Python=20SDK=20Changes:=20*=20`workflo?= =?UTF-8?q?ws.campaign.update=5Fcampaigns=5Fjob()`:=20=20=20*=20=20`reques?= =?UTF-8?q?t.input[]`=20**Changed**=20**Breaking**=20=E2=9A=A0=EF=B8=8F=20?= =?UTF-8?q?*=20`workflows.campaigns.update()`:=20=20`request`=20**Changed*?= =?UTF-8?q?*=20**Breaking**=20=E2=9A=A0=EF=B8=8F=20*=20`workflows.campaign?= =?UTF-8?q?.create()`:=20=20`request`=20**Changed**=20*=20`workflows.campa?= =?UTF-8?q?ign.create=5Fcampaigns=5Fjob()`:=20=20=20*=20=20`request.input[?= =?UTF-8?q?]`=20**Changed**?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .speakeasy/gen.lock | 1853 ++++++++++++++--- .speakeasy/gen.yaml | 9 +- .speakeasy/workflow.lock | 14 +- README-PYPI.md | 16 +- README.md | 16 +- RELEASES.md | 12 +- .../campaigncreateworkflowadvancedinput.md | 5 +- ...d => campaigncreateworkflowbudgetinput.md} | 2 +- .../campaigncreateworkflowprimaryinput.md | 2 +- .../campaignupdateworkflowadvancedinput.md | 7 +- .../campaignupdateworkflowbudgetinput.md | 8 + .../campaignupdateworkflowprimaryinput.md | 4 +- ...wcampaignconversionreportingcolumninput.md | 17 +- docs/models/frequencyconfig.md | 11 + docs/models/productlistreportingtypeinput.md | 9 + docs/sdks/adgroup/README.md | 1 - docs/sdks/adgroups/README.md | 1 - docs/sdks/campaign/README.md | 65 +- docs/sdks/campaigns/README.md | 22 +- docs/sdks/dmp/README.md | 1 - docs/sdks/graphqlrequest/README.md | 1 - docs/sdks/jobstatus/README.md | 1 - docs/sdks/restrequest/README.md | 1 - pyproject.toml | 2 +- src/ttd_workflows/_version.py | 6 +- src/ttd_workflows/ad_group.py | 4 + src/ttd_workflows/adgroups.py | 6 + src/ttd_workflows/basesdk.py | 32 +- src/ttd_workflows/campaign.py | 8 + src/ttd_workflows/campaigns.py | 4 + src/ttd_workflows/dmp.py | 4 + src/ttd_workflows/graphql_request.py | 4 + src/ttd_workflows/job_status.py | 4 + src/ttd_workflows/models/__init__.py | 32 +- .../models/adgroupassociatebidlist.py | 18 +- .../models/adgroupaudiencetargeting.py | 33 +- src/ttd_workflows/models/adgroupbudget.py | 53 +- ...upbulkcreateworkflowinputwithvalidation.py | 33 +- ...upbulkupdateworkflowinputwithvalidation.py | 33 +- .../models/adgroupcomscoresettings.py | 37 +- .../models/adgroupcreateworkflowinput.py | 33 +- ...dgroupcreateworkflowinputwithvalidation.py | 31 +- .../adgroupcreateworkflowprimaryinput.py | 81 +- src/ttd_workflows/models/adgroupflight.py | 55 +- .../models/adgroupkoaoptimizationsettings.py | 21 +- .../adgroupnielsentrackingattributes.py | 18 +- src/ttd_workflows/models/adgrouppayload.py | 19 +- src/ttd_workflows/models/adgrouproigoal.py | 89 +- .../models/adgroupupdateworkflowinput.py | 33 +- ...dgroupupdateworkflowinputwithvalidation.py | 31 +- .../adgroupupdateworkflowprimaryinput.py | 81 +- src/ttd_workflows/models/adgroupworkflow.py | 79 +- .../models/adgroupworkflowadvancedinput.py | 73 +- .../adgroupworkflowassociatebidlistinput.py | 33 +- .../adgroupworkflowaudiencetargetinginput.py | 77 +- .../models/adgroupworkflowbudgetinput.py | 59 +- .../adgroupworkflowcomscoresettingsinput.py | 43 +- .../adgroupworkflowcontracttargetinginput.py | 33 +- .../models/adgroupworkflowflightinput.py | 59 +- ...oupworkflowkoaoptimizationsettingsinput.py | 37 +- .../adgroupworkflownewfrequencyconfiginput.py | 33 +- ...pworkflownielsentrackingattributesinput.py | 33 +- .../models/adgroupworkflowroigoalinput.py | 89 +- src/ttd_workflows/models/archiveadgroupsop.py | 35 +- .../models/archivecampaignsop.py | 35 +- .../models/callrestapiworkflowinput.py | 33 +- ...gnbulkcreateworkflowinputwithvalidation.py | 33 +- ...gnbulkupdateworkflowinputwithvalidation.py | 33 +- .../campaigncreatepassthroughfeesinput.py | 33 +- ...paigncreateworkflowadgroupadvancedinput.py | 71 +- ...ampaigncreateworkflowadgroupflightinput.py | 59 +- .../campaigncreateworkflowadgroupinput.py | 19 +- .../campaigncreateworkflowadvancedinput.py | 63 +- ...y => campaigncreateworkflowbudgetinput.py} | 57 +- ...workflowincrementalreachcampaignsetting.py | 26 +- .../models/campaigncreateworkflowinput.py | 31 +- ...mpaigncreateworkflowinputwithvalidation.py | 31 +- ...gncreateworkflowpassthroughfeecardinput.py | 42 +- .../campaigncreateworkflowprimaryinput.py | 111 +- .../models/campaignflightworkflow.py | 59 +- src/ttd_workflows/models/campaignpayload.py | 33 +- .../campaignupdateworkflowadvancedinput.py | 41 +- .../campaignupdateworkflowbudgetinput.py | 15 + .../models/campaignupdateworkflowinput.py | 33 +- ...mpaignupdateworkflowinputwithvalidation.py | 31 +- .../campaignupdateworkflowprimaryinput.py | 115 +- .../models/campaignversionworkflow.py | 33 +- src/ttd_workflows/models/campaignworkflow.py | 107 +- ...wcampaignconversionreportingcolumninput.py | 47 +- .../models/campaignworkflowflightinput.py | 57 +- .../models/campaignworkflowroigoalinput.py | 105 +- src/ttd_workflows/models/createadgroupop.py | 19 +- .../models/createadgroupsjobop.py | 19 +- src/ttd_workflows/models/createcampaignop.py | 19 +- .../models/createcampaignsjobop.py | 19 +- src/ttd_workflows/models/customroasconfig.py | 43 +- .../models/firstpartydatainput.py | 33 +- src/ttd_workflows/models/frequencyconfig.py | 66 + .../models/getcampaignversionop.py | 19 +- .../models/getfirstpartydatajobop.py | 19 +- .../models/getgraphqlbulkjobstatusop.py | 19 +- src/ttd_workflows/models/getjobstatusop.py | 19 +- .../models/getthirdpartydatajobop.py | 19 +- src/ttd_workflows/models/graphqlbulkjob.py | 63 +- .../models/graphqlbulkjobcallbackinput.py | 33 +- .../models/graphqlbulkjoberror.py | 33 +- .../models/graphqlbulkjobpayload.py | 33 +- .../models/graphqlbulkjobresponse.py | 33 +- .../models/graphqlbulkjobretrievalresponse.py | 33 +- .../models/graphqlqueryjobinput.py | 33 +- .../models/graphqlrequestinput.py | 33 +- .../models/incrementalreachbrandinput.py | 33 +- .../models/incrementalreachproductinput.py | 33 +- .../keyvaluepairofstringandstringinput.py | 18 +- .../models/problemdetails_error.py | 5 - .../models/productlistreportingtypeinput.py | 9 + .../models/realyticsreachsettinginput.py | 41 +- src/ttd_workflows/models/security.py | 19 +- .../models/standardjobstatusresponse.py | 49 +- .../models/submitgraphqlbulkqueryjobop.py | 19 +- .../models/submitgraphqlrequestop.py | 19 +- .../models/submitrestrequestop.py | 19 +- .../models/thirdpartydatainput.py | 33 +- src/ttd_workflows/models/updateadgroupop.py | 19 +- .../models/updateadgroupsjobop.py | 19 +- src/ttd_workflows/models/updatecampaignop.py | 19 +- .../models/updatecampaignsjobop.py | 19 +- .../models/workflowcallbackinput.py | 33 +- src/ttd_workflows/rest_request.py | 2 + src/ttd_workflows/types/basemodel.py | 44 +- src/ttd_workflows/utils/__init__.py | 17 +- src/ttd_workflows/utils/enums.py | 60 + src/ttd_workflows/utils/forms.py | 31 +- src/ttd_workflows/utils/queryparams.py | 16 +- src/ttd_workflows/utils/requestbodies.py | 6 +- src/ttd_workflows/utils/retries.py | 74 +- src/ttd_workflows/utils/serializers.py | 20 - 137 files changed, 3984 insertions(+), 2218 deletions(-) rename docs/models/{campaignworkflowbudgetinput.md => campaigncreateworkflowbudgetinput.md} (98%) create mode 100644 docs/models/campaignupdateworkflowbudgetinput.md create mode 100644 docs/models/frequencyconfig.md create mode 100644 docs/models/productlistreportingtypeinput.md rename src/ttd_workflows/models/{campaignworkflowbudgetinput.py => campaigncreateworkflowbudgetinput.py} (60%) create mode 100644 src/ttd_workflows/models/campaignupdateworkflowbudgetinput.py create mode 100644 src/ttd_workflows/models/frequencyconfig.py create mode 100644 src/ttd_workflows/models/productlistreportingtypeinput.py diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 8339ae6..1853bfa 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,21 +1,25 @@ lockVersion: 2.0.0 id: f803c176-84c0-412f-93ec-3006a124047d management: - docChecksum: a2d8f95f84924d1831e7cc12f35d4868 + docChecksum: 7a40c3a3686fc1c5c897f9eddfa14348 docVersion: v1 - speakeasyVersion: 1.659.0 - generationVersion: 2.755.9 - releaseVersion: 0.12.0 - configChecksum: c397f762534351929a57f8b5de3e7488 + speakeasyVersion: 1.700.2 + generationVersion: 2.801.2 + releaseVersion: 0.13.0 + configChecksum: 10eff847d7b819937dc145a2a47d9807 repoURL: https://github.com/thetradedesk/ttd-workflows-python.git installationURL: https://github.com/thetradedesk/ttd-workflows-python.git published: true +persistentEdits: + generation_id: 46e5e7b4-6633-4158-a9d9-66d84d4a9bfe + pristine_commit_hash: 943b7b60bf084fa8bddc3fee7e026183115576e1 + pristine_tree_hash: 48e2f39817da0da60337326541c989dc4863ce3d features: python: additionalDependencies: 1.0.0 additionalProperties: 1.0.1 constsAndDefaults: 1.0.5 - core: 5.23.9 + core: 5.23.18 defaultEnabledRetries: 0.2.0 enumUnions: 0.1.0 envVarSecurityUsage: 0.3.2 @@ -27,311 +31,1232 @@ features: groups: 3.0.1 methodArguments: 1.0.2 nameOverrides: 3.0.1 - nullables: 1.0.1 + nullables: 1.0.2 responseFormat: 1.0.1 - retries: 3.0.2 - sdkHooks: 1.1.0 + retries: 3.0.3 + sdkHooks: 1.2.1 serverIDs: 3.0.0 -generatedFiles: - - .gitattributes - - .vscode/settings.json - - USAGE.md - - docs/models/adgroupassociatebidlist.md - - docs/models/adgroupaudiencetargeting.md - - docs/models/adgroupbudget.md - - docs/models/adgroupbulkcreateworkflowinputwithvalidation.md - - docs/models/adgroupbulkupdateworkflowinputwithvalidation.md - - docs/models/adgroupchannel.md - - docs/models/adgroupcomscoresettings.md - - docs/models/adgroupcontracttargeting.md - - docs/models/adgroupcreateworkflowinput.md - - docs/models/adgroupcreateworkflowinputwithvalidation.md - - docs/models/adgroupcreateworkflowprimaryinput.md - - docs/models/adgroupflight.md - - docs/models/adgroupfunnellocation.md - - docs/models/adgroupkoaoptimizationsettings.md - - docs/models/adgroupnielsentrackingattributes.md - - docs/models/adgrouppayload.md - - docs/models/adgrouproigoal.md - - docs/models/adgroupupdateworkflowinput.md - - docs/models/adgroupupdateworkflowinputwithvalidation.md - - docs/models/adgroupupdateworkflowprimaryinput.md - - docs/models/adgroupworkflow.md - - docs/models/adgroupworkflowadvancedinput.md - - docs/models/adgroupworkflowassociatebidlistinput.md - - docs/models/adgroupworkflowaudiencetargetinginput.md - - docs/models/adgroupworkflowbudgetinput.md - - docs/models/adgroupworkflowcomscoresettingsinput.md - - docs/models/adgroupworkflowcontracttargetinginput.md - - docs/models/adgroupworkflowflightinput.md - - docs/models/adgroupworkflowkoaoptimizationsettingsinput.md - - docs/models/adgroupworkflownewfrequencyconfiginput.md - - docs/models/adgroupworkflownielsentrackingattributesinput.md - - docs/models/adgroupworkflowroigoalinput.md - - docs/models/allocationtype.md - - docs/models/archiveadgroupsrequest.md - - docs/models/archiveadgroupsresponse.md - - docs/models/archivecampaignsrequest.md - - docs/models/archivecampaignsresponse.md - - docs/models/bulkjobstatus.md - - docs/models/callrestapiworkflowinput.md - - docs/models/campaignbulkcreateworkflowinputwithvalidation.md - - docs/models/campaignbulkupdateworkflowinputwithvalidation.md - - docs/models/campaignchanneltype.md - - docs/models/campaigncreatepassthroughfeesinput.md - - docs/models/campaigncreateworkflowadgroupadvancedinput.md - - docs/models/campaigncreateworkflowadgroupflightinput.md - - docs/models/campaigncreateworkflowadgroupinput.md - - docs/models/campaigncreateworkflowadvancedinput.md - - docs/models/campaigncreateworkflowincrementalreachcampaignsetting.md - - docs/models/campaigncreateworkflowinput.md - - docs/models/campaigncreateworkflowinputwithvalidation.md - - docs/models/campaigncreateworkflowpassthroughfeecardinput.md - - docs/models/campaigncreateworkflowprimaryinput.md - - docs/models/campaignflightworkflow.md - - docs/models/campaignpacingmode.md - - docs/models/campaignpayload.md - - docs/models/campaignupdateworkflowadvancedinput.md - - docs/models/campaignupdateworkflowinput.md - - docs/models/campaignupdateworkflowinputwithvalidation.md - - docs/models/campaignupdateworkflowprimaryinput.md - - docs/models/campaignversionworkflow.md - - docs/models/campaignworkflow.md - - docs/models/campaignworkflowbudgetinput.md - - docs/models/campaignworkflowcampaignconversionreportingcolumninput.md - - docs/models/campaignworkflowflightinput.md - - docs/models/campaignworkflowroigoalinput.md - - docs/models/createadgroupresponse.md - - docs/models/createadgroupsjobresponse.md - - docs/models/createcampaignresponse.md - - docs/models/createcampaignsjobresponse.md - - docs/models/customcpatype.md - - docs/models/customroasconfig.md - - docs/models/customroastype.md - - docs/models/dimensionalbiddingdimensions.md - - docs/models/enhancednielsenreportingoptions.md - - docs/models/enhancednielsenreportingoptionsinput.md - - docs/models/firstpartydatainput.md - - docs/models/getcampaignversionrequest.md - - docs/models/getcampaignversionresponse.md - - docs/models/getfirstpartydatajobresponse.md - - docs/models/getgraphqlbulkjobstatusrequest.md - - docs/models/getgraphqlbulkjobstatusresponse.md - - docs/models/getjobstatusrequest.md - - docs/models/getjobstatusresponse.md - - docs/models/getthirdpartydatajobresponse.md - - docs/models/graphqlbulkjob.md - - docs/models/graphqlbulkjobcallbackinput.md - - docs/models/graphqlbulkjoberror.md - - docs/models/graphqlbulkjobpayload.md - - docs/models/graphqlbulkjobresponse.md - - docs/models/graphqlbulkjobretrievalresponse.md - - docs/models/graphqlqueryjobinput.md - - docs/models/graphqlrequestinput.md - - docs/models/httpmetadata.md - - docs/models/incrementalreachbrandinput.md - - docs/models/incrementalreachproductinput.md - - docs/models/keyvaluepairofstringandstringinput.md - - docs/models/markettype.md - - docs/models/passthroughfeetype.md - - docs/models/problemdetails.md - - docs/models/problemdetailserror.md - - docs/models/realyticsentertainmenttype.md - - docs/models/realyticsreachsettinginput.md - - docs/models/restapimethodtype.md - - docs/models/security.md - - docs/models/standardjobstatusresponse.md - - docs/models/standardjobsubmitresponse.md - - docs/models/submitgraphqlbulkqueryjobresponse.md - - docs/models/submitgraphqlrequestresponse.md - - docs/models/submitrestrequestresponse.md - - docs/models/targetingendage.md - - docs/models/targetingendageinput.md - - docs/models/targetinggender.md - - docs/models/targetinggenderinput.md - - docs/models/targetingstartage.md - - docs/models/targetingstartageinput.md - - docs/models/thirdpartydatainput.md - - docs/models/updateadgroupresponse.md - - docs/models/updateadgroupsjobresponse.md - - docs/models/updatecampaignresponse.md - - docs/models/updatecampaignsjobresponse.md - - docs/models/utils/retryconfig.md - - docs/models/workflowcallbackinput.md - - docs/models/workflowstatus.md - - docs/sdks/adgroup/README.md - - docs/sdks/adgroups/README.md - - docs/sdks/campaign/README.md - - docs/sdks/campaigns/README.md - - docs/sdks/dmp/README.md - - docs/sdks/graphqlrequest/README.md - - docs/sdks/jobstatus/README.md - - docs/sdks/restrequest/README.md - - poetry.toml - - py.typed - - pylintrc - - pyproject.toml - - scripts/prepare_readme.py - - scripts/publish.sh - - src/ttd_workflows/__init__.py - - src/ttd_workflows/_hooks/__init__.py - - src/ttd_workflows/_hooks/sdkhooks.py - - src/ttd_workflows/_hooks/types.py - - src/ttd_workflows/_version.py - - src/ttd_workflows/ad_group.py - - src/ttd_workflows/adgroups.py - - src/ttd_workflows/basesdk.py - - src/ttd_workflows/campaign.py - - src/ttd_workflows/campaigns.py - - src/ttd_workflows/dmp.py - - src/ttd_workflows/graphql_request.py - - src/ttd_workflows/httpclient.py - - src/ttd_workflows/job_status.py - - src/ttd_workflows/models/__init__.py - - src/ttd_workflows/models/adgroupassociatebidlist.py - - src/ttd_workflows/models/adgroupaudiencetargeting.py - - src/ttd_workflows/models/adgroupbudget.py - - src/ttd_workflows/models/adgroupbulkcreateworkflowinputwithvalidation.py - - src/ttd_workflows/models/adgroupbulkupdateworkflowinputwithvalidation.py - - src/ttd_workflows/models/adgroupchannel.py - - src/ttd_workflows/models/adgroupcomscoresettings.py - - src/ttd_workflows/models/adgroupcontracttargeting.py - - src/ttd_workflows/models/adgroupcreateworkflowinput.py - - src/ttd_workflows/models/adgroupcreateworkflowinputwithvalidation.py - - src/ttd_workflows/models/adgroupcreateworkflowprimaryinput.py - - src/ttd_workflows/models/adgroupflight.py - - src/ttd_workflows/models/adgroupfunnellocation.py - - src/ttd_workflows/models/adgroupkoaoptimizationsettings.py - - src/ttd_workflows/models/adgroupnielsentrackingattributes.py - - src/ttd_workflows/models/adgrouppayload.py - - src/ttd_workflows/models/adgrouproigoal.py - - src/ttd_workflows/models/adgroupupdateworkflowinput.py - - src/ttd_workflows/models/adgroupupdateworkflowinputwithvalidation.py - - src/ttd_workflows/models/adgroupupdateworkflowprimaryinput.py - - src/ttd_workflows/models/adgroupworkflow.py - - src/ttd_workflows/models/adgroupworkflowadvancedinput.py - - src/ttd_workflows/models/adgroupworkflowassociatebidlistinput.py - - src/ttd_workflows/models/adgroupworkflowaudiencetargetinginput.py - - src/ttd_workflows/models/adgroupworkflowbudgetinput.py - - src/ttd_workflows/models/adgroupworkflowcomscoresettingsinput.py - - src/ttd_workflows/models/adgroupworkflowcontracttargetinginput.py - - src/ttd_workflows/models/adgroupworkflowflightinput.py - - src/ttd_workflows/models/adgroupworkflowkoaoptimizationsettingsinput.py - - src/ttd_workflows/models/adgroupworkflownewfrequencyconfiginput.py - - src/ttd_workflows/models/adgroupworkflownielsentrackingattributesinput.py - - src/ttd_workflows/models/adgroupworkflowroigoalinput.py - - src/ttd_workflows/models/allocationtype.py - - src/ttd_workflows/models/apierror.py - - src/ttd_workflows/models/archiveadgroupsop.py - - src/ttd_workflows/models/archivecampaignsop.py - - src/ttd_workflows/models/bulkjobstatus.py - - src/ttd_workflows/models/callrestapiworkflowinput.py - - src/ttd_workflows/models/campaignbulkcreateworkflowinputwithvalidation.py - - src/ttd_workflows/models/campaignbulkupdateworkflowinputwithvalidation.py - - src/ttd_workflows/models/campaignchanneltype.py - - src/ttd_workflows/models/campaigncreatepassthroughfeesinput.py - - src/ttd_workflows/models/campaigncreateworkflowadgroupadvancedinput.py - - src/ttd_workflows/models/campaigncreateworkflowadgroupflightinput.py - - src/ttd_workflows/models/campaigncreateworkflowadgroupinput.py - - src/ttd_workflows/models/campaigncreateworkflowadvancedinput.py - - src/ttd_workflows/models/campaigncreateworkflowincrementalreachcampaignsetting.py - - src/ttd_workflows/models/campaigncreateworkflowinput.py - - src/ttd_workflows/models/campaigncreateworkflowinputwithvalidation.py - - src/ttd_workflows/models/campaigncreateworkflowpassthroughfeecardinput.py - - src/ttd_workflows/models/campaigncreateworkflowprimaryinput.py - - src/ttd_workflows/models/campaignflightworkflow.py - - src/ttd_workflows/models/campaignpacingmode.py - - src/ttd_workflows/models/campaignpayload.py - - src/ttd_workflows/models/campaignupdateworkflowadvancedinput.py - - src/ttd_workflows/models/campaignupdateworkflowinput.py - - src/ttd_workflows/models/campaignupdateworkflowinputwithvalidation.py - - src/ttd_workflows/models/campaignupdateworkflowprimaryinput.py - - src/ttd_workflows/models/campaignversionworkflow.py - - src/ttd_workflows/models/campaignworkflow.py - - src/ttd_workflows/models/campaignworkflowbudgetinput.py - - src/ttd_workflows/models/campaignworkflowcampaignconversionreportingcolumninput.py - - src/ttd_workflows/models/campaignworkflowflightinput.py - - src/ttd_workflows/models/campaignworkflowroigoalinput.py - - src/ttd_workflows/models/createadgroupop.py - - src/ttd_workflows/models/createadgroupsjobop.py - - src/ttd_workflows/models/createcampaignop.py - - src/ttd_workflows/models/createcampaignsjobop.py - - src/ttd_workflows/models/customcpatype.py - - src/ttd_workflows/models/customroasconfig.py - - src/ttd_workflows/models/customroastype.py - - src/ttd_workflows/models/dimensionalbiddingdimensions.py - - src/ttd_workflows/models/enhancednielsenreportingoptions.py - - src/ttd_workflows/models/enhancednielsenreportingoptionsinput.py - - src/ttd_workflows/models/firstpartydatainput.py - - src/ttd_workflows/models/getcampaignversionop.py - - src/ttd_workflows/models/getfirstpartydatajobop.py - - src/ttd_workflows/models/getgraphqlbulkjobstatusop.py - - src/ttd_workflows/models/getjobstatusop.py - - src/ttd_workflows/models/getthirdpartydatajobop.py - - src/ttd_workflows/models/graphqlbulkjob.py - - src/ttd_workflows/models/graphqlbulkjobcallbackinput.py - - src/ttd_workflows/models/graphqlbulkjoberror.py - - src/ttd_workflows/models/graphqlbulkjobpayload.py - - src/ttd_workflows/models/graphqlbulkjobresponse.py - - src/ttd_workflows/models/graphqlbulkjobretrievalresponse.py - - src/ttd_workflows/models/graphqlqueryjobinput.py - - src/ttd_workflows/models/graphqlrequestinput.py - - src/ttd_workflows/models/httpmetadata.py - - src/ttd_workflows/models/incrementalreachbrandinput.py - - src/ttd_workflows/models/incrementalreachproductinput.py - - src/ttd_workflows/models/keyvaluepairofstringandstringinput.py - - src/ttd_workflows/models/markettype.py - - src/ttd_workflows/models/no_response_error.py - - src/ttd_workflows/models/passthroughfeetype.py - - src/ttd_workflows/models/problemdetails.py - - src/ttd_workflows/models/problemdetails_error.py - - src/ttd_workflows/models/realyticsentertainmenttype.py - - src/ttd_workflows/models/realyticsreachsettinginput.py - - src/ttd_workflows/models/responsevalidationerror.py - - src/ttd_workflows/models/restapimethodtype.py - - src/ttd_workflows/models/security.py - - src/ttd_workflows/models/standardjobstatusresponse.py - - src/ttd_workflows/models/standardjobsubmitresponse.py - - src/ttd_workflows/models/submitgraphqlbulkqueryjobop.py - - src/ttd_workflows/models/submitgraphqlrequestop.py - - src/ttd_workflows/models/submitrestrequestop.py - - src/ttd_workflows/models/targetingendage.py - - src/ttd_workflows/models/targetingendageinput.py - - src/ttd_workflows/models/targetinggender.py - - src/ttd_workflows/models/targetinggenderinput.py - - src/ttd_workflows/models/targetingstartage.py - - src/ttd_workflows/models/targetingstartageinput.py - - src/ttd_workflows/models/thirdpartydatainput.py - - src/ttd_workflows/models/updateadgroupop.py - - src/ttd_workflows/models/updateadgroupsjobop.py - - src/ttd_workflows/models/updatecampaignop.py - - src/ttd_workflows/models/updatecampaignsjobop.py - - src/ttd_workflows/models/workflowcallbackinput.py - - src/ttd_workflows/models/workflowserror.py - - src/ttd_workflows/models/workflowstatus.py - - src/ttd_workflows/py.typed - - src/ttd_workflows/rest_request.py - - src/ttd_workflows/sdk.py - - src/ttd_workflows/sdkconfiguration.py - - src/ttd_workflows/types/__init__.py - - src/ttd_workflows/types/basemodel.py - - src/ttd_workflows/utils/__init__.py - - src/ttd_workflows/utils/annotations.py - - src/ttd_workflows/utils/datetimes.py - - src/ttd_workflows/utils/enums.py - - src/ttd_workflows/utils/eventstreaming.py - - src/ttd_workflows/utils/forms.py - - src/ttd_workflows/utils/headers.py - - src/ttd_workflows/utils/logger.py - - src/ttd_workflows/utils/metadata.py - - src/ttd_workflows/utils/queryparams.py - - src/ttd_workflows/utils/requestbodies.py - - src/ttd_workflows/utils/retries.py - - src/ttd_workflows/utils/security.py - - src/ttd_workflows/utils/serializers.py - - src/ttd_workflows/utils/unmarshal_json_response.py - - src/ttd_workflows/utils/url.py - - src/ttd_workflows/utils/values.py +trackedFiles: + .gitattributes: + id: 24139dae6567 + last_write_checksum: sha1:53134de3ada576f37c22276901e1b5b6d85cd2da + pristine_git_object: 4d75d59008e4d8609876d263419a9dc56c8d6f3a + .vscode/settings.json: + id: 89aa447020cd + last_write_checksum: sha1:f84632c81029fcdda8c3b0c768d02b836fc80526 + pristine_git_object: 8d79f0abb72526f1fb34a4c03e5bba612c6ba2ae + USAGE.md: + id: 3aed33ce6e6f + last_write_checksum: sha1:87a03d94421b6da3566ee0d9b3c6ddf74b854958 + pristine_git_object: 0c0cfe8ba42249e6813746234435b3d9e6e894ca + docs/models/adgroupassociatebidlist.md: + id: 89e1b5988192 + last_write_checksum: sha1:e04d75ffdec0d0563bc3a7acbb6e427cf407cad6 + pristine_git_object: 50b977e330519af86447c39d7f8ec2abe5fd660e + docs/models/adgroupaudiencetargeting.md: + id: 4faeb035b584 + last_write_checksum: sha1:bee6243ba083996ec66357074182c9f0525c05a9 + pristine_git_object: 219954fe12289b1a84e98478e9c66a30e14fe2c6 + docs/models/adgroupbudget.md: + id: b1c7ab85931c + last_write_checksum: sha1:22638ea9318ce14ce1a6fc0bc94d928d7587b4aa + pristine_git_object: c9e2a8e891751356996512022ce94c54a39ea33e + docs/models/adgroupbulkcreateworkflowinputwithvalidation.md: + id: b1d625c91fae + last_write_checksum: sha1:ff4941499b1b7516fe2648e74114e89ca3311897 + pristine_git_object: bf5ec3939bc82b73b6052a522e5368a7ae39d771 + docs/models/adgroupbulkupdateworkflowinputwithvalidation.md: + id: 5b8ad0b5388f + last_write_checksum: sha1:41c9acd9de4e469f5e16ebbe7d7a5672ea545249 + pristine_git_object: aee44b2de3c2ae771183e579baf6e575df93fc92 + docs/models/adgroupchannel.md: + id: 3cfb7258ab82 + last_write_checksum: sha1:32b0f3c585d5330522d7ca334f768fdefb3cc868 + pristine_git_object: 6074eb690a9d411957c5a6477c4963ebb3aba9e6 + docs/models/adgroupcomscoresettings.md: + id: 50fe92286f33 + last_write_checksum: sha1:0c82ea792e7c1a13b3b5161853079c095e426c8a + pristine_git_object: 6b8a227368e7b6ab8c8bfc654db55e9f894282b7 + docs/models/adgroupcontracttargeting.md: + id: b082002edef9 + last_write_checksum: sha1:fcd0bbced5a58d60c34280d1bf7946df0b894f08 + pristine_git_object: e48df93561765600ea0cd645fc46c0780c2b9e72 + docs/models/adgroupcreateworkflowinput.md: + id: bbe085e22550 + last_write_checksum: sha1:b1a5de459b9b0cee0a50e4e7811905653d331ad4 + pristine_git_object: 334f6a016e9f9b6f6a5b3d9d937c82ca21fb4f5b + docs/models/adgroupcreateworkflowinputwithvalidation.md: + id: e617b2b22230 + last_write_checksum: sha1:bd8cebae9c7ba035c9125efb7b5dca00fe170297 + pristine_git_object: 013cad94586f8f0d21034b68f10e34cb22937ec2 + docs/models/adgroupcreateworkflowprimaryinput.md: + id: 3afd442abc2d + last_write_checksum: sha1:c9d185cc3f55f178f817e9852cb878f382d4c989 + pristine_git_object: 1f9a77f3965664b7082b38a2795e0a7b7d96ad67 + docs/models/adgroupflight.md: + id: 7f86780fc323 + last_write_checksum: sha1:290deb951634a63a9cef24741570f035e0633fde + pristine_git_object: 650c3a2d676657d4de862f6d8c91fdfbf9497440 + docs/models/adgroupfunnellocation.md: + id: d6a4912e85a0 + last_write_checksum: sha1:854bcb70e51ec7e84d3cb43b464a8167f16129ad + pristine_git_object: dcfaa23e14fef838e3e30c7938cc1aea10e8a226 + docs/models/adgroupkoaoptimizationsettings.md: + id: 2a44f48e6dcc + last_write_checksum: sha1:9329894ffe587f0f27f572958979d5821812a255 + pristine_git_object: 07258d3e1e94450f608e191d72694f4fb21d5aed + docs/models/adgroupnielsentrackingattributes.md: + id: 38548f98d667 + last_write_checksum: sha1:74e020b39d0d3f935c77d3fa1544aaeff5e568f9 + pristine_git_object: 9a27cecb8ce69709fe57d13aedb4162ffbe84752 + docs/models/adgrouppayload.md: + id: 634cbe68e94c + last_write_checksum: sha1:34f3c3387efa8f56099f2d58de23f9c69d97815c + pristine_git_object: 299011969b8bf553afa4a24769c16a2d5d5d1861 + docs/models/adgrouproigoal.md: + id: a0e4eb461cf2 + last_write_checksum: sha1:f3a0d0e122653eeb3b35f03df27aa0dcde9299a1 + pristine_git_object: 69d809bdbdc6e1a1d2cf609572fa3ba0e083aee4 + docs/models/adgroupupdateworkflowinput.md: + id: 7290f2dcbe81 + last_write_checksum: sha1:7c5a3899f71980ec290e6f9dac345f5ab5ea0827 + pristine_git_object: 65a44beb3d2baaf82f149c98f64a666d637f49d1 + docs/models/adgroupupdateworkflowinputwithvalidation.md: + id: f6a0980d4c7e + last_write_checksum: sha1:b54141ad6042cac223c2b1058093c7e3d7ef8952 + pristine_git_object: d9cdf485f2d0491ed6ea4b6e83313ff3dc742cb6 + docs/models/adgroupupdateworkflowprimaryinput.md: + id: e247b35e9d0f + last_write_checksum: sha1:47e88858bf9b7c192f23fcefc623b29309587a2b + pristine_git_object: 8e088d9dff9ce310efb9c298bc7b82dad63a8284 + docs/models/adgroupworkflow.md: + id: 9e8b18e5dd6c + last_write_checksum: sha1:57a8259f3fdcab67b3298808e85985f29234bd32 + pristine_git_object: 8160387bf3cd413fbfa4899193adc3a5bafe6dae + docs/models/adgroupworkflowadvancedinput.md: + id: f39435f7c4ba + last_write_checksum: sha1:e0d0c4662015f3ffe995c7e3c9bcc0ed6d8a0f50 + pristine_git_object: 4d562899e3e1c4432428498baf99d17ecde25666 + docs/models/adgroupworkflowassociatebidlistinput.md: + id: 0e210b93dc48 + last_write_checksum: sha1:a2ad780f26b88cedde7bcf23c3df56fdcf73735b + pristine_git_object: f40230cb906a1145add9db0dd7a818c967d54232 + docs/models/adgroupworkflowaudiencetargetinginput.md: + id: a697e43c62f2 + last_write_checksum: sha1:43ef36cb267c9e9e431bf580329cd3fbc71943f5 + pristine_git_object: 447bc07853c12f2cae15d89985582836d9eab767 + docs/models/adgroupworkflowbudgetinput.md: + id: baadf4652dfe + last_write_checksum: sha1:ddfbe4895c3e80fbf19ae1dc6a7e5cc6d925beda + pristine_git_object: 4eebb7f9972eebfe48796f0591ba00a3f7ff5dbf + docs/models/adgroupworkflowcomscoresettingsinput.md: + id: 57567953d365 + last_write_checksum: sha1:f1e72bdf33ea37f4129b884378a2254a32002030 + pristine_git_object: 656c191be131a773c6d45b7b7e26da5462f8deca + docs/models/adgroupworkflowcontracttargetinginput.md: + id: e25dd7529654 + last_write_checksum: sha1:deffd85bf7de5a80b570dc6e0a06588ca1be15e3 + pristine_git_object: 29c2291008b6c319f2ca5f2f1cc8a0e06f9a9566 + docs/models/adgroupworkflowflightinput.md: + id: 59f15067b42e + last_write_checksum: sha1:c95e89bb6b521bac38382032ee60bd225bb1731d + pristine_git_object: 9c2d02896f509dbcdae8b688bb1b13b968f9d1bc + docs/models/adgroupworkflowkoaoptimizationsettingsinput.md: + id: 81bbfaa853a8 + last_write_checksum: sha1:dfae885facc327f3bf9a23ba558f1eed905a7e2c + pristine_git_object: 4af73ceadafbbc2605f869e019ee8959f06779db + docs/models/adgroupworkflownewfrequencyconfiginput.md: + id: 566bf27c8c0d + last_write_checksum: sha1:75c8e342377fa4a39dc23deb60f864b8a55c789b + pristine_git_object: a1161a912339d3c5c3f9a439a15738ebc4c2bc5c + docs/models/adgroupworkflownielsentrackingattributesinput.md: + id: b0532aa9e82b + last_write_checksum: sha1:e636367b585acef7c745aadb1d2ddb3af9311358 + pristine_git_object: 3eeff429ecfcb024737510d732c8de048206c55b + docs/models/adgroupworkflowroigoalinput.md: + id: 72e568660735 + last_write_checksum: sha1:35a6b34b3a44b60840b3347f486367e488ff40e3 + pristine_git_object: b1d5ce18290f530e160f55e938096c50ff6fd821 + docs/models/allocationtype.md: + id: db446c19b69a + last_write_checksum: sha1:e85a4c466cc4a666f8d0f636c24ddd358d313dc3 + pristine_git_object: cd5146bccfe2214208e314abd37d823c5ccfe58d + docs/models/archiveadgroupsrequest.md: + id: 92cc8afc3799 + last_write_checksum: sha1:a9c5566797556fbba0e71fde3fb00727263056c0 + pristine_git_object: 1a54cf88435fd663797af0d9f072b38a67e781fb + docs/models/archiveadgroupsresponse.md: + id: 26eec7250512 + last_write_checksum: sha1:b13726755d545d3c3b9dcadf36f85941390562c4 + pristine_git_object: 6e18a8203b7c52e5353db9d1953af9bba36a8537 + docs/models/archivecampaignsrequest.md: + id: c26296eb622d + last_write_checksum: sha1:6bee0769d22eaf7b09e9b2f39892ed3e73eb7c3c + pristine_git_object: 7bc8dfc2bc3deab03f209e4bc2144b1440786b5d + docs/models/archivecampaignsresponse.md: + id: 56a637ece614 + last_write_checksum: sha1:cea214c5b848d316de9dc770ebf09b32e26584c5 + pristine_git_object: 6909b47ab7528a61c3680fa03f6613548a4de3a8 + docs/models/bulkjobstatus.md: + id: 73cecefe3dde + last_write_checksum: sha1:5d7522b7ce5216552491521d52cac9098b4c9627 + pristine_git_object: 9d9d119df812d185327968ef4d18025be79e9f83 + docs/models/callrestapiworkflowinput.md: + id: 8beb154bac18 + last_write_checksum: sha1:b95c138c0745e214fe535fcd59216090828ec07b + pristine_git_object: bd5431bb56715b4a84527108a3370189c0ba1329 + docs/models/campaignbulkcreateworkflowinputwithvalidation.md: + id: e67b5d6c0966 + last_write_checksum: sha1:98beb6743c6f708cf13dcc99ef54c8fbdf08e140 + pristine_git_object: 8189911396624546d54766747483208ec92c8396 + docs/models/campaignbulkupdateworkflowinputwithvalidation.md: + id: ce565ed14090 + last_write_checksum: sha1:dc16ac3eda368c056751b7984c02ce85c854a89d + pristine_git_object: fe39c962f2b12b17355faf399c8dc38b2c995c51 + docs/models/campaignchanneltype.md: + id: 2e1a80752b31 + last_write_checksum: sha1:d089c8765c6c1be32c0d4c7012b5422830224600 + pristine_git_object: 4d92b17f82356f79bdc0f5654b9dd13a34d44b75 + docs/models/campaigncreatepassthroughfeesinput.md: + id: 4170ddc46b22 + last_write_checksum: sha1:776462db9c5b0ab776fa31ac2e8f811560309182 + pristine_git_object: 028a3752d6a7b9a89b0aedb337ec9fb04eb2fceb + docs/models/campaigncreateworkflowadgroupadvancedinput.md: + id: 88beaccfe5ba + last_write_checksum: sha1:8dfb808d3e0ffa6b4491f4ce4345539fe2fabc9f + pristine_git_object: 8840745d56420d1119f3b800d841b3016550a93c + docs/models/campaigncreateworkflowadgroupflightinput.md: + id: 15636f2356cc + last_write_checksum: sha1:77892c84d59950e2164fa38778a9482e24630494 + pristine_git_object: 6e303e235c1b39005dcac6490b5507bec07f5e88 + docs/models/campaigncreateworkflowadgroupinput.md: + id: d44a39da6281 + last_write_checksum: sha1:700cc6002907579478aded8f05746d8a1ebe9e2c + pristine_git_object: 30b993e63d1439cb48c2b7b1589d0ad37655d169 + docs/models/campaigncreateworkflowadvancedinput.md: + id: 1e66c2696037 + last_write_checksum: sha1:e685bc0f2f50dcc00891d0fb24f2b079a8083b91 + pristine_git_object: a2ab910f19173fdc554add136b6694d4e9f2746e + docs/models/campaigncreateworkflowbudgetinput.md: + id: ad873dca3e12 + last_write_checksum: sha1:91a83ba5e0b31ea41b75bff1a116f1b6554a5703 + pristine_git_object: dbd0a676c690d9683035990be3c53ca5943643f8 + docs/models/campaigncreateworkflowincrementalreachcampaignsetting.md: + id: 4460f29ee009 + last_write_checksum: sha1:4670fe3d46d2fb58b839936dc0d9ed97f826ec1c + pristine_git_object: cc511d5691bef9cdedcc65d75d91b3cfbf4fb406 + docs/models/campaigncreateworkflowinput.md: + id: 6a10a7a91577 + last_write_checksum: sha1:8c6ad1a8eb5399057489b6ece9bc8af79ace79ee + pristine_git_object: ddc08b168eff7e16c687a3482e8f4128b60f6932 + docs/models/campaigncreateworkflowinputwithvalidation.md: + id: 75204516b4c0 + last_write_checksum: sha1:22287acc83c0ce3477f8660fdab87de17ca5a60f + pristine_git_object: 125443531bf254e5aa5b9e88a3640809ed29e27e + docs/models/campaigncreateworkflowpassthroughfeecardinput.md: + id: ba9b9f66b45a + last_write_checksum: sha1:68a8df2e2d93f4c344723a0833996ab817db3624 + pristine_git_object: d4f4d6c7dfa3ca50519422b6cdac74cf2807e642 + docs/models/campaigncreateworkflowprimaryinput.md: + id: d7b69dc04a46 + last_write_checksum: sha1:ecc69791de47a58cc12f2f8bf5df0c94636ac3e1 + pristine_git_object: 72ac2e5943c7297372de76ced40fc7eaa9ee318d + docs/models/campaignflightworkflow.md: + id: 4cb322764f16 + last_write_checksum: sha1:f14d629f69fd0ae8a3a0a03f18cd808620347376 + pristine_git_object: 68d738727a4e765a1a1c3f717ddd4cf632a86f34 + docs/models/campaignpacingmode.md: + id: 69ea16fb5b02 + last_write_checksum: sha1:03f09076f4db58d69126e0cef2842355c9d84fe7 + pristine_git_object: 8439a827e60bae1b69397378b26dfdf570cddda5 + docs/models/campaignpayload.md: + id: 165359cbc0f6 + last_write_checksum: sha1:bc2b75e789e458a37315dae1676a68b42e06ce4b + pristine_git_object: e4550a3fa162cd44c69e1e0bec9e13ed9b2842ad + docs/models/campaignupdateworkflowadvancedinput.md: + id: bd4bcd11a50b + last_write_checksum: sha1:bd0a5b75603e95541c2a4b12e01b178752426686 + pristine_git_object: a47a608f2aea429a29b4eda3f53aed5074040248 + docs/models/campaignupdateworkflowbudgetinput.md: + id: 69b1d3e6c1e0 + last_write_checksum: sha1:a3bc912d8b9265bf4fcc1a3b11b9dd5bc700a7d9 + pristine_git_object: 437825e60c72bc058fdd609066a306311c28568d + docs/models/campaignupdateworkflowinput.md: + id: d21faf4cf8e8 + last_write_checksum: sha1:f76e001f955953879c09535ddcaf02e3557a1e86 + pristine_git_object: 9e18456e50507c376d55f906d3d536e80dae365b + docs/models/campaignupdateworkflowinputwithvalidation.md: + id: e45e2aec5f03 + last_write_checksum: sha1:f5d4dcd4d2b197e3e4cca48275e85e50e268b912 + pristine_git_object: cae68e34b4a42f59a78c3a823c2498432da5f467 + docs/models/campaignupdateworkflowprimaryinput.md: + id: 5a32bc2debbc + last_write_checksum: sha1:c99c6911dfc592542d99721a0a4adc0c2bc7604c + pristine_git_object: e766ed66bca75fd420edbeb2cf5038ad4d2b06c8 + docs/models/campaignversionworkflow.md: + id: 329f84471050 + last_write_checksum: sha1:93732228ea25e62dab99d1d62102cb87719121c3 + pristine_git_object: 7402c0bedb7a57c975a80fc3533ae60ef6045ef9 + docs/models/campaignworkflow.md: + id: 1c20f29fd300 + last_write_checksum: sha1:d68a54bf8a8b12a600fc5e08a699929a71552383 + pristine_git_object: 625fa9085ee7b3605c81aa899907180e24f4454f + docs/models/campaignworkflowcampaignconversionreportingcolumninput.md: + id: 0269fa832996 + last_write_checksum: sha1:7c072b893631eb3a5d202fd3a9db18fedf15feff + pristine_git_object: fec5e5a061fc8d8cca5bdefa7344a16cc8db1884 + docs/models/campaignworkflowflightinput.md: + id: 6860e12ac28f + last_write_checksum: sha1:07626f49cd311dac942192ffe3c0db402f09b7ab + pristine_git_object: 1d719942818bf51ca2deef44f7abac020f02df64 + docs/models/campaignworkflowroigoalinput.md: + id: b70f33aa66e3 + last_write_checksum: sha1:6506d1f52053471f0fc5932663f7f40b81ab44c8 + pristine_git_object: a1bf86865070e2dbde89f130bd929a034e43a212 + docs/models/createadgroupresponse.md: + id: 9bdacf326273 + last_write_checksum: sha1:5553ace8b80684e40a59464cafe235a81906a83a + pristine_git_object: b0ea2576ed13d5ea51e9cc99239e3ede6de5712f + docs/models/createadgroupsjobresponse.md: + id: 082202ce198a + last_write_checksum: sha1:d95082d11be8885b838db5affdc8c289a6eef747 + pristine_git_object: a0712099e95c4bc7dfbc7a4822348f3150884ee5 + docs/models/createcampaignresponse.md: + id: 2f9c6ed0294e + last_write_checksum: sha1:ee0a2f3bd749063e70c0cee9ff66c371b7b79f99 + pristine_git_object: d1536e82c63f3252e6467953c5b4d4f6ef5e2d21 + docs/models/createcampaignsjobresponse.md: + id: ce235e06d106 + last_write_checksum: sha1:63e553d41e67fdb0f06542a49a73edc8d28237b1 + pristine_git_object: 8cb704bfd88662083be2f48d729aa983db89e2ca + docs/models/customcpatype.md: + id: 4c9fff8a8fea + last_write_checksum: sha1:5153a8d8b5d3d0d21d67ceef36cde1e2cfa31973 + pristine_git_object: fd9e4f2204588bfb21315e631d3d24bcd07a3c70 + docs/models/customroasconfig.md: + id: 95b7a51246e1 + last_write_checksum: sha1:f80790d4bb8f0ab776f7a787bea45b19fd89fc50 + pristine_git_object: de244fc3385b73b139c7774298c3dc4fbe6e1e42 + docs/models/customroastype.md: + id: edc8dd037af7 + last_write_checksum: sha1:4302f784c9ade482ad97520e6c5f3c76b1fbbef4 + pristine_git_object: f196fd4788386142188fddfc87a565734ab54380 + docs/models/dimensionalbiddingdimensions.md: + id: fd4592736955 + last_write_checksum: sha1:29aef464678321f8aecadc47c800409d6d1120a4 + pristine_git_object: 335699f9fdaa1205d7be1490faccb62305b1da36 + docs/models/enhancednielsenreportingoptions.md: + id: f1e874aa558e + last_write_checksum: sha1:9fcfe39530753e5883c5a84b9ac3719896e26d7a + pristine_git_object: ef00bfb9f59dc52e6f5fef9a0c0c9c5c43912201 + docs/models/enhancednielsenreportingoptionsinput.md: + id: 609985d29fc3 + last_write_checksum: sha1:eed31487a1530c0d40d947aaea1f0c81ca33b0a6 + pristine_git_object: 403eeb55db274eda3a6f81162ca415f232974aa1 + docs/models/firstpartydatainput.md: + id: fa8f44865cf5 + last_write_checksum: sha1:610a40cf61582d35a74a77fc95b04dba58ecd753 + pristine_git_object: a31c8b8c786a36924cac7b35744f5fc66b120f51 + docs/models/frequencyconfig.md: + id: 40380273680d + last_write_checksum: sha1:bd9e85d5c126875ec8f2358d29a836e4d075e746 + pristine_git_object: e98fb8942a1c1afd239732469f7673543f3f3c5d + docs/models/getcampaignversionrequest.md: + id: 4520d6c17477 + last_write_checksum: sha1:3562faa49b28f0ae7040a41ad1c255986a842765 + pristine_git_object: 0a7bb8cda70a45c9eb4c35efd597ec865ad84409 + docs/models/getcampaignversionresponse.md: + id: 4c405d80f8ae + last_write_checksum: sha1:013ea9d55db1717b2558c0c1b20f25df7b794e69 + pristine_git_object: 5c8521f7b0d87a7c3a3cb668bf29ab2b5f2cb95b + docs/models/getfirstpartydatajobresponse.md: + id: 2d5e490e564a + last_write_checksum: sha1:8d968509979981ff69838824b5e2b9727cf754cb + pristine_git_object: 49dfdc985a0783a99fcb05dc4fa21dc7053b3c2a + docs/models/getgraphqlbulkjobstatusrequest.md: + id: e17dc67df672 + last_write_checksum: sha1:24b35c7675b468495425d8b0a1321706a8ad1cb2 + pristine_git_object: 3bff08f71d15c3b3edfb05280c78acd148e81c56 + docs/models/getgraphqlbulkjobstatusresponse.md: + id: 4abe29a14798 + last_write_checksum: sha1:3ba83160add0bf6bf615421fe192228d576f243b + pristine_git_object: 630b7d82027ccf3a490354380db66650cbf12fa4 + docs/models/getjobstatusrequest.md: + id: 86a1d751ab9c + last_write_checksum: sha1:fdc5d5638d09f6c3b247ce8fdfd69d5a61b3b27b + pristine_git_object: 8eb92b33d2bd533e96599d271381e4953e432ad2 + docs/models/getjobstatusresponse.md: + id: 3b781cfeae28 + last_write_checksum: sha1:4e6f9c0a49bdcfac65a5d3ddd82cf27b32de0af4 + pristine_git_object: 14d68ae9fbf5f2ae2f985fa5706ce1c11eded4e1 + docs/models/getthirdpartydatajobresponse.md: + id: 947972be8c6f + last_write_checksum: sha1:b3ef1a040aa13f273f1fab82dc95063dfc37d7d8 + pristine_git_object: ea1a5aa36897b4d7283c72cedd8d09d693cdf559 + docs/models/graphqlbulkjob.md: + id: cb5f98a6e329 + last_write_checksum: sha1:cd9eefb79919c731e277fc897b30ca726d2913aa + pristine_git_object: 61b462bca7b8d08d30fceae23543d8f26a1f1d89 + docs/models/graphqlbulkjobcallbackinput.md: + id: 56542187fc77 + last_write_checksum: sha1:94e5530c98fc1f81bb7f6e90c98d35e62bfa6a85 + pristine_git_object: cff28cd4ea456f4bdf3a0d16e96556f78ac0b528 + docs/models/graphqlbulkjoberror.md: + id: 36fe5e583a2f + last_write_checksum: sha1:b17539c3640871de219cbb7061f6c61cc13e6ce2 + pristine_git_object: fb70bd8a78817ae9770a796b08bf088af49e61bb + docs/models/graphqlbulkjobpayload.md: + id: b21b224a3b07 + last_write_checksum: sha1:8481aae60da55bbd33ea717b91c89a67efba29f4 + pristine_git_object: 63fc1d02ed85190b8d9e3787f70b4b6bb7d07047 + docs/models/graphqlbulkjobresponse.md: + id: 2f36eeb2d942 + last_write_checksum: sha1:1b563a0256d64c482f5f952a850620da849c6445 + pristine_git_object: c513e8c57fb60d08ca9723be9bb786900390f5bb + docs/models/graphqlbulkjobretrievalresponse.md: + id: 508d54d32fdb + last_write_checksum: sha1:d7375e4fdb2c8fb65fe2c48b3f96f96ae1aeccc8 + pristine_git_object: dde1056475d6ba3e5493a3b15df84bd7f60807b3 + docs/models/graphqlqueryjobinput.md: + id: 3cbe937d7e5b + last_write_checksum: sha1:6dba557e1a3e89effb0ebf579bbd1e22a72d4d27 + pristine_git_object: 41f48f0b911c81085774aba445fc833f8335b688 + docs/models/graphqlrequestinput.md: + id: d8c7a0b64cc6 + last_write_checksum: sha1:c6135b477c91415f60651ecc4b0ec245e0fc0d41 + pristine_git_object: ab09acbb5bf259aea6359dacd8e2e8e220fef12c + docs/models/httpmetadata.md: + id: 7ca0a10e4586 + last_write_checksum: sha1:09d9c91cf41e3b9e867647becda4e437f4f3e3c8 + pristine_git_object: 2c187164ad5f4bf5cc49203cbb81b64b240247a6 + docs/models/incrementalreachbrandinput.md: + id: 0d894d3a4bb6 + last_write_checksum: sha1:e210789af42b890f13c65885434487bc10dd9fef + pristine_git_object: 6d2cf064834254d84d7681bdca60a95a6e75e139 + docs/models/incrementalreachproductinput.md: + id: 56b3c9704fe8 + last_write_checksum: sha1:2c6956f17a371147b8217087d8f122c37aad6a69 + pristine_git_object: 9d319c9bad5c0c3b22455759699829e6c9d5e95e + docs/models/keyvaluepairofstringandstringinput.md: + id: e21eaecc8f2e + last_write_checksum: sha1:dbb5974fa5c418a4a90a0619e6fc008bd7f4fd5b + pristine_git_object: d9cecab7946adcaa0e69f849291d61d770ae3431 + docs/models/markettype.md: + id: 3e2a3a298fd5 + last_write_checksum: sha1:92e2ac6fbe9d9621c2fe3ba197ce47ac891ce595 + pristine_git_object: 677a8b75ce74bfae5b5abc7daef85c98def375ca + docs/models/passthroughfeetype.md: + id: fb9b76f90834 + last_write_checksum: sha1:adee35d14199369b441445481bf3bc295e941f7b + pristine_git_object: dc50cf399a4bcff5f187bd2f14e0f2f7f5e723c0 + docs/models/problemdetails.md: + id: 9a2634c43a19 + last_write_checksum: sha1:a03ec7410fcce855a2841b00431d8ba71df3f742 + pristine_git_object: df047f21ab337055563b24d3a75ae85603d0c423 + docs/models/problemdetailserror.md: + id: a0c446405363 + last_write_checksum: sha1:2f58e4df9f4542ed4788168f9e1bd9bcf16eb3b5 + pristine_git_object: edd1350d9fcce462cb1177e93729fd97a6671ee8 + docs/models/productlistreportingtypeinput.md: + id: dd3f92801d21 + last_write_checksum: sha1:ab9b45f46492b30e06d3d04e64de780ff56a3124 + pristine_git_object: c18c515fa844cc8077bccc39af4ae7cccd3670cc + docs/models/realyticsentertainmenttype.md: + id: d99dccf97573 + last_write_checksum: sha1:7df8d783551d33b27fe66e2232f2335d08f46503 + pristine_git_object: af96d8c00f10c3dfd62b1b5140be059e9efc04ba + docs/models/realyticsreachsettinginput.md: + id: e1a6ed1de70a + last_write_checksum: sha1:38d32f0d9a6ec314e4ff01dbd42aeb18dbba8368 + pristine_git_object: 1f04c4916a76d4ddecd225e4781381ec75f50b73 + docs/models/restapimethodtype.md: + id: 60ab2ab44641 + last_write_checksum: sha1:ff03810cace55abdced7055c8f9243c5a8138eae + pristine_git_object: 38c4edac9b60b3e1f9d2a64e292bf873054944b3 + docs/models/security.md: + id: 452e4d4eb67a + last_write_checksum: sha1:3e93f1c842d02a3435ab584686f216504d80c33c + pristine_git_object: 3201615afc1f8c9c29d2f5eca5cecfb6ae6eae94 + docs/models/standardjobstatusresponse.md: + id: c58a965ba650 + last_write_checksum: sha1:87004f6791e8e4c39880b8b3aad1e52fdf3263be + pristine_git_object: cc01e51952e9920d15be58c496f6dc7ba966ddf8 + docs/models/standardjobsubmitresponse.md: + id: 1f77f63a8265 + last_write_checksum: sha1:21b20bf896609c951f5e0e787d8bf137c313c3b5 + pristine_git_object: c94421a795d2d313bb9c9656ca404ac52f707f4e + docs/models/submitgraphqlbulkqueryjobresponse.md: + id: 9a4e3e6dd7d8 + last_write_checksum: sha1:95ac70b4156a9d39f1392effefdb1b6209343c70 + pristine_git_object: 1b27bc49cb054be4638fd631ef051d40ebaef673 + docs/models/submitgraphqlrequestresponse.md: + id: 999e253c505c + last_write_checksum: sha1:3225f58018c0802c22bdae60b9eb2b4ece32787b + pristine_git_object: ff4bef56a2af36d1d388935c68657b779b7df76b + docs/models/submitrestrequestresponse.md: + id: 60d556bb3987 + last_write_checksum: sha1:0204ed87b5cfe6202fcb8af162f5facdcb3182d0 + pristine_git_object: 5dc3ca80fad486eec118a2b17b65e8c761ada25b + docs/models/targetingendage.md: + id: 5c67533ce782 + last_write_checksum: sha1:7b0b7c9d53dbed88a88619bf8f8ea33d4b42f890 + pristine_git_object: ee43803a7cb61eb8de4576e9efcdcd1d4e391d67 + docs/models/targetingendageinput.md: + id: cd759b7dc378 + last_write_checksum: sha1:b23cff533ef55c67909dc2da8b96f32242de0ee0 + pristine_git_object: 7bc5f1c8f593786c145f3912f2dad373fc25c05b + docs/models/targetinggender.md: + id: c8fa025f62b2 + last_write_checksum: sha1:d6bc5b7bfc73105d45c73566da6daf5ea224081d + pristine_git_object: 999667d8f7a77ded5ac89f91fc72eac17235d4e6 + docs/models/targetinggenderinput.md: + id: 511c9047de4d + last_write_checksum: sha1:085762f9136d959f094dbea632220ed03afd9824 + pristine_git_object: 9a0a21587f944315499ae4b1e9c5b383e5931c41 + docs/models/targetingstartage.md: + id: 0e54e1f6bc28 + last_write_checksum: sha1:13dc803a6bcf2b9b37d540912f05ce4bfb9b3919 + pristine_git_object: 7b9455eed12c1822a12864a84172f8b7db5af0cf + docs/models/targetingstartageinput.md: + id: 95835dc49cae + last_write_checksum: sha1:5f8388fdc4e3a0224e22f630ddf8a90c5f6db1af + pristine_git_object: 710fc038e352b62e2d1bd9857f9a7ae12de806a8 + docs/models/thirdpartydatainput.md: + id: 1fb78ab4ddaf + last_write_checksum: sha1:d061d1773d65ee1c912ff1cc3eb1701b708edcee + pristine_git_object: 28a02691c41997e81ea927d60620d2ba9d0aa316 + docs/models/updateadgroupresponse.md: + id: 3dbcab5e1ec2 + last_write_checksum: sha1:13f8c43e53e5e974a2a576ca82482f464cfb1c1a + pristine_git_object: 56332e23ef7ccfdb74dee12c83e9377cf6b2d62a + docs/models/updateadgroupsjobresponse.md: + id: 6ccc073485bc + last_write_checksum: sha1:222810433e6a4ce098fb9f314c7ac6d4d02bf27b + pristine_git_object: 07565fb9a443785ec7203417bfa2d6ee769c235a + docs/models/updatecampaignresponse.md: + id: f288f2976c29 + last_write_checksum: sha1:2515a0470210d5c1f4f1d7cdd7ffae1fa0dba25b + pristine_git_object: 62ffcb9e42a332cfd64b25ef39a66e3a667d4626 + docs/models/updatecampaignsjobresponse.md: + id: 0cab9a2de927 + last_write_checksum: sha1:9f4dd348c88f5b99d5a028e83dccef0d3d2ca724 + pristine_git_object: 3ca81ac92bf0664c3102012ea1c353aaf1e2750c + docs/models/utils/retryconfig.md: + id: 4343ac43161c + last_write_checksum: sha1:562c0f21e308ad10c27f85f75704c15592c6929d + pristine_git_object: 69dd549ec7f5f885101d08dd502e25748183aebf + docs/models/workflowcallbackinput.md: + id: 38b78069e12a + last_write_checksum: sha1:fa27f48671c6b4665b47466352f0dac9ae51d139 + pristine_git_object: 88e0f8222a73cb4f8c5326a7a162d8565edc5103 + docs/models/workflowstatus.md: + id: 9c0d61d3ce80 + last_write_checksum: sha1:a07db3419526e6a30be49b847998588a5486223f + pristine_git_object: 7912f012f66047745b1fd8c23f828ee88dcb2f4e + docs/sdks/adgroup/README.md: + id: 8e0c2412ebea + last_write_checksum: sha1:6d5149aa2ff47ca8d7f4302360494056a5f882db + pristine_git_object: 322b3867608edf337ac2f2b1a078c72d1646e402 + docs/sdks/adgroups/README.md: + id: 59faf627531f + last_write_checksum: sha1:f87667dc5ba4227b5451bad60121e687291bb58b + pristine_git_object: 3c1dfd9acfb1930e485b0f613bcd3fcda43a259b + docs/sdks/campaign/README.md: + id: 7c44530e0eca + last_write_checksum: sha1:be7631676d51f0e858f26635e65fc1d82043fae1 + pristine_git_object: fa7d251142cb44fcd1e5b734be33cee52ee110fd + docs/sdks/campaigns/README.md: + id: 18dcc3c717ca + last_write_checksum: sha1:ad50395c8a58fc1ba6f7df94879a62530115e707 + pristine_git_object: a0e5eeb05730cdd3b903eae3038405976fdda779 + docs/sdks/dmp/README.md: + id: 0b076a846392 + last_write_checksum: sha1:18c2d44f02be88b3217e983c72234111169486d7 + pristine_git_object: 18284c8f23620930e04c627f6b11f3efdbfe70e6 + docs/sdks/graphqlrequest/README.md: + id: 052d8a84b2ef + last_write_checksum: sha1:34e25da0e2893e8546e100f7dc71ad363476d15d + pristine_git_object: e37d5154be25c52c7a1c86c486c087a396deedff + docs/sdks/jobstatus/README.md: + id: eedaaa6caff4 + last_write_checksum: sha1:b8cc3605e3ad31fb2ed4e7294a4d026fb709c684 + pristine_git_object: eebac6006f2ae35bcdae256b8dffe345943f0361 + docs/sdks/restrequest/README.md: + id: 241b82b286d0 + last_write_checksum: sha1:dfc3131919e4910db3a9623d208f1d4535f39597 + pristine_git_object: 5f4a27ec10fb60110be9ae2e07f7794a761b1d7b + poetry.toml: + id: a81ade82122a + last_write_checksum: sha1:2242305e29dc6921bdf5b200aea5d4bf67830230 + pristine_git_object: cd3492ac9dc870fdcf23dbd94fd1d40cc753cc8e + py.typed: + id: 258c3ed47ae4 + last_write_checksum: sha1:8efc425ffe830805ffcc0f3055871bdcdc542c60 + pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544 + pylintrc: + id: 7ce8b9f946e6 + last_write_checksum: sha1:db2aebd83e553dd59d3965e79104a3fb780c403a + pristine_git_object: e8cd3e85682cd3d489cf3c5be75a0563d0c9f4bf + pyproject.toml: + id: 5d07e7d72637 + last_write_checksum: sha1:763036aa5776d1d41a1cfbe3038fa7745d7b9d10 + pristine_git_object: cffaebdea89b8110e762a8ef0ceecd9fb6907155 + scripts/prepare_readme.py: + id: e0c5957a6035 + last_write_checksum: sha1:9eebd27076f34cee181d36379e4102aea070e45f + pristine_git_object: 9984eb5de2723845ca9156286b65f559611a72a8 + scripts/publish.sh: + id: fe273b08f514 + last_write_checksum: sha1:b31bafc19c15ab5ea925fdf8d5d4adce2b115a63 + pristine_git_object: 2a3ead70ccc6228cbae1c5c8a319b1399f3804ea + src/ttd_workflows/__init__.py: + id: 37fa7e7bcf8d + last_write_checksum: sha1:36306d1d404b6aeb912d27f1d9c52f098ff7bf9b + pristine_git_object: dd02e42e4cc509dc90e6ae70493054021faa5f9c + src/ttd_workflows/_hooks/__init__.py: + id: 30a4bbfa92ec + last_write_checksum: sha1:e3111289afd28ad557c21d9e2f918caabfb7037d + pristine_git_object: 2ee66cdd592fe41731c24ddd407c8ca31c50aec1 + src/ttd_workflows/_hooks/sdkhooks.py: + id: 028dbe6bef03 + last_write_checksum: sha1:435ef5f7f2e00136ac4423b054cc9cecc9d311e6 + pristine_git_object: d3568b1440cdca3099dfeb1c978963fdf3839f5f + src/ttd_workflows/_hooks/types.py: + id: e9c2fb642463 + last_write_checksum: sha1:908c80d17eb37a017f9e0a225525b2e9f0c16489 + pristine_git_object: edb32b587a8e40342f5605ed44e58c527d021a39 + src/ttd_workflows/_version.py: + id: 5664ebff5b6e + last_write_checksum: sha1:b5b44f227892de93990ac9dbe5166c4365f9b41c + pristine_git_object: 9e00d54b5e4a8b14274c6ae8b88eef08f5aa5cff + src/ttd_workflows/ad_group.py: + id: 3439b8a7a7f1 + last_write_checksum: sha1:a3b8f41e47f0d0352c3a0d20dbd5152f4a76e55e + pristine_git_object: fdeedbb401161df59339335d332ffa2a75de8682 + src/ttd_workflows/adgroups.py: + id: 62ea0669755b + last_write_checksum: sha1:7c6a3122b59554a4b6468194594ae77716992866 + pristine_git_object: a70baa2a82292bebed79b28042bed192cfb1b420 + src/ttd_workflows/basesdk.py: + id: 55f3edb5df65 + last_write_checksum: sha1:2fcfab6212bcccde5399843f970c4da4263d80b2 + pristine_git_object: 8421abf1b743932e3a93f8e9f7689e2c9c444b2f + src/ttd_workflows/campaign.py: + id: 2b62a5a8a7ac + last_write_checksum: sha1:625ca65fac88d026215e43f87b8b66f2f328776b + pristine_git_object: 09329a29954f0da003d310a6f39c04791e081f3f + src/ttd_workflows/campaigns.py: + id: 5180186cb0b6 + last_write_checksum: sha1:057cb3ae782110b1ec7c0014ff59d0f52d3626cb + pristine_git_object: 0b36db67ce9c413a43404c8811b736f039694bb0 + src/ttd_workflows/dmp.py: + id: dbdcabfaa6cf + last_write_checksum: sha1:455cde0eb7b52dc8144c71ebdef2f7a91feff4ba + pristine_git_object: b006f4bd5f5739a120a0efe6247d748722508ae8 + src/ttd_workflows/graphql_request.py: + id: 7f5875407e46 + last_write_checksum: sha1:fe597e72d7b1a5b3edb77308d9a863766ce96654 + pristine_git_object: a4d3cae072ffddf8fcdb795b4509312fab882426 + src/ttd_workflows/httpclient.py: + id: a7dee5e78769 + last_write_checksum: sha1:5e55338d6ee9f01ab648cad4380201a8a3da7dd7 + pristine_git_object: 89560b566073785535643e694c112bedbd3db13d + src/ttd_workflows/job_status.py: + id: 3843e125bd67 + last_write_checksum: sha1:2ac8f930a6bdf557cdc64060626acd574ae7a5b9 + pristine_git_object: 6cef2ff6514a7fc0486e9aed33ca2aa80d6b87ac + src/ttd_workflows/models/__init__.py: + id: 79eeb27997ee + last_write_checksum: sha1:ea7de4b87ed3073ee2b321344a2a3041b9deab5a + pristine_git_object: ab99a27869859ef671734de37ecff9c6cc02f42a + src/ttd_workflows/models/adgroupassociatebidlist.py: + id: fd552d2c7596 + last_write_checksum: sha1:e2e2db9c3f800d3b5b4874371376853fa8a7782d + pristine_git_object: 7d905c6b83fc5e4342c2849d4b64d622c2acc043 + src/ttd_workflows/models/adgroupaudiencetargeting.py: + id: 2c7a7571c224 + last_write_checksum: sha1:6b89b8b9c591969d7c650876fcce93884798a4a5 + pristine_git_object: d233e50c08ff364a8b06894d0d08b25216373ba0 + src/ttd_workflows/models/adgroupbudget.py: + id: 78a6e36bb4a0 + last_write_checksum: sha1:325fbaecca0bdabaad4e4e01277f57ef8fdacece + pristine_git_object: 1f446252c0a0add21f6f887bea9f8807650c6007 + src/ttd_workflows/models/adgroupbulkcreateworkflowinputwithvalidation.py: + id: a43348a207ee + last_write_checksum: sha1:6f8f6a3917bb5901573897213fe07634d3a1e479 + pristine_git_object: bdf71fbb6697444827e050eee1487822e9006f3a + src/ttd_workflows/models/adgroupbulkupdateworkflowinputwithvalidation.py: + id: b7928a844b68 + last_write_checksum: sha1:2e16980d52f10b66e89f2fd212b9527b97db5e17 + pristine_git_object: beaf7f9ba53db8bf94812dfaf9e7f7593432595a + src/ttd_workflows/models/adgroupchannel.py: + id: 3c36b67d3f30 + last_write_checksum: sha1:c2702cc960bdd0a1ac7de38b29a3ee5146835c2a + pristine_git_object: 6997af84f0e7c95c745c8f79e8e5cc63177d883c + src/ttd_workflows/models/adgroupcomscoresettings.py: + id: 333cc2bc2bb3 + last_write_checksum: sha1:c5f707a9211784b6f6949d6f29c5e5b695906d23 + pristine_git_object: 51561f7ae1ad0e6beae4d8d32650f1f6f00dda6d + src/ttd_workflows/models/adgroupcontracttargeting.py: + id: 188439a1dd24 + last_write_checksum: sha1:694d0439646973298bc9085c860b245ee4f56103 + pristine_git_object: 6e443f17a98988146663fbd8f6f7650217d3fdfb + src/ttd_workflows/models/adgroupcreateworkflowinput.py: + id: 3d58bfa5afd9 + last_write_checksum: sha1:6ea502cb308d5303ba3bb0d2e6932a0fb5f598d3 + pristine_git_object: fa8e284e0ade325ce736d1863f44fb7f0a7c3a2a + src/ttd_workflows/models/adgroupcreateworkflowinputwithvalidation.py: + id: a4db208b2e19 + last_write_checksum: sha1:8d30eb02c6fcc1a37d941d6789b09eb1d14f4d07 + pristine_git_object: eb2b8747927601529c65b02ae116e41378f6f540 + src/ttd_workflows/models/adgroupcreateworkflowprimaryinput.py: + id: 6f4df950ef19 + last_write_checksum: sha1:dd3d44c4616c990ae5e060e57c00a11014fdbc49 + pristine_git_object: e4a054d86e78d02029303c16aebb9123ee38dd5f + src/ttd_workflows/models/adgroupflight.py: + id: a6188bc550f0 + last_write_checksum: sha1:4012782300c0b8b4a7062687846e96cfd38b089e + pristine_git_object: c92331cdee08e0e3bd122ba2d38cd8bae614f77a + src/ttd_workflows/models/adgroupfunnellocation.py: + id: 26b4f40bc27e + last_write_checksum: sha1:78d81225966e8d0978f257a88f08560469312031 + pristine_git_object: a018d7aca83351f2aac4594a6c05118fa1ae80d9 + src/ttd_workflows/models/adgroupkoaoptimizationsettings.py: + id: fdbafd7aed1c + last_write_checksum: sha1:9094ddf385417d5fd533413885e8663c20f9759f + pristine_git_object: c0a0f1d0ce138155d782014e4006fbfaafeec1fd + src/ttd_workflows/models/adgroupnielsentrackingattributes.py: + id: c09071aa9963 + last_write_checksum: sha1:d64f3ebdccd04e174370ef15763b901e3ae6a7c0 + pristine_git_object: be48d65f6a070dae8e0d979097ad4882a0d5808f + src/ttd_workflows/models/adgrouppayload.py: + id: 1982a1b3f0b7 + last_write_checksum: sha1:1fdb345888836c98b83fbaee9c130274ce60a2a7 + pristine_git_object: 881cad691f95d6d26f8018e390cc2e502de43bc5 + src/ttd_workflows/models/adgrouproigoal.py: + id: 11f4184dd4f9 + last_write_checksum: sha1:8e67b6201ab7facc4d65ff61695a073c10f90776 + pristine_git_object: 94db10ad9a885e5368ab5df3e457ec12b3bf0812 + src/ttd_workflows/models/adgroupupdateworkflowinput.py: + id: 42086610c07f + last_write_checksum: sha1:975310cb3e3e126ead34f142f9b6b2aca662c576 + pristine_git_object: ad544288a2eb26d7ddc990ba4eef3233c71f3c88 + src/ttd_workflows/models/adgroupupdateworkflowinputwithvalidation.py: + id: 1b71413926b4 + last_write_checksum: sha1:97384dba047bde7407a776690983d26b3ddaf52c + pristine_git_object: b197218143a2d0adb544e0bf7cd0671578e5d4f2 + src/ttd_workflows/models/adgroupupdateworkflowprimaryinput.py: + id: 2baa60fda196 + last_write_checksum: sha1:ad378ad0d49f619a08350f5b13eeed630304c8d3 + pristine_git_object: 650fcb6d1b592ed6a0c5594c3dff426c62ca36de + src/ttd_workflows/models/adgroupworkflow.py: + id: e14b9169793e + last_write_checksum: sha1:4cd3d29a7fc50cc9d3d6ae84bbab0d4561eee690 + pristine_git_object: 4b4d4261fe864afd105932b3b674bb2431bbe373 + src/ttd_workflows/models/adgroupworkflowadvancedinput.py: + id: 39de78598924 + last_write_checksum: sha1:ed76e9df80fdba419e91cba97b0d4236159847b5 + pristine_git_object: 9f5379ed3eacd84ff6966a37c29a9114bfbf9bc3 + src/ttd_workflows/models/adgroupworkflowassociatebidlistinput.py: + id: cb4382ec9111 + last_write_checksum: sha1:e7342fc1bc27a612e23d041c7eb50a88133d6854 + pristine_git_object: cfec3ee64846f2f0260238e6729a43962b691407 + src/ttd_workflows/models/adgroupworkflowaudiencetargetinginput.py: + id: cd2a04bd8d31 + last_write_checksum: sha1:97005b068944d35d2100b568afd2adde5efabe94 + pristine_git_object: 6066207b0e4fbf9c093f587356affd7745541e16 + src/ttd_workflows/models/adgroupworkflowbudgetinput.py: + id: effa54a3eb73 + last_write_checksum: sha1:fc3d01f7670a6c5104bdfbdb74be02b4110d55b1 + pristine_git_object: 1ec69e8373acda21dbde1cb07612d32ac89137ff + src/ttd_workflows/models/adgroupworkflowcomscoresettingsinput.py: + id: e7d8b7a0048e + last_write_checksum: sha1:766c840ba26ddddee2c56e1caccfe03db41a6a94 + pristine_git_object: 1c7414d2b9158983fecf3515e66afae7aba8085c + src/ttd_workflows/models/adgroupworkflowcontracttargetinginput.py: + id: e66cb60de9ec + last_write_checksum: sha1:baf9557a8fa735ee44688d6d08e43e68b7e83f35 + pristine_git_object: d70ec64a1d58b1d7d565fb44497c2dfe5d56b4b8 + src/ttd_workflows/models/adgroupworkflowflightinput.py: + id: 907aeb057a55 + last_write_checksum: sha1:b6a1020b8a7b64d2dd4c5ce85af67258e35adf46 + pristine_git_object: 58e72138c106e0acb80c3ed7e464a87042e4dd0e + src/ttd_workflows/models/adgroupworkflowkoaoptimizationsettingsinput.py: + id: 531e306555b9 + last_write_checksum: sha1:95e3023117947421553ede522bb36a6af25bef81 + pristine_git_object: c485a775c0948acfd59390c3478132e1168a8cd8 + src/ttd_workflows/models/adgroupworkflownewfrequencyconfiginput.py: + id: 9285801b6c97 + last_write_checksum: sha1:685187d5455fa33c28922eb012e713d8fa6e7b14 + pristine_git_object: 46f598d3db1cdd8861b879247028599135c6a2ad + src/ttd_workflows/models/adgroupworkflownielsentrackingattributesinput.py: + id: b8de2185d88c + last_write_checksum: sha1:5418ccf6aa24b32df8ceaf657fe0efee08557513 + pristine_git_object: 0d199f6f81d65eb5070ef246b8161324c7a40e58 + src/ttd_workflows/models/adgroupworkflowroigoalinput.py: + id: 2ba6148a555f + last_write_checksum: sha1:c096dc9f70cd1ec793008e57fccf87e91daa3bc6 + pristine_git_object: 3b2b405fb59077ba6d7a30f6777f350ce10bf199 + src/ttd_workflows/models/allocationtype.py: + id: 525c597c17c7 + last_write_checksum: sha1:8689d34ca6c9b968c6d6b0dcb5e56c3feaf2a94a + pristine_git_object: 4030ddef25d8fb4ed93e64e6da655b0f36593cae + src/ttd_workflows/models/apierror.py: + id: 66037c91af44 + last_write_checksum: sha1:d81017ad03736594b4ee1031359751ed5e13dcd4 + pristine_git_object: a3b3606a38f937ee6cc4bf786acc41656d982635 + src/ttd_workflows/models/archiveadgroupsop.py: + id: 7f2bf9bff7b0 + last_write_checksum: sha1:1fe2129ea98c06991a5a62f339e079c903aaaa20 + pristine_git_object: 0857e6a678c888e06a873ddf7066826df8034f64 + src/ttd_workflows/models/archivecampaignsop.py: + id: 6eaaf71ad5b6 + last_write_checksum: sha1:35d70ce6ed2cb3e1b876f1302848859b89c73852 + pristine_git_object: c266627d6dbb475244501260ae33796e2fe359b7 + src/ttd_workflows/models/bulkjobstatus.py: + id: 9d4006edca0b + last_write_checksum: sha1:c80b6236f751282b33e2b994f58ce40696ba5c70 + pristine_git_object: a9c53878d8ed5668fbc10595eb10118a277bfaac + src/ttd_workflows/models/callrestapiworkflowinput.py: + id: c309cbbfbcfa + last_write_checksum: sha1:45150d11e45d10e1145a97000c69fb3770f2c653 + pristine_git_object: e676bdc44dc916462d58a39ae3e5775dc24d088a + src/ttd_workflows/models/campaignbulkcreateworkflowinputwithvalidation.py: + id: 5e577e2ed813 + last_write_checksum: sha1:898d1baa1dc06751b44fda50666ec5226ae8fe33 + pristine_git_object: aa6fa3cea50d3606358491648c7c38fb731832fa + src/ttd_workflows/models/campaignbulkupdateworkflowinputwithvalidation.py: + id: 7c69aed5ecbb + last_write_checksum: sha1:02d8f4cfa35d2787300e202325b30d7ed0583da7 + pristine_git_object: 7c6861348b2795ccbbd0c196603d314f40454a28 + src/ttd_workflows/models/campaignchanneltype.py: + id: 75619726aed9 + last_write_checksum: sha1:f89c055d4278e97d531e07e669f561759f9b6ad0 + pristine_git_object: 2059f3bdcf6250bd517d40105b0aa8eb76f7048c + src/ttd_workflows/models/campaigncreatepassthroughfeesinput.py: + id: f16c2f32b780 + last_write_checksum: sha1:ce0af89bfe8ee6340c16c40ec07a43086f1a81cc + pristine_git_object: 7217d6e23971ff71bd5a3229daf24fe5fe7456eb + src/ttd_workflows/models/campaigncreateworkflowadgroupadvancedinput.py: + id: c4f55606911a + last_write_checksum: sha1:9147303917dd006a52ba7236f933ae181ae65efa + pristine_git_object: 7ca4bc56c9c5b195b68b55506fedf9820acbfa59 + src/ttd_workflows/models/campaigncreateworkflowadgroupflightinput.py: + id: e1434368f629 + last_write_checksum: sha1:4a87f5fe90a86927ed0bcd6d5119c2a77770d285 + pristine_git_object: 0f44994cd63db9319cf4d5fbccead0f62b437ce3 + src/ttd_workflows/models/campaigncreateworkflowadgroupinput.py: + id: 0e4e51f76cf7 + last_write_checksum: sha1:04b4046980a1a8a6a285622e673903dd07923ba7 + pristine_git_object: 0019944a5df027407c625192728c704081974284 + src/ttd_workflows/models/campaigncreateworkflowadvancedinput.py: + id: 31aac1e8c1b6 + last_write_checksum: sha1:01d28c5eda1ac65c22291691783ec97fefd50510 + pristine_git_object: 1d67f54ca024bb0905d2d4918a4a21b2a74af011 + src/ttd_workflows/models/campaigncreateworkflowbudgetinput.py: + id: 1baf6a3c9814 + last_write_checksum: sha1:19e199759db5b667c74b6b8bf7d7a73b8d5db70c + pristine_git_object: 1a24b96356eee1aac184c0c9cfa0042955a39809 + src/ttd_workflows/models/campaigncreateworkflowincrementalreachcampaignsetting.py: + id: 62042a96c1c8 + last_write_checksum: sha1:1209dd2429f2393f983cb3031576aa180d18e99c + pristine_git_object: ba8fbb4f5f64dc116fbba04cfcdd2d52f83862f4 + src/ttd_workflows/models/campaigncreateworkflowinput.py: + id: 7380efadfa40 + last_write_checksum: sha1:f0d1ddf529b1390b188ec97dde5bc2a0c0681455 + pristine_git_object: b81c29085fcbc5af2bf71eaafec54f08f5cb97ae + src/ttd_workflows/models/campaigncreateworkflowinputwithvalidation.py: + id: 559c214c17f9 + last_write_checksum: sha1:00464d350c357e1a124ab4b8cfeb54bdeeac5d9d + pristine_git_object: 80cf1ec01b5c7b120e9bfafabc0d8f225536fb44 + src/ttd_workflows/models/campaigncreateworkflowpassthroughfeecardinput.py: + id: f81a27744bc6 + last_write_checksum: sha1:43e72a138005f0db81da8d8356db42a7a525341d + pristine_git_object: 8e3cb91113c812ef3824a5f0750f67d50a116b06 + src/ttd_workflows/models/campaigncreateworkflowprimaryinput.py: + id: 0a6a6cd0eca9 + last_write_checksum: sha1:38ba560bcbc004005e89b519811816497cd64cb9 + pristine_git_object: 37c293bdc05b56bc0af5d58bf161b901bd8c8ab4 + src/ttd_workflows/models/campaignflightworkflow.py: + id: cd6a7f67b15e + last_write_checksum: sha1:6642882b3150ccfa364b751e5afa829dcbd9c002 + pristine_git_object: f4cbe45bd406dfc91b9bbab5e3aeb66becc67105 + src/ttd_workflows/models/campaignpacingmode.py: + id: e67cab654322 + last_write_checksum: sha1:569ddda0112f7f2a3b68a1bfa2e84ee07e4d223c + pristine_git_object: 023ebce053bb4079ae14c34e7b5b0d328fb47d05 + src/ttd_workflows/models/campaignpayload.py: + id: 216eeccd225c + last_write_checksum: sha1:cc581a589a28f1d8b1989e252588d05fbd84a69e + pristine_git_object: 82c6bca5621796e4a49a74d601abb9118b6fdec4 + src/ttd_workflows/models/campaignupdateworkflowadvancedinput.py: + id: c1f013a260b9 + last_write_checksum: sha1:2af826aa1f0df4c5f638d0d27fc5967153fe32f8 + pristine_git_object: 14b36c8490d46f6c228babd3dbee5c73b3816815 + src/ttd_workflows/models/campaignupdateworkflowbudgetinput.py: + id: cd9d94fc94fb + last_write_checksum: sha1:8bf5b8cefb01d3383a905f3573eb607cdd1f071d + pristine_git_object: 92bec02952e5faab8bf8d84d10efbc9f4a897775 + src/ttd_workflows/models/campaignupdateworkflowinput.py: + id: bf279a672f4e + last_write_checksum: sha1:aaf28d8dd1ef313f31e4a2a5cb6f2345fb112cbb + pristine_git_object: 4fdce93f6d0129a09f3d5256228499e649d6d9f2 + src/ttd_workflows/models/campaignupdateworkflowinputwithvalidation.py: + id: 48a691cf5237 + last_write_checksum: sha1:0481085437e44236acbc35eb0f594ae68d1268a4 + pristine_git_object: 10db98880405c09c27d4ffc5b7c2863d07e85e56 + src/ttd_workflows/models/campaignupdateworkflowprimaryinput.py: + id: af32a9977531 + last_write_checksum: sha1:150eab289c01bc959d16b80a89f6684c5e554f96 + pristine_git_object: fdbf49848b0f8188870aa7893188b3003ef28b53 + src/ttd_workflows/models/campaignversionworkflow.py: + id: ce1c3fd7af89 + last_write_checksum: sha1:fe18d87928ffc0868332691bd8e132d90f60462e + pristine_git_object: 5a95df57d93659c6931559dab881852a5842e6f8 + src/ttd_workflows/models/campaignworkflow.py: + id: c33cbf9627a5 + last_write_checksum: sha1:ec119ff55c154a19926a358b03b5a9becaf95562 + pristine_git_object: 48a44ef956d686aca67813892e3ecb925e981d74 + src/ttd_workflows/models/campaignworkflowcampaignconversionreportingcolumninput.py: + id: e9fe6e934c12 + last_write_checksum: sha1:df77ff3bf83f90a7eabf6b9ec84aa4a348c0f3fe + pristine_git_object: 45ab09cbc3c82676ffb934736ccf93ef1fc08d60 + src/ttd_workflows/models/campaignworkflowflightinput.py: + id: cd53d2726084 + last_write_checksum: sha1:b44885abeb7460c962f7e73c1b21fbec505090bd + pristine_git_object: f2bb7cf9b88f784a48308bcbe612067b464a97df + src/ttd_workflows/models/campaignworkflowroigoalinput.py: + id: 09b998234a37 + last_write_checksum: sha1:e0df6b8d138adcc5918458656ff53cff72755ef6 + pristine_git_object: 0913d65072d6afed76df4f636adb07fe2d02be37 + src/ttd_workflows/models/createadgroupop.py: + id: c1f8606dbd97 + last_write_checksum: sha1:64c7309b3ead922c35d1d0eac8d6ba4635c3cd10 + pristine_git_object: 1b924bd21009a3906d72079fd95363c34097b01b + src/ttd_workflows/models/createadgroupsjobop.py: + id: cf0cca6ca73b + last_write_checksum: sha1:ef10c7b5a428e4cd3ad9ee07cab5518338768e67 + pristine_git_object: e7957d3dec376fb1af08b2025b22c164bb48dbc5 + src/ttd_workflows/models/createcampaignop.py: + id: 6f71204b35b2 + last_write_checksum: sha1:8596a410ff2d4360633afa17e6b03fc2235a1df6 + pristine_git_object: 9465b8bc5664a09d5d0f63fe4bd3815483215a67 + src/ttd_workflows/models/createcampaignsjobop.py: + id: 2be2408ce02b + last_write_checksum: sha1:b0d109f5cc18faee30a17a1fe5fbc2eabe994210 + pristine_git_object: 368edd46c6430567e1a136bb21fa9d06e63121fe + src/ttd_workflows/models/customcpatype.py: + id: b25b19e6d115 + last_write_checksum: sha1:734ccc926884bc12052e9cdbe9ada3dbaad49194 + pristine_git_object: ac2e97fbfeae2aa6026819650560e86c8ca7f68f + src/ttd_workflows/models/customroasconfig.py: + id: 22fab2b6d459 + last_write_checksum: sha1:15d59841ae94c1f8270049f5efd29488277367e8 + pristine_git_object: 91802536a3eb2e2a4332c6d1c022a607cbaec5ea + src/ttd_workflows/models/customroastype.py: + id: b50f3660ee27 + last_write_checksum: sha1:2509fa5ecd7dce85a657745d08e3057ab6f78a64 + pristine_git_object: 697c20a08fa87993d2b452d2cfe782acf81b404f + src/ttd_workflows/models/dimensionalbiddingdimensions.py: + id: 70ec768eb560 + last_write_checksum: sha1:f6ddc67e45c09c64383f31eeb80bc07452fd5b2b + pristine_git_object: 70ac2386f7dcd50aefeea8efc0974317c2f073e9 + src/ttd_workflows/models/enhancednielsenreportingoptions.py: + id: 338efb6136c0 + last_write_checksum: sha1:db2f41e1274f3aa891843164c4858ad4c9c2cfaf + pristine_git_object: 6ea151a1fe0221ae03b8a6cb56ec6f2adf792b91 + src/ttd_workflows/models/enhancednielsenreportingoptionsinput.py: + id: acaacede98c2 + last_write_checksum: sha1:e9fe6dcf88ee71e576f64b8fc2abcae7861b22fa + pristine_git_object: 8a011e38b4f839c1a820ca8a49a53e61bf26cc80 + src/ttd_workflows/models/firstpartydatainput.py: + id: 3b48af5975f9 + last_write_checksum: sha1:3d7dedb630a719af97ac0f0f29194a493646fe9a + pristine_git_object: 5c4cfc6bd25b7a121ce4d6a93f3711a9afb15a6e + src/ttd_workflows/models/frequencyconfig.py: + id: 47fd578f370e + last_write_checksum: sha1:8835e5b0d83a0bd3d07841d1a8914bce286577f3 + pristine_git_object: e135c6f2dd8d956dd2c744047da8cf5cc15f9943 + src/ttd_workflows/models/getcampaignversionop.py: + id: 235842ca615d + last_write_checksum: sha1:781c452fa6b981e4b0befec14fb951f6ad43150a + pristine_git_object: fca5aa7e774f4e80c37e4fad1c57ab2dfbed2044 + src/ttd_workflows/models/getfirstpartydatajobop.py: + id: 14c24bd398dc + last_write_checksum: sha1:6a17a8e00ec4d133570ea66ab1619fcc933b12ac + pristine_git_object: 90d3a300e1782a20992f69e45fa4b5d6d656a3ef + src/ttd_workflows/models/getgraphqlbulkjobstatusop.py: + id: e612ef0fab1b + last_write_checksum: sha1:22e3688910547588b8a3ba93ce8bb6e171a57375 + pristine_git_object: 604e40dad0a7cd825cb8fa4d79dfc884cf8412c4 + src/ttd_workflows/models/getjobstatusop.py: + id: a40cfdbd2d70 + last_write_checksum: sha1:1ec778385ebbd7b6b4574f02cd598d1afa470bc4 + pristine_git_object: 94c924684cf345178ffd5129da9fd21605fceec9 + src/ttd_workflows/models/getthirdpartydatajobop.py: + id: 89506fde69b2 + last_write_checksum: sha1:a78930600658634b7e970d2c42e38a61414aa814 + pristine_git_object: 00dcc598067658e8a959584c5e0cfcd0e013b443 + src/ttd_workflows/models/graphqlbulkjob.py: + id: 978f79e87f32 + last_write_checksum: sha1:2c07785c45dd8ecd602978b8863ed0b413607012 + pristine_git_object: 755af97f84ecfb2de5f3baf7a06bc961656c4993 + src/ttd_workflows/models/graphqlbulkjobcallbackinput.py: + id: 90e4e1b44d95 + last_write_checksum: sha1:230c3f50bfb2011527d761edc674035162019c26 + pristine_git_object: 266483330cf14f20f2c07460798b7c4fc9e60e9f + src/ttd_workflows/models/graphqlbulkjoberror.py: + id: c1a0ff0cff9a + last_write_checksum: sha1:47760e936f97d60e1837cd895ca5308597610003 + pristine_git_object: 40523a44c3d74d8d45202ecedf6e78664637624a + src/ttd_workflows/models/graphqlbulkjobpayload.py: + id: 8ca19bc0ef4e + last_write_checksum: sha1:5b63d073d7d00c908c48d14c18cc9c620186ecae + pristine_git_object: f4593b12a8b32dd7cc1b6445a8caec8c2892e260 + src/ttd_workflows/models/graphqlbulkjobresponse.py: + id: 852324944b1b + last_write_checksum: sha1:94d2109e40468172f62e0a3b009f647ab8f450f3 + pristine_git_object: 0316f6ddc7eadbe8bd69939a06aaf5a130310cf5 + src/ttd_workflows/models/graphqlbulkjobretrievalresponse.py: + id: bb30565d22b5 + last_write_checksum: sha1:c84e5e2d624c573110aa2bcf48adbeed665eef6c + pristine_git_object: 329d6e4caef488c087c2901e6ac443ae2c833eb2 + src/ttd_workflows/models/graphqlqueryjobinput.py: + id: e13a824ad40b + last_write_checksum: sha1:20dc2b6e1f1b0de13b7f9bfe080fef0cbd23f2b3 + pristine_git_object: 46600aff79e48e70d386dd6968be1b0e416a873d + src/ttd_workflows/models/graphqlrequestinput.py: + id: 2d82a130037e + last_write_checksum: sha1:5ba4d492b230489e11edc052cbc3bcc616889c29 + pristine_git_object: eed81b25c0ab057c38bdd47471f8ec4c12d62f39 + src/ttd_workflows/models/httpmetadata.py: + id: 32a0fd5b6d21 + last_write_checksum: sha1:ac8dea94ccf520c3f50465ab4dd0288725db2a19 + pristine_git_object: 59aa79175681ead334ea4af7d0ea0ab8adebba39 + src/ttd_workflows/models/incrementalreachbrandinput.py: + id: 94b38bc58a49 + last_write_checksum: sha1:e6193f98845d18f656d94f4dc20d0cd738b866fc + pristine_git_object: cbaf9ce34f3c831f00d7cdd38d0abadd397cfafa + src/ttd_workflows/models/incrementalreachproductinput.py: + id: 0f714afc180a + last_write_checksum: sha1:8d622b2c25402d47328860ee97195200c6338b71 + pristine_git_object: f2c0c9453f5e90e90e379653bee269e1175ea6c3 + src/ttd_workflows/models/keyvaluepairofstringandstringinput.py: + id: 29e351e41556 + last_write_checksum: sha1:5c5dfd2edf5fb93e7508843611c6349ed88135fe + pristine_git_object: 000d2672d8c7c9ec1162f5bcefba40d557f28db5 + src/ttd_workflows/models/markettype.py: + id: 814609c43b5d + last_write_checksum: sha1:87d28a39357fa2472cb38dedbe7bb120b34af871 + pristine_git_object: cdc5e4bd2511fe05956147b6d01a1cb398e9bcd5 + src/ttd_workflows/models/no_response_error.py: + id: 48eaa114e151 + last_write_checksum: sha1:7f326424a7d5ae1bcd5c89a0d6b3dbda9138942f + pristine_git_object: 1deab64bc43e1e65bf3c412d326a4032ce342366 + src/ttd_workflows/models/passthroughfeetype.py: + id: e35f2fb8e90a + last_write_checksum: sha1:181ce6d9e9fded33fbc83bc3b46f16d11e924709 + pristine_git_object: 74b2e81f52fef5900fa028fd9b2b17c10559b2df + src/ttd_workflows/models/problemdetails.py: + id: fc541ceb5912 + last_write_checksum: sha1:09f0da4aca771f27fd455f19bc255200fcc476cf + pristine_git_object: 825de54b31ea141a04ffb5c7962e5f340b034374 + src/ttd_workflows/models/problemdetails_error.py: + id: "325919308502" + last_write_checksum: sha1:75c22fd9571df60523dbe355273177d2cf0a5d1c + pristine_git_object: 51b0e6f1c9c3f3c377e01dc38f5bac2bbf192823 + src/ttd_workflows/models/productlistreportingtypeinput.py: + id: 1f7fcfa4fbde + last_write_checksum: sha1:350a4d71b0f843c84719e512d5935d885d50fbcf + pristine_git_object: bd9f4435e295cc728428a3db9347f4fdc9d1f019 + src/ttd_workflows/models/realyticsentertainmenttype.py: + id: 4359c165dd2a + last_write_checksum: sha1:eee4e5c8fbf1e7c95868ca1c84a33ed5e2a7aa72 + pristine_git_object: 8f23fa054773202c73c6fff8d606442a0ae02acf + src/ttd_workflows/models/realyticsreachsettinginput.py: + id: d4060ac01cb3 + last_write_checksum: sha1:08875eb2db584cb68c0a32ba7dc0f8c5e303a2b7 + pristine_git_object: 5bcb8c911c23cfe335921b7062fbaea8213c72a6 + src/ttd_workflows/models/responsevalidationerror.py: + id: 675fb7eb40ad + last_write_checksum: sha1:d303ac8efad7f58b3cf79c8126f4c6ffa7bff6cf + pristine_git_object: b93c23f13ea2ffac56dc01b9987887cc5f2e2ac9 + src/ttd_workflows/models/restapimethodtype.py: + id: d8e5c2ab4849 + last_write_checksum: sha1:7d69632281e7aacf2d919166756628a1963726ee + pristine_git_object: ada4883079be43ba70e61bb1e385d6caf8a6ee24 + src/ttd_workflows/models/security.py: + id: 0c49d437cd85 + last_write_checksum: sha1:7ffcf8dc3932c2571f2a8effe01cde9b87c8a26b + pristine_git_object: 25d523e33870f952f04b5c526876ecb66724f15f + src/ttd_workflows/models/standardjobstatusresponse.py: + id: 305579cf2199 + last_write_checksum: sha1:099028d7baa0136c7d5e18eefe45f9508eb23380 + pristine_git_object: 5bb68287b143b1b7e06246802a04da51947a0749 + src/ttd_workflows/models/standardjobsubmitresponse.py: + id: 691c38c6973d + last_write_checksum: sha1:eb7283c411ffa196d7fd9a44e142569d33c6ee5a + pristine_git_object: 69f4e3c27937a7987d4a62b84626a243567c2f9f + src/ttd_workflows/models/submitgraphqlbulkqueryjobop.py: + id: a50c2c6d5a6d + last_write_checksum: sha1:49f2186b026caa607dbd9f34bc4feb92fc893a88 + pristine_git_object: 019ba205847d6b47f16004071122b0a6fa836d0b + src/ttd_workflows/models/submitgraphqlrequestop.py: + id: 8d1384031a13 + last_write_checksum: sha1:f8faeebe0cbb01df1325d0dec930ea40a049bcdd + pristine_git_object: 75bba35eda6af9831086feb191515bf39cfa86d6 + src/ttd_workflows/models/submitrestrequestop.py: + id: 0b233054a689 + last_write_checksum: sha1:9db4158b6fe6e5bcbc2f11f3f3b47651354ee1ee + pristine_git_object: 6c5d01c99a8845568118cf7c663f95c24a915539 + src/ttd_workflows/models/targetingendage.py: + id: e82986ad7b1e + last_write_checksum: sha1:e0086e72179dbe1f87fb11d3d46efc2d95dbc468 + pristine_git_object: 100c9212196cb8b6ef93e79a6923de5938b3f770 + src/ttd_workflows/models/targetingendageinput.py: + id: cd299496a4af + last_write_checksum: sha1:f7c5e7e9345ac776950a9d36b2cdb5a5da627244 + pristine_git_object: de4d0365ab2da3dd8dc5d97d70ec000398eb0c1a + src/ttd_workflows/models/targetinggender.py: + id: a9214820387d + last_write_checksum: sha1:7ea391327ca2aa1269939328afe9bc8d1340ecf8 + pristine_git_object: d211a87dbce4f7d653d349162b516e6912a0b422 + src/ttd_workflows/models/targetinggenderinput.py: + id: 169d266df05c + last_write_checksum: sha1:f8a4b320ad4aa4e90ecc8d4bab24d7d2c990a09c + pristine_git_object: 9e5a4b29a6f8eb3f14c2a96be178d70f7ea019c4 + src/ttd_workflows/models/targetingstartage.py: + id: 506d86e1a570 + last_write_checksum: sha1:c5d8b34a7ef0854c691408e56072d95738919d6d + pristine_git_object: 7cabdea54a52cf68c4b69c75ceb1a67ecb74e175 + src/ttd_workflows/models/targetingstartageinput.py: + id: 65c8cf4adef7 + last_write_checksum: sha1:4d909f7eba24b427ba04d45a0202e3ac0f424ea0 + pristine_git_object: 9039213e9cf178ec451d8ffb8453d24f3caeeee1 + src/ttd_workflows/models/thirdpartydatainput.py: + id: 655bb82a1cdb + last_write_checksum: sha1:3a2bfb733615ef03d726d08315dbd10780e20f73 + pristine_git_object: 9f5bcc1dffcfcf659437b1f7c4551538f57f3a82 + src/ttd_workflows/models/updateadgroupop.py: + id: 43ab397b4052 + last_write_checksum: sha1:52494ff3881a6e1c4346698f9ce625f2f3a046ad + pristine_git_object: 4683744a7b48c4b3411f69d206c6454bc9f0964a + src/ttd_workflows/models/updateadgroupsjobop.py: + id: eb6dda6a8a98 + last_write_checksum: sha1:5f2d5eb4e949498f2b3d615ed441b51f25416307 + pristine_git_object: d4a0386e83552b07bf3dbfec072a003f5759bd01 + src/ttd_workflows/models/updatecampaignop.py: + id: 4f135098f776 + last_write_checksum: sha1:8aa35c3cd76589c7362a69290013f6a5b71a41eb + pristine_git_object: 830e26654b20273c6b7c0d8bba616fb8e28ede8e + src/ttd_workflows/models/updatecampaignsjobop.py: + id: 5657cd7d5003 + last_write_checksum: sha1:0f0f68ba894c8790bfe2d34c4c41f170045e2f59 + pristine_git_object: ec3fa965ba673403869163737a2f0ef60c289ab3 + src/ttd_workflows/models/workflowcallbackinput.py: + id: 4669e0e53a00 + last_write_checksum: sha1:d8e038c715f6907c0cfcd5ab4f7aef2d498084d9 + pristine_git_object: 40d891988d3481e550a4934751a025ea28d7fd8d + src/ttd_workflows/models/workflowserror.py: + id: 4da91dd5b508 + last_write_checksum: sha1:4c1410bb789dda3cac319180a88c5b6ef26a0a0b + pristine_git_object: efd4cdd246a627e661f3308424de887348e37e09 + src/ttd_workflows/models/workflowstatus.py: + id: dd2b6b56194b + last_write_checksum: sha1:6f5e08bc2a7ed3f3f5dc5a3df543836821ef32c3 + pristine_git_object: adbb2664b96a8e903dd875a33ca91c0c2a209c38 + src/ttd_workflows/py.typed: + id: 789245869f4c + last_write_checksum: sha1:8efc425ffe830805ffcc0f3055871bdcdc542c60 + pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544 + src/ttd_workflows/rest_request.py: + id: b465d7d9fd11 + last_write_checksum: sha1:97858d602b9ecb585f92d12c86d01c79c02b585f + pristine_git_object: 8658ef319331b40a4c0687cdc0a1c81353f6d58e + src/ttd_workflows/sdk.py: + id: cdce0760579e + last_write_checksum: sha1:0a0011539b7d6dcb6e5f13472e940639e2041802 + pristine_git_object: eadb380bed5e27aface2d7a91337c9d51740b101 + src/ttd_workflows/sdkconfiguration.py: + id: 16b01c739bea + last_write_checksum: sha1:1faaf0c607157c7a8cdf0e8e568bc474bec8fe0c + pristine_git_object: 81318ac9b274d8f220c272284b166735f1a9e7e7 + src/ttd_workflows/types/__init__.py: + id: 1c43829fe82e + last_write_checksum: sha1:140ebdd01a46f92ffc710c52c958c4eba3cf68ed + pristine_git_object: fc76fe0c5505e29859b5d2bb707d48fd27661b8c + src/ttd_workflows/types/basemodel.py: + id: 80248e109351 + last_write_checksum: sha1:10d84aedeb9d35edfdadf2c3020caa1d24d8b584 + pristine_git_object: a9a640a1a7048736383f96c67c6290c86bf536ee + src/ttd_workflows/utils/__init__.py: + id: a9f65cd2e166 + last_write_checksum: sha1:ffaf69e6877a274b08066215f5a31a1b344f5402 + pristine_git_object: f4525b2057c3d54fb3b9eff6248fd172478ce94c + src/ttd_workflows/utils/annotations.py: + id: 405b51daeec6 + last_write_checksum: sha1:a4824ad65f730303e4e1e3ec1febf87b4eb46dbc + pristine_git_object: 12e0aa4f1151bb52474cc02e88397329b90703f6 + src/ttd_workflows/utils/datetimes.py: + id: 758b2b303693 + last_write_checksum: sha1:c721e4123000e7dc61ec52b28a739439d9e17341 + pristine_git_object: a6c52cd61bbe2d459046c940ce5e8c469f2f0664 + src/ttd_workflows/utils/enums.py: + id: 2d1cd0acb918 + last_write_checksum: sha1:bc8c3c1285ae09ba8a094ee5c3d9c7f41fa1284d + pristine_git_object: 3324e1bc2668c54c4d5f5a1a845675319757a828 + src/ttd_workflows/utils/eventstreaming.py: + id: 933fd7a5988b + last_write_checksum: sha1:bababae5d54b7efc360db701daa49e18a92c2f3b + pristine_git_object: 0969899bfc491e5e408d05643525f347ea95e4fc + src/ttd_workflows/utils/forms.py: + id: f960e946eaac + last_write_checksum: sha1:15fa7e9ab1611e062a9984cf06cb20969713d295 + pristine_git_object: f961e76beaf0a8b1fe0dda44754a74eebd3608e7 + src/ttd_workflows/utils/headers.py: + id: 204fa4a6b366 + last_write_checksum: sha1:7c6df233ee006332b566a8afa9ce9a245941d935 + pristine_git_object: 37864cbbbc40d1a47112bbfdd3ba79568fc8818a + src/ttd_workflows/utils/logger.py: + id: e3468b376043 + last_write_checksum: sha1:81ae0e5a1169ba01eb4a1b110e1c35d9d44eb96d + pristine_git_object: d338ccf6b4cbf98208c42556d641cd8ce424bdd1 + src/ttd_workflows/utils/metadata.py: + id: de75a1ab8bca + last_write_checksum: sha1:c6a560bd0c63ab158582f34dadb69433ea73b3d4 + pristine_git_object: 173b3e5ce658675c2f504222a56b3daaaa68107d + src/ttd_workflows/utils/queryparams.py: + id: b93302bd0e2e + last_write_checksum: sha1:b94c3f314fd3da0d1d215afc2731f48748e2aa59 + pristine_git_object: c04e0db82b68eca041f2cb2614d748fbac80fd41 + src/ttd_workflows/utils/requestbodies.py: + id: 2bd37b0150df + last_write_checksum: sha1:41e2d2d2d3ecc394c8122ca4d4b85e1c3e03f054 + pristine_git_object: 1de32b6d26f46590232f398fdba6ce0072f1659c + src/ttd_workflows/utils/retries.py: + id: e684f07917dd + last_write_checksum: sha1:5b97ac4f59357d70c2529975d50364c88bcad607 + pristine_git_object: 88a91b10cd2076b4a2c6cff2ac6bfaa5e3c5ad13 + src/ttd_workflows/utils/security.py: + id: c51116786ae9 + last_write_checksum: sha1:954b1c7461db29b681cd58d03c9a8587593baabe + pristine_git_object: c7bc326da1b41ac99e74563c5c61eb09a287a8bc + src/ttd_workflows/utils/serializers.py: + id: d63fe0b8b3a4 + last_write_checksum: sha1:ce1d8d7f500a9ccba0aeca5057cee9c271f4dfd7 + pristine_git_object: 14321eb479de81d0d9580ec8291e0ff91bf29e57 + src/ttd_workflows/utils/unmarshal_json_response.py: + id: 90176fb39904 + last_write_checksum: sha1:3b4d9d179cea2d886242d8d608b28f378344935c + pristine_git_object: 8b8c12e061ace29f0232e0e37062424153d648e4 + src/ttd_workflows/utils/url.py: + id: a266d9f10f37 + last_write_checksum: sha1:6479961baa90432ca25626f8e40a7bbc32e73b41 + pristine_git_object: c78ccbae426ce6d385709d97ce0b1c2813ea2418 + src/ttd_workflows/utils/values.py: + id: 31b0e0952875 + last_write_checksum: sha1:acaa178a7c41ddd000f58cc691e4632d925b2553 + pristine_git_object: dae01a44384ac3bc13ae07453a053bf6c898ebe3 examples: post_/adgroup: speakeasy-default-post-/adgroup: @@ -629,7 +1554,7 @@ examples: createCampaign: speakeasy-default-create-campaign: requestBody: - application/json: {"primaryInput": {"description": "woot furthermore mentor", "campaignGroupId": 86586, "timeZone": "Europe/Ulyanovsk", "customCPAClickWeight": 2561.01, "customCPAViewthroughWeight": 5604.35, "customCPAType": "ClickViewthroughWeighting", "customRoasType": "Disabled", "impressionsOnlyBudgetingCpm": 1502.33, "budget": {"pacingMode": "PaceAsSoonAsPossible", "budgetInAdvertiserCurrency": 6363.35, "budgetInImpressions": 836518, "dailyTargetInAdvertiserCurrency": 7814.79, "dailyTargetInImpressions": 784985}, "endDateInUtc": null, "seedId": null, "campaignConversionReportingColumns": [{"trackingTagId": "", "includeInCustomCPA": false, "reportingColumnId": 888649, "ROASConfig": {"includeInCustomROAS": false, "customROASWeight": 4766.9, "customROASClickWeight": 3310.24, "customROASViewthroughWeight": 2919.37}, "weight": 5369.43, "crossDeviceAttributionModelId": ""}], "isManagedByTTD": null, "secondaryGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 4128.35, "ctrInPercent": 4434.91, "nielsenOTPInPercent": 7433.37, "cpaInAdvertiserCurrency": null, "returnOnAdSpendPercent": 2367.04, "vcrInPercent": 2333.15, "viewabilityInPercent": 5018.08, "vcpmInAdvertiserCurrency": 6070.6, "cpcvInAdvertiserCurrency": null, "miaozhenOTPInPercent": 4324.01, "iqviaAudienceQualityIndex": true, "crossixAudienceQualityIndex": true, "iqviaAudienceQualityIndexAndCostPerTarget": false, "crossixCostPerTarget": true}, "tertiaryGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 7814.79, "ctrInPercent": 7849.85, "nielsenOTPInPercent": null, "cpaInAdvertiserCurrency": null, "returnOnAdSpendPercent": 9519.81, "vcrInPercent": 6125.66, "viewabilityInPercent": 4766.9, "vcpmInAdvertiserCurrency": 3310.24, "cpcvInAdvertiserCurrency": 2919.37, "miaozhenOTPInPercent": 5369.43, "iqviaAudienceQualityIndex": false, "crossixAudienceQualityIndex": false, "iqviaAudienceQualityIndexAndCostPerTarget": null, "crossixCostPerTarget": false}, "advertiserId": "", "name": "", "primaryChannel": "DOOH", "primaryGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": null, "cpcInAdvertiserCurrency": 6678.34, "ctrInPercent": 5357.4, "nielsenOTPInPercent": 2741.6, "cpaInAdvertiserCurrency": 4220.63, "returnOnAdSpendPercent": 8572.83, "vcrInPercent": 8294.92, "viewabilityInPercent": 8592.21, "vcpmInAdvertiserCurrency": 8388.8, "cpcvInAdvertiserCurrency": null, "miaozhenOTPInPercent": 3033.14, "iqviaAudienceQualityIndex": false, "crossixAudienceQualityIndex": true, "iqviaAudienceQualityIndexAndCostPerTarget": true, "crossixCostPerTarget": false}, "startDateInUtc": null, "campaignIncrementalReachSetting": {"iSpotReachSetting": {"id": 787894, "name": "", "isActive": false}, "realyticsReachSetting": {"id": 859221, "name": "", "isActive": false, "products": null, "realyticsEntertainmentInput": "TVS"}, "tvSquaredReachSetting": {"id": 303314, "name": null, "isActive": false}, "sambaAuReachSetting": {"id": 505888, "name": "", "isActive": true}}}, "advancedInput": {"flights": [{"startDateInclusiveUTC": "2024-07-08T10:52:56.944Z", "endDateExclusiveUTC": "2023-05-12T16:41:56.386Z", "budgetInAdvertiserCurrency": 5904.11, "budgetInImpressions": null, "dailyTargetInAdvertiserCurrency": 6112.24, "dailyTargetInImpressions": 333131}], "purchaseOrderNumber": null, "includeDefaultsFromAdvertiser": false, "passThroughFeeCard": {"startDateUtc": "2023-03-18T04:39:08.387Z", "passThroughFees": [{"type": "FeeCPM", "description": "fairly gah mortally freight since", "amount": 2122.11}]}, "callerSource": ""}, "adGroups": [{"primaryInput": {"isEnabled": false, "description": "quash lightly rot bashfully slope", "budget": {"allocationType": "Minimum", "budgetInAdvertiserCurrency": 4043.98, "budgetInImpressions": 907414, "dailyTargetInAdvertiserCurrency": 49.95, "dailyTargetInImpressions": 62363}, "baseBidCPMInAdvertiserCurrency": 1136.89, "maxBidCPMInAdvertiserCurrency": 6950.27, "audienceTargeting": {"audienceId": "", "audienceAcceleratorExclusionsEnabled": false, "audienceBoosterEnabled": true, "audienceExcluderEnabled": false, "audiencePredictorEnabled": true, "crossDeviceVendorListForAudience": [458524, 284141], "recencyExclusionWindowInMinutes": 982426, "targetTrackableUsersEnabled": false, "useMcIdAsPrimary": true}, "roiGoal": {"maximizeReach": null, "maximizeLtvIncrementalReach": true, "cpcInAdvertiserCurrency": 8782.74, "ctrInPercent": null, "nielsenOTPInPercent": 7930.85, "cpaInAdvertiserCurrency": 4606.89, "returnOnAdSpendPercent": 2522.83, "vcrInPercent": 5828.49, "viewabilityInPercent": 6824.44, "vcpmInAdvertiserCurrency": 7123.95, "cpcvInAdvertiserCurrency": 6233.72, "miaozhenOTPInPercent": 8437.22}, "creativeIds": [""], "associatedBidLists": [{"bidListId": "", "isEnabled": true, "isDefaultForDimension": false}], "name": "", "channel": "NativeVideo", "funnelLocation": "None", "marketType": "OpenMarket", "programmaticGuaranteedPrivateContractId": "", "includeDefaultsFromCampaign": true}, "advancedInput": {"koaOptimizationSettings": {"areFutureKoaFeaturesEnabled": true, "predictiveClearingEnabled": true}, "comscoreSettings": {"isEnabled": false, "populationId": 523753, "demographicMemberIds": null, "mobileDemographicMemberIds": null}, "contractTargeting": {"allowOpenMarketBiddingWhenTargetingContracts": true}, "dimensionalBiddingAutoOptimizationSettings": [["HasFullReferrerUrl"], ["HasPublisherId"]], "isUseClicksAsConversionsEnabled": null, "isUseSecondaryConversionsEnabled": true, "nielsenTrackingAttributes": {"enhancedReportingOption": "Site", "gender": "Female", "startAge": "ThirtyFive", "endAge": "FortyNine", "countries": []}, "newFrequencyConfigs": [{"counterName": "", "frequencyCap": 391231, "frequencyGoal": 499235, "resetIntervalInMinutes": 587736}], "includeDefaultsFromCampaign": false, "flights": [{"allocationType": "Fixed", "budgetInAdvertiserCurrency": 5340.32, "budgetInImpressions": 492382, "dailyTargetInAdvertiserCurrency": 5622.5, "dailyTargetInImpressions": 398919}]}}], "validateInputOnly": false} + application/json: {"primaryInput": {"description": "woot furthermore mentor", "campaignGroupId": 86586, "timeZone": "Europe/Ulyanovsk", "customCPAClickWeight": 2561.01, "customCPAViewthroughWeight": 5604.35, "customCPAType": "ClickViewthroughWeighting", "customRoasType": "Disabled", "impressionsOnlyBudgetingCpm": 1502.33, "endDateInUtc": null, "seedId": null, "campaignConversionReportingColumns": [{"trackingTagId": "", "includeInCustomCPA": false, "reportingColumnId": 888649, "ROASConfig": {"includeInCustomROAS": false, "customROASWeight": 4766.9, "customROASClickWeight": 3310.24, "customROASViewthroughWeight": 2919.37}, "productListReportingType": "Featured", "weight": 5369.43, "crossDeviceAttributionModelId": ""}], "isManagedByTTD": null, "secondaryGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 4128.35, "ctrInPercent": 4434.91, "nielsenOTPInPercent": 7433.37, "cpaInAdvertiserCurrency": null, "returnOnAdSpendPercent": 2367.04, "vcrInPercent": 2333.15, "viewabilityInPercent": 5018.08, "vcpmInAdvertiserCurrency": 6070.6, "cpcvInAdvertiserCurrency": null, "miaozhenOTPInPercent": 4324.01, "iqviaAudienceQualityIndex": true, "crossixAudienceQualityIndex": true, "iqviaAudienceQualityIndexAndCostPerTarget": false, "crossixCostPerTarget": true}, "tertiaryGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 7814.79, "ctrInPercent": 7849.85, "nielsenOTPInPercent": null, "cpaInAdvertiserCurrency": null, "returnOnAdSpendPercent": 9519.81, "vcrInPercent": 6125.66, "viewabilityInPercent": 4766.9, "vcpmInAdvertiserCurrency": 3310.24, "cpcvInAdvertiserCurrency": 2919.37, "miaozhenOTPInPercent": 5369.43, "iqviaAudienceQualityIndex": false, "crossixAudienceQualityIndex": false, "iqviaAudienceQualityIndexAndCostPerTarget": null, "crossixCostPerTarget": false}, "advertiserId": "", "name": "", "primaryChannel": "DOOH", "primaryGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": null, "cpcInAdvertiserCurrency": 6678.34, "ctrInPercent": 5357.4, "nielsenOTPInPercent": 2741.6, "cpaInAdvertiserCurrency": 4220.63, "returnOnAdSpendPercent": 8572.83, "vcrInPercent": 8294.92, "viewabilityInPercent": 8592.21, "vcpmInAdvertiserCurrency": 8388.8, "cpcvInAdvertiserCurrency": null, "miaozhenOTPInPercent": 3033.14, "iqviaAudienceQualityIndex": false, "crossixAudienceQualityIndex": true, "iqviaAudienceQualityIndexAndCostPerTarget": true, "crossixCostPerTarget": false}, "startDateInUtc": null, "budget": {"pacingMode": "PaceAsSoonAsPossible", "budgetInAdvertiserCurrency": 6363.35, "budgetInImpressions": 836518, "dailyTargetInAdvertiserCurrency": 7814.79, "dailyTargetInImpressions": 784985}, "campaignIncrementalReachSetting": {"iSpotReachSetting": {"id": 787894, "name": "", "isActive": false}, "realyticsReachSetting": {"id": 859221, "name": "", "isActive": false, "products": null, "realyticsEntertainmentInput": "TVS"}, "tvSquaredReachSetting": {"id": 303314, "name": null, "isActive": false}, "sambaAuReachSetting": {"id": 505888, "name": "", "isActive": true}}}, "advancedInput": {"purchaseOrderNumber": null, "flights": [{"startDateInclusiveUTC": "2024-07-08T10:52:56.944Z", "endDateExclusiveUTC": "2023-05-12T16:41:56.386Z", "budgetInAdvertiserCurrency": 5904.11, "budgetInImpressions": null, "dailyTargetInAdvertiserCurrency": 6112.24, "dailyTargetInImpressions": 333131}], "includeDefaultsFromAdvertiser": false, "passThroughFeeCard": {"startDateUtc": "2023-03-18T04:39:08.387Z", "passThroughFees": [{"type": "FeeCPM", "description": "fairly gah mortally freight since", "amount": 2122.11}]}, "callerSource": "", "frequencyConfigs": null}, "adGroups": [{"primaryInput": {"isEnabled": false, "description": "quash lightly rot bashfully slope", "budget": {"allocationType": "Minimum", "budgetInAdvertiserCurrency": 4043.98, "budgetInImpressions": 907414, "dailyTargetInAdvertiserCurrency": 49.95, "dailyTargetInImpressions": 62363}, "baseBidCPMInAdvertiserCurrency": 1136.89, "maxBidCPMInAdvertiserCurrency": 6950.27, "audienceTargeting": {"audienceId": "", "audienceAcceleratorExclusionsEnabled": false, "audienceBoosterEnabled": true, "audienceExcluderEnabled": false, "audiencePredictorEnabled": true, "crossDeviceVendorListForAudience": [458524, 284141], "recencyExclusionWindowInMinutes": 982426, "targetTrackableUsersEnabled": false, "useMcIdAsPrimary": true}, "roiGoal": {"maximizeReach": null, "maximizeLtvIncrementalReach": true, "cpcInAdvertiserCurrency": 8782.74, "ctrInPercent": null, "nielsenOTPInPercent": 7930.85, "cpaInAdvertiserCurrency": 4606.89, "returnOnAdSpendPercent": 2522.83, "vcrInPercent": 5828.49, "viewabilityInPercent": 6824.44, "vcpmInAdvertiserCurrency": 7123.95, "cpcvInAdvertiserCurrency": 6233.72, "miaozhenOTPInPercent": 8437.22}, "creativeIds": [""], "associatedBidLists": [{"bidListId": "", "isEnabled": true, "isDefaultForDimension": false}], "name": "", "channel": "NativeVideo", "funnelLocation": "None", "marketType": "OpenMarket", "programmaticGuaranteedPrivateContractId": "", "includeDefaultsFromCampaign": true}, "advancedInput": {"koaOptimizationSettings": {"areFutureKoaFeaturesEnabled": true, "predictiveClearingEnabled": true}, "comscoreSettings": {"isEnabled": false, "populationId": 523753, "demographicMemberIds": null, "mobileDemographicMemberIds": null}, "contractTargeting": {"allowOpenMarketBiddingWhenTargetingContracts": true}, "dimensionalBiddingAutoOptimizationSettings": [["HasFullReferrerUrl"], ["HasPublisherId"]], "isUseClicksAsConversionsEnabled": null, "isUseSecondaryConversionsEnabled": true, "nielsenTrackingAttributes": {"enhancedReportingOption": "Site", "gender": "Female", "startAge": "ThirtyFive", "endAge": "FortyNine", "countries": []}, "newFrequencyConfigs": [{"counterName": "", "frequencyCap": 391231, "frequencyGoal": 499235, "resetIntervalInMinutes": 587736}], "includeDefaultsFromCampaign": false, "flights": [{"allocationType": "Fixed", "budgetInAdvertiserCurrency": 5340.32, "budgetInImpressions": 492382, "dailyTargetInAdvertiserCurrency": 5622.5, "dailyTargetInImpressions": 398919}]}}], "validateInputOnly": false} responses: "201": application/json: {"campaign": {"id": "", "name": "", "campaignGroupId": 960101, "description": "commandeer following afore ghost schematise lest understated brr happily lined", "startDate": "2025-05-13T19:59:29.421Z", "endDate": "2025-09-17T08:16:44.433Z", "timeZone": "Africa/Lome", "customCPAClickWeight": 1725.54, "customCPAViewthroughWeight": 418.34, "customCPAType": "PixelWeighting", "impressionsOnlyBudgetingCpm": 3266.9, "primaryChannel": "Display", "primaryGoal": "", "seedId": "", "conversionReportingColumnsCount": 748798, "flights": [{"id": "", "startDateInclusiveUTC": "2024-03-12T14:53:08.741Z", "endDateExclusiveUTC": "2024-07-12T11:11:36.420Z", "budgetInAdvertiserCurrency": 6585.86, "budgetInImpressions": 83962, "dailyTargetInAdvertiserCurrency": 2584.64, "dailyTargetInImpressions": 910113}]}, "adGroups": [{"id": "", "name": "", "campaignId": "", "isEnabled": false, "description": "hence questioningly punctual austere beard around circumnavigate behind aboard", "programmaticGuaranteedPrivateContractId": null, "channel": "NativeVideo", "funnelLocation": "Consideration", "budget": {"allocationType": "Maximum", "budgetInAdvertiserCurrency": 4437.6, "budgetInImpressions": 663120, "dailyTargetInAdvertiserCurrency": 3765.21, "dailyTargetInImpressions": 111869}, "baseBidCPMInAdvertiserCurrency": 9802.01, "maxBidCPMInAdvertiserCurrency": 1646.69, "audienceTargeting": {"audienceId": "", "audienceAcceleratorExclusionsEnabled": false, "audienceBoosterEnabled": false, "audienceExcluderEnabled": false, "audiencePredictorEnabled": false, "crossDeviceVendorListForAudience": [502213, 470177, 420897], "recencyExclusionWindowInMinutes": 4504, "targetTrackableUsersEnabled": true, "useMcIdAsPrimary": true}, "roiGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 6741.01, "ctrInPercent": 982.47, "nielsenOTPInPercent": 7021.23, "cpaInAdvertiserCurrency": 7395.27, "returnOnAdSpendPercent": 744.23, "vcrInPercent": 3686.93, "viewabilityInPercent": 3897.27, "vcpmInAdvertiserCurrency": 4522.49, "cpcvInAdvertiserCurrency": 2016.93, "miaozhenOTPInPercent": 3516.78}, "creativeIds": [""], "associatedBidLists": [{"bidListId": null, "isEnabled": false, "isDefaultForDimension": true}], "flights": null, "koaOptimizationSettings": {"areFutureKoaFeaturesEnabled": false, "predictiveClearingEnabled": false}, "comscoreSettings": {"isEnabled": false, "populationId": null, "demographicMemberIds": [339950, 676551], "mobileDemographicMemberIds": []}, "contractTargeting": {"allowOpenMarketBiddingWhenTargetingContracts": false}, "dimensionalBiddingAutoOptimizationSettings": [["HasTVQualityIndexRange"], [], ["HasDoubleVerifyBotAvoidanceCategoryId"]], "isUseClicksAsConversionsEnabled": true, "isUseSecondaryConversionsEnabled": true, "nielsenTrackingAttributes": {"enhancedReportingOption": "Audience", "gender": "Female", "startAge": "TwentyOne", "endAge": "SixtyFour", "countries": ["", ""]}}]} @@ -640,7 +1565,7 @@ examples: createCampaignsJob: speakeasy-default-create-campaigns-job: requestBody: - application/json: {"input": [{"primaryInput": {"description": null, "campaignGroupId": 657704, "timeZone": "America/North_Dakota/Center", "customCPAClickWeight": 9662.9, "customCPAViewthroughWeight": 3558.78, "customCPAType": "ClickViewthroughWeighting", "customRoasType": "CompositeWeighting", "impressionsOnlyBudgetingCpm": 4427.56, "budget": {"pacingMode": "PaceAhead", "budgetInAdvertiserCurrency": 5501.96, "budgetInImpressions": 629784, "dailyTargetInAdvertiserCurrency": 2524.41, "dailyTargetInImpressions": 726807}, "endDateInUtc": "2023-12-21T01:12:20.772Z", "seedId": "", "campaignConversionReportingColumns": [{"trackingTagId": "", "includeInCustomCPA": false, "reportingColumnId": 356532, "ROASConfig": {"includeInCustomROAS": false, "customROASWeight": 1483.03, "customROASClickWeight": 5286.76, "customROASViewthroughWeight": 8906.82}, "weight": null, "crossDeviceAttributionModelId": ""}], "isManagedByTTD": true, "secondaryGoal": {"maximizeReach": true, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 3558.78, "ctrInPercent": 2407.01, "nielsenOTPInPercent": 2349.25, "cpaInAdvertiserCurrency": 7778.32, "returnOnAdSpendPercent": 6752.02, "vcrInPercent": 5019.36, "viewabilityInPercent": 5781.75, "vcpmInAdvertiserCurrency": 1696.34, "cpcvInAdvertiserCurrency": 5609.2, "miaozhenOTPInPercent": 5842.09, "iqviaAudienceQualityIndex": true, "crossixAudienceQualityIndex": false, "iqviaAudienceQualityIndexAndCostPerTarget": false, "crossixCostPerTarget": null}, "tertiaryGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 6123.61, "ctrInPercent": 25.32, "nielsenOTPInPercent": 4889.32, "cpaInAdvertiserCurrency": 5258.8, "returnOnAdSpendPercent": 2553.01, "vcrInPercent": 1142.91, "viewabilityInPercent": 1152.77, "vcpmInAdvertiserCurrency": 6711.38, "cpcvInAdvertiserCurrency": 4528.37, "miaozhenOTPInPercent": 9833.69, "iqviaAudienceQualityIndex": true, "crossixAudienceQualityIndex": false, "iqviaAudienceQualityIndexAndCostPerTarget": false, "crossixCostPerTarget": true}, "advertiserId": "", "name": "", "primaryChannel": "NativeVideo", "primaryGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 25.32, "ctrInPercent": 4889.32, "nielsenOTPInPercent": 5258.8, "cpaInAdvertiserCurrency": 2553.01, "returnOnAdSpendPercent": 1142.91, "vcrInPercent": 1152.77, "viewabilityInPercent": 6711.38, "vcpmInAdvertiserCurrency": 4528.37, "cpcvInAdvertiserCurrency": 9833.69, "miaozhenOTPInPercent": 1951.58, "iqviaAudienceQualityIndex": true, "crossixAudienceQualityIndex": null, "iqviaAudienceQualityIndexAndCostPerTarget": false, "crossixCostPerTarget": true}, "startDateInUtc": "2025-09-26T21:06:42.946Z", "campaignIncrementalReachSetting": {"iSpotReachSetting": {"id": 178346, "name": "", "isActive": true}, "realyticsReachSetting": {"id": 268786, "name": "", "isActive": false, "products": [{"id": 106975, "name": ""}], "realyticsEntertainmentInput": "TVS"}, "tvSquaredReachSetting": {"id": 772731, "name": "", "isActive": false}, "sambaAuReachSetting": {"id": 403863, "name": null, "isActive": true}}}, "advancedInput": {"flights": [{"startDateInclusiveUTC": "2024-09-20T06:04:19.345Z", "endDateExclusiveUTC": "2024-01-18T07:43:56.299Z", "budgetInAdvertiserCurrency": 8219.9, "budgetInImpressions": 76925, "dailyTargetInAdvertiserCurrency": 9309.03, "dailyTargetInImpressions": 152838}], "purchaseOrderNumber": "", "includeDefaultsFromAdvertiser": false, "passThroughFeeCard": {"startDateUtc": "2024-07-24T11:58:59.190Z", "passThroughFees": [{"type": "DataCostPercentage", "description": "sweetly absent fortunately forenenst earnest who solidly wherever step-mother", "amount": 2888.48}]}, "callerSource": ""}, "adGroups": [{"primaryInput": {"isEnabled": true, "description": "scenario dish gracefully through tame yahoo pension husband as atop", "budget": {"allocationType": "Maximum", "budgetInAdvertiserCurrency": 2283.06, "budgetInImpressions": 301691, "dailyTargetInAdvertiserCurrency": 9268.18, "dailyTargetInImpressions": 851470}, "baseBidCPMInAdvertiserCurrency": 694.78, "maxBidCPMInAdvertiserCurrency": 6084.4, "audienceTargeting": {"audienceId": "", "audienceAcceleratorExclusionsEnabled": true, "audienceBoosterEnabled": false, "audienceExcluderEnabled": true, "audiencePredictorEnabled": false, "crossDeviceVendorListForAudience": [497890, 566253], "recencyExclusionWindowInMinutes": 742665, "targetTrackableUsersEnabled": true, "useMcIdAsPrimary": true}, "roiGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": true, "cpcInAdvertiserCurrency": 9062.02, "ctrInPercent": 7192.99, "nielsenOTPInPercent": 2823.22, "cpaInAdvertiserCurrency": 3140.25, "returnOnAdSpendPercent": 6857.21, "vcrInPercent": 2704.73, "viewabilityInPercent": 2247.4, "vcpmInAdvertiserCurrency": 8383.69, "cpcvInAdvertiserCurrency": 4755.8, "miaozhenOTPInPercent": 4575.86}, "creativeIds": ["", ""], "associatedBidLists": [{"bidListId": "", "isEnabled": true, "isDefaultForDimension": false}], "name": "", "channel": "Display", "funnelLocation": "Awareness", "marketType": "PrivateMarketOnly", "programmaticGuaranteedPrivateContractId": "", "includeDefaultsFromCampaign": true}, "advancedInput": {"koaOptimizationSettings": {"areFutureKoaFeaturesEnabled": true, "predictiveClearingEnabled": false}, "comscoreSettings": {"isEnabled": false, "populationId": 559587, "demographicMemberIds": [139340, 129935], "mobileDemographicMemberIds": null}, "contractTargeting": {"allowOpenMarketBiddingWhenTargetingContracts": true}, "dimensionalBiddingAutoOptimizationSettings": [["HasAudienceReachPercentageTierId"], []], "isUseClicksAsConversionsEnabled": false, "isUseSecondaryConversionsEnabled": true, "nielsenTrackingAttributes": {"enhancedReportingOption": "None", "gender": "Female", "startAge": "ThirtyFive", "endAge": "TwentyFour", "countries": ["", ""]}, "newFrequencyConfigs": null, "includeDefaultsFromCampaign": true, "flights": [{"allocationType": "Maximum", "budgetInAdvertiserCurrency": 4838.47, "budgetInImpressions": 420224, "dailyTargetInAdvertiserCurrency": 1513.78, "dailyTargetInImpressions": 735500}]}}]}], "validateInputOnly": true, "callbackInput": {"callbackUrl": "https://impeccable-pick.com/", "callbackHeaders": {"key": ""}}} + application/json: {"input": [{"primaryInput": {"description": null, "campaignGroupId": 657704, "timeZone": "America/North_Dakota/Center", "customCPAClickWeight": 9662.9, "customCPAViewthroughWeight": 3558.78, "customCPAType": "ClickViewthroughWeighting", "customRoasType": "CompositeWeighting", "impressionsOnlyBudgetingCpm": 4427.56, "endDateInUtc": "2023-12-21T01:12:20.772Z", "seedId": "", "campaignConversionReportingColumns": [{"trackingTagId": "", "includeInCustomCPA": false, "reportingColumnId": 356532, "ROASConfig": {"includeInCustomROAS": false, "customROASWeight": 1483.03, "customROASClickWeight": 5286.76, "customROASViewthroughWeight": 8906.82}, "productListReportingType": "Halo", "weight": null, "crossDeviceAttributionModelId": ""}], "isManagedByTTD": true, "secondaryGoal": {"maximizeReach": true, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 3558.78, "ctrInPercent": 2407.01, "nielsenOTPInPercent": 2349.25, "cpaInAdvertiserCurrency": 7778.32, "returnOnAdSpendPercent": 6752.02, "vcrInPercent": 5019.36, "viewabilityInPercent": 5781.75, "vcpmInAdvertiserCurrency": 1696.34, "cpcvInAdvertiserCurrency": 5609.2, "miaozhenOTPInPercent": 5842.09, "iqviaAudienceQualityIndex": true, "crossixAudienceQualityIndex": false, "iqviaAudienceQualityIndexAndCostPerTarget": false, "crossixCostPerTarget": null}, "tertiaryGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 6123.61, "ctrInPercent": 25.32, "nielsenOTPInPercent": 4889.32, "cpaInAdvertiserCurrency": 5258.8, "returnOnAdSpendPercent": 2553.01, "vcrInPercent": 1142.91, "viewabilityInPercent": 1152.77, "vcpmInAdvertiserCurrency": 6711.38, "cpcvInAdvertiserCurrency": 4528.37, "miaozhenOTPInPercent": 9833.69, "iqviaAudienceQualityIndex": true, "crossixAudienceQualityIndex": false, "iqviaAudienceQualityIndexAndCostPerTarget": false, "crossixCostPerTarget": true}, "advertiserId": "", "name": "", "primaryChannel": "NativeVideo", "primaryGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 25.32, "ctrInPercent": 4889.32, "nielsenOTPInPercent": 5258.8, "cpaInAdvertiserCurrency": 2553.01, "returnOnAdSpendPercent": 1142.91, "vcrInPercent": 1152.77, "viewabilityInPercent": 6711.38, "vcpmInAdvertiserCurrency": 4528.37, "cpcvInAdvertiserCurrency": 9833.69, "miaozhenOTPInPercent": 1951.58, "iqviaAudienceQualityIndex": true, "crossixAudienceQualityIndex": null, "iqviaAudienceQualityIndexAndCostPerTarget": false, "crossixCostPerTarget": true}, "startDateInUtc": "2025-09-26T21:06:42.946Z", "budget": {"pacingMode": "PaceAhead", "budgetInAdvertiserCurrency": 5501.96, "budgetInImpressions": 629784, "dailyTargetInAdvertiserCurrency": 2524.41, "dailyTargetInImpressions": 726807}, "campaignIncrementalReachSetting": {"iSpotReachSetting": {"id": 178346, "name": "", "isActive": true}, "realyticsReachSetting": {"id": 268786, "name": "", "isActive": false, "products": [{"id": 106975, "name": ""}], "realyticsEntertainmentInput": "TVS"}, "tvSquaredReachSetting": {"id": 772731, "name": "", "isActive": false}, "sambaAuReachSetting": {"id": 403863, "name": null, "isActive": true}}}, "advancedInput": {"purchaseOrderNumber": "", "flights": [{"startDateInclusiveUTC": "2024-09-20T06:04:19.345Z", "endDateExclusiveUTC": "2024-01-18T07:43:56.299Z", "budgetInAdvertiserCurrency": 8219.9, "budgetInImpressions": 76925, "dailyTargetInAdvertiserCurrency": 9309.03, "dailyTargetInImpressions": 152838}], "includeDefaultsFromAdvertiser": false, "passThroughFeeCard": {"startDateUtc": "2024-07-24T11:58:59.190Z", "passThroughFees": [{"type": "DataCostPercentage", "description": "sweetly absent fortunately forenenst earnest who solidly wherever step-mother", "amount": 2888.48}]}, "callerSource": "", "frequencyConfigs": [{"counterName": null, "frequencyCap": 373225, "frequencyGoal": 966290, "resetIntervalInMinutes": 774436}]}, "adGroups": [{"primaryInput": {"isEnabled": true, "description": "scenario dish gracefully through tame yahoo pension husband as atop", "budget": {"allocationType": "Maximum", "budgetInAdvertiserCurrency": 2283.06, "budgetInImpressions": 301691, "dailyTargetInAdvertiserCurrency": 9268.18, "dailyTargetInImpressions": 851470}, "baseBidCPMInAdvertiserCurrency": 694.78, "maxBidCPMInAdvertiserCurrency": 6084.4, "audienceTargeting": {"audienceId": "", "audienceAcceleratorExclusionsEnabled": true, "audienceBoosterEnabled": false, "audienceExcluderEnabled": true, "audiencePredictorEnabled": false, "crossDeviceVendorListForAudience": [497890, 566253], "recencyExclusionWindowInMinutes": 742665, "targetTrackableUsersEnabled": true, "useMcIdAsPrimary": true}, "roiGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": true, "cpcInAdvertiserCurrency": 9062.02, "ctrInPercent": 7192.99, "nielsenOTPInPercent": 2823.22, "cpaInAdvertiserCurrency": 3140.25, "returnOnAdSpendPercent": 6857.21, "vcrInPercent": 2704.73, "viewabilityInPercent": 2247.4, "vcpmInAdvertiserCurrency": 8383.69, "cpcvInAdvertiserCurrency": 4755.8, "miaozhenOTPInPercent": 4575.86}, "creativeIds": ["", ""], "associatedBidLists": [{"bidListId": "", "isEnabled": true, "isDefaultForDimension": false}], "name": "", "channel": "Display", "funnelLocation": "Awareness", "marketType": "PrivateMarketOnly", "programmaticGuaranteedPrivateContractId": "", "includeDefaultsFromCampaign": true}, "advancedInput": {"koaOptimizationSettings": {"areFutureKoaFeaturesEnabled": true, "predictiveClearingEnabled": false}, "comscoreSettings": {"isEnabled": false, "populationId": 559587, "demographicMemberIds": [139340, 129935], "mobileDemographicMemberIds": null}, "contractTargeting": {"allowOpenMarketBiddingWhenTargetingContracts": true}, "dimensionalBiddingAutoOptimizationSettings": [["HasAudienceReachPercentageTierId"], []], "isUseClicksAsConversionsEnabled": false, "isUseSecondaryConversionsEnabled": true, "nielsenTrackingAttributes": {"enhancedReportingOption": "None", "gender": "Female", "startAge": "ThirtyFive", "endAge": "TwentyFour", "countries": ["", ""]}, "newFrequencyConfigs": null, "includeDefaultsFromCampaign": true, "flights": [{"allocationType": "Maximum", "budgetInAdvertiserCurrency": 4838.47, "budgetInImpressions": 420224, "dailyTargetInAdvertiserCurrency": 1513.78, "dailyTargetInImpressions": 735500}]}}]}], "validateInputOnly": true, "callbackInput": {"callbackUrl": "https://impeccable-pick.com/", "callbackHeaders": {"key": ""}}} responses: "202": application/json: {"id": 400815} @@ -649,7 +1574,7 @@ examples: updateCampaignsJob: speakeasy-default-update-campaigns-job: requestBody: - application/json: {"input": [{"id": "", "primaryInput": {"description": "hmph energetically yet surprisingly swift knight swear multicolored absent", "campaignGroupId": 645576, "timeZone": "America/Argentina/San_Juan", "customCPAClickWeight": null, "customCPAViewthroughWeight": 8361.84, "customCPAType": "PixelWeighting", "customRoasType": "ClickViewthroughWeighting", "impressionsOnlyBudgetingCpm": 2706.4, "budget": {"pacingMode": "PaceAsSoonAsPossible", "budgetInAdvertiserCurrency": 2564.89, "budgetInImpressions": 659726, "dailyTargetInAdvertiserCurrency": 6514.48, "dailyTargetInImpressions": 892097}, "endDateInUtc": "2023-11-11T21:39:56.025Z", "seedId": "", "campaignConversionReportingColumns": [{"trackingTagId": "", "includeInCustomCPA": true, "reportingColumnId": 809247, "ROASConfig": {"includeInCustomROAS": false, "customROASWeight": null, "customROASClickWeight": null, "customROASViewthroughWeight": 6784.9}, "weight": 2260.69, "crossDeviceAttributionModelId": ""}], "isManagedByTTD": true, "secondaryGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": null, "ctrInPercent": null, "nielsenOTPInPercent": 5546.51, "cpaInAdvertiserCurrency": 7735.11, "returnOnAdSpendPercent": 5459.4, "vcrInPercent": 7724.91, "viewabilityInPercent": null, "vcpmInAdvertiserCurrency": 9927, "cpcvInAdvertiserCurrency": 1852.41, "miaozhenOTPInPercent": 2827.93, "iqviaAudienceQualityIndex": false, "crossixAudienceQualityIndex": null, "iqviaAudienceQualityIndexAndCostPerTarget": false, "crossixCostPerTarget": true}, "tertiaryGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 7329.7, "ctrInPercent": 9103.24, "nielsenOTPInPercent": 2359.55, "cpaInAdvertiserCurrency": 6489.19, "returnOnAdSpendPercent": 8265.87, "vcrInPercent": null, "viewabilityInPercent": 6404.44, "vcpmInAdvertiserCurrency": 1278.49, "cpcvInAdvertiserCurrency": 9238.19, "miaozhenOTPInPercent": 8948.48, "iqviaAudienceQualityIndex": true, "crossixAudienceQualityIndex": false, "iqviaAudienceQualityIndexAndCostPerTarget": false, "crossixCostPerTarget": true}, "name": "", "primaryChannel": "None", "primaryGoal": {"maximizeReach": true, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 3354.68, "ctrInPercent": 7716.49, "nielsenOTPInPercent": null, "cpaInAdvertiserCurrency": 381.7, "returnOnAdSpendPercent": 8461.44, "vcrInPercent": 4170.61, "viewabilityInPercent": 5364.85, "vcpmInAdvertiserCurrency": 1107.08, "cpcvInAdvertiserCurrency": null, "miaozhenOTPInPercent": 4584.96, "iqviaAudienceQualityIndex": true, "crossixAudienceQualityIndex": false, "iqviaAudienceQualityIndexAndCostPerTarget": true, "crossixCostPerTarget": true}, "startDateInUtc": "2023-01-13T23:06:05.083Z"}, "advancedInput": {"flights": [{"startDateInclusiveUTC": "2023-08-14T13:47:31.198Z", "endDateExclusiveUTC": "2024-07-07T14:46:57.378Z", "budgetInAdvertiserCurrency": 1874.95, "budgetInImpressions": 207094, "dailyTargetInAdvertiserCurrency": 7255.71, "dailyTargetInImpressions": 760981}], "purchaseOrderNumber": ""}}], "validateInputOnly": true, "callbackInput": {"callbackUrl": "https://soggy-apparatus.org/", "callbackHeaders": {"key": "", "key1": "", "key2": ""}}} + application/json: {"input": [{"id": "", "primaryInput": {"description": "hmph energetically yet surprisingly swift knight swear multicolored absent", "campaignGroupId": 645576, "timeZone": "America/Argentina/San_Juan", "customCPAClickWeight": null, "customCPAViewthroughWeight": 8361.84, "customCPAType": "PixelWeighting", "customRoasType": "ClickViewthroughWeighting", "impressionsOnlyBudgetingCpm": 2706.4, "endDateInUtc": "2023-11-11T21:39:56.025Z", "seedId": "", "campaignConversionReportingColumns": [{"trackingTagId": "", "includeInCustomCPA": true, "reportingColumnId": 809247, "ROASConfig": {"includeInCustomROAS": false, "customROASWeight": null, "customROASClickWeight": null, "customROASViewthroughWeight": 6784.9}, "productListReportingType": "Halo", "weight": 2260.69, "crossDeviceAttributionModelId": ""}], "isManagedByTTD": true, "secondaryGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": null, "ctrInPercent": null, "nielsenOTPInPercent": 5546.51, "cpaInAdvertiserCurrency": 7735.11, "returnOnAdSpendPercent": 5459.4, "vcrInPercent": 7724.91, "viewabilityInPercent": null, "vcpmInAdvertiserCurrency": 9927, "cpcvInAdvertiserCurrency": 1852.41, "miaozhenOTPInPercent": 2827.93, "iqviaAudienceQualityIndex": false, "crossixAudienceQualityIndex": null, "iqviaAudienceQualityIndexAndCostPerTarget": false, "crossixCostPerTarget": true}, "tertiaryGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 7329.7, "ctrInPercent": 9103.24, "nielsenOTPInPercent": 2359.55, "cpaInAdvertiserCurrency": 6489.19, "returnOnAdSpendPercent": 8265.87, "vcrInPercent": null, "viewabilityInPercent": 6404.44, "vcpmInAdvertiserCurrency": 1278.49, "cpcvInAdvertiserCurrency": 9238.19, "miaozhenOTPInPercent": 8948.48, "iqviaAudienceQualityIndex": true, "crossixAudienceQualityIndex": false, "iqviaAudienceQualityIndexAndCostPerTarget": false, "crossixCostPerTarget": true}, "name": "", "primaryChannel": "None", "primaryGoal": {"maximizeReach": true, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 3354.68, "ctrInPercent": 7716.49, "nielsenOTPInPercent": null, "cpaInAdvertiserCurrency": 381.7, "returnOnAdSpendPercent": 8461.44, "vcrInPercent": 4170.61, "viewabilityInPercent": 5364.85, "vcpmInAdvertiserCurrency": 1107.08, "cpcvInAdvertiserCurrency": null, "miaozhenOTPInPercent": 4584.96, "iqviaAudienceQualityIndex": true, "crossixAudienceQualityIndex": false, "iqviaAudienceQualityIndexAndCostPerTarget": true, "crossixCostPerTarget": true}, "startDateInUtc": "2023-01-13T23:06:05.083Z", "budget": {"pacingMode": "PaceAsSoonAsPossible"}}, "advancedInput": {"purchaseOrderNumber": ""}}], "validateInputOnly": true, "callbackInput": {"callbackUrl": "https://soggy-apparatus.org/", "callbackHeaders": {"key": "", "key1": "", "key2": ""}}} responses: "202": application/json: {"id": 833664} @@ -670,7 +1595,7 @@ examples: updateCampaign: speakeasy-default-update-campaign: requestBody: - application/json: {"id": "", "primaryInput": {"description": "yahoo whether frail but into form sway neck notwithstanding", "campaignGroupId": 760468, "timeZone": "Asia/Amman", "customCPAClickWeight": 1380.93, "customCPAViewthroughWeight": 3991.98, "customCPAType": "ClickViewthroughWeighting", "customRoasType": "Disabled", "impressionsOnlyBudgetingCpm": 126.57, "budget": {"pacingMode": "PaceAsSoonAsPossible", "budgetInAdvertiserCurrency": 6974.82, "budgetInImpressions": 834352, "dailyTargetInAdvertiserCurrency": 8583.49, "dailyTargetInImpressions": 746941}, "endDateInUtc": "2024-07-09T17:14:23.542Z", "seedId": "", "campaignConversionReportingColumns": [{"trackingTagId": "", "includeInCustomCPA": false, "reportingColumnId": 716444, "ROASConfig": {"includeInCustomROAS": true, "customROASWeight": 8307.9, "customROASClickWeight": 129.65, "customROASViewthroughWeight": 2890.82}, "weight": 5187.48, "crossDeviceAttributionModelId": null}], "isManagedByTTD": false, "secondaryGoal": {"maximizeReach": true, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 1165.14, "ctrInPercent": 5157.73, "nielsenOTPInPercent": 3855.93, "cpaInAdvertiserCurrency": 5164.28, "returnOnAdSpendPercent": 8554.35, "vcrInPercent": 9569.97, "viewabilityInPercent": 9650.33, "vcpmInAdvertiserCurrency": 5268.69, "cpcvInAdvertiserCurrency": 7216.52, "miaozhenOTPInPercent": 6966.26, "iqviaAudienceQualityIndex": true, "crossixAudienceQualityIndex": true, "iqviaAudienceQualityIndexAndCostPerTarget": true, "crossixCostPerTarget": true}, "tertiaryGoal": {"maximizeReach": true, "maximizeLtvIncrementalReach": true, "cpcInAdvertiserCurrency": 5149.5, "ctrInPercent": 5602.97, "nielsenOTPInPercent": 3514.56, "cpaInAdvertiserCurrency": 1.97, "returnOnAdSpendPercent": 3177.79, "vcrInPercent": 5564.63, "viewabilityInPercent": 472.11, "vcpmInAdvertiserCurrency": 4614.14, "cpcvInAdvertiserCurrency": 8553.51, "miaozhenOTPInPercent": 5511.72, "iqviaAudienceQualityIndex": false, "crossixAudienceQualityIndex": false, "iqviaAudienceQualityIndexAndCostPerTarget": null, "crossixCostPerTarget": false}, "name": "", "primaryChannel": "Display", "primaryGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": true, "cpcInAdvertiserCurrency": 8835.54, "ctrInPercent": 4975.78, "nielsenOTPInPercent": 6033.78, "cpaInAdvertiserCurrency": null, "returnOnAdSpendPercent": 5696.08, "vcrInPercent": 8315.31, "viewabilityInPercent": 1059.68, "vcpmInAdvertiserCurrency": 4588.07, "cpcvInAdvertiserCurrency": 2202.71, "miaozhenOTPInPercent": 2682.12, "iqviaAudienceQualityIndex": false, "crossixAudienceQualityIndex": true, "iqviaAudienceQualityIndexAndCostPerTarget": true, "crossixCostPerTarget": true}, "startDateInUtc": "2024-02-29T10:31:50.069Z"}, "advancedInput": {"flights": [{"startDateInclusiveUTC": "2025-11-09T04:11:39.432Z", "endDateExclusiveUTC": "2025-09-10T20:38:51.701Z", "budgetInAdvertiserCurrency": 6534.57, "budgetInImpressions": 865481, "dailyTargetInAdvertiserCurrency": 1033.72, "dailyTargetInImpressions": null}], "purchaseOrderNumber": ""}, "validateInputOnly": true} + application/json: {"id": "", "primaryInput": {"description": "yahoo whether frail but into form sway neck notwithstanding", "campaignGroupId": 760468, "timeZone": "Asia/Amman", "customCPAClickWeight": 1380.93, "customCPAViewthroughWeight": 3991.98, "customCPAType": "ClickViewthroughWeighting", "customRoasType": "Disabled", "impressionsOnlyBudgetingCpm": 126.57, "endDateInUtc": "2024-07-09T17:14:23.542Z", "seedId": "", "campaignConversionReportingColumns": [{"trackingTagId": "", "includeInCustomCPA": false, "reportingColumnId": 716444, "ROASConfig": {"includeInCustomROAS": true, "customROASWeight": 8307.9, "customROASClickWeight": 129.65, "customROASViewthroughWeight": 2890.82}, "productListReportingType": "Featured", "weight": 5187.48, "crossDeviceAttributionModelId": null}], "isManagedByTTD": false, "secondaryGoal": {"maximizeReach": true, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 1165.14, "ctrInPercent": 5157.73, "nielsenOTPInPercent": 3855.93, "cpaInAdvertiserCurrency": 5164.28, "returnOnAdSpendPercent": 8554.35, "vcrInPercent": 9569.97, "viewabilityInPercent": 9650.33, "vcpmInAdvertiserCurrency": 5268.69, "cpcvInAdvertiserCurrency": 7216.52, "miaozhenOTPInPercent": 6966.26, "iqviaAudienceQualityIndex": true, "crossixAudienceQualityIndex": true, "iqviaAudienceQualityIndexAndCostPerTarget": true, "crossixCostPerTarget": true}, "tertiaryGoal": {"maximizeReach": true, "maximizeLtvIncrementalReach": true, "cpcInAdvertiserCurrency": 5149.5, "ctrInPercent": 5602.97, "nielsenOTPInPercent": 3514.56, "cpaInAdvertiserCurrency": 1.97, "returnOnAdSpendPercent": 3177.79, "vcrInPercent": 5564.63, "viewabilityInPercent": 472.11, "vcpmInAdvertiserCurrency": 4614.14, "cpcvInAdvertiserCurrency": 8553.51, "miaozhenOTPInPercent": 5511.72, "iqviaAudienceQualityIndex": false, "crossixAudienceQualityIndex": false, "iqviaAudienceQualityIndexAndCostPerTarget": null, "crossixCostPerTarget": false}, "name": "", "primaryChannel": "Display", "primaryGoal": {"maximizeReach": false, "maximizeLtvIncrementalReach": true, "cpcInAdvertiserCurrency": 8835.54, "ctrInPercent": 4975.78, "nielsenOTPInPercent": 6033.78, "cpaInAdvertiserCurrency": null, "returnOnAdSpendPercent": 5696.08, "vcrInPercent": 8315.31, "viewabilityInPercent": 1059.68, "vcpmInAdvertiserCurrency": 4588.07, "cpcvInAdvertiserCurrency": 2202.71, "miaozhenOTPInPercent": 2682.12, "iqviaAudienceQualityIndex": false, "crossixAudienceQualityIndex": true, "iqviaAudienceQualityIndexAndCostPerTarget": true, "crossixCostPerTarget": true}, "startDateInUtc": "2024-02-29T10:31:50.069Z", "budget": {"pacingMode": "PaceAsSoonAsPossible"}}, "advancedInput": {"purchaseOrderNumber": ""}, "validateInputOnly": true} responses: "200": application/json: {"campaign": {"id": "", "name": "", "campaignGroupId": 287698, "description": "yuppify primary lest nutritious whoa likewise bookcase traduce seriously", "startDate": "2024-06-18T22:41:27.089Z", "endDate": "2023-09-28T10:30:24.825Z", "timeZone": "Africa/Brazzaville", "customCPAClickWeight": 1420.08, "customCPAViewthroughWeight": 3419.03, "customCPAType": "Disabled", "impressionsOnlyBudgetingCpm": null, "primaryChannel": "Display", "primaryGoal": "", "seedId": "", "conversionReportingColumnsCount": 10946, "flights": [{"id": "", "startDateInclusiveUTC": "2024-06-26T03:24:17.236Z", "endDateExclusiveUTC": "2025-07-01T04:11:25.573Z", "budgetInAdvertiserCurrency": 6644.31, "budgetInImpressions": 164310, "dailyTargetInAdvertiserCurrency": 4555.64, "dailyTargetInImpressions": null}], "secondaryGoal": null, "tertiaryGoal": ""}, "adGroups": [{"id": "", "name": null, "campaignId": "", "isEnabled": false, "description": "er palatable clonk against noon blacken though", "programmaticGuaranteedPrivateContractId": "", "channel": "Display", "funnelLocation": "None", "budget": {"allocationType": "Maximum", "budgetInAdvertiserCurrency": 4400.5, "budgetInImpressions": 252235, "dailyTargetInAdvertiserCurrency": 3360.49, "dailyTargetInImpressions": 82960}, "baseBidCPMInAdvertiserCurrency": 4115.19, "maxBidCPMInAdvertiserCurrency": 9043, "marketType": "OpenMarket", "audienceTargeting": {"audienceId": "", "audienceAcceleratorExclusionsEnabled": true, "audienceBoosterEnabled": false, "audienceExcluderEnabled": true, "audiencePredictorEnabled": false, "crossDeviceVendorListForAudience": [706430], "recencyExclusionWindowInMinutes": 773547, "targetTrackableUsersEnabled": true, "useMcIdAsPrimary": false}, "roiGoal": {"maximizeReach": null, "maximizeLtvIncrementalReach": false, "cpcInAdvertiserCurrency": 8439.61, "ctrInPercent": 3120.58, "nielsenOTPInPercent": 7464.3, "cpaInAdvertiserCurrency": 6205.02, "returnOnAdSpendPercent": 9077.31, "vcrInPercent": 9134.53, "viewabilityInPercent": 7809.01, "vcpmInAdvertiserCurrency": null, "cpcvInAdvertiserCurrency": 9297.05, "miaozhenOTPInPercent": 330.19}, "creativeIds": ["", ""], "associatedBidLists": [], "flights": null, "koaOptimizationSettings": {"areFutureKoaFeaturesEnabled": false, "predictiveClearingEnabled": false}, "comscoreSettings": {"isEnabled": true, "populationId": 34197, "demographicMemberIds": [], "mobileDemographicMemberIds": [172582, 373780]}, "contractTargeting": {"allowOpenMarketBiddingWhenTargetingContracts": true}, "dimensionalBiddingAutoOptimizationSettings": [[], []], "isUseClicksAsConversionsEnabled": true, "isUseSecondaryConversionsEnabled": false, "nielsenTrackingAttributes": {"enhancedReportingOption": "Site", "gender": "Female", "startAge": "FiftyFive", "endAge": "TwentyFour", "countries": [""]}}]} @@ -776,4 +1701,304 @@ examples: application/json: {"type": "", "title": "", "status": 603376, "detail": "", "instance": ""} examplesVersion: 1.0.2 generatedTests: {} -releaseNotes: "## Python SDK Changes Detected:\n* `workflows.ad_groups.create()`: \n * `request` **Changed**\n * `response.ad_group.market_type` **Added**\n* `workflows.ad_groups.update()`: \n * `request` **Changed**\n * `response.ad_group.market_type` **Added**\n* `workflows.ad_group.create_ad_groups_job()`: \n * `request.input.[]` **Changed**\n* `workflows.ad_group.update_ad_groups_job()`: \n * `request.input.[]` **Changed**\n* `workflows.campaign.create()`: \n * `request` **Changed**\n * `response.ad_groups.[].market_type` **Added**\n* `workflows.campaign.create_campaigns_job()`: \n * `request.input.[]` **Changed**\n* `workflows.campaign.update_campaigns_job()`: `response.ad_groups.[].market_type` **Added**\n* `workflows.campaigns.update()`: `response.ad_groups.[].market_type` **Added**\n" +releaseNotes: "## Python SDK Changes:\n* `workflows.campaign.update_campaigns_job()`: \n * `request.input[]` **Changed** **Breaking** ⚠️\n* `workflows.campaigns.update()`: `request` **Changed** **Breaking** ⚠️\n* `workflows.campaign.create()`: `request` **Changed**\n* `workflows.campaign.create_campaigns_job()`: \n * `request.input[]` **Changed**\n" +generatedFiles: + - .gitattributes + - .vscode/settings.json + - USAGE.md + - docs/models/adgroupassociatebidlist.md + - docs/models/adgroupaudiencetargeting.md + - docs/models/adgroupbudget.md + - docs/models/adgroupbulkcreateworkflowinputwithvalidation.md + - docs/models/adgroupbulkupdateworkflowinputwithvalidation.md + - docs/models/adgroupchannel.md + - docs/models/adgroupcomscoresettings.md + - docs/models/adgroupcontracttargeting.md + - docs/models/adgroupcreateworkflowinput.md + - docs/models/adgroupcreateworkflowinputwithvalidation.md + - docs/models/adgroupcreateworkflowprimaryinput.md + - docs/models/adgroupflight.md + - docs/models/adgroupfunnellocation.md + - docs/models/adgroupkoaoptimizationsettings.md + - docs/models/adgroupnielsentrackingattributes.md + - docs/models/adgrouppayload.md + - docs/models/adgrouproigoal.md + - docs/models/adgroupupdateworkflowinput.md + - docs/models/adgroupupdateworkflowinputwithvalidation.md + - docs/models/adgroupupdateworkflowprimaryinput.md + - docs/models/adgroupworkflow.md + - docs/models/adgroupworkflowadvancedinput.md + - docs/models/adgroupworkflowassociatebidlistinput.md + - docs/models/adgroupworkflowaudiencetargetinginput.md + - docs/models/adgroupworkflowbudgetinput.md + - docs/models/adgroupworkflowcomscoresettingsinput.md + - docs/models/adgroupworkflowcontracttargetinginput.md + - docs/models/adgroupworkflowflightinput.md + - docs/models/adgroupworkflowkoaoptimizationsettingsinput.md + - docs/models/adgroupworkflownewfrequencyconfiginput.md + - docs/models/adgroupworkflownielsentrackingattributesinput.md + - docs/models/adgroupworkflowroigoalinput.md + - docs/models/allocationtype.md + - docs/models/archiveadgroupsrequest.md + - docs/models/archiveadgroupsresponse.md + - docs/models/archivecampaignsrequest.md + - docs/models/archivecampaignsresponse.md + - docs/models/bulkjobstatus.md + - docs/models/callrestapiworkflowinput.md + - docs/models/campaignbulkcreateworkflowinputwithvalidation.md + - docs/models/campaignbulkupdateworkflowinputwithvalidation.md + - docs/models/campaignchanneltype.md + - docs/models/campaigncreatepassthroughfeesinput.md + - docs/models/campaigncreateworkflowadgroupadvancedinput.md + - docs/models/campaigncreateworkflowadgroupflightinput.md + - docs/models/campaigncreateworkflowadgroupinput.md + - docs/models/campaigncreateworkflowadvancedinput.md + - docs/models/campaigncreateworkflowincrementalreachcampaignsetting.md + - docs/models/campaigncreateworkflowinput.md + - docs/models/campaigncreateworkflowinputwithvalidation.md + - docs/models/campaigncreateworkflowpassthroughfeecardinput.md + - docs/models/campaigncreateworkflowprimaryinput.md + - docs/models/campaignflightworkflow.md + - docs/models/campaignpacingmode.md + - docs/models/campaignpayload.md + - docs/models/campaignupdateworkflowadvancedinput.md + - docs/models/campaignupdateworkflowinput.md + - docs/models/campaignupdateworkflowinputwithvalidation.md + - docs/models/campaignupdateworkflowprimaryinput.md + - docs/models/campaignversionworkflow.md + - docs/models/campaignworkflow.md + - docs/models/campaignworkflowbudgetinput.md + - docs/models/campaignworkflowcampaignconversionreportingcolumninput.md + - docs/models/campaignworkflowflightinput.md + - docs/models/campaignworkflowroigoalinput.md + - docs/models/createadgroupresponse.md + - docs/models/createadgroupsjobresponse.md + - docs/models/createcampaignresponse.md + - docs/models/createcampaignsjobresponse.md + - docs/models/customcpatype.md + - docs/models/customroasconfig.md + - docs/models/customroastype.md + - docs/models/dimensionalbiddingdimensions.md + - docs/models/enhancednielsenreportingoptions.md + - docs/models/enhancednielsenreportingoptionsinput.md + - docs/models/firstpartydatainput.md + - docs/models/getcampaignversionrequest.md + - docs/models/getcampaignversionresponse.md + - docs/models/getfirstpartydatajobresponse.md + - docs/models/getgraphqlbulkjobstatusrequest.md + - docs/models/getgraphqlbulkjobstatusresponse.md + - docs/models/getjobstatusrequest.md + - docs/models/getjobstatusresponse.md + - docs/models/getthirdpartydatajobresponse.md + - docs/models/graphqlbulkjob.md + - docs/models/graphqlbulkjobcallbackinput.md + - docs/models/graphqlbulkjoberror.md + - docs/models/graphqlbulkjobpayload.md + - docs/models/graphqlbulkjobresponse.md + - docs/models/graphqlbulkjobretrievalresponse.md + - docs/models/graphqlqueryjobinput.md + - docs/models/graphqlrequestinput.md + - docs/models/httpmetadata.md + - docs/models/incrementalreachbrandinput.md + - docs/models/incrementalreachproductinput.md + - docs/models/keyvaluepairofstringandstringinput.md + - docs/models/markettype.md + - docs/models/passthroughfeetype.md + - docs/models/problemdetails.md + - docs/models/problemdetailserror.md + - docs/models/realyticsentertainmenttype.md + - docs/models/realyticsreachsettinginput.md + - docs/models/restapimethodtype.md + - docs/models/security.md + - docs/models/standardjobstatusresponse.md + - docs/models/standardjobsubmitresponse.md + - docs/models/submitgraphqlbulkqueryjobresponse.md + - docs/models/submitgraphqlrequestresponse.md + - docs/models/submitrestrequestresponse.md + - docs/models/targetingendage.md + - docs/models/targetingendageinput.md + - docs/models/targetinggender.md + - docs/models/targetinggenderinput.md + - docs/models/targetingstartage.md + - docs/models/targetingstartageinput.md + - docs/models/thirdpartydatainput.md + - docs/models/updateadgroupresponse.md + - docs/models/updateadgroupsjobresponse.md + - docs/models/updatecampaignresponse.md + - docs/models/updatecampaignsjobresponse.md + - docs/models/utils/retryconfig.md + - docs/models/workflowcallbackinput.md + - docs/models/workflowstatus.md + - docs/sdks/adgroup/README.md + - docs/sdks/adgroups/README.md + - docs/sdks/campaign/README.md + - docs/sdks/campaigns/README.md + - docs/sdks/dmp/README.md + - docs/sdks/graphqlrequest/README.md + - docs/sdks/jobstatus/README.md + - docs/sdks/restrequest/README.md + - poetry.toml + - py.typed + - pylintrc + - pyproject.toml + - scripts/prepare_readme.py + - scripts/publish.sh + - src/ttd_workflows/__init__.py + - src/ttd_workflows/_hooks/__init__.py + - src/ttd_workflows/_hooks/sdkhooks.py + - src/ttd_workflows/_hooks/types.py + - src/ttd_workflows/_version.py + - src/ttd_workflows/ad_group.py + - src/ttd_workflows/adgroups.py + - src/ttd_workflows/basesdk.py + - src/ttd_workflows/campaign.py + - src/ttd_workflows/campaigns.py + - src/ttd_workflows/dmp.py + - src/ttd_workflows/graphql_request.py + - src/ttd_workflows/httpclient.py + - src/ttd_workflows/job_status.py + - src/ttd_workflows/models/__init__.py + - src/ttd_workflows/models/adgroupassociatebidlist.py + - src/ttd_workflows/models/adgroupaudiencetargeting.py + - src/ttd_workflows/models/adgroupbudget.py + - src/ttd_workflows/models/adgroupbulkcreateworkflowinputwithvalidation.py + - src/ttd_workflows/models/adgroupbulkupdateworkflowinputwithvalidation.py + - src/ttd_workflows/models/adgroupchannel.py + - src/ttd_workflows/models/adgroupcomscoresettings.py + - src/ttd_workflows/models/adgroupcontracttargeting.py + - src/ttd_workflows/models/adgroupcreateworkflowinput.py + - src/ttd_workflows/models/adgroupcreateworkflowinputwithvalidation.py + - src/ttd_workflows/models/adgroupcreateworkflowprimaryinput.py + - src/ttd_workflows/models/adgroupflight.py + - src/ttd_workflows/models/adgroupfunnellocation.py + - src/ttd_workflows/models/adgroupkoaoptimizationsettings.py + - src/ttd_workflows/models/adgroupnielsentrackingattributes.py + - src/ttd_workflows/models/adgrouppayload.py + - src/ttd_workflows/models/adgrouproigoal.py + - src/ttd_workflows/models/adgroupupdateworkflowinput.py + - src/ttd_workflows/models/adgroupupdateworkflowinputwithvalidation.py + - src/ttd_workflows/models/adgroupupdateworkflowprimaryinput.py + - src/ttd_workflows/models/adgroupworkflow.py + - src/ttd_workflows/models/adgroupworkflowadvancedinput.py + - src/ttd_workflows/models/adgroupworkflowassociatebidlistinput.py + - src/ttd_workflows/models/adgroupworkflowaudiencetargetinginput.py + - src/ttd_workflows/models/adgroupworkflowbudgetinput.py + - src/ttd_workflows/models/adgroupworkflowcomscoresettingsinput.py + - src/ttd_workflows/models/adgroupworkflowcontracttargetinginput.py + - src/ttd_workflows/models/adgroupworkflowflightinput.py + - src/ttd_workflows/models/adgroupworkflowkoaoptimizationsettingsinput.py + - src/ttd_workflows/models/adgroupworkflownewfrequencyconfiginput.py + - src/ttd_workflows/models/adgroupworkflownielsentrackingattributesinput.py + - src/ttd_workflows/models/adgroupworkflowroigoalinput.py + - src/ttd_workflows/models/allocationtype.py + - src/ttd_workflows/models/apierror.py + - src/ttd_workflows/models/archiveadgroupsop.py + - src/ttd_workflows/models/archivecampaignsop.py + - src/ttd_workflows/models/bulkjobstatus.py + - src/ttd_workflows/models/callrestapiworkflowinput.py + - src/ttd_workflows/models/campaignbulkcreateworkflowinputwithvalidation.py + - src/ttd_workflows/models/campaignbulkupdateworkflowinputwithvalidation.py + - src/ttd_workflows/models/campaignchanneltype.py + - src/ttd_workflows/models/campaigncreatepassthroughfeesinput.py + - src/ttd_workflows/models/campaigncreateworkflowadgroupadvancedinput.py + - src/ttd_workflows/models/campaigncreateworkflowadgroupflightinput.py + - src/ttd_workflows/models/campaigncreateworkflowadgroupinput.py + - src/ttd_workflows/models/campaigncreateworkflowadvancedinput.py + - src/ttd_workflows/models/campaigncreateworkflowincrementalreachcampaignsetting.py + - src/ttd_workflows/models/campaigncreateworkflowinput.py + - src/ttd_workflows/models/campaigncreateworkflowinputwithvalidation.py + - src/ttd_workflows/models/campaigncreateworkflowpassthroughfeecardinput.py + - src/ttd_workflows/models/campaigncreateworkflowprimaryinput.py + - src/ttd_workflows/models/campaignflightworkflow.py + - src/ttd_workflows/models/campaignpacingmode.py + - src/ttd_workflows/models/campaignpayload.py + - src/ttd_workflows/models/campaignupdateworkflowadvancedinput.py + - src/ttd_workflows/models/campaignupdateworkflowinput.py + - src/ttd_workflows/models/campaignupdateworkflowinputwithvalidation.py + - src/ttd_workflows/models/campaignupdateworkflowprimaryinput.py + - src/ttd_workflows/models/campaignversionworkflow.py + - src/ttd_workflows/models/campaignworkflow.py + - src/ttd_workflows/models/campaignworkflowbudgetinput.py + - src/ttd_workflows/models/campaignworkflowcampaignconversionreportingcolumninput.py + - src/ttd_workflows/models/campaignworkflowflightinput.py + - src/ttd_workflows/models/campaignworkflowroigoalinput.py + - src/ttd_workflows/models/createadgroupop.py + - src/ttd_workflows/models/createadgroupsjobop.py + - src/ttd_workflows/models/createcampaignop.py + - src/ttd_workflows/models/createcampaignsjobop.py + - src/ttd_workflows/models/customcpatype.py + - src/ttd_workflows/models/customroasconfig.py + - src/ttd_workflows/models/customroastype.py + - src/ttd_workflows/models/dimensionalbiddingdimensions.py + - src/ttd_workflows/models/enhancednielsenreportingoptions.py + - src/ttd_workflows/models/enhancednielsenreportingoptionsinput.py + - src/ttd_workflows/models/firstpartydatainput.py + - src/ttd_workflows/models/getcampaignversionop.py + - src/ttd_workflows/models/getfirstpartydatajobop.py + - src/ttd_workflows/models/getgraphqlbulkjobstatusop.py + - src/ttd_workflows/models/getjobstatusop.py + - src/ttd_workflows/models/getthirdpartydatajobop.py + - src/ttd_workflows/models/graphqlbulkjob.py + - src/ttd_workflows/models/graphqlbulkjobcallbackinput.py + - src/ttd_workflows/models/graphqlbulkjoberror.py + - src/ttd_workflows/models/graphqlbulkjobpayload.py + - src/ttd_workflows/models/graphqlbulkjobresponse.py + - src/ttd_workflows/models/graphqlbulkjobretrievalresponse.py + - src/ttd_workflows/models/graphqlqueryjobinput.py + - src/ttd_workflows/models/graphqlrequestinput.py + - src/ttd_workflows/models/httpmetadata.py + - src/ttd_workflows/models/incrementalreachbrandinput.py + - src/ttd_workflows/models/incrementalreachproductinput.py + - src/ttd_workflows/models/keyvaluepairofstringandstringinput.py + - src/ttd_workflows/models/markettype.py + - src/ttd_workflows/models/no_response_error.py + - src/ttd_workflows/models/passthroughfeetype.py + - src/ttd_workflows/models/problemdetails.py + - src/ttd_workflows/models/problemdetails_error.py + - src/ttd_workflows/models/realyticsentertainmenttype.py + - src/ttd_workflows/models/realyticsreachsettinginput.py + - src/ttd_workflows/models/responsevalidationerror.py + - src/ttd_workflows/models/restapimethodtype.py + - src/ttd_workflows/models/security.py + - src/ttd_workflows/models/standardjobstatusresponse.py + - src/ttd_workflows/models/standardjobsubmitresponse.py + - src/ttd_workflows/models/submitgraphqlbulkqueryjobop.py + - src/ttd_workflows/models/submitgraphqlrequestop.py + - src/ttd_workflows/models/submitrestrequestop.py + - src/ttd_workflows/models/targetingendage.py + - src/ttd_workflows/models/targetingendageinput.py + - src/ttd_workflows/models/targetinggender.py + - src/ttd_workflows/models/targetinggenderinput.py + - src/ttd_workflows/models/targetingstartage.py + - src/ttd_workflows/models/targetingstartageinput.py + - src/ttd_workflows/models/thirdpartydatainput.py + - src/ttd_workflows/models/updateadgroupop.py + - src/ttd_workflows/models/updateadgroupsjobop.py + - src/ttd_workflows/models/updatecampaignop.py + - src/ttd_workflows/models/updatecampaignsjobop.py + - src/ttd_workflows/models/workflowcallbackinput.py + - src/ttd_workflows/models/workflowserror.py + - src/ttd_workflows/models/workflowstatus.py + - src/ttd_workflows/py.typed + - src/ttd_workflows/rest_request.py + - src/ttd_workflows/sdk.py + - src/ttd_workflows/sdkconfiguration.py + - src/ttd_workflows/types/__init__.py + - src/ttd_workflows/types/basemodel.py + - src/ttd_workflows/utils/__init__.py + - src/ttd_workflows/utils/annotations.py + - src/ttd_workflows/utils/datetimes.py + - src/ttd_workflows/utils/enums.py + - src/ttd_workflows/utils/eventstreaming.py + - src/ttd_workflows/utils/forms.py + - src/ttd_workflows/utils/headers.py + - src/ttd_workflows/utils/logger.py + - src/ttd_workflows/utils/metadata.py + - src/ttd_workflows/utils/queryparams.py + - src/ttd_workflows/utils/requestbodies.py + - src/ttd_workflows/utils/retries.py + - src/ttd_workflows/utils/security.py + - src/ttd_workflows/utils/serializers.py + - src/ttd_workflows/utils/unmarshal_json_response.py + - src/ttd_workflows/utils/url.py + - src/ttd_workflows/utils/values.py diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index 6707260..ccd5386 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -13,6 +13,7 @@ generation: requestResponseComponentNamesFeb2024: true securityFeb2025: true sharedErrorComponentsApr2025: false + sharedNestedComponentsJan2026: false auth: oAuth2ClientCredentialsEnabled: true oAuth2PasswordEnabled: true @@ -20,12 +21,13 @@ generation: schemas: allOfMergeStrategy: shallowMerge requestBodyFieldName: "" + persistentEdits: {} tests: generateTests: true generateNewTests: false skipResponseBodyAssertions: false python: - version: 0.12.0 + version: 0.13.0 additionalDependencies: dev: {} main: {} @@ -37,6 +39,7 @@ python: - Speakeasy baseErrorName: WorkflowsError clientServerStatusCodesAsErrors: true + constFieldCasing: upper defaultErrorName: APIError description: Python Client SDK Generated by Speakeasy. enableCustomCodeRegions: false @@ -55,6 +58,7 @@ python: operations: "" shared: "" webhooks: "" + inferUnionDiscriminators: true inputModelSuffix: input legacyPyright: true license: @@ -64,11 +68,14 @@ python: maxMethodParams: 999 methodArguments: infer-optional-args moduleName: "" + multipartArrayFormat: legacy outputModelSuffix: output packageManager: poetry packageName: ttd-workflows + preApplyUnionDiscriminators: false pytestFilterWarnings: [] pytestTimeout: 0 responseFormat: envelope-http sseFlatResponse: false templateVersion: v2 + useAsyncHooks: false diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index 5ab0f88..9f0f479 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -1,21 +1,21 @@ -speakeasyVersion: 1.659.0 +speakeasyVersion: 1.700.2 sources: Workflows API: sourceNamespace: workflows-api - sourceRevisionDigest: sha256:99370cb8dddc3cee36a3822b18b636c4820fde8a49a7592885112496ce50a165 - sourceBlobDigest: sha256:40ce424e35a3f71b8da7420b4308fb566a3cd210dd2f6018ec87002aa7d650e2 + sourceRevisionDigest: sha256:e433ec800854e3881f868dbde1cfedbbd52d762719b96afa79b4a9b5cd87e573 + sourceBlobDigest: sha256:4a73d5b11e3adc9342333c9b8e12bdcc2cda6c3b5cc5ef7c485019a9dba75bbb tags: - latest - - speakeasy-sdk-regen-1762131036 + - speakeasy-sdk-regen-1765241396 - v1 targets: workflows: source: Workflows API sourceNamespace: workflows-api - sourceRevisionDigest: sha256:99370cb8dddc3cee36a3822b18b636c4820fde8a49a7592885112496ce50a165 - sourceBlobDigest: sha256:40ce424e35a3f71b8da7420b4308fb566a3cd210dd2f6018ec87002aa7d650e2 + sourceRevisionDigest: sha256:e433ec800854e3881f868dbde1cfedbbd52d762719b96afa79b4a9b5cd87e573 + sourceBlobDigest: sha256:4a73d5b11e3adc9342333c9b8e12bdcc2cda6c3b5cc5ef7c485019a9dba75bbb codeSamplesNamespace: workflows-api-python-code-samples - codeSamplesRevisionDigest: sha256:c554ef1f658bb189876b39f5a8c552ac7da53a8630ba4261f5f18fcab81d0398 + codeSamplesRevisionDigest: sha256:d1b9f74610f1d208db53be1011f148bbca06614bf65bccf6e5bdffd499254e8a workflow: workflowVersion: 1.0.0 speakeasyVersion: latest diff --git a/README-PYPI.md b/README-PYPI.md index e9e9005..fe4b012 100644 --- a/README-PYPI.md +++ b/README-PYPI.md @@ -524,45 +524,45 @@ with Workflows(
Available methods -### [ad_group](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/adgroup/README.md) +### [AdGroup](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/adgroup/README.md) * [create_ad_groups_job](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/adgroup/README.md#create_ad_groups_job) - Submit a job to create multiple new ad groups * [update_ad_groups_job](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/adgroup/README.md#update_ad_groups_job) - Submit a job to update multiple ad groups -### [ad_groups](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/adgroups/README.md) +### [AdGroups](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/adgroups/README.md) * [create](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/adgroups/README.md#create) - Create a new ad group * [update](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/adgroups/README.md#update) - Update an ad group * [archive](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/adgroups/README.md#archive) - Archive multiple ad groups -### [campaign](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/campaign/README.md) +### [Campaign](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/campaign/README.md) * [create](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/campaign/README.md#create) - Create a new campaign * [create_campaigns_job](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/campaign/README.md#create_campaigns_job) - Submit a job to create multiple new campaigns * [update_campaigns_job](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/campaign/README.md#update_campaigns_job) - Submit a job to update multiple campaigns * [get_version](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/campaign/README.md#get_version) - Get a campaign's version -### [campaigns](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/campaigns/README.md) +### [Campaigns](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/campaigns/README.md) * [update](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/campaigns/README.md#update) - Update a campaign * [archive](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/campaigns/README.md#archive) - Archive multiple campaigns -### [dmp](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/dmp/README.md) +### [Dmp](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/dmp/README.md) * [get_first_party_data_job](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/dmp/README.md#get_first_party_data_job) - Submit a job for first-party data retrieval for an advertiser * [get_third_party_data_job](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/dmp/README.md#get_third_party_data_job) - Submit a job for third-party data retrieval for a partner -### [graph_ql_request](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/graphqlrequest/README.md) +### [GraphQLRequest](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/graphqlrequest/README.md) * [submit_graph_ql_request](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/graphqlrequest/README.md#submit_graph_ql_request) - Submit a valid GraphQL query or mutation * [submit_graph_ql_bulk_query_job](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/graphqlrequest/README.md#submit_graph_ql_bulk_query_job) - Submit a valid bulk GraphQL query job -### [job_status](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/jobstatus/README.md) +### [JobStatus](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/jobstatus/README.md) * [get_graph_ql_bulk_job_status](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/jobstatus/README.md#get_graph_ql_bulk_job_status) - Get the status of a previously submitted GraphQL bulk job * [get_job_status](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/jobstatus/README.md#get_job_status) - Get the status of a previously submitted job -### [rest_request](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/restrequest/README.md) +### [RESTRequest](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/restrequest/README.md) * [submit_rest_request](https://github.com/thetradedesk/ttd-workflows-python/blob/master/docs/sdks/restrequest/README.md#submit_rest_request) - Submit a valid REST request diff --git a/README.md b/README.md index ed76276..04af033 100644 --- a/README.md +++ b/README.md @@ -524,45 +524,45 @@ with Workflows(
Available methods -### [ad_group](docs/sdks/adgroup/README.md) +### [AdGroup](docs/sdks/adgroup/README.md) * [create_ad_groups_job](docs/sdks/adgroup/README.md#create_ad_groups_job) - Submit a job to create multiple new ad groups * [update_ad_groups_job](docs/sdks/adgroup/README.md#update_ad_groups_job) - Submit a job to update multiple ad groups -### [ad_groups](docs/sdks/adgroups/README.md) +### [AdGroups](docs/sdks/adgroups/README.md) * [create](docs/sdks/adgroups/README.md#create) - Create a new ad group * [update](docs/sdks/adgroups/README.md#update) - Update an ad group * [archive](docs/sdks/adgroups/README.md#archive) - Archive multiple ad groups -### [campaign](docs/sdks/campaign/README.md) +### [Campaign](docs/sdks/campaign/README.md) * [create](docs/sdks/campaign/README.md#create) - Create a new campaign * [create_campaigns_job](docs/sdks/campaign/README.md#create_campaigns_job) - Submit a job to create multiple new campaigns * [update_campaigns_job](docs/sdks/campaign/README.md#update_campaigns_job) - Submit a job to update multiple campaigns * [get_version](docs/sdks/campaign/README.md#get_version) - Get a campaign's version -### [campaigns](docs/sdks/campaigns/README.md) +### [Campaigns](docs/sdks/campaigns/README.md) * [update](docs/sdks/campaigns/README.md#update) - Update a campaign * [archive](docs/sdks/campaigns/README.md#archive) - Archive multiple campaigns -### [dmp](docs/sdks/dmp/README.md) +### [Dmp](docs/sdks/dmp/README.md) * [get_first_party_data_job](docs/sdks/dmp/README.md#get_first_party_data_job) - Submit a job for first-party data retrieval for an advertiser * [get_third_party_data_job](docs/sdks/dmp/README.md#get_third_party_data_job) - Submit a job for third-party data retrieval for a partner -### [graph_ql_request](docs/sdks/graphqlrequest/README.md) +### [GraphQLRequest](docs/sdks/graphqlrequest/README.md) * [submit_graph_ql_request](docs/sdks/graphqlrequest/README.md#submit_graph_ql_request) - Submit a valid GraphQL query or mutation * [submit_graph_ql_bulk_query_job](docs/sdks/graphqlrequest/README.md#submit_graph_ql_bulk_query_job) - Submit a valid bulk GraphQL query job -### [job_status](docs/sdks/jobstatus/README.md) +### [JobStatus](docs/sdks/jobstatus/README.md) * [get_graph_ql_bulk_job_status](docs/sdks/jobstatus/README.md#get_graph_ql_bulk_job_status) - Get the status of a previously submitted GraphQL bulk job * [get_job_status](docs/sdks/jobstatus/README.md#get_job_status) - Get the status of a previously submitted job -### [rest_request](docs/sdks/restrequest/README.md) +### [RESTRequest](docs/sdks/restrequest/README.md) * [submit_rest_request](docs/sdks/restrequest/README.md#submit_rest_request) - Submit a valid REST request diff --git a/RELEASES.md b/RELEASES.md index fd8a0ab..d6c8436 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -258,4 +258,14 @@ Based on: ### Generated - [python v0.12.0] . ### Releases -- [PyPI v0.12.0] https://pypi.org/project/ttd-workflows/0.12.0 - . \ No newline at end of file +- [PyPI v0.12.0] https://pypi.org/project/ttd-workflows/0.12.0 - . + +## 2026-02-01 01:13:01 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.700.2 (2.801.2) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v0.13.0] . +### Releases +- [PyPI v0.13.0] https://pypi.org/project/ttd-workflows/0.13.0 - . \ No newline at end of file diff --git a/docs/models/campaigncreateworkflowadvancedinput.md b/docs/models/campaigncreateworkflowadvancedinput.md index ad21be1..a2ab910 100644 --- a/docs/models/campaigncreateworkflowadvancedinput.md +++ b/docs/models/campaigncreateworkflowadvancedinput.md @@ -5,8 +5,9 @@ | Field | Type | Required | Description | | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -| `flights` | List[[models.CampaignWorkflowFlightInput](../models/campaignworkflowflightinput.md)] | :heavy_minus_sign: | N/A | | `purchase_order_number` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | +| `flights` | List[[models.CampaignWorkflowFlightInput](../models/campaignworkflowflightinput.md)] | :heavy_minus_sign: | N/A | | `include_defaults_from_advertiser` | *Optional[bool]* | :heavy_minus_sign: | N/A | | `pass_through_fee_card` | [Optional[models.CampaignCreateWorkflowPassThroughFeeCardInput]](../models/campaigncreateworkflowpassthroughfeecardinput.md) | :heavy_minus_sign: | N/A | -| `caller_source` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file +| `caller_source` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | +| `frequency_configs` | List[[models.FrequencyConfig](../models/frequencyconfig.md)] | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/campaignworkflowbudgetinput.md b/docs/models/campaigncreateworkflowbudgetinput.md similarity index 98% rename from docs/models/campaignworkflowbudgetinput.md rename to docs/models/campaigncreateworkflowbudgetinput.md index a5ae975..dbd0a67 100644 --- a/docs/models/campaignworkflowbudgetinput.md +++ b/docs/models/campaigncreateworkflowbudgetinput.md @@ -1,4 +1,4 @@ -# CampaignWorkflowBudgetInput +# CampaignCreateWorkflowBudgetInput ## Fields diff --git a/docs/models/campaigncreateworkflowprimaryinput.md b/docs/models/campaigncreateworkflowprimaryinput.md index fa5f4f9..72ac2e5 100644 --- a/docs/models/campaigncreateworkflowprimaryinput.md +++ b/docs/models/campaigncreateworkflowprimaryinput.md @@ -13,7 +13,6 @@ | `custom_cpa_type` | [Optional[models.CustomCPAType]](../models/customcpatype.md) | :heavy_minus_sign: | N/A | | `custom_roas_type` | [Optional[models.CustomROASType]](../models/customroastype.md) | :heavy_minus_sign: | N/A | | `impressions_only_budgeting_cpm` | *OptionalNullable[float]* | :heavy_minus_sign: | N/A | -| `budget` | [Optional[models.CampaignWorkflowBudgetInput]](../models/campaignworkflowbudgetinput.md) | :heavy_minus_sign: | N/A | | `end_date_in_utc` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | N/A | | `seed_id` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | | `campaign_conversion_reporting_columns` | List[[models.CampaignWorkflowCampaignConversionReportingColumnInput](../models/campaignworkflowcampaignconversionreportingcolumninput.md)] | :heavy_minus_sign: | N/A | @@ -25,4 +24,5 @@ | `primary_channel` | [models.CampaignChannelType](../models/campaignchanneltype.md) | :heavy_check_mark: | N/A | | `primary_goal` | [models.CampaignWorkflowROIGoalInput](../models/campaignworkflowroigoalinput.md) | :heavy_check_mark: | N/A | | `start_date_in_utc` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | N/A | +| `budget` | [Optional[models.CampaignCreateWorkflowBudgetInput]](../models/campaigncreateworkflowbudgetinput.md) | :heavy_minus_sign: | N/A | | `campaign_incremental_reach_setting` | [Optional[models.CampaignCreateWorkflowIncrementalReachCampaignSetting]](../models/campaigncreateworkflowincrementalreachcampaignsetting.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/campaignupdateworkflowadvancedinput.md b/docs/models/campaignupdateworkflowadvancedinput.md index 385c4f5..a47a608 100644 --- a/docs/models/campaignupdateworkflowadvancedinput.md +++ b/docs/models/campaignupdateworkflowadvancedinput.md @@ -3,7 +3,6 @@ ## Fields -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | -| `flights` | List[[models.CampaignWorkflowFlightInput](../models/campaignworkflowflightinput.md)] | :heavy_minus_sign: | N/A | -| `purchase_order_number` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file +| Field | Type | Required | Description | +| ----------------------- | ----------------------- | ----------------------- | ----------------------- | +| `purchase_order_number` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/campaignupdateworkflowbudgetinput.md b/docs/models/campaignupdateworkflowbudgetinput.md new file mode 100644 index 0000000..437825e --- /dev/null +++ b/docs/models/campaignupdateworkflowbudgetinput.md @@ -0,0 +1,8 @@ +# CampaignUpdateWorkflowBudgetInput + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | +| `pacing_mode` | [models.CampaignPacingMode](../models/campaignpacingmode.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/campaignupdateworkflowprimaryinput.md b/docs/models/campaignupdateworkflowprimaryinput.md index 4f45177..e766ed6 100644 --- a/docs/models/campaignupdateworkflowprimaryinput.md +++ b/docs/models/campaignupdateworkflowprimaryinput.md @@ -13,7 +13,6 @@ | `custom_cpa_type` | [Optional[models.CustomCPAType]](../models/customcpatype.md) | :heavy_minus_sign: | N/A | | `custom_roas_type` | [Optional[models.CustomROASType]](../models/customroastype.md) | :heavy_minus_sign: | N/A | | `impressions_only_budgeting_cpm` | *OptionalNullable[float]* | :heavy_minus_sign: | N/A | -| `budget` | [Optional[models.CampaignWorkflowBudgetInput]](../models/campaignworkflowbudgetinput.md) | :heavy_minus_sign: | N/A | | `end_date_in_utc` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | N/A | | `seed_id` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | | `campaign_conversion_reporting_columns` | List[[models.CampaignWorkflowCampaignConversionReportingColumnInput](../models/campaignworkflowcampaignconversionreportingcolumninput.md)] | :heavy_minus_sign: | N/A | @@ -23,4 +22,5 @@ | `name` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | | `primary_channel` | [Optional[models.CampaignChannelType]](../models/campaignchanneltype.md) | :heavy_minus_sign: | N/A | | `primary_goal` | [Optional[models.CampaignWorkflowROIGoalInput]](../models/campaignworkflowroigoalinput.md) | :heavy_minus_sign: | N/A | -| `start_date_in_utc` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | N/A | \ No newline at end of file +| `start_date_in_utc` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | N/A | +| `budget` | [Optional[models.CampaignUpdateWorkflowBudgetInput]](../models/campaignupdateworkflowbudgetinput.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/campaignworkflowcampaignconversionreportingcolumninput.md b/docs/models/campaignworkflowcampaignconversionreportingcolumninput.md index 06ac374..fec5e5a 100644 --- a/docs/models/campaignworkflowcampaignconversionreportingcolumninput.md +++ b/docs/models/campaignworkflowcampaignconversionreportingcolumninput.md @@ -3,11 +3,12 @@ ## Fields -| Field | Type | Required | Description | -| ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | -| `tracking_tag_id` | *str* | :heavy_check_mark: | N/A | -| `include_in_custom_cpa` | *bool* | :heavy_check_mark: | N/A | -| `reporting_column_id` | *int* | :heavy_check_mark: | N/A | -| `roas_config` | [Optional[models.CustomROASConfig]](../models/customroasconfig.md) | :heavy_minus_sign: | N/A | -| `weight` | *OptionalNullable[float]* | :heavy_minus_sign: | N/A | -| `cross_device_attribution_model_id` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| `tracking_tag_id` | *str* | :heavy_check_mark: | N/A | +| `include_in_custom_cpa` | *bool* | :heavy_check_mark: | N/A | +| `reporting_column_id` | *int* | :heavy_check_mark: | N/A | +| `roas_config` | [Optional[models.CustomROASConfig]](../models/customroasconfig.md) | :heavy_minus_sign: | N/A | +| `product_list_reporting_type` | [Optional[models.ProductListReportingTypeInput]](../models/productlistreportingtypeinput.md) | :heavy_minus_sign: | N/A | +| `weight` | *OptionalNullable[float]* | :heavy_minus_sign: | N/A | +| `cross_device_attribution_model_id` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/frequencyconfig.md b/docs/models/frequencyconfig.md new file mode 100644 index 0000000..e98fb89 --- /dev/null +++ b/docs/models/frequencyconfig.md @@ -0,0 +1,11 @@ +# FrequencyConfig + + +## Fields + +| Field | Type | Required | Description | +| --------------------------- | --------------------------- | --------------------------- | --------------------------- | +| `counter_name` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | +| `frequency_cap` | *OptionalNullable[int]* | :heavy_minus_sign: | N/A | +| `frequency_goal` | *OptionalNullable[int]* | :heavy_minus_sign: | N/A | +| `reset_interval_in_minutes` | *Optional[int]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/productlistreportingtypeinput.md b/docs/models/productlistreportingtypeinput.md new file mode 100644 index 0000000..c18c515 --- /dev/null +++ b/docs/models/productlistreportingtypeinput.md @@ -0,0 +1,9 @@ +# ProductListReportingTypeInput + + +## Values + +| Name | Value | +| ---------- | ---------- | +| `FEATURED` | Featured | +| `HALO` | Halo | \ No newline at end of file diff --git a/docs/sdks/adgroup/README.md b/docs/sdks/adgroup/README.md index 3a88d72..322b386 100644 --- a/docs/sdks/adgroup/README.md +++ b/docs/sdks/adgroup/README.md @@ -1,5 +1,4 @@ # AdGroup -(*ad_group*) ## Overview diff --git a/docs/sdks/adgroups/README.md b/docs/sdks/adgroups/README.md index 721e13f..3c1dfd9 100644 --- a/docs/sdks/adgroups/README.md +++ b/docs/sdks/adgroups/README.md @@ -1,5 +1,4 @@ # AdGroups -(*ad_groups*) ## Overview diff --git a/docs/sdks/campaign/README.md b/docs/sdks/campaign/README.md index 316d0a9..fa7d251 100644 --- a/docs/sdks/campaign/README.md +++ b/docs/sdks/campaign/README.md @@ -1,5 +1,4 @@ # Campaign -(*campaign*) ## Overview @@ -38,13 +37,6 @@ with Workflows( custom_cpa_type=ttd_workflows.CustomCPAType.CLICK_VIEWTHROUGH_WEIGHTING, custom_roas_type=ttd_workflows.CustomROASType.DISABLED, impressions_only_budgeting_cpm=1502.33, - budget=ttd_workflows.CampaignWorkflowBudgetInput( - pacing_mode=ttd_workflows.CampaignPacingMode.PACE_AS_SOON_AS_POSSIBLE, - budget_in_advertiser_currency=6363.35, - budget_in_impressions=836518, - daily_target_in_advertiser_currency=7814.79, - daily_target_in_impressions=784985, - ), end_date_in_utc=None, seed_id=None, campaign_conversion_reporting_columns=[ @@ -58,6 +50,7 @@ with Workflows( custom_roas_click_weight=3310.24, custom_roas_viewthrough_weight=2919.37, ), + product_list_reporting_type=ttd_workflows.ProductListReportingTypeInput.FEATURED, weight=5369.43, cross_device_attribution_model_id="", ), @@ -121,6 +114,13 @@ with Workflows( crossix_cost_per_target=False, ), start_date_in_utc=None, + budget=ttd_workflows.CampaignCreateWorkflowBudgetInput( + pacing_mode=ttd_workflows.CampaignPacingMode.PACE_AS_SOON_AS_POSSIBLE, + budget_in_advertiser_currency=6363.35, + budget_in_impressions=836518, + daily_target_in_advertiser_currency=7814.79, + daily_target_in_impressions=784985, + ), campaign_incremental_reach_setting=ttd_workflows.CampaignCreateWorkflowIncrementalReachCampaignSetting( i_spot_reach_setting=ttd_workflows.IncrementalReachBrandInput( id=787894, @@ -147,6 +147,7 @@ with Workflows( ), ), advanced_input=ttd_workflows.CampaignCreateWorkflowAdvancedInput( + purchase_order_number=None, flights=[ ttd_workflows.CampaignWorkflowFlightInput( start_date_inclusive_utc=parse_datetime("2024-07-08T10:52:56.944Z"), @@ -157,7 +158,6 @@ with Workflows( daily_target_in_impressions=333131, ), ], - purchase_order_number=None, include_defaults_from_advertiser=False, pass_through_fee_card=ttd_workflows.CampaignCreateWorkflowPassThroughFeeCardInput( start_date_utc=parse_datetime("2023-03-18T04:39:08.387Z"), @@ -170,6 +170,7 @@ with Workflows( ], ), caller_source="", + frequency_configs=None, ), ad_groups=[ ttd_workflows.CampaignCreateWorkflowAdGroupInput( @@ -340,13 +341,6 @@ with Workflows( custom_cpa_type=ttd_workflows.CustomCPAType.CLICK_VIEWTHROUGH_WEIGHTING, custom_roas_type=ttd_workflows.CustomROASType.COMPOSITE_WEIGHTING, impressions_only_budgeting_cpm=4427.56, - budget=ttd_workflows.CampaignWorkflowBudgetInput( - pacing_mode=ttd_workflows.CampaignPacingMode.PACE_AHEAD, - budget_in_advertiser_currency=5501.96, - budget_in_impressions=629784, - daily_target_in_advertiser_currency=2524.41, - daily_target_in_impressions=726807, - ), end_date_in_utc=parse_datetime("2023-12-21T01:12:20.772Z"), seed_id="", campaign_conversion_reporting_columns=[ @@ -360,6 +354,7 @@ with Workflows( custom_roas_click_weight=5286.76, custom_roas_viewthrough_weight=8906.82, ), + product_list_reporting_type=ttd_workflows.ProductListReportingTypeInput.HALO, weight=None, cross_device_attribution_model_id="", ), @@ -423,6 +418,13 @@ with Workflows( crossix_cost_per_target=True, ), start_date_in_utc=parse_datetime("2025-09-26T21:06:42.946Z"), + budget=ttd_workflows.CampaignCreateWorkflowBudgetInput( + pacing_mode=ttd_workflows.CampaignPacingMode.PACE_AHEAD, + budget_in_advertiser_currency=5501.96, + budget_in_impressions=629784, + daily_target_in_advertiser_currency=2524.41, + daily_target_in_impressions=726807, + ), campaign_incremental_reach_setting=ttd_workflows.CampaignCreateWorkflowIncrementalReachCampaignSetting( i_spot_reach_setting=ttd_workflows.IncrementalReachBrandInput( id=178346, @@ -454,6 +456,7 @@ with Workflows( ), ), advanced_input=ttd_workflows.CampaignCreateWorkflowAdvancedInput( + purchase_order_number="", flights=[ ttd_workflows.CampaignWorkflowFlightInput( start_date_inclusive_utc=parse_datetime("2024-09-20T06:04:19.345Z"), @@ -464,7 +467,6 @@ with Workflows( daily_target_in_impressions=152838, ), ], - purchase_order_number="", include_defaults_from_advertiser=False, pass_through_fee_card=ttd_workflows.CampaignCreateWorkflowPassThroughFeeCardInput( start_date_utc=parse_datetime("2024-07-24T11:58:59.190Z"), @@ -477,6 +479,14 @@ with Workflows( ], ), caller_source="", + frequency_configs=[ + ttd_workflows.FrequencyConfig( + counter_name=None, + frequency_cap=373225, + frequency_goal=966290, + reset_interval_in_minutes=774436, + ), + ], ), ad_groups=[ ttd_workflows.CampaignCreateWorkflowAdGroupInput( @@ -654,13 +664,6 @@ with Workflows( custom_cpa_type=ttd_workflows.CustomCPAType.PIXEL_WEIGHTING, custom_roas_type=ttd_workflows.CustomROASType.CLICK_VIEWTHROUGH_WEIGHTING, impressions_only_budgeting_cpm=2706.4, - budget=ttd_workflows.CampaignWorkflowBudgetInput( - pacing_mode=ttd_workflows.CampaignPacingMode.PACE_AS_SOON_AS_POSSIBLE, - budget_in_advertiser_currency=2564.89, - budget_in_impressions=659726, - daily_target_in_advertiser_currency=6514.48, - daily_target_in_impressions=892097, - ), end_date_in_utc=parse_datetime("2023-11-11T21:39:56.025Z"), seed_id="", campaign_conversion_reporting_columns=[ @@ -674,6 +677,7 @@ with Workflows( custom_roas_click_weight=None, custom_roas_viewthrough_weight=6784.9, ), + product_list_reporting_type=ttd_workflows.ProductListReportingTypeInput.HALO, weight=2260.69, cross_device_attribution_model_id="", ), @@ -736,18 +740,11 @@ with Workflows( crossix_cost_per_target=True, ), start_date_in_utc=parse_datetime("2023-01-13T23:06:05.083Z"), + budget=ttd_workflows.CampaignUpdateWorkflowBudgetInput( + pacing_mode=ttd_workflows.CampaignPacingMode.PACE_AS_SOON_AS_POSSIBLE, + ), ), advanced_input=ttd_workflows.CampaignUpdateWorkflowAdvancedInput( - flights=[ - ttd_workflows.CampaignWorkflowFlightInput( - start_date_inclusive_utc=parse_datetime("2023-08-14T13:47:31.198Z"), - end_date_exclusive_utc=parse_datetime("2024-07-07T14:46:57.378Z"), - budget_in_advertiser_currency=1874.95, - budget_in_impressions=207094, - daily_target_in_advertiser_currency=7255.71, - daily_target_in_impressions=760981, - ), - ], purchase_order_number="", ), ), diff --git a/docs/sdks/campaigns/README.md b/docs/sdks/campaigns/README.md index 7a752ee..a0e5eeb 100644 --- a/docs/sdks/campaigns/README.md +++ b/docs/sdks/campaigns/README.md @@ -1,5 +1,4 @@ # Campaigns -(*campaigns*) ## Overview @@ -37,13 +36,6 @@ with Workflows( custom_cpa_type=ttd_workflows.CustomCPAType.CLICK_VIEWTHROUGH_WEIGHTING, custom_roas_type=ttd_workflows.CustomROASType.DISABLED, impressions_only_budgeting_cpm=126.57, - budget=ttd_workflows.CampaignWorkflowBudgetInput( - pacing_mode=ttd_workflows.CampaignPacingMode.PACE_AS_SOON_AS_POSSIBLE, - budget_in_advertiser_currency=6974.82, - budget_in_impressions=834352, - daily_target_in_advertiser_currency=8583.49, - daily_target_in_impressions=746941, - ), end_date_in_utc=parse_datetime("2024-07-09T17:14:23.542Z"), seed_id="", campaign_conversion_reporting_columns=[ @@ -57,6 +49,7 @@ with Workflows( custom_roas_click_weight=129.65, custom_roas_viewthrough_weight=2890.82, ), + product_list_reporting_type=ttd_workflows.ProductListReportingTypeInput.FEATURED, weight=5187.48, cross_device_attribution_model_id=None, ), @@ -119,18 +112,11 @@ with Workflows( crossix_cost_per_target=True, ), start_date_in_utc=parse_datetime("2024-02-29T10:31:50.069Z"), + budget=ttd_workflows.CampaignUpdateWorkflowBudgetInput( + pacing_mode=ttd_workflows.CampaignPacingMode.PACE_AS_SOON_AS_POSSIBLE, + ), ), advanced_input=ttd_workflows.CampaignUpdateWorkflowAdvancedInput( - flights=[ - ttd_workflows.CampaignWorkflowFlightInput( - start_date_inclusive_utc=parse_datetime("2025-11-09T04:11:39.432Z"), - end_date_exclusive_utc=parse_datetime("2025-09-10T20:38:51.701Z"), - budget_in_advertiser_currency=6534.57, - budget_in_impressions=865481, - daily_target_in_advertiser_currency=1033.72, - daily_target_in_impressions=None, - ), - ], purchase_order_number="", ), validate_input_only=True, diff --git a/docs/sdks/dmp/README.md b/docs/sdks/dmp/README.md index 2ed8824..18284c8 100644 --- a/docs/sdks/dmp/README.md +++ b/docs/sdks/dmp/README.md @@ -1,5 +1,4 @@ # Dmp -(*dmp*) ## Overview diff --git a/docs/sdks/graphqlrequest/README.md b/docs/sdks/graphqlrequest/README.md index 960440e..e37d515 100644 --- a/docs/sdks/graphqlrequest/README.md +++ b/docs/sdks/graphqlrequest/README.md @@ -1,5 +1,4 @@ # GraphQLRequest -(*graph_ql_request*) ## Overview diff --git a/docs/sdks/jobstatus/README.md b/docs/sdks/jobstatus/README.md index 2275e09..eebac60 100644 --- a/docs/sdks/jobstatus/README.md +++ b/docs/sdks/jobstatus/README.md @@ -1,5 +1,4 @@ # JobStatus -(*job_status*) ## Overview diff --git a/docs/sdks/restrequest/README.md b/docs/sdks/restrequest/README.md index 87a6088..5f4a27e 100644 --- a/docs/sdks/restrequest/README.md +++ b/docs/sdks/restrequest/README.md @@ -1,5 +1,4 @@ # RESTRequest -(*rest_request*) ## Overview diff --git a/pyproject.toml b/pyproject.toml index 0411475..cffaebd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "ttd-workflows" -version = "0.12.0" +version = "0.13.0" description = "Python Client SDK Generated by Speakeasy." authors = [{ name = "Speakeasy" },] readme = "README-PYPI.md" diff --git a/src/ttd_workflows/_version.py b/src/ttd_workflows/_version.py index 6089b73..9e00d54 100644 --- a/src/ttd_workflows/_version.py +++ b/src/ttd_workflows/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "ttd-workflows" -__version__: str = "0.12.0" +__version__: str = "0.13.0" __openapi_doc_version__: str = "v1" -__gen_version__: str = "2.755.9" -__user_agent__: str = "speakeasy-sdk/python 0.12.0 2.755.9 v1 ttd-workflows" +__gen_version__: str = "2.801.2" +__user_agent__: str = "speakeasy-sdk/python 0.13.0 2.801.2 v1 ttd-workflows" try: if __package__ is not None: diff --git a/src/ttd_workflows/ad_group.py b/src/ttd_workflows/ad_group.py index aa621bf..fdeedbb 100644 --- a/src/ttd_workflows/ad_group.py +++ b/src/ttd_workflows/ad_group.py @@ -70,6 +70,7 @@ def create_ad_groups_job( "json", Optional[models.AdGroupBulkCreateWorkflowInputWithValidation], ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -182,6 +183,7 @@ async def create_ad_groups_job_async( "json", Optional[models.AdGroupBulkCreateWorkflowInputWithValidation], ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -296,6 +298,7 @@ def update_ad_groups_job( "json", Optional[models.AdGroupBulkUpdateWorkflowInputWithValidation], ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -410,6 +413,7 @@ async def update_ad_groups_job_async( "json", Optional[models.AdGroupBulkUpdateWorkflowInputWithValidation], ), + allow_empty_value=None, timeout_ms=timeout_ms, ) diff --git a/src/ttd_workflows/adgroups.py b/src/ttd_workflows/adgroups.py index 48adadf..a70baa2 100644 --- a/src/ttd_workflows/adgroups.py +++ b/src/ttd_workflows/adgroups.py @@ -70,6 +70,7 @@ def create( "json", Optional[models.AdGroupCreateWorkflowInputWithValidation], ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -186,6 +187,7 @@ async def create_async( "json", Optional[models.AdGroupCreateWorkflowInputWithValidation], ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -304,6 +306,7 @@ def update( "json", Optional[models.AdGroupUpdateWorkflowInputWithValidation], ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -418,6 +421,7 @@ async def update_async( "json", Optional[models.AdGroupUpdateWorkflowInputWithValidation], ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -522,6 +526,7 @@ def archive( get_serialized_body=lambda: utils.serialize_request_body( request.request_body, False, True, "json", Optional[List[str]] ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -624,6 +629,7 @@ async def archive_async( get_serialized_body=lambda: utils.serialize_request_body( request.request_body, False, True, "json", Optional[List[str]] ), + allow_empty_value=None, timeout_ms=timeout_ms, ) diff --git a/src/ttd_workflows/basesdk.py b/src/ttd_workflows/basesdk.py index a15931d..8421abf 100644 --- a/src/ttd_workflows/basesdk.py +++ b/src/ttd_workflows/basesdk.py @@ -8,7 +8,12 @@ AfterSuccessContext, BeforeRequestContext, ) -from ttd_workflows.utils import RetryConfig, SerializedRequestBody, get_body_content +from ttd_workflows.utils import ( + RetryConfig, + SerializedRequestBody, + get_body_content, + run_sync_in_thread, +) from typing import Callable, List, Mapping, Optional, Tuple from urllib.parse import parse_qs, urlparse @@ -60,6 +65,7 @@ def _build_request_async( ] = None, url_override: Optional[str] = None, http_headers: Optional[Mapping[str, str]] = None, + allow_empty_value: Optional[List[str]] = None, ) -> httpx.Request: client = self.sdk_configuration.async_client return self._build_request_with_client( @@ -80,6 +86,7 @@ def _build_request_async( get_serialized_body, url_override, http_headers, + allow_empty_value, ) def _build_request( @@ -102,6 +109,7 @@ def _build_request( ] = None, url_override: Optional[str] = None, http_headers: Optional[Mapping[str, str]] = None, + allow_empty_value: Optional[List[str]] = None, ) -> httpx.Request: client = self.sdk_configuration.client return self._build_request_with_client( @@ -122,6 +130,7 @@ def _build_request( get_serialized_body, url_override, http_headers, + allow_empty_value, ) def _build_request_with_client( @@ -145,6 +154,7 @@ def _build_request_with_client( ] = None, url_override: Optional[str] = None, http_headers: Optional[Mapping[str, str]] = None, + allow_empty_value: Optional[List[str]] = None, ) -> httpx.Request: query_params = {} @@ -160,6 +170,7 @@ def _build_request_with_client( query_params = utils.get_query_params( request if request_has_query_params else None, _globals if request_has_query_params else None, + allow_empty_value, ) else: # Pick up the query parameter from the override so they can be @@ -305,7 +316,10 @@ async def do_request_async( async def do(): http_res = None try: - req = hooks.before_request(BeforeRequestContext(hook_ctx), request) + req = await run_sync_in_thread( + hooks.before_request, BeforeRequestContext(hook_ctx), request + ) + logger.debug( "Request:\nMethod: %s\nURL: %s\nHeaders: %s\nBody: %s", req.method, @@ -319,7 +333,10 @@ async def do(): http_res = await client.send(req, stream=stream) except Exception as e: - _, e = hooks.after_error(AfterErrorContext(hook_ctx), None, e) + _, e = await run_sync_in_thread( + hooks.after_error, AfterErrorContext(hook_ctx), None, e + ) + if e is not None: logger.debug("Request Exception", exc_info=True) raise e @@ -337,9 +354,10 @@ async def do(): ) if utils.match_status_codes(error_status_codes, http_res.status_code): - result, err = hooks.after_error( - AfterErrorContext(hook_ctx), http_res, None + result, err = await run_sync_in_thread( + hooks.after_error, AfterErrorContext(hook_ctx), http_res, None ) + if err is not None: logger.debug("Request Exception", exc_info=True) raise err @@ -359,6 +377,8 @@ async def do(): http_res = await do() if not utils.match_status_codes(error_status_codes, http_res.status_code): - http_res = hooks.after_success(AfterSuccessContext(hook_ctx), http_res) + http_res = await run_sync_in_thread( + hooks.after_success, AfterSuccessContext(hook_ctx), http_res + ) return http_res diff --git a/src/ttd_workflows/campaign.py b/src/ttd_workflows/campaign.py index f369658..09329a2 100644 --- a/src/ttd_workflows/campaign.py +++ b/src/ttd_workflows/campaign.py @@ -70,6 +70,7 @@ def create( "json", Optional[models.CampaignCreateWorkflowInputWithValidation], ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -182,6 +183,7 @@ async def create_async( "json", Optional[models.CampaignCreateWorkflowInputWithValidation], ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -294,6 +296,7 @@ def create_campaigns_job( "json", Optional[models.CampaignBulkCreateWorkflowInputWithValidation], ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -406,6 +409,7 @@ async def create_campaigns_job_async( "json", Optional[models.CampaignBulkCreateWorkflowInputWithValidation], ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -520,6 +524,7 @@ def update_campaigns_job( "json", Optional[models.CampaignBulkUpdateWorkflowInputWithValidation], ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -641,6 +646,7 @@ async def update_campaigns_job_async( "json", Optional[models.CampaignBulkUpdateWorkflowInputWithValidation], ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -744,6 +750,7 @@ def get_version( accept_header_value="application/json", http_headers=http_headers, security=self.sdk_configuration.security, + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -842,6 +849,7 @@ async def get_version_async( accept_header_value="application/json", http_headers=http_headers, security=self.sdk_configuration.security, + allow_empty_value=None, timeout_ms=timeout_ms, ) diff --git a/src/ttd_workflows/campaigns.py b/src/ttd_workflows/campaigns.py index 95cb112..0b36db6 100644 --- a/src/ttd_workflows/campaigns.py +++ b/src/ttd_workflows/campaigns.py @@ -72,6 +72,7 @@ def update( "json", Optional[models.CampaignUpdateWorkflowInputWithValidation], ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -186,6 +187,7 @@ async def update_async( "json", Optional[models.CampaignUpdateWorkflowInputWithValidation], ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -290,6 +292,7 @@ def archive( get_serialized_body=lambda: utils.serialize_request_body( request.request_body, False, True, "json", Optional[List[str]] ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -392,6 +395,7 @@ async def archive_async( get_serialized_body=lambda: utils.serialize_request_body( request.request_body, False, True, "json", Optional[List[str]] ), + allow_empty_value=None, timeout_ms=timeout_ms, ) diff --git a/src/ttd_workflows/dmp.py b/src/ttd_workflows/dmp.py index 66e4cfe..b006f4b 100644 --- a/src/ttd_workflows/dmp.py +++ b/src/ttd_workflows/dmp.py @@ -62,6 +62,7 @@ def get_first_party_data_job( get_serialized_body=lambda: utils.serialize_request_body( request, False, True, "json", Optional[models.FirstPartyDataInput] ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -168,6 +169,7 @@ async def get_first_party_data_job_async( get_serialized_body=lambda: utils.serialize_request_body( request, False, True, "json", Optional[models.FirstPartyDataInput] ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -275,6 +277,7 @@ def get_third_party_data_job( get_serialized_body=lambda: utils.serialize_request_body( request, False, True, "json", Optional[models.ThirdPartyDataInput] ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -382,6 +385,7 @@ async def get_third_party_data_job_async( get_serialized_body=lambda: utils.serialize_request_body( request, False, True, "json", Optional[models.ThirdPartyDataInput] ), + allow_empty_value=None, timeout_ms=timeout_ms, ) diff --git a/src/ttd_workflows/graphql_request.py b/src/ttd_workflows/graphql_request.py index 10e076d..a4d3cae 100644 --- a/src/ttd_workflows/graphql_request.py +++ b/src/ttd_workflows/graphql_request.py @@ -63,6 +63,7 @@ def submit_graph_ql_request( get_serialized_body=lambda: utils.serialize_request_body( request, False, True, "json", Optional[models.GraphQLRequestInput] ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -168,6 +169,7 @@ async def submit_graph_ql_request_async( get_serialized_body=lambda: utils.serialize_request_body( request, False, True, "json", Optional[models.GraphQLRequestInput] ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -275,6 +277,7 @@ def submit_graph_ql_bulk_query_job( get_serialized_body=lambda: utils.serialize_request_body( request, False, True, "json", Optional[models.GraphQlQueryJobInput] ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -384,6 +387,7 @@ async def submit_graph_ql_bulk_query_job_async( get_serialized_body=lambda: utils.serialize_request_body( request, False, True, "json", Optional[models.GraphQlQueryJobInput] ), + allow_empty_value=None, timeout_ms=timeout_ms, ) diff --git a/src/ttd_workflows/job_status.py b/src/ttd_workflows/job_status.py index 0fdf739..6cef2ff 100644 --- a/src/ttd_workflows/job_status.py +++ b/src/ttd_workflows/job_status.py @@ -57,6 +57,7 @@ def get_graph_ql_bulk_job_status( accept_header_value="application/json", http_headers=http_headers, security=self.sdk_configuration.security, + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -158,6 +159,7 @@ async def get_graph_ql_bulk_job_status_async( accept_header_value="application/json", http_headers=http_headers, security=self.sdk_configuration.security, + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -261,6 +263,7 @@ def get_job_status( accept_header_value="application/json", http_headers=http_headers, security=self.sdk_configuration.security, + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -364,6 +367,7 @@ async def get_job_status_async( accept_header_value="application/json", http_headers=http_headers, security=self.sdk_configuration.security, + allow_empty_value=None, timeout_ms=timeout_ms, ) diff --git a/src/ttd_workflows/models/__init__.py b/src/ttd_workflows/models/__init__.py index 7c095dc..ab99a27 100644 --- a/src/ttd_workflows/models/__init__.py +++ b/src/ttd_workflows/models/__init__.py @@ -162,6 +162,10 @@ CampaignCreateWorkflowAdvancedInput, CampaignCreateWorkflowAdvancedInputTypedDict, ) + from .campaigncreateworkflowbudgetinput import ( + CampaignCreateWorkflowBudgetInput, + CampaignCreateWorkflowBudgetInputTypedDict, + ) from .campaigncreateworkflowincrementalreachcampaignsetting import ( CampaignCreateWorkflowIncrementalReachCampaignSetting, CampaignCreateWorkflowIncrementalReachCampaignSettingTypedDict, @@ -192,6 +196,10 @@ CampaignUpdateWorkflowAdvancedInput, CampaignUpdateWorkflowAdvancedInputTypedDict, ) + from .campaignupdateworkflowbudgetinput import ( + CampaignUpdateWorkflowBudgetInput, + CampaignUpdateWorkflowBudgetInputTypedDict, + ) from .campaignupdateworkflowinput import ( CampaignUpdateWorkflowInput, CampaignUpdateWorkflowInputTypedDict, @@ -209,10 +217,6 @@ CampaignVersionWorkflowTypedDict, ) from .campaignworkflow import CampaignWorkflow, CampaignWorkflowTypedDict - from .campaignworkflowbudgetinput import ( - CampaignWorkflowBudgetInput, - CampaignWorkflowBudgetInputTypedDict, - ) from .campaignworkflowcampaignconversionreportingcolumninput import ( CampaignWorkflowCampaignConversionReportingColumnInput, CampaignWorkflowCampaignConversionReportingColumnInputTypedDict, @@ -247,6 +251,7 @@ EnhancedNielsenReportingOptionsInput, ) from .firstpartydatainput import FirstPartyDataInput, FirstPartyDataInputTypedDict + from .frequencyconfig import FrequencyConfig, FrequencyConfigTypedDict from .getcampaignversionop import ( GetCampaignVersionRequest, GetCampaignVersionRequestTypedDict, @@ -314,6 +319,7 @@ from .passthroughfeetype import PassThroughFeeType from .problemdetails import ProblemDetails, ProblemDetailsTypedDict from .problemdetails_error import ProblemDetailsError, ProblemDetailsErrorData + from .productlistreportingtypeinput import ProductListReportingTypeInput from .realyticsentertainmenttype import RealyticsEntertainmentType from .realyticsreachsettinginput import ( RealyticsReachSettingInput, @@ -459,6 +465,8 @@ "CampaignCreateWorkflowAdGroupInputTypedDict", "CampaignCreateWorkflowAdvancedInput", "CampaignCreateWorkflowAdvancedInputTypedDict", + "CampaignCreateWorkflowBudgetInput", + "CampaignCreateWorkflowBudgetInputTypedDict", "CampaignCreateWorkflowIncrementalReachCampaignSetting", "CampaignCreateWorkflowIncrementalReachCampaignSettingTypedDict", "CampaignCreateWorkflowInput", @@ -476,6 +484,8 @@ "CampaignPayloadTypedDict", "CampaignUpdateWorkflowAdvancedInput", "CampaignUpdateWorkflowAdvancedInputTypedDict", + "CampaignUpdateWorkflowBudgetInput", + "CampaignUpdateWorkflowBudgetInputTypedDict", "CampaignUpdateWorkflowInput", "CampaignUpdateWorkflowInputTypedDict", "CampaignUpdateWorkflowInputWithValidation", @@ -485,8 +495,6 @@ "CampaignVersionWorkflow", "CampaignVersionWorkflowTypedDict", "CampaignWorkflow", - "CampaignWorkflowBudgetInput", - "CampaignWorkflowBudgetInputTypedDict", "CampaignWorkflowCampaignConversionReportingColumnInput", "CampaignWorkflowCampaignConversionReportingColumnInputTypedDict", "CampaignWorkflowFlightInput", @@ -511,6 +519,8 @@ "EnhancedNielsenReportingOptionsInput", "FirstPartyDataInput", "FirstPartyDataInputTypedDict", + "FrequencyConfig", + "FrequencyConfigTypedDict", "GetCampaignVersionRequest", "GetCampaignVersionRequestTypedDict", "GetCampaignVersionResponse", @@ -558,6 +568,7 @@ "ProblemDetailsError", "ProblemDetailsErrorData", "ProblemDetailsTypedDict", + "ProductListReportingTypeInput", "RealyticsEntertainmentType", "RealyticsReachSettingInput", "RealyticsReachSettingInputTypedDict", @@ -688,6 +699,8 @@ "CampaignCreateWorkflowAdGroupInputTypedDict": ".campaigncreateworkflowadgroupinput", "CampaignCreateWorkflowAdvancedInput": ".campaigncreateworkflowadvancedinput", "CampaignCreateWorkflowAdvancedInputTypedDict": ".campaigncreateworkflowadvancedinput", + "CampaignCreateWorkflowBudgetInput": ".campaigncreateworkflowbudgetinput", + "CampaignCreateWorkflowBudgetInputTypedDict": ".campaigncreateworkflowbudgetinput", "CampaignCreateWorkflowIncrementalReachCampaignSetting": ".campaigncreateworkflowincrementalreachcampaignsetting", "CampaignCreateWorkflowIncrementalReachCampaignSettingTypedDict": ".campaigncreateworkflowincrementalreachcampaignsetting", "CampaignCreateWorkflowInput": ".campaigncreateworkflowinput", @@ -705,6 +718,8 @@ "CampaignPayloadTypedDict": ".campaignpayload", "CampaignUpdateWorkflowAdvancedInput": ".campaignupdateworkflowadvancedinput", "CampaignUpdateWorkflowAdvancedInputTypedDict": ".campaignupdateworkflowadvancedinput", + "CampaignUpdateWorkflowBudgetInput": ".campaignupdateworkflowbudgetinput", + "CampaignUpdateWorkflowBudgetInputTypedDict": ".campaignupdateworkflowbudgetinput", "CampaignUpdateWorkflowInput": ".campaignupdateworkflowinput", "CampaignUpdateWorkflowInputTypedDict": ".campaignupdateworkflowinput", "CampaignUpdateWorkflowInputWithValidation": ".campaignupdateworkflowinputwithvalidation", @@ -715,8 +730,6 @@ "CampaignVersionWorkflowTypedDict": ".campaignversionworkflow", "CampaignWorkflow": ".campaignworkflow", "CampaignWorkflowTypedDict": ".campaignworkflow", - "CampaignWorkflowBudgetInput": ".campaignworkflowbudgetinput", - "CampaignWorkflowBudgetInputTypedDict": ".campaignworkflowbudgetinput", "CampaignWorkflowCampaignConversionReportingColumnInput": ".campaignworkflowcampaignconversionreportingcolumninput", "CampaignWorkflowCampaignConversionReportingColumnInputTypedDict": ".campaignworkflowcampaignconversionreportingcolumninput", "CampaignWorkflowFlightInput": ".campaignworkflowflightinput", @@ -740,6 +753,8 @@ "EnhancedNielsenReportingOptionsInput": ".enhancednielsenreportingoptionsinput", "FirstPartyDataInput": ".firstpartydatainput", "FirstPartyDataInputTypedDict": ".firstpartydatainput", + "FrequencyConfig": ".frequencyconfig", + "FrequencyConfigTypedDict": ".frequencyconfig", "GetCampaignVersionRequest": ".getcampaignversionop", "GetCampaignVersionRequestTypedDict": ".getcampaignversionop", "GetCampaignVersionResponse": ".getcampaignversionop", @@ -787,6 +802,7 @@ "ProblemDetailsTypedDict": ".problemdetails", "ProblemDetailsError": ".problemdetails_error", "ProblemDetailsErrorData": ".problemdetails_error", + "ProductListReportingTypeInput": ".productlistreportingtypeinput", "RealyticsEntertainmentType": ".realyticsentertainmenttype", "RealyticsReachSettingInput": ".realyticsreachsettinginput", "RealyticsReachSettingInputTypedDict": ".realyticsreachsettinginput", diff --git a/src/ttd_workflows/models/adgroupassociatebidlist.py b/src/ttd_workflows/models/adgroupassociatebidlist.py index 02abc4c..7d905c6 100644 --- a/src/ttd_workflows/models/adgroupassociatebidlist.py +++ b/src/ttd_workflows/models/adgroupassociatebidlist.py @@ -24,30 +24,14 @@ class AdGroupAssociateBidList(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [] - nullable_fields = ["bidListId"] - null_default_fields = [] - serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): + if val != UNSET_SENTINEL: m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupaudiencetargeting.py b/src/ttd_workflows/models/adgroupaudiencetargeting.py index 102a345..d233e50 100644 --- a/src/ttd_workflows/models/adgroupaudiencetargeting.py +++ b/src/ttd_workflows/models/adgroupaudiencetargeting.py @@ -63,30 +63,25 @@ class AdGroupAudienceTargeting(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["audienceId"] - nullable_fields = ["audienceId", "crossDeviceVendorListForAudience"] - null_default_fields = [] - + optional_fields = set(["audienceId"]) + nullable_fields = set(["audienceId", "crossDeviceVendorListForAudience"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupbudget.py b/src/ttd_workflows/models/adgroupbudget.py index c2789cf..1f44625 100644 --- a/src/ttd_workflows/models/adgroupbudget.py +++ b/src/ttd_workflows/models/adgroupbudget.py @@ -43,38 +43,37 @@ class AdGroupBudget(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "budgetInImpressions", - "dailyTargetInAdvertiserCurrency", - "dailyTargetInImpressions", - ] - nullable_fields = [ - "budgetInImpressions", - "dailyTargetInAdvertiserCurrency", - "dailyTargetInImpressions", - ] - null_default_fields = [] - + optional_fields = set( + [ + "budgetInImpressions", + "dailyTargetInAdvertiserCurrency", + "dailyTargetInImpressions", + ] + ) + nullable_fields = set( + [ + "budgetInImpressions", + "dailyTargetInAdvertiserCurrency", + "dailyTargetInImpressions", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupbulkcreateworkflowinputwithvalidation.py b/src/ttd_workflows/models/adgroupbulkcreateworkflowinputwithvalidation.py index 0eb99df..bdf71fb 100644 --- a/src/ttd_workflows/models/adgroupbulkcreateworkflowinputwithvalidation.py +++ b/src/ttd_workflows/models/adgroupbulkcreateworkflowinputwithvalidation.py @@ -38,30 +38,25 @@ class AdGroupBulkCreateWorkflowInputWithValidation(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["validateInputOnly", "callbackInput"] - nullable_fields = ["input", "validateInputOnly"] - null_default_fields = [] - + optional_fields = set(["validateInputOnly", "callbackInput"]) + nullable_fields = set(["input", "validateInputOnly"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupbulkupdateworkflowinputwithvalidation.py b/src/ttd_workflows/models/adgroupbulkupdateworkflowinputwithvalidation.py index 5a76a4b..beaf7f9 100644 --- a/src/ttd_workflows/models/adgroupbulkupdateworkflowinputwithvalidation.py +++ b/src/ttd_workflows/models/adgroupbulkupdateworkflowinputwithvalidation.py @@ -38,30 +38,25 @@ class AdGroupBulkUpdateWorkflowInputWithValidation(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["validateInputOnly", "callbackInput"] - nullable_fields = ["input", "validateInputOnly"] - null_default_fields = [] - + optional_fields = set(["validateInputOnly", "callbackInput"]) + nullable_fields = set(["input", "validateInputOnly"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupcomscoresettings.py b/src/ttd_workflows/models/adgroupcomscoresettings.py index 181a23f..51561f7 100644 --- a/src/ttd_workflows/models/adgroupcomscoresettings.py +++ b/src/ttd_workflows/models/adgroupcomscoresettings.py @@ -38,34 +38,27 @@ class AdGroupComscoreSettings(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["populationId"] - nullable_fields = [ - "populationId", - "demographicMemberIds", - "mobileDemographicMemberIds", - ] - null_default_fields = [] - + optional_fields = set(["populationId"]) + nullable_fields = set( + ["populationId", "demographicMemberIds", "mobileDemographicMemberIds"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupcreateworkflowinput.py b/src/ttd_workflows/models/adgroupcreateworkflowinput.py index 6524ff6..fa8e284 100644 --- a/src/ttd_workflows/models/adgroupcreateworkflowinput.py +++ b/src/ttd_workflows/models/adgroupcreateworkflowinput.py @@ -35,30 +35,25 @@ class AdGroupCreateWorkflowInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["advancedInput"] - nullable_fields = ["campaignId"] - null_default_fields = [] - + optional_fields = set(["advancedInput"]) + nullable_fields = set(["campaignId"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupcreateworkflowinputwithvalidation.py b/src/ttd_workflows/models/adgroupcreateworkflowinputwithvalidation.py index 8d09798..eb2b874 100644 --- a/src/ttd_workflows/models/adgroupcreateworkflowinputwithvalidation.py +++ b/src/ttd_workflows/models/adgroupcreateworkflowinputwithvalidation.py @@ -46,30 +46,25 @@ class AdGroupCreateWorkflowInputWithValidation(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["advancedInput", "validateInputOnly"] - nullable_fields = ["campaignId", "validateInputOnly"] - null_default_fields = [] - + optional_fields = set(["advancedInput", "validateInputOnly"]) + nullable_fields = set(["campaignId", "validateInputOnly"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupcreateworkflowprimaryinput.py b/src/ttd_workflows/models/adgroupcreateworkflowprimaryinput.py index f4ad3ed..e4a054d 100644 --- a/src/ttd_workflows/models/adgroupcreateworkflowprimaryinput.py +++ b/src/ttd_workflows/models/adgroupcreateworkflowprimaryinput.py @@ -111,52 +111,51 @@ class AdGroupCreateWorkflowPrimaryInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "isEnabled", - "description", - "budget", - "baseBidCPMInAdvertiserCurrency", - "maxBidCPMInAdvertiserCurrency", - "audienceTargeting", - "roiGoal", - "creativeIds", - "associatedBidLists", - "marketType", - "programmaticGuaranteedPrivateContractId", - "includeDefaultsFromCampaign", - ] - nullable_fields = [ - "isEnabled", - "description", - "baseBidCPMInAdvertiserCurrency", - "maxBidCPMInAdvertiserCurrency", - "creativeIds", - "associatedBidLists", - "name", - "programmaticGuaranteedPrivateContractId", - ] - null_default_fields = [] - + optional_fields = set( + [ + "isEnabled", + "description", + "budget", + "baseBidCPMInAdvertiserCurrency", + "maxBidCPMInAdvertiserCurrency", + "audienceTargeting", + "roiGoal", + "creativeIds", + "associatedBidLists", + "marketType", + "programmaticGuaranteedPrivateContractId", + "includeDefaultsFromCampaign", + ] + ) + nullable_fields = set( + [ + "isEnabled", + "description", + "baseBidCPMInAdvertiserCurrency", + "maxBidCPMInAdvertiserCurrency", + "creativeIds", + "associatedBidLists", + "name", + "programmaticGuaranteedPrivateContractId", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupflight.py b/src/ttd_workflows/models/adgroupflight.py index ed84afc..c92331c 100644 --- a/src/ttd_workflows/models/adgroupflight.py +++ b/src/ttd_workflows/models/adgroupflight.py @@ -49,39 +49,38 @@ class AdGroupFlight(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "budgetInImpressions", - "dailyTargetInAdvertiserCurrency", - "dailyTargetInImpressions", - ] - nullable_fields = [ - "budgetInImpressions", - "dailyTargetInAdvertiserCurrency", - "dailyTargetInImpressions", - "adGroupId", - ] - null_default_fields = [] - + optional_fields = set( + [ + "budgetInImpressions", + "dailyTargetInAdvertiserCurrency", + "dailyTargetInImpressions", + ] + ) + nullable_fields = set( + [ + "budgetInImpressions", + "dailyTargetInAdvertiserCurrency", + "dailyTargetInImpressions", + "adGroupId", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupkoaoptimizationsettings.py b/src/ttd_workflows/models/adgroupkoaoptimizationsettings.py index afd7651..c0a0f1d 100644 --- a/src/ttd_workflows/models/adgroupkoaoptimizationsettings.py +++ b/src/ttd_workflows/models/adgroupkoaoptimizationsettings.py @@ -2,7 +2,8 @@ from __future__ import annotations import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -20,3 +21,21 @@ class AdGroupKoaOptimizationSettings(BaseModel): predictive_clearing_enabled: Annotated[ Optional[bool], pydantic.Field(alias="predictiveClearingEnabled") ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["areFutureKoaFeaturesEnabled", "predictiveClearingEnabled"] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/adgroupnielsentrackingattributes.py b/src/ttd_workflows/models/adgroupnielsentrackingattributes.py index de362c1..be48d65 100644 --- a/src/ttd_workflows/models/adgroupnielsentrackingattributes.py +++ b/src/ttd_workflows/models/adgroupnielsentrackingattributes.py @@ -35,30 +35,14 @@ class AdGroupNielsenTrackingAttributes(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [] - nullable_fields = ["countries"] - null_default_fields = [] - serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): + if val != UNSET_SENTINEL: m[k] = val return m diff --git a/src/ttd_workflows/models/adgrouppayload.py b/src/ttd_workflows/models/adgrouppayload.py index 0aa91f7..881cad6 100644 --- a/src/ttd_workflows/models/adgrouppayload.py +++ b/src/ttd_workflows/models/adgrouppayload.py @@ -3,7 +3,8 @@ from __future__ import annotations from .adgroupworkflow import AdGroupWorkflow, AdGroupWorkflowTypedDict import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -16,3 +17,19 @@ class AdGroupPayload(BaseModel): ad_group: Annotated[Optional[AdGroupWorkflow], pydantic.Field(alias="adGroup")] = ( None ) + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["adGroup"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/adgrouproigoal.py b/src/ttd_workflows/models/adgrouproigoal.py index b4d1840..94db10a 100644 --- a/src/ttd_workflows/models/adgrouproigoal.py +++ b/src/ttd_workflows/models/adgrouproigoal.py @@ -79,56 +79,55 @@ class AdGroupROIGoal(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "maximizeReach", - "maximizeLtvIncrementalReach", - "cpcInAdvertiserCurrency", - "ctrInPercent", - "nielsenOTPInPercent", - "cpaInAdvertiserCurrency", - "returnOnAdSpendPercent", - "vcrInPercent", - "viewabilityInPercent", - "vcpmInAdvertiserCurrency", - "cpcvInAdvertiserCurrency", - "miaozhenOTPInPercent", - ] - nullable_fields = [ - "maximizeReach", - "maximizeLtvIncrementalReach", - "cpcInAdvertiserCurrency", - "ctrInPercent", - "nielsenOTPInPercent", - "cpaInAdvertiserCurrency", - "returnOnAdSpendPercent", - "vcrInPercent", - "viewabilityInPercent", - "vcpmInAdvertiserCurrency", - "cpcvInAdvertiserCurrency", - "miaozhenOTPInPercent", - ] - null_default_fields = [] - + optional_fields = set( + [ + "maximizeReach", + "maximizeLtvIncrementalReach", + "cpcInAdvertiserCurrency", + "ctrInPercent", + "nielsenOTPInPercent", + "cpaInAdvertiserCurrency", + "returnOnAdSpendPercent", + "vcrInPercent", + "viewabilityInPercent", + "vcpmInAdvertiserCurrency", + "cpcvInAdvertiserCurrency", + "miaozhenOTPInPercent", + ] + ) + nullable_fields = set( + [ + "maximizeReach", + "maximizeLtvIncrementalReach", + "cpcInAdvertiserCurrency", + "ctrInPercent", + "nielsenOTPInPercent", + "cpaInAdvertiserCurrency", + "returnOnAdSpendPercent", + "vcrInPercent", + "viewabilityInPercent", + "vcpmInAdvertiserCurrency", + "cpcvInAdvertiserCurrency", + "miaozhenOTPInPercent", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupupdateworkflowinput.py b/src/ttd_workflows/models/adgroupupdateworkflowinput.py index 4b929d3..ad54428 100644 --- a/src/ttd_workflows/models/adgroupupdateworkflowinput.py +++ b/src/ttd_workflows/models/adgroupupdateworkflowinput.py @@ -36,30 +36,25 @@ class AdGroupUpdateWorkflowInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["primaryInput", "advancedInput"] - nullable_fields = ["id"] - null_default_fields = [] - + optional_fields = set(["primaryInput", "advancedInput"]) + nullable_fields = set(["id"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupupdateworkflowinputwithvalidation.py b/src/ttd_workflows/models/adgroupupdateworkflowinputwithvalidation.py index 3bc68e8..b197218 100644 --- a/src/ttd_workflows/models/adgroupupdateworkflowinputwithvalidation.py +++ b/src/ttd_workflows/models/adgroupupdateworkflowinputwithvalidation.py @@ -47,30 +47,25 @@ class AdGroupUpdateWorkflowInputWithValidation(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["primaryInput", "advancedInput", "validateInputOnly"] - nullable_fields = ["id", "validateInputOnly"] - null_default_fields = [] - + optional_fields = set(["primaryInput", "advancedInput", "validateInputOnly"]) + nullable_fields = set(["id", "validateInputOnly"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupupdateworkflowprimaryinput.py b/src/ttd_workflows/models/adgroupupdateworkflowprimaryinput.py index dc88bf7..650fcb6 100644 --- a/src/ttd_workflows/models/adgroupupdateworkflowprimaryinput.py +++ b/src/ttd_workflows/models/adgroupupdateworkflowprimaryinput.py @@ -100,52 +100,51 @@ class AdGroupUpdateWorkflowPrimaryInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "isEnabled", - "description", - "budget", - "baseBidCPMInAdvertiserCurrency", - "maxBidCPMInAdvertiserCurrency", - "audienceTargeting", - "roiGoal", - "creativeIds", - "associatedBidLists", - "name", - "channel", - "funnelLocation", - "marketType", - ] - nullable_fields = [ - "isEnabled", - "description", - "baseBidCPMInAdvertiserCurrency", - "maxBidCPMInAdvertiserCurrency", - "creativeIds", - "associatedBidLists", - "name", - ] - null_default_fields = [] - + optional_fields = set( + [ + "isEnabled", + "description", + "budget", + "baseBidCPMInAdvertiserCurrency", + "maxBidCPMInAdvertiserCurrency", + "audienceTargeting", + "roiGoal", + "creativeIds", + "associatedBidLists", + "name", + "channel", + "funnelLocation", + "marketType", + ] + ) + nullable_fields = set( + [ + "isEnabled", + "description", + "baseBidCPMInAdvertiserCurrency", + "maxBidCPMInAdvertiserCurrency", + "creativeIds", + "associatedBidLists", + "name", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupworkflow.py b/src/ttd_workflows/models/adgroupworkflow.py index cf37c68..4b4d426 100644 --- a/src/ttd_workflows/models/adgroupworkflow.py +++ b/src/ttd_workflows/models/adgroupworkflow.py @@ -158,51 +158,50 @@ class AdGroupWorkflow(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "description", - "programmaticGuaranteedPrivateContractId", - "baseBidCPMInAdvertiserCurrency", - "maxBidCPMInAdvertiserCurrency", - "marketType", - "audienceTargeting", - "koaOptimizationSettings", - "nielsenTrackingAttributes", - ] - nullable_fields = [ - "id", - "name", - "campaignId", - "description", - "programmaticGuaranteedPrivateContractId", - "baseBidCPMInAdvertiserCurrency", - "maxBidCPMInAdvertiserCurrency", - "creativeIds", - "associatedBidLists", - "flights", - "dimensionalBiddingAutoOptimizationSettings", - ] - null_default_fields = [] - + optional_fields = set( + [ + "description", + "programmaticGuaranteedPrivateContractId", + "baseBidCPMInAdvertiserCurrency", + "maxBidCPMInAdvertiserCurrency", + "marketType", + "audienceTargeting", + "koaOptimizationSettings", + "nielsenTrackingAttributes", + ] + ) + nullable_fields = set( + [ + "id", + "name", + "campaignId", + "description", + "programmaticGuaranteedPrivateContractId", + "baseBidCPMInAdvertiserCurrency", + "maxBidCPMInAdvertiserCurrency", + "creativeIds", + "associatedBidLists", + "flights", + "dimensionalBiddingAutoOptimizationSettings", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupworkflowadvancedinput.py b/src/ttd_workflows/models/adgroupworkflowadvancedinput.py index c7ab5fb..9f5379e 100644 --- a/src/ttd_workflows/models/adgroupworkflowadvancedinput.py +++ b/src/ttd_workflows/models/adgroupworkflowadvancedinput.py @@ -107,48 +107,47 @@ class AdGroupWorkflowAdvancedInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "koaOptimizationSettings", - "comscoreSettings", - "contractTargeting", - "dimensionalBiddingAutoOptimizationSettings", - "isUseClicksAsConversionsEnabled", - "isUseSecondaryConversionsEnabled", - "nielsenTrackingAttributes", - "newFrequencyConfigs", - "flights", - "callerSource", - ] - nullable_fields = [ - "dimensionalBiddingAutoOptimizationSettings", - "isUseClicksAsConversionsEnabled", - "isUseSecondaryConversionsEnabled", - "newFrequencyConfigs", - "flights", - "callerSource", - ] - null_default_fields = [] - + optional_fields = set( + [ + "koaOptimizationSettings", + "comscoreSettings", + "contractTargeting", + "dimensionalBiddingAutoOptimizationSettings", + "isUseClicksAsConversionsEnabled", + "isUseSecondaryConversionsEnabled", + "nielsenTrackingAttributes", + "newFrequencyConfigs", + "flights", + "callerSource", + ] + ) + nullable_fields = set( + [ + "dimensionalBiddingAutoOptimizationSettings", + "isUseClicksAsConversionsEnabled", + "isUseSecondaryConversionsEnabled", + "newFrequencyConfigs", + "flights", + "callerSource", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupworkflowassociatebidlistinput.py b/src/ttd_workflows/models/adgroupworkflowassociatebidlistinput.py index cf42408..cfec3ee 100644 --- a/src/ttd_workflows/models/adgroupworkflowassociatebidlistinput.py +++ b/src/ttd_workflows/models/adgroupworkflowassociatebidlistinput.py @@ -32,30 +32,25 @@ class AdGroupWorkflowAssociateBidListInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["isEnabled", "isDefaultForDimension"] - nullable_fields = ["isEnabled", "isDefaultForDimension"] - null_default_fields = [] - + optional_fields = set(["isEnabled", "isDefaultForDimension"]) + nullable_fields = set(["isEnabled", "isDefaultForDimension"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupworkflowaudiencetargetinginput.py b/src/ttd_workflows/models/adgroupworkflowaudiencetargetinginput.py index 651b475..6066207 100644 --- a/src/ttd_workflows/models/adgroupworkflowaudiencetargetinginput.py +++ b/src/ttd_workflows/models/adgroupworkflowaudiencetargetinginput.py @@ -67,50 +67,49 @@ class AdGroupWorkflowAudienceTargetingInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "audienceId", - "audienceAcceleratorExclusionsEnabled", - "audienceBoosterEnabled", - "audienceExcluderEnabled", - "audiencePredictorEnabled", - "crossDeviceVendorListForAudience", - "recencyExclusionWindowInMinutes", - "targetTrackableUsersEnabled", - "useMcIdAsPrimary", - ] - nullable_fields = [ - "audienceId", - "audienceAcceleratorExclusionsEnabled", - "audienceBoosterEnabled", - "audienceExcluderEnabled", - "audiencePredictorEnabled", - "crossDeviceVendorListForAudience", - "recencyExclusionWindowInMinutes", - "targetTrackableUsersEnabled", - "useMcIdAsPrimary", - ] - null_default_fields = [] - + optional_fields = set( + [ + "audienceId", + "audienceAcceleratorExclusionsEnabled", + "audienceBoosterEnabled", + "audienceExcluderEnabled", + "audiencePredictorEnabled", + "crossDeviceVendorListForAudience", + "recencyExclusionWindowInMinutes", + "targetTrackableUsersEnabled", + "useMcIdAsPrimary", + ] + ) + nullable_fields = set( + [ + "audienceId", + "audienceAcceleratorExclusionsEnabled", + "audienceBoosterEnabled", + "audienceExcluderEnabled", + "audiencePredictorEnabled", + "crossDeviceVendorListForAudience", + "recencyExclusionWindowInMinutes", + "targetTrackableUsersEnabled", + "useMcIdAsPrimary", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupworkflowbudgetinput.py b/src/ttd_workflows/models/adgroupworkflowbudgetinput.py index c0fe339..1ec69e8 100644 --- a/src/ttd_workflows/models/adgroupworkflowbudgetinput.py +++ b/src/ttd_workflows/models/adgroupworkflowbudgetinput.py @@ -46,41 +46,40 @@ class AdGroupWorkflowBudgetInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "allocationType", - "budgetInAdvertiserCurrency", - "budgetInImpressions", - "dailyTargetInAdvertiserCurrency", - "dailyTargetInImpressions", - ] - nullable_fields = [ - "budgetInAdvertiserCurrency", - "budgetInImpressions", - "dailyTargetInAdvertiserCurrency", - "dailyTargetInImpressions", - ] - null_default_fields = [] - + optional_fields = set( + [ + "allocationType", + "budgetInAdvertiserCurrency", + "budgetInImpressions", + "dailyTargetInAdvertiserCurrency", + "dailyTargetInImpressions", + ] + ) + nullable_fields = set( + [ + "budgetInAdvertiserCurrency", + "budgetInImpressions", + "dailyTargetInAdvertiserCurrency", + "dailyTargetInImpressions", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupworkflowcomscoresettingsinput.py b/src/ttd_workflows/models/adgroupworkflowcomscoresettingsinput.py index 443d927..1c7414d 100644 --- a/src/ttd_workflows/models/adgroupworkflowcomscoresettingsinput.py +++ b/src/ttd_workflows/models/adgroupworkflowcomscoresettingsinput.py @@ -38,38 +38,29 @@ class AdGroupWorkflowComscoreSettingsInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "populationId", - "demographicMemberIds", - "mobileDemographicMemberIds", - ] - nullable_fields = [ - "populationId", - "demographicMemberIds", - "mobileDemographicMemberIds", - ] - null_default_fields = [] - + optional_fields = set( + ["populationId", "demographicMemberIds", "mobileDemographicMemberIds"] + ) + nullable_fields = set( + ["populationId", "demographicMemberIds", "mobileDemographicMemberIds"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupworkflowcontracttargetinginput.py b/src/ttd_workflows/models/adgroupworkflowcontracttargetinginput.py index 4e216b0..d70ec64 100644 --- a/src/ttd_workflows/models/adgroupworkflowcontracttargetinginput.py +++ b/src/ttd_workflows/models/adgroupworkflowcontracttargetinginput.py @@ -25,30 +25,25 @@ class AdGroupWorkflowContractTargetingInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["allowOpenMarketBiddingWhenTargetingContracts"] - nullable_fields = ["allowOpenMarketBiddingWhenTargetingContracts"] - null_default_fields = [] - + optional_fields = set(["allowOpenMarketBiddingWhenTargetingContracts"]) + nullable_fields = set(["allowOpenMarketBiddingWhenTargetingContracts"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupworkflowflightinput.py b/src/ttd_workflows/models/adgroupworkflowflightinput.py index b5dba5b..58e7213 100644 --- a/src/ttd_workflows/models/adgroupworkflowflightinput.py +++ b/src/ttd_workflows/models/adgroupworkflowflightinput.py @@ -49,41 +49,40 @@ class AdGroupWorkflowFlightInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "allocationType", - "budgetInAdvertiserCurrency", - "budgetInImpressions", - "dailyTargetInAdvertiserCurrency", - "dailyTargetInImpressions", - ] - nullable_fields = [ - "budgetInAdvertiserCurrency", - "budgetInImpressions", - "dailyTargetInAdvertiserCurrency", - "dailyTargetInImpressions", - ] - null_default_fields = [] - + optional_fields = set( + [ + "allocationType", + "budgetInAdvertiserCurrency", + "budgetInImpressions", + "dailyTargetInAdvertiserCurrency", + "dailyTargetInImpressions", + ] + ) + nullable_fields = set( + [ + "budgetInAdvertiserCurrency", + "budgetInImpressions", + "dailyTargetInAdvertiserCurrency", + "dailyTargetInImpressions", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupworkflowkoaoptimizationsettingsinput.py b/src/ttd_workflows/models/adgroupworkflowkoaoptimizationsettingsinput.py index 096a391..c485a77 100644 --- a/src/ttd_workflows/models/adgroupworkflowkoaoptimizationsettingsinput.py +++ b/src/ttd_workflows/models/adgroupworkflowkoaoptimizationsettingsinput.py @@ -29,30 +29,29 @@ class AdGroupWorkflowKoaOptimizationSettingsInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["areFutureKoaFeaturesEnabled", "predictiveClearingEnabled"] - nullable_fields = ["areFutureKoaFeaturesEnabled", "predictiveClearingEnabled"] - null_default_fields = [] - + optional_fields = set( + ["areFutureKoaFeaturesEnabled", "predictiveClearingEnabled"] + ) + nullable_fields = set( + ["areFutureKoaFeaturesEnabled", "predictiveClearingEnabled"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupworkflownewfrequencyconfiginput.py b/src/ttd_workflows/models/adgroupworkflownewfrequencyconfiginput.py index c066693..46f598d 100644 --- a/src/ttd_workflows/models/adgroupworkflownewfrequencyconfiginput.py +++ b/src/ttd_workflows/models/adgroupworkflownewfrequencyconfiginput.py @@ -38,30 +38,27 @@ class AdGroupWorkflowNewFrequencyConfigInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["frequencyCap", "frequencyGoal", "resetIntervalInMinutes"] - nullable_fields = ["counterName", "frequencyCap", "frequencyGoal"] - null_default_fields = [] - + optional_fields = set( + ["frequencyCap", "frequencyGoal", "resetIntervalInMinutes"] + ) + nullable_fields = set(["counterName", "frequencyCap", "frequencyGoal"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupworkflownielsentrackingattributesinput.py b/src/ttd_workflows/models/adgroupworkflownielsentrackingattributesinput.py index 5a349d9..0d199f6 100644 --- a/src/ttd_workflows/models/adgroupworkflownielsentrackingattributesinput.py +++ b/src/ttd_workflows/models/adgroupworkflownielsentrackingattributesinput.py @@ -36,30 +36,25 @@ class AdGroupWorkflowNielsenTrackingAttributesInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["enhancedReportingOption"] - nullable_fields = ["countries"] - null_default_fields = [] - + optional_fields = set(["enhancedReportingOption"]) + nullable_fields = set(["countries"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/adgroupworkflowroigoalinput.py b/src/ttd_workflows/models/adgroupworkflowroigoalinput.py index 9818b44..3b2b405 100644 --- a/src/ttd_workflows/models/adgroupworkflowroigoalinput.py +++ b/src/ttd_workflows/models/adgroupworkflowroigoalinput.py @@ -79,56 +79,55 @@ class AdGroupWorkflowROIGoalInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "maximizeReach", - "maximizeLtvIncrementalReach", - "cpcInAdvertiserCurrency", - "ctrInPercent", - "nielsenOTPInPercent", - "cpaInAdvertiserCurrency", - "returnOnAdSpendPercent", - "vcrInPercent", - "viewabilityInPercent", - "vcpmInAdvertiserCurrency", - "cpcvInAdvertiserCurrency", - "miaozhenOTPInPercent", - ] - nullable_fields = [ - "maximizeReach", - "maximizeLtvIncrementalReach", - "cpcInAdvertiserCurrency", - "ctrInPercent", - "nielsenOTPInPercent", - "cpaInAdvertiserCurrency", - "returnOnAdSpendPercent", - "vcrInPercent", - "viewabilityInPercent", - "vcpmInAdvertiserCurrency", - "cpcvInAdvertiserCurrency", - "miaozhenOTPInPercent", - ] - null_default_fields = [] - + optional_fields = set( + [ + "maximizeReach", + "maximizeLtvIncrementalReach", + "cpcInAdvertiserCurrency", + "ctrInPercent", + "nielsenOTPInPercent", + "cpaInAdvertiserCurrency", + "returnOnAdSpendPercent", + "vcrInPercent", + "viewabilityInPercent", + "vcpmInAdvertiserCurrency", + "cpcvInAdvertiserCurrency", + "miaozhenOTPInPercent", + ] + ) + nullable_fields = set( + [ + "maximizeReach", + "maximizeLtvIncrementalReach", + "cpcInAdvertiserCurrency", + "ctrInPercent", + "nielsenOTPInPercent", + "cpaInAdvertiserCurrency", + "returnOnAdSpendPercent", + "vcrInPercent", + "viewabilityInPercent", + "vcpmInAdvertiserCurrency", + "cpcvInAdvertiserCurrency", + "miaozhenOTPInPercent", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/archiveadgroupsop.py b/src/ttd_workflows/models/archiveadgroupsop.py index c7f96b0..0857e6a 100644 --- a/src/ttd_workflows/models/archiveadgroupsop.py +++ b/src/ttd_workflows/models/archiveadgroupsop.py @@ -3,7 +3,8 @@ from __future__ import annotations from .httpmetadata import HTTPMetadata, HTTPMetadataTypedDict import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from ttd_workflows.utils import FieldMetadata, QueryParamMetadata, RequestMetadata from typing import List, Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -26,6 +27,22 @@ class ArchiveAdGroupsRequest(BaseModel): FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["forceArchive", "RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class ArchiveAdGroupsResponseTypedDict(TypedDict): http_meta: HTTPMetadataTypedDict @@ -38,3 +55,19 @@ class ArchiveAdGroupsResponse(BaseModel): strings: Optional[List[str]] = None r"""OK""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["strings"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/archivecampaignsop.py b/src/ttd_workflows/models/archivecampaignsop.py index 1d3ed65..c266627 100644 --- a/src/ttd_workflows/models/archivecampaignsop.py +++ b/src/ttd_workflows/models/archivecampaignsop.py @@ -3,7 +3,8 @@ from __future__ import annotations from .httpmetadata import HTTPMetadata, HTTPMetadataTypedDict import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from ttd_workflows.utils import FieldMetadata, QueryParamMetadata, RequestMetadata from typing import List, Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -26,6 +27,22 @@ class ArchiveCampaignsRequest(BaseModel): FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["forceArchive", "RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class ArchiveCampaignsResponseTypedDict(TypedDict): http_meta: HTTPMetadataTypedDict @@ -38,3 +55,19 @@ class ArchiveCampaignsResponse(BaseModel): strings: Optional[List[str]] = None r"""OK""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["strings"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/callrestapiworkflowinput.py b/src/ttd_workflows/models/callrestapiworkflowinput.py index 4c112fb..e676bdc 100644 --- a/src/ttd_workflows/models/callrestapiworkflowinput.py +++ b/src/ttd_workflows/models/callrestapiworkflowinput.py @@ -31,30 +31,25 @@ class CallRestAPIWorkflowInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["dataBody"] - nullable_fields = ["endpoint", "dataBody"] - null_default_fields = [] - + optional_fields = set(["dataBody"]) + nullable_fields = set(["endpoint", "dataBody"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaignbulkcreateworkflowinputwithvalidation.py b/src/ttd_workflows/models/campaignbulkcreateworkflowinputwithvalidation.py index 4e343f5..aa6fa3c 100644 --- a/src/ttd_workflows/models/campaignbulkcreateworkflowinputwithvalidation.py +++ b/src/ttd_workflows/models/campaignbulkcreateworkflowinputwithvalidation.py @@ -38,30 +38,25 @@ class CampaignBulkCreateWorkflowInputWithValidation(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["validateInputOnly", "callbackInput"] - nullable_fields = ["input", "validateInputOnly"] - null_default_fields = [] - + optional_fields = set(["validateInputOnly", "callbackInput"]) + nullable_fields = set(["input", "validateInputOnly"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaignbulkupdateworkflowinputwithvalidation.py b/src/ttd_workflows/models/campaignbulkupdateworkflowinputwithvalidation.py index 2e3c1bb..7c68613 100644 --- a/src/ttd_workflows/models/campaignbulkupdateworkflowinputwithvalidation.py +++ b/src/ttd_workflows/models/campaignbulkupdateworkflowinputwithvalidation.py @@ -38,30 +38,25 @@ class CampaignBulkUpdateWorkflowInputWithValidation(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["validateInputOnly", "callbackInput"] - nullable_fields = ["input", "validateInputOnly"] - null_default_fields = [] - + optional_fields = set(["validateInputOnly", "callbackInput"]) + nullable_fields = set(["input", "validateInputOnly"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaigncreatepassthroughfeesinput.py b/src/ttd_workflows/models/campaigncreatepassthroughfeesinput.py index 6026842..7217d6e 100644 --- a/src/ttd_workflows/models/campaigncreatepassthroughfeesinput.py +++ b/src/ttd_workflows/models/campaigncreatepassthroughfeesinput.py @@ -29,30 +29,25 @@ class CampaignCreatePassThroughFeesInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["type", "description", "amount"] - nullable_fields = ["description"] - null_default_fields = [] - + optional_fields = set(["type", "description", "amount"]) + nullable_fields = set(["description"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaigncreateworkflowadgroupadvancedinput.py b/src/ttd_workflows/models/campaigncreateworkflowadgroupadvancedinput.py index 6c797de..7ca4bc5 100644 --- a/src/ttd_workflows/models/campaigncreateworkflowadgroupadvancedinput.py +++ b/src/ttd_workflows/models/campaigncreateworkflowadgroupadvancedinput.py @@ -109,47 +109,46 @@ class CampaignCreateWorkflowAdGroupAdvancedInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "koaOptimizationSettings", - "comscoreSettings", - "contractTargeting", - "dimensionalBiddingAutoOptimizationSettings", - "isUseClicksAsConversionsEnabled", - "isUseSecondaryConversionsEnabled", - "nielsenTrackingAttributes", - "newFrequencyConfigs", - "includeDefaultsFromCampaign", - "flights", - ] - nullable_fields = [ - "dimensionalBiddingAutoOptimizationSettings", - "isUseClicksAsConversionsEnabled", - "isUseSecondaryConversionsEnabled", - "newFrequencyConfigs", - "flights", - ] - null_default_fields = [] - + optional_fields = set( + [ + "koaOptimizationSettings", + "comscoreSettings", + "contractTargeting", + "dimensionalBiddingAutoOptimizationSettings", + "isUseClicksAsConversionsEnabled", + "isUseSecondaryConversionsEnabled", + "nielsenTrackingAttributes", + "newFrequencyConfigs", + "includeDefaultsFromCampaign", + "flights", + ] + ) + nullable_fields = set( + [ + "dimensionalBiddingAutoOptimizationSettings", + "isUseClicksAsConversionsEnabled", + "isUseSecondaryConversionsEnabled", + "newFrequencyConfigs", + "flights", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaigncreateworkflowadgroupflightinput.py b/src/ttd_workflows/models/campaigncreateworkflowadgroupflightinput.py index 6b1c5f7..0f44994 100644 --- a/src/ttd_workflows/models/campaigncreateworkflowadgroupflightinput.py +++ b/src/ttd_workflows/models/campaigncreateworkflowadgroupflightinput.py @@ -46,41 +46,40 @@ class CampaignCreateWorkflowAdGroupFlightInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "allocationType", - "budgetInAdvertiserCurrency", - "budgetInImpressions", - "dailyTargetInAdvertiserCurrency", - "dailyTargetInImpressions", - ] - nullable_fields = [ - "budgetInAdvertiserCurrency", - "budgetInImpressions", - "dailyTargetInAdvertiserCurrency", - "dailyTargetInImpressions", - ] - null_default_fields = [] - + optional_fields = set( + [ + "allocationType", + "budgetInAdvertiserCurrency", + "budgetInImpressions", + "dailyTargetInAdvertiserCurrency", + "dailyTargetInImpressions", + ] + ) + nullable_fields = set( + [ + "budgetInAdvertiserCurrency", + "budgetInImpressions", + "dailyTargetInAdvertiserCurrency", + "dailyTargetInImpressions", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaigncreateworkflowadgroupinput.py b/src/ttd_workflows/models/campaigncreateworkflowadgroupinput.py index e228c75..0019944 100644 --- a/src/ttd_workflows/models/campaigncreateworkflowadgroupinput.py +++ b/src/ttd_workflows/models/campaigncreateworkflowadgroupinput.py @@ -10,7 +10,8 @@ CampaignCreateWorkflowAdGroupAdvancedInputTypedDict, ) import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -29,3 +30,19 @@ class CampaignCreateWorkflowAdGroupInput(BaseModel): Optional[CampaignCreateWorkflowAdGroupAdvancedInput], pydantic.Field(alias="advancedInput"), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["advancedInput"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/campaigncreateworkflowadvancedinput.py b/src/ttd_workflows/models/campaigncreateworkflowadvancedinput.py index ca943a9..1d67f54 100644 --- a/src/ttd_workflows/models/campaigncreateworkflowadvancedinput.py +++ b/src/ttd_workflows/models/campaigncreateworkflowadvancedinput.py @@ -9,6 +9,7 @@ CampaignWorkflowFlightInput, CampaignWorkflowFlightInputTypedDict, ) +from .frequencyconfig import FrequencyConfig, FrequencyConfigTypedDict import pydantic from pydantic import model_serializer from ttd_workflows.types import ( @@ -23,22 +24,23 @@ class CampaignCreateWorkflowAdvancedInputTypedDict(TypedDict): - flights: NotRequired[Nullable[List[CampaignWorkflowFlightInputTypedDict]]] purchase_order_number: NotRequired[Nullable[str]] + flights: NotRequired[Nullable[List[CampaignWorkflowFlightInputTypedDict]]] include_defaults_from_advertiser: NotRequired[bool] pass_through_fee_card: NotRequired[ CampaignCreateWorkflowPassThroughFeeCardInputTypedDict ] caller_source: NotRequired[Nullable[str]] + frequency_configs: NotRequired[Nullable[List[FrequencyConfigTypedDict]]] class CampaignCreateWorkflowAdvancedInput(BaseModel): - flights: OptionalNullable[List[CampaignWorkflowFlightInput]] = UNSET - purchase_order_number: Annotated[ OptionalNullable[str], pydantic.Field(alias="purchaseOrderNumber") ] = UNSET + flights: OptionalNullable[List[CampaignWorkflowFlightInput]] = UNSET + include_defaults_from_advertiser: Annotated[ Optional[bool], pydantic.Field(alias="includeDefaultsFromAdvertiser") ] = None @@ -52,38 +54,43 @@ class CampaignCreateWorkflowAdvancedInput(BaseModel): OptionalNullable[str], pydantic.Field(alias="callerSource") ] = UNSET + frequency_configs: Annotated[ + OptionalNullable[List[FrequencyConfig]], + pydantic.Field(alias="frequencyConfigs"), + ] = UNSET + @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "flights", - "purchaseOrderNumber", - "includeDefaultsFromAdvertiser", - "passThroughFeeCard", - "callerSource", - ] - nullable_fields = ["flights", "purchaseOrderNumber", "callerSource"] - null_default_fields = [] - + optional_fields = set( + [ + "purchaseOrderNumber", + "flights", + "includeDefaultsFromAdvertiser", + "passThroughFeeCard", + "callerSource", + "frequencyConfigs", + ] + ) + nullable_fields = set( + ["purchaseOrderNumber", "flights", "callerSource", "frequencyConfigs"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaignworkflowbudgetinput.py b/src/ttd_workflows/models/campaigncreateworkflowbudgetinput.py similarity index 60% rename from src/ttd_workflows/models/campaignworkflowbudgetinput.py rename to src/ttd_workflows/models/campaigncreateworkflowbudgetinput.py index aa11063..1a24b96 100644 --- a/src/ttd_workflows/models/campaignworkflowbudgetinput.py +++ b/src/ttd_workflows/models/campaigncreateworkflowbudgetinput.py @@ -14,7 +14,7 @@ from typing_extensions import Annotated, NotRequired, TypedDict -class CampaignWorkflowBudgetInputTypedDict(TypedDict): +class CampaignCreateWorkflowBudgetInputTypedDict(TypedDict): pacing_mode: CampaignPacingMode budget_in_advertiser_currency: float budget_in_impressions: NotRequired[Nullable[int]] @@ -22,7 +22,7 @@ class CampaignWorkflowBudgetInputTypedDict(TypedDict): daily_target_in_impressions: NotRequired[Nullable[int]] -class CampaignWorkflowBudgetInput(BaseModel): +class CampaignCreateWorkflowBudgetInput(BaseModel): pacing_mode: Annotated[CampaignPacingMode, pydantic.Field(alias="pacingMode")] budget_in_advertiser_currency: Annotated[ @@ -43,38 +43,37 @@ class CampaignWorkflowBudgetInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "budgetInImpressions", - "dailyTargetInAdvertiserCurrency", - "dailyTargetInImpressions", - ] - nullable_fields = [ - "budgetInImpressions", - "dailyTargetInAdvertiserCurrency", - "dailyTargetInImpressions", - ] - null_default_fields = [] - + optional_fields = set( + [ + "budgetInImpressions", + "dailyTargetInAdvertiserCurrency", + "dailyTargetInImpressions", + ] + ) + nullable_fields = set( + [ + "budgetInImpressions", + "dailyTargetInAdvertiserCurrency", + "dailyTargetInImpressions", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaigncreateworkflowincrementalreachcampaignsetting.py b/src/ttd_workflows/models/campaigncreateworkflowincrementalreachcampaignsetting.py index a029192..ba8fbb4 100644 --- a/src/ttd_workflows/models/campaigncreateworkflowincrementalreachcampaignsetting.py +++ b/src/ttd_workflows/models/campaigncreateworkflowincrementalreachcampaignsetting.py @@ -10,7 +10,8 @@ RealyticsReachSettingInputTypedDict, ) import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -41,3 +42,26 @@ class CampaignCreateWorkflowIncrementalReachCampaignSetting(BaseModel): Optional[IncrementalReachBrandInput], pydantic.Field(alias="sambaAuReachSetting"), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "iSpotReachSetting", + "realyticsReachSetting", + "tvSquaredReachSetting", + "sambaAuReachSetting", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/campaigncreateworkflowinput.py b/src/ttd_workflows/models/campaigncreateworkflowinput.py index afc1ec2..b81c290 100644 --- a/src/ttd_workflows/models/campaigncreateworkflowinput.py +++ b/src/ttd_workflows/models/campaigncreateworkflowinput.py @@ -49,30 +49,25 @@ class CampaignCreateWorkflowInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["advancedInput", "adGroups"] - nullable_fields = ["adGroups"] - null_default_fields = [] - + optional_fields = set(["advancedInput", "adGroups"]) + nullable_fields = set(["adGroups"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaigncreateworkflowinputwithvalidation.py b/src/ttd_workflows/models/campaigncreateworkflowinputwithvalidation.py index ddcdf06..80cf1ec 100644 --- a/src/ttd_workflows/models/campaigncreateworkflowinputwithvalidation.py +++ b/src/ttd_workflows/models/campaigncreateworkflowinputwithvalidation.py @@ -54,30 +54,25 @@ class CampaignCreateWorkflowInputWithValidation(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["advancedInput", "adGroups", "validateInputOnly"] - nullable_fields = ["adGroups", "validateInputOnly"] - null_default_fields = [] - + optional_fields = set(["advancedInput", "adGroups", "validateInputOnly"]) + nullable_fields = set(["adGroups", "validateInputOnly"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaigncreateworkflowpassthroughfeecardinput.py b/src/ttd_workflows/models/campaigncreateworkflowpassthroughfeecardinput.py index 413f826..8e3cb91 100644 --- a/src/ttd_workflows/models/campaigncreateworkflowpassthroughfeecardinput.py +++ b/src/ttd_workflows/models/campaigncreateworkflowpassthroughfeecardinput.py @@ -7,14 +7,21 @@ ) from datetime import datetime import pydantic -from ttd_workflows.types import BaseModel -from typing import List, Optional +from pydantic import model_serializer +from ttd_workflows.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from typing import List from typing_extensions import Annotated, NotRequired, TypedDict class CampaignCreateWorkflowPassThroughFeeCardInputTypedDict(TypedDict): pass_through_fees: List[CampaignCreatePassThroughFeesInputTypedDict] - start_date_utc: NotRequired[datetime] + start_date_utc: NotRequired[Nullable[datetime]] class CampaignCreateWorkflowPassThroughFeeCardInput(BaseModel): @@ -24,5 +31,30 @@ class CampaignCreateWorkflowPassThroughFeeCardInput(BaseModel): ] start_date_utc: Annotated[ - Optional[datetime], pydantic.Field(alias="startDateUtc") - ] = None + OptionalNullable[datetime], pydantic.Field(alias="startDateUtc") + ] = UNSET + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["startDateUtc"]) + nullable_fields = set(["startDateUtc"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/ttd_workflows/models/campaigncreateworkflowprimaryinput.py b/src/ttd_workflows/models/campaigncreateworkflowprimaryinput.py index 04c055a..37c293b 100644 --- a/src/ttd_workflows/models/campaigncreateworkflowprimaryinput.py +++ b/src/ttd_workflows/models/campaigncreateworkflowprimaryinput.py @@ -2,14 +2,14 @@ from __future__ import annotations from .campaignchanneltype import CampaignChannelType +from .campaigncreateworkflowbudgetinput import ( + CampaignCreateWorkflowBudgetInput, + CampaignCreateWorkflowBudgetInputTypedDict, +) from .campaigncreateworkflowincrementalreachcampaignsetting import ( CampaignCreateWorkflowIncrementalReachCampaignSetting, CampaignCreateWorkflowIncrementalReachCampaignSettingTypedDict, ) -from .campaignworkflowbudgetinput import ( - CampaignWorkflowBudgetInput, - CampaignWorkflowBudgetInputTypedDict, -) from .campaignworkflowcampaignconversionreportingcolumninput import ( CampaignWorkflowCampaignConversionReportingColumnInput, CampaignWorkflowCampaignConversionReportingColumnInputTypedDict, @@ -47,7 +47,6 @@ class CampaignCreateWorkflowPrimaryInputTypedDict(TypedDict): custom_cpa_type: NotRequired[CustomCPAType] custom_roas_type: NotRequired[CustomROASType] impressions_only_budgeting_cpm: NotRequired[Nullable[float]] - budget: NotRequired[CampaignWorkflowBudgetInputTypedDict] end_date_in_utc: NotRequired[Nullable[datetime]] seed_id: NotRequired[Nullable[str]] campaign_conversion_reporting_columns: NotRequired[ @@ -57,6 +56,7 @@ class CampaignCreateWorkflowPrimaryInputTypedDict(TypedDict): secondary_goal: NotRequired[CampaignWorkflowROIGoalInputTypedDict] tertiary_goal: NotRequired[CampaignWorkflowROIGoalInputTypedDict] start_date_in_utc: NotRequired[Nullable[datetime]] + budget: NotRequired[CampaignCreateWorkflowBudgetInputTypedDict] campaign_incremental_reach_setting: NotRequired[ CampaignCreateWorkflowIncrementalReachCampaignSettingTypedDict ] @@ -105,8 +105,6 @@ class CampaignCreateWorkflowPrimaryInput(BaseModel): OptionalNullable[float], pydantic.Field(alias="impressionsOnlyBudgetingCpm") ] = UNSET - budget: Optional[CampaignWorkflowBudgetInput] = None - end_date_in_utc: Annotated[ OptionalNullable[datetime], pydantic.Field(alias="endDateInUtc") ] = UNSET @@ -134,6 +132,8 @@ class CampaignCreateWorkflowPrimaryInput(BaseModel): OptionalNullable[datetime], pydantic.Field(alias="startDateInUtc") ] = UNSET + budget: Optional[CampaignCreateWorkflowBudgetInput] = None + campaign_incremental_reach_setting: Annotated[ Optional[CampaignCreateWorkflowIncrementalReachCampaignSetting], pydantic.Field(alias="campaignIncrementalReachSetting"), @@ -141,60 +141,59 @@ class CampaignCreateWorkflowPrimaryInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "description", - "campaignGroupId", - "timeZone", - "customCPAClickWeight", - "customCPAViewthroughWeight", - "customCPAType", - "customRoasType", - "impressionsOnlyBudgetingCpm", - "budget", - "endDateInUtc", - "seedId", - "campaignConversionReportingColumns", - "isManagedByTTD", - "secondaryGoal", - "tertiaryGoal", - "startDateInUtc", - "campaignIncrementalReachSetting", - ] - nullable_fields = [ - "description", - "campaignGroupId", - "timeZone", - "customCPAClickWeight", - "customCPAViewthroughWeight", - "impressionsOnlyBudgetingCpm", - "endDateInUtc", - "seedId", - "campaignConversionReportingColumns", - "isManagedByTTD", - "startDateInUtc", - ] - null_default_fields = [] - + optional_fields = set( + [ + "description", + "campaignGroupId", + "timeZone", + "customCPAClickWeight", + "customCPAViewthroughWeight", + "customCPAType", + "customRoasType", + "impressionsOnlyBudgetingCpm", + "endDateInUtc", + "seedId", + "campaignConversionReportingColumns", + "isManagedByTTD", + "secondaryGoal", + "tertiaryGoal", + "startDateInUtc", + "budget", + "campaignIncrementalReachSetting", + ] + ) + nullable_fields = set( + [ + "description", + "campaignGroupId", + "timeZone", + "customCPAClickWeight", + "customCPAViewthroughWeight", + "impressionsOnlyBudgetingCpm", + "endDateInUtc", + "seedId", + "campaignConversionReportingColumns", + "isManagedByTTD", + "startDateInUtc", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaignflightworkflow.py b/src/ttd_workflows/models/campaignflightworkflow.py index 5c1b2ee..f4cbe45 100644 --- a/src/ttd_workflows/models/campaignflightworkflow.py +++ b/src/ttd_workflows/models/campaignflightworkflow.py @@ -53,41 +53,40 @@ class CampaignFlightWorkflow(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "endDateExclusiveUTC", - "budgetInImpressions", - "dailyTargetInAdvertiserCurrency", - "dailyTargetInImpressions", - ] - nullable_fields = [ - "id", - "endDateExclusiveUTC", - "budgetInImpressions", - "dailyTargetInAdvertiserCurrency", - "dailyTargetInImpressions", - ] - null_default_fields = [] - + optional_fields = set( + [ + "endDateExclusiveUTC", + "budgetInImpressions", + "dailyTargetInAdvertiserCurrency", + "dailyTargetInImpressions", + ] + ) + nullable_fields = set( + [ + "id", + "endDateExclusiveUTC", + "budgetInImpressions", + "dailyTargetInAdvertiserCurrency", + "dailyTargetInImpressions", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaignpayload.py b/src/ttd_workflows/models/campaignpayload.py index 01369a6..82c6bca 100644 --- a/src/ttd_workflows/models/campaignpayload.py +++ b/src/ttd_workflows/models/campaignpayload.py @@ -30,30 +30,25 @@ class CampaignPayload(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["campaign", "adGroups"] - nullable_fields = ["adGroups"] - null_default_fields = [] - + optional_fields = set(["campaign", "adGroups"]) + nullable_fields = set(["adGroups"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaignupdateworkflowadvancedinput.py b/src/ttd_workflows/models/campaignupdateworkflowadvancedinput.py index c9eb764..14b36c8 100644 --- a/src/ttd_workflows/models/campaignupdateworkflowadvancedinput.py +++ b/src/ttd_workflows/models/campaignupdateworkflowadvancedinput.py @@ -1,10 +1,6 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from .campaignworkflowflightinput import ( - CampaignWorkflowFlightInput, - CampaignWorkflowFlightInputTypedDict, -) import pydantic from pydantic import model_serializer from ttd_workflows.types import ( @@ -14,48 +10,39 @@ UNSET, UNSET_SENTINEL, ) -from typing import List from typing_extensions import Annotated, NotRequired, TypedDict class CampaignUpdateWorkflowAdvancedInputTypedDict(TypedDict): - flights: NotRequired[Nullable[List[CampaignWorkflowFlightInputTypedDict]]] purchase_order_number: NotRequired[Nullable[str]] class CampaignUpdateWorkflowAdvancedInput(BaseModel): - flights: OptionalNullable[List[CampaignWorkflowFlightInput]] = UNSET - purchase_order_number: Annotated[ OptionalNullable[str], pydantic.Field(alias="purchaseOrderNumber") ] = UNSET @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["flights", "purchaseOrderNumber"] - nullable_fields = ["flights", "purchaseOrderNumber"] - null_default_fields = [] - + optional_fields = set(["purchaseOrderNumber"]) + nullable_fields = set(["purchaseOrderNumber"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaignupdateworkflowbudgetinput.py b/src/ttd_workflows/models/campaignupdateworkflowbudgetinput.py new file mode 100644 index 0000000..92bec02 --- /dev/null +++ b/src/ttd_workflows/models/campaignupdateworkflowbudgetinput.py @@ -0,0 +1,15 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .campaignpacingmode import CampaignPacingMode +import pydantic +from ttd_workflows.types import BaseModel +from typing_extensions import Annotated, TypedDict + + +class CampaignUpdateWorkflowBudgetInputTypedDict(TypedDict): + pacing_mode: CampaignPacingMode + + +class CampaignUpdateWorkflowBudgetInput(BaseModel): + pacing_mode: Annotated[CampaignPacingMode, pydantic.Field(alias="pacingMode")] diff --git a/src/ttd_workflows/models/campaignupdateworkflowinput.py b/src/ttd_workflows/models/campaignupdateworkflowinput.py index 51c3b71..4fdce93 100644 --- a/src/ttd_workflows/models/campaignupdateworkflowinput.py +++ b/src/ttd_workflows/models/campaignupdateworkflowinput.py @@ -37,30 +37,25 @@ class CampaignUpdateWorkflowInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["primaryInput", "advancedInput"] - nullable_fields = ["id"] - null_default_fields = [] - + optional_fields = set(["primaryInput", "advancedInput"]) + nullable_fields = set(["id"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaignupdateworkflowinputwithvalidation.py b/src/ttd_workflows/models/campaignupdateworkflowinputwithvalidation.py index a1980ac..10db988 100644 --- a/src/ttd_workflows/models/campaignupdateworkflowinputwithvalidation.py +++ b/src/ttd_workflows/models/campaignupdateworkflowinputwithvalidation.py @@ -48,30 +48,25 @@ class CampaignUpdateWorkflowInputWithValidation(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["primaryInput", "advancedInput", "validateInputOnly"] - nullable_fields = ["id", "validateInputOnly"] - null_default_fields = [] - + optional_fields = set(["primaryInput", "advancedInput", "validateInputOnly"]) + nullable_fields = set(["id", "validateInputOnly"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaignupdateworkflowprimaryinput.py b/src/ttd_workflows/models/campaignupdateworkflowprimaryinput.py index d06a5e2..fdbf498 100644 --- a/src/ttd_workflows/models/campaignupdateworkflowprimaryinput.py +++ b/src/ttd_workflows/models/campaignupdateworkflowprimaryinput.py @@ -2,9 +2,9 @@ from __future__ import annotations from .campaignchanneltype import CampaignChannelType -from .campaignworkflowbudgetinput import ( - CampaignWorkflowBudgetInput, - CampaignWorkflowBudgetInputTypedDict, +from .campaignupdateworkflowbudgetinput import ( + CampaignUpdateWorkflowBudgetInput, + CampaignUpdateWorkflowBudgetInputTypedDict, ) from .campaignworkflowcampaignconversionreportingcolumninput import ( CampaignWorkflowCampaignConversionReportingColumnInput, @@ -39,7 +39,6 @@ class CampaignUpdateWorkflowPrimaryInputTypedDict(TypedDict): custom_cpa_type: NotRequired[CustomCPAType] custom_roas_type: NotRequired[CustomROASType] impressions_only_budgeting_cpm: NotRequired[Nullable[float]] - budget: NotRequired[CampaignWorkflowBudgetInputTypedDict] end_date_in_utc: NotRequired[Nullable[datetime]] seed_id: NotRequired[Nullable[str]] campaign_conversion_reporting_columns: NotRequired[ @@ -52,6 +51,7 @@ class CampaignUpdateWorkflowPrimaryInputTypedDict(TypedDict): primary_channel: NotRequired[CampaignChannelType] primary_goal: NotRequired[CampaignWorkflowROIGoalInputTypedDict] start_date_in_utc: NotRequired[Nullable[datetime]] + budget: NotRequired[CampaignUpdateWorkflowBudgetInputTypedDict] class CampaignUpdateWorkflowPrimaryInput(BaseModel): @@ -85,8 +85,6 @@ class CampaignUpdateWorkflowPrimaryInput(BaseModel): OptionalNullable[float], pydantic.Field(alias="impressionsOnlyBudgetingCpm") ] = UNSET - budget: Optional[CampaignWorkflowBudgetInput] = None - end_date_in_utc: Annotated[ OptionalNullable[datetime], pydantic.Field(alias="endDateInUtc") ] = UNSET @@ -124,65 +122,66 @@ class CampaignUpdateWorkflowPrimaryInput(BaseModel): OptionalNullable[datetime], pydantic.Field(alias="startDateInUtc") ] = UNSET + budget: Optional[CampaignUpdateWorkflowBudgetInput] = None + @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "description", - "campaignGroupId", - "timeZone", - "customCPAClickWeight", - "customCPAViewthroughWeight", - "customCPAType", - "customRoasType", - "impressionsOnlyBudgetingCpm", - "budget", - "endDateInUtc", - "seedId", - "campaignConversionReportingColumns", - "isManagedByTTD", - "secondaryGoal", - "tertiaryGoal", - "name", - "primaryChannel", - "primaryGoal", - "startDateInUtc", - ] - nullable_fields = [ - "description", - "campaignGroupId", - "timeZone", - "customCPAClickWeight", - "customCPAViewthroughWeight", - "impressionsOnlyBudgetingCpm", - "endDateInUtc", - "seedId", - "campaignConversionReportingColumns", - "isManagedByTTD", - "name", - "startDateInUtc", - ] - null_default_fields = [] - + optional_fields = set( + [ + "description", + "campaignGroupId", + "timeZone", + "customCPAClickWeight", + "customCPAViewthroughWeight", + "customCPAType", + "customRoasType", + "impressionsOnlyBudgetingCpm", + "endDateInUtc", + "seedId", + "campaignConversionReportingColumns", + "isManagedByTTD", + "secondaryGoal", + "tertiaryGoal", + "name", + "primaryChannel", + "primaryGoal", + "startDateInUtc", + "budget", + ] + ) + nullable_fields = set( + [ + "description", + "campaignGroupId", + "timeZone", + "customCPAClickWeight", + "customCPAViewthroughWeight", + "impressionsOnlyBudgetingCpm", + "endDateInUtc", + "seedId", + "campaignConversionReportingColumns", + "isManagedByTTD", + "name", + "startDateInUtc", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaignversionworkflow.py b/src/ttd_workflows/models/campaignversionworkflow.py index 8639c74..5a95df5 100644 --- a/src/ttd_workflows/models/campaignversionworkflow.py +++ b/src/ttd_workflows/models/campaignversionworkflow.py @@ -30,30 +30,25 @@ class CampaignVersionWorkflow(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["version", "budgetingVersion"] - nullable_fields = ["Id", "version", "budgetingVersion"] - null_default_fields = [] - + optional_fields = set(["version", "budgetingVersion"]) + nullable_fields = set(["Id", "version", "budgetingVersion"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaignworkflow.py b/src/ttd_workflows/models/campaignworkflow.py index 9e96b02..48a44ef 100644 --- a/src/ttd_workflows/models/campaignworkflow.py +++ b/src/ttd_workflows/models/campaignworkflow.py @@ -107,65 +107,64 @@ class CampaignWorkflow(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "name", - "campaignGroupId", - "description", - "startDate", - "endDate", - "timeZone", - "customCPAClickWeight", - "customCPAViewthroughWeight", - "customCPAType", - "impressionsOnlyBudgetingCpm", - "primaryChannel", - "primaryGoal", - "seedId", - "conversionReportingColumnsCount", - "flights", - "secondaryGoal", - "tertiaryGoal", - ] - nullable_fields = [ - "id", - "name", - "campaignGroupId", - "description", - "startDate", - "endDate", - "timeZone", - "customCPAClickWeight", - "customCPAViewthroughWeight", - "impressionsOnlyBudgetingCpm", - "primaryGoal", - "seedId", - "conversionReportingColumnsCount", - "flights", - "secondaryGoal", - "tertiaryGoal", - ] - null_default_fields = [] - + optional_fields = set( + [ + "name", + "campaignGroupId", + "description", + "startDate", + "endDate", + "timeZone", + "customCPAClickWeight", + "customCPAViewthroughWeight", + "customCPAType", + "impressionsOnlyBudgetingCpm", + "primaryChannel", + "primaryGoal", + "seedId", + "conversionReportingColumnsCount", + "flights", + "secondaryGoal", + "tertiaryGoal", + ] + ) + nullable_fields = set( + [ + "id", + "name", + "campaignGroupId", + "description", + "startDate", + "endDate", + "timeZone", + "customCPAClickWeight", + "customCPAViewthroughWeight", + "impressionsOnlyBudgetingCpm", + "primaryGoal", + "seedId", + "conversionReportingColumnsCount", + "flights", + "secondaryGoal", + "tertiaryGoal", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaignworkflowcampaignconversionreportingcolumninput.py b/src/ttd_workflows/models/campaignworkflowcampaignconversionreportingcolumninput.py index 762b56d..45ab09c 100644 --- a/src/ttd_workflows/models/campaignworkflowcampaignconversionreportingcolumninput.py +++ b/src/ttd_workflows/models/campaignworkflowcampaignconversionreportingcolumninput.py @@ -2,6 +2,7 @@ from __future__ import annotations from .customroasconfig import CustomROASConfig, CustomROASConfigTypedDict +from .productlistreportingtypeinput import ProductListReportingTypeInput import pydantic from pydantic import model_serializer from ttd_workflows.types import ( @@ -20,6 +21,7 @@ class CampaignWorkflowCampaignConversionReportingColumnInputTypedDict(TypedDict) include_in_custom_cpa: bool reporting_column_id: int roas_config: NotRequired[CustomROASConfigTypedDict] + product_list_reporting_type: NotRequired[ProductListReportingTypeInput] weight: NotRequired[Nullable[float]] cross_device_attribution_model_id: NotRequired[Nullable[str]] @@ -35,6 +37,11 @@ class CampaignWorkflowCampaignConversionReportingColumnInput(BaseModel): Optional[CustomROASConfig], pydantic.Field(alias="ROASConfig") ] = None + product_list_reporting_type: Annotated[ + Optional[ProductListReportingTypeInput], + pydantic.Field(alias="productListReportingType"), + ] = None + weight: OptionalNullable[float] = UNSET cross_device_attribution_model_id: Annotated[ @@ -43,30 +50,32 @@ class CampaignWorkflowCampaignConversionReportingColumnInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["ROASConfig", "weight", "crossDeviceAttributionModelId"] - nullable_fields = ["weight", "crossDeviceAttributionModelId"] - null_default_fields = [] - + optional_fields = set( + [ + "ROASConfig", + "productListReportingType", + "weight", + "crossDeviceAttributionModelId", + ] + ) + nullable_fields = set(["weight", "crossDeviceAttributionModelId"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaignworkflowflightinput.py b/src/ttd_workflows/models/campaignworkflowflightinput.py index d9d5d2a..f2bb7cf 100644 --- a/src/ttd_workflows/models/campaignworkflowflightinput.py +++ b/src/ttd_workflows/models/campaignworkflowflightinput.py @@ -50,40 +50,39 @@ class CampaignWorkflowFlightInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "endDateExclusiveUTC", - "budgetInImpressions", - "dailyTargetInAdvertiserCurrency", - "dailyTargetInImpressions", - ] - nullable_fields = [ - "endDateExclusiveUTC", - "budgetInImpressions", - "dailyTargetInAdvertiserCurrency", - "dailyTargetInImpressions", - ] - null_default_fields = [] - + optional_fields = set( + [ + "endDateExclusiveUTC", + "budgetInImpressions", + "dailyTargetInAdvertiserCurrency", + "dailyTargetInImpressions", + ] + ) + nullable_fields = set( + [ + "endDateExclusiveUTC", + "budgetInImpressions", + "dailyTargetInAdvertiserCurrency", + "dailyTargetInImpressions", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/campaignworkflowroigoalinput.py b/src/ttd_workflows/models/campaignworkflowroigoalinput.py index 7fa7e7a..0913d65 100644 --- a/src/ttd_workflows/models/campaignworkflowroigoalinput.py +++ b/src/ttd_workflows/models/campaignworkflowroigoalinput.py @@ -100,64 +100,63 @@ class CampaignWorkflowROIGoalInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "maximizeReach", - "maximizeLtvIncrementalReach", - "cpcInAdvertiserCurrency", - "ctrInPercent", - "nielsenOTPInPercent", - "cpaInAdvertiserCurrency", - "returnOnAdSpendPercent", - "vcrInPercent", - "viewabilityInPercent", - "vcpmInAdvertiserCurrency", - "cpcvInAdvertiserCurrency", - "miaozhenOTPInPercent", - "iqviaAudienceQualityIndex", - "crossixAudienceQualityIndex", - "iqviaAudienceQualityIndexAndCostPerTarget", - "crossixCostPerTarget", - ] - nullable_fields = [ - "maximizeReach", - "maximizeLtvIncrementalReach", - "cpcInAdvertiserCurrency", - "ctrInPercent", - "nielsenOTPInPercent", - "cpaInAdvertiserCurrency", - "returnOnAdSpendPercent", - "vcrInPercent", - "viewabilityInPercent", - "vcpmInAdvertiserCurrency", - "cpcvInAdvertiserCurrency", - "miaozhenOTPInPercent", - "iqviaAudienceQualityIndex", - "crossixAudienceQualityIndex", - "iqviaAudienceQualityIndexAndCostPerTarget", - "crossixCostPerTarget", - ] - null_default_fields = [] - + optional_fields = set( + [ + "maximizeReach", + "maximizeLtvIncrementalReach", + "cpcInAdvertiserCurrency", + "ctrInPercent", + "nielsenOTPInPercent", + "cpaInAdvertiserCurrency", + "returnOnAdSpendPercent", + "vcrInPercent", + "viewabilityInPercent", + "vcpmInAdvertiserCurrency", + "cpcvInAdvertiserCurrency", + "miaozhenOTPInPercent", + "iqviaAudienceQualityIndex", + "crossixAudienceQualityIndex", + "iqviaAudienceQualityIndexAndCostPerTarget", + "crossixCostPerTarget", + ] + ) + nullable_fields = set( + [ + "maximizeReach", + "maximizeLtvIncrementalReach", + "cpcInAdvertiserCurrency", + "ctrInPercent", + "nielsenOTPInPercent", + "cpaInAdvertiserCurrency", + "returnOnAdSpendPercent", + "vcrInPercent", + "viewabilityInPercent", + "vcpmInAdvertiserCurrency", + "cpcvInAdvertiserCurrency", + "miaozhenOTPInPercent", + "iqviaAudienceQualityIndex", + "crossixAudienceQualityIndex", + "iqviaAudienceQualityIndexAndCostPerTarget", + "crossixCostPerTarget", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/createadgroupop.py b/src/ttd_workflows/models/createadgroupop.py index f3627af..1b924bd 100644 --- a/src/ttd_workflows/models/createadgroupop.py +++ b/src/ttd_workflows/models/createadgroupop.py @@ -4,7 +4,8 @@ from .adgrouppayload import AdGroupPayload, AdGroupPayloadTypedDict from .httpmetadata import HTTPMetadata, HTTPMetadataTypedDict import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -20,3 +21,19 @@ class CreateAdGroupResponse(BaseModel): ad_group_payload: Optional[AdGroupPayload] = None r"""Created""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["AdGroupPayload"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/createadgroupsjobop.py b/src/ttd_workflows/models/createadgroupsjobop.py index f90d90b..e7957d3 100644 --- a/src/ttd_workflows/models/createadgroupsjobop.py +++ b/src/ttd_workflows/models/createadgroupsjobop.py @@ -7,7 +7,8 @@ StandardJobSubmitResponseTypedDict, ) import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -23,3 +24,19 @@ class CreateAdGroupsJobResponse(BaseModel): standard_job_submit_response: Optional[StandardJobSubmitResponse] = None r"""Accepted""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["StandardJobSubmitResponse"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/createcampaignop.py b/src/ttd_workflows/models/createcampaignop.py index 5a2dbbc..9465b8b 100644 --- a/src/ttd_workflows/models/createcampaignop.py +++ b/src/ttd_workflows/models/createcampaignop.py @@ -4,7 +4,8 @@ from .campaignpayload import CampaignPayload, CampaignPayloadTypedDict from .httpmetadata import HTTPMetadata, HTTPMetadataTypedDict import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -20,3 +21,19 @@ class CreateCampaignResponse(BaseModel): campaign_payload: Optional[CampaignPayload] = None r"""Created""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["CampaignPayload"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/createcampaignsjobop.py b/src/ttd_workflows/models/createcampaignsjobop.py index 8e83670..368edd4 100644 --- a/src/ttd_workflows/models/createcampaignsjobop.py +++ b/src/ttd_workflows/models/createcampaignsjobop.py @@ -7,7 +7,8 @@ StandardJobSubmitResponseTypedDict, ) import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -23,3 +24,19 @@ class CreateCampaignsJobResponse(BaseModel): standard_job_submit_response: Optional[StandardJobSubmitResponse] = None r"""Accepted""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["StandardJobSubmitResponse"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/customroasconfig.py b/src/ttd_workflows/models/customroasconfig.py index 701a3b3..9180253 100644 --- a/src/ttd_workflows/models/customroasconfig.py +++ b/src/ttd_workflows/models/customroasconfig.py @@ -37,38 +37,29 @@ class CustomROASConfig(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "customROASWeight", - "customROASClickWeight", - "customROASViewthroughWeight", - ] - nullable_fields = [ - "customROASWeight", - "customROASClickWeight", - "customROASViewthroughWeight", - ] - null_default_fields = [] - + optional_fields = set( + ["customROASWeight", "customROASClickWeight", "customROASViewthroughWeight"] + ) + nullable_fields = set( + ["customROASWeight", "customROASClickWeight", "customROASViewthroughWeight"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/firstpartydatainput.py b/src/ttd_workflows/models/firstpartydatainput.py index df76b45..5c4cfc6 100644 --- a/src/ttd_workflows/models/firstpartydatainput.py +++ b/src/ttd_workflows/models/firstpartydatainput.py @@ -95,30 +95,25 @@ class FirstPartyDataInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["nameFilter", "queryShape", "callbackInput"] - nullable_fields = ["nameFilter", "queryShape"] - null_default_fields = [] - + optional_fields = set(["nameFilter", "queryShape", "callbackInput"]) + nullable_fields = set(["nameFilter", "queryShape"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/frequencyconfig.py b/src/ttd_workflows/models/frequencyconfig.py new file mode 100644 index 0000000..e135c6f --- /dev/null +++ b/src/ttd_workflows/models/frequencyconfig.py @@ -0,0 +1,66 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +import pydantic +from pydantic import model_serializer +from ttd_workflows.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from typing import Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class FrequencyConfigTypedDict(TypedDict): + counter_name: NotRequired[Nullable[str]] + frequency_cap: NotRequired[Nullable[int]] + frequency_goal: NotRequired[Nullable[int]] + reset_interval_in_minutes: NotRequired[int] + + +class FrequencyConfig(BaseModel): + counter_name: Annotated[ + OptionalNullable[str], pydantic.Field(alias="counterName") + ] = UNSET + + frequency_cap: Annotated[ + OptionalNullable[int], pydantic.Field(alias="frequencyCap") + ] = UNSET + + frequency_goal: Annotated[ + OptionalNullable[int], pydantic.Field(alias="frequencyGoal") + ] = UNSET + + reset_interval_in_minutes: Annotated[ + Optional[int], pydantic.Field(alias="resetIntervalInMinutes") + ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["counterName", "frequencyCap", "frequencyGoal", "resetIntervalInMinutes"] + ) + nullable_fields = set(["counterName", "frequencyCap", "frequencyGoal"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/ttd_workflows/models/getcampaignversionop.py b/src/ttd_workflows/models/getcampaignversionop.py index d8ddd4f..fca5aa7 100644 --- a/src/ttd_workflows/models/getcampaignversionop.py +++ b/src/ttd_workflows/models/getcampaignversionop.py @@ -7,7 +7,8 @@ ) from .httpmetadata import HTTPMetadata, HTTPMetadataTypedDict import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from ttd_workflows.utils import FieldMetadata, PathParamMetadata from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -34,3 +35,19 @@ class GetCampaignVersionResponse(BaseModel): campaign_version_workflow: Optional[CampaignVersionWorkflow] = None r"""OK""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["CampaignVersionWorkflow"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/getfirstpartydatajobop.py b/src/ttd_workflows/models/getfirstpartydatajobop.py index 7f33eed..90d3a30 100644 --- a/src/ttd_workflows/models/getfirstpartydatajobop.py +++ b/src/ttd_workflows/models/getfirstpartydatajobop.py @@ -7,7 +7,8 @@ StandardJobSubmitResponseTypedDict, ) import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -23,3 +24,19 @@ class GetFirstPartyDataJobResponse(BaseModel): standard_job_submit_response: Optional[StandardJobSubmitResponse] = None r"""Accepted""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["StandardJobSubmitResponse"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/getgraphqlbulkjobstatusop.py b/src/ttd_workflows/models/getgraphqlbulkjobstatusop.py index 758deaf..604e40d 100644 --- a/src/ttd_workflows/models/getgraphqlbulkjobstatusop.py +++ b/src/ttd_workflows/models/getgraphqlbulkjobstatusop.py @@ -7,7 +7,8 @@ ) from .httpmetadata import HTTPMetadata, HTTPMetadataTypedDict import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from ttd_workflows.utils import FieldMetadata, PathParamMetadata from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -38,3 +39,19 @@ class GetGraphQlBulkJobStatusResponse(BaseModel): None ) r"""OK""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["GraphQLBulkJobRetrievalResponse"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/getjobstatusop.py b/src/ttd_workflows/models/getjobstatusop.py index f97d391..94c9246 100644 --- a/src/ttd_workflows/models/getjobstatusop.py +++ b/src/ttd_workflows/models/getjobstatusop.py @@ -7,7 +7,8 @@ StandardJobStatusResponseTypedDict, ) import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from ttd_workflows.utils import FieldMetadata, PathParamMetadata from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -34,3 +35,19 @@ class GetJobStatusResponse(BaseModel): standard_job_status_response: Optional[StandardJobStatusResponse] = None r"""OK""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["StandardJobStatusResponse"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/getthirdpartydatajobop.py b/src/ttd_workflows/models/getthirdpartydatajobop.py index 93fc639..00dcc59 100644 --- a/src/ttd_workflows/models/getthirdpartydatajobop.py +++ b/src/ttd_workflows/models/getthirdpartydatajobop.py @@ -7,7 +7,8 @@ StandardJobSubmitResponseTypedDict, ) import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -23,3 +24,19 @@ class GetThirdPartyDataJobResponse(BaseModel): standard_job_submit_response: Optional[StandardJobSubmitResponse] = None r"""Accepted""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["StandardJobSubmitResponse"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/graphqlbulkjob.py b/src/ttd_workflows/models/graphqlbulkjob.py index 366d07e..755af97 100644 --- a/src/ttd_workflows/models/graphqlbulkjob.py +++ b/src/ttd_workflows/models/graphqlbulkjob.py @@ -87,43 +87,42 @@ class GraphQlBulkJob(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "completedAt", - "completionPercentage", - "url", - "rawResult", - "queryGqlErrors", - ] - nullable_fields = [ - "completedAt", - "completionPercentage", - "url", - "rawResult", - "queryGqlErrors", - "runtimeErrors", - ] - null_default_fields = [] - + optional_fields = set( + [ + "completedAt", + "completionPercentage", + "url", + "rawResult", + "queryGqlErrors", + ] + ) + nullable_fields = set( + [ + "completedAt", + "completionPercentage", + "url", + "rawResult", + "queryGqlErrors", + "runtimeErrors", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/graphqlbulkjobcallbackinput.py b/src/ttd_workflows/models/graphqlbulkjobcallbackinput.py index 672aa3f..2664833 100644 --- a/src/ttd_workflows/models/graphqlbulkjobcallbackinput.py +++ b/src/ttd_workflows/models/graphqlbulkjobcallbackinput.py @@ -39,30 +39,25 @@ class GraphQlBulkJobCallbackInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["callbackHeaders"] - nullable_fields = ["callbackHeaders"] - null_default_fields = [] - + optional_fields = set(["callbackHeaders"]) + nullable_fields = set(["callbackHeaders"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/graphqlbulkjoberror.py b/src/ttd_workflows/models/graphqlbulkjoberror.py index b652db5..40523a4 100644 --- a/src/ttd_workflows/models/graphqlbulkjoberror.py +++ b/src/ttd_workflows/models/graphqlbulkjoberror.py @@ -35,30 +35,25 @@ class GraphQLBulkJobError(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["field", "additionalData"] - nullable_fields = ["message", "field", "additionalData"] - null_default_fields = [] - + optional_fields = set(["field", "additionalData"]) + nullable_fields = set(["message", "field", "additionalData"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/graphqlbulkjobpayload.py b/src/ttd_workflows/models/graphqlbulkjobpayload.py index 377e1b8..f4593b1 100644 --- a/src/ttd_workflows/models/graphqlbulkjobpayload.py +++ b/src/ttd_workflows/models/graphqlbulkjobpayload.py @@ -29,30 +29,25 @@ class GraphQlBulkJobPayload(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["data", "errors"] - nullable_fields = ["errors"] - null_default_fields = [] - + optional_fields = set(["data", "errors"]) + nullable_fields = set(["errors"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/graphqlbulkjobresponse.py b/src/ttd_workflows/models/graphqlbulkjobresponse.py index 7de8ce9..0316f6d 100644 --- a/src/ttd_workflows/models/graphqlbulkjobresponse.py +++ b/src/ttd_workflows/models/graphqlbulkjobresponse.py @@ -30,30 +30,25 @@ class GraphQlBulkJobResponse(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["payload", "errors"] - nullable_fields = ["errors"] - null_default_fields = [] - + optional_fields = set(["payload", "errors"]) + nullable_fields = set(["errors"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/graphqlbulkjobretrievalresponse.py b/src/ttd_workflows/models/graphqlbulkjobretrievalresponse.py index 3111d6a..329d6e4 100644 --- a/src/ttd_workflows/models/graphqlbulkjobretrievalresponse.py +++ b/src/ttd_workflows/models/graphqlbulkjobretrievalresponse.py @@ -32,30 +32,25 @@ class GraphQLBulkJobRetrievalResponse(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["job", "errors"] - nullable_fields = ["errors"] - null_default_fields = [] - + optional_fields = set(["job", "errors"]) + nullable_fields = set(["errors"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/graphqlqueryjobinput.py b/src/ttd_workflows/models/graphqlqueryjobinput.py index 4e2e16d..46600af 100644 --- a/src/ttd_workflows/models/graphqlqueryjobinput.py +++ b/src/ttd_workflows/models/graphqlqueryjobinput.py @@ -47,30 +47,25 @@ class GraphQlQueryJobInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["callbackInput", "betaFeatures"] - nullable_fields = ["betaFeatures"] - null_default_fields = [] - + optional_fields = set(["callbackInput", "betaFeatures"]) + nullable_fields = set(["betaFeatures"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/graphqlrequestinput.py b/src/ttd_workflows/models/graphqlrequestinput.py index 2bcb947..eed81b2 100644 --- a/src/ttd_workflows/models/graphqlrequestinput.py +++ b/src/ttd_workflows/models/graphqlrequestinput.py @@ -41,30 +41,25 @@ class GraphQLRequestInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["variables", "betaFeatures"] - nullable_fields = ["variables", "betaFeatures"] - null_default_fields = [] - + optional_fields = set(["variables", "betaFeatures"]) + nullable_fields = set(["variables", "betaFeatures"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/incrementalreachbrandinput.py b/src/ttd_workflows/models/incrementalreachbrandinput.py index 2aaf848..cbaf9ce 100644 --- a/src/ttd_workflows/models/incrementalreachbrandinput.py +++ b/src/ttd_workflows/models/incrementalreachbrandinput.py @@ -29,30 +29,25 @@ class IncrementalReachBrandInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["id", "name", "isActive"] - nullable_fields = ["name"] - null_default_fields = [] - + optional_fields = set(["id", "name", "isActive"]) + nullable_fields = set(["name"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/incrementalreachproductinput.py b/src/ttd_workflows/models/incrementalreachproductinput.py index 39b326e..f2c0c94 100644 --- a/src/ttd_workflows/models/incrementalreachproductinput.py +++ b/src/ttd_workflows/models/incrementalreachproductinput.py @@ -25,30 +25,25 @@ class IncrementalReachProductInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["id", "name"] - nullable_fields = ["name"] - null_default_fields = [] - + optional_fields = set(["id", "name"]) + nullable_fields = set(["name"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/keyvaluepairofstringandstringinput.py b/src/ttd_workflows/models/keyvaluepairofstringandstringinput.py index 64e8d18..000d267 100644 --- a/src/ttd_workflows/models/keyvaluepairofstringandstringinput.py +++ b/src/ttd_workflows/models/keyvaluepairofstringandstringinput.py @@ -22,30 +22,14 @@ class KeyValuePairOfStringAndStringInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [] - nullable_fields = ["key", "value"] - null_default_fields = [] - serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): + if val != UNSET_SENTINEL: m[k] = val return m diff --git a/src/ttd_workflows/models/problemdetails_error.py b/src/ttd_workflows/models/problemdetails_error.py index f7d133c..51b0e6f 100644 --- a/src/ttd_workflows/models/problemdetails_error.py +++ b/src/ttd_workflows/models/problemdetails_error.py @@ -13,15 +13,10 @@ class ProblemDetailsErrorData(BaseModel): type: OptionalNullable[str] = UNSET - title: OptionalNullable[str] = UNSET - status: OptionalNullable[int] = UNSET - detail: OptionalNullable[str] = UNSET - instance: OptionalNullable[str] = UNSET - additional_properties: Annotated[ Optional[Dict[str, ProblemDetails]], pydantic.Field(exclude=True) ] = None diff --git a/src/ttd_workflows/models/productlistreportingtypeinput.py b/src/ttd_workflows/models/productlistreportingtypeinput.py new file mode 100644 index 0000000..bd9f443 --- /dev/null +++ b/src/ttd_workflows/models/productlistreportingtypeinput.py @@ -0,0 +1,9 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from enum import Enum + + +class ProductListReportingTypeInput(str, Enum): + FEATURED = "Featured" + HALO = "Halo" diff --git a/src/ttd_workflows/models/realyticsreachsettinginput.py b/src/ttd_workflows/models/realyticsreachsettinginput.py index 0956450..5bcb8c9 100644 --- a/src/ttd_workflows/models/realyticsreachsettinginput.py +++ b/src/ttd_workflows/models/realyticsreachsettinginput.py @@ -43,36 +43,27 @@ class RealyticsReachSettingInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "id", - "name", - "isActive", - "products", - "realyticsEntertainmentInput", - ] - nullable_fields = ["name", "products"] - null_default_fields = [] - + optional_fields = set( + ["id", "name", "isActive", "products", "realyticsEntertainmentInput"] + ) + nullable_fields = set(["name", "products"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/security.py b/src/ttd_workflows/models/security.py index 5c78376..25d523e 100644 --- a/src/ttd_workflows/models/security.py +++ b/src/ttd_workflows/models/security.py @@ -1,7 +1,8 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from ttd_workflows.utils import FieldMetadata, SecurityMetadata from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -23,3 +24,19 @@ class Security(BaseModel): ) ), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["TTD-Auth"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/standardjobstatusresponse.py b/src/ttd_workflows/models/standardjobstatusresponse.py index d4c805c..5bb6828 100644 --- a/src/ttd_workflows/models/standardjobstatusresponse.py +++ b/src/ttd_workflows/models/standardjobstatusresponse.py @@ -69,42 +69,29 @@ class StandardJobStatusResponse(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "completedAtUtc", - "completionPercentage", - "url", - "rawResult", - "errors", - ] - nullable_fields = [ - "completedAtUtc", - "completionPercentage", - "url", - "rawResult", - "errors", - ] - null_default_fields = [] - + optional_fields = set( + ["completedAtUtc", "completionPercentage", "url", "rawResult", "errors"] + ) + nullable_fields = set( + ["completedAtUtc", "completionPercentage", "url", "rawResult", "errors"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/submitgraphqlbulkqueryjobop.py b/src/ttd_workflows/models/submitgraphqlbulkqueryjobop.py index a6b6122..019ba20 100644 --- a/src/ttd_workflows/models/submitgraphqlbulkqueryjobop.py +++ b/src/ttd_workflows/models/submitgraphqlbulkqueryjobop.py @@ -7,7 +7,8 @@ ) from .httpmetadata import HTTPMetadata, HTTPMetadataTypedDict import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -23,3 +24,19 @@ class SubmitGraphQlBulkQueryJobResponse(BaseModel): graph_ql_bulk_job_response: Optional[GraphQlBulkJobResponse] = None r"""OK""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["GraphQlBulkJobResponse"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/submitgraphqlrequestop.py b/src/ttd_workflows/models/submitgraphqlrequestop.py index 3c3c4ae..75bba35 100644 --- a/src/ttd_workflows/models/submitgraphqlrequestop.py +++ b/src/ttd_workflows/models/submitgraphqlrequestop.py @@ -3,7 +3,8 @@ from __future__ import annotations from .httpmetadata import HTTPMetadata, HTTPMetadataTypedDict import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from typing import Any, Dict, Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -19,3 +20,19 @@ class SubmitGraphQlRequestResponse(BaseModel): object: Optional[Dict[str, Any]] = None r"""OK""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["object"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/submitrestrequestop.py b/src/ttd_workflows/models/submitrestrequestop.py index 17efbf9..6c5d01c 100644 --- a/src/ttd_workflows/models/submitrestrequestop.py +++ b/src/ttd_workflows/models/submitrestrequestop.py @@ -3,7 +3,8 @@ from __future__ import annotations from .httpmetadata import HTTPMetadata, HTTPMetadataTypedDict import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from typing import Any, Dict, Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -19,3 +20,19 @@ class SubmitRestRequestResponse(BaseModel): object: Optional[Dict[str, Any]] = None r"""OK""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["object"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/thirdpartydatainput.py b/src/ttd_workflows/models/thirdpartydatainput.py index ca3ad01..9f5bcc1 100644 --- a/src/ttd_workflows/models/thirdpartydatainput.py +++ b/src/ttd_workflows/models/thirdpartydatainput.py @@ -96,30 +96,25 @@ class ThirdPartyDataInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["queryShape", "callbackInput"] - nullable_fields = ["queryShape"] - null_default_fields = [] - + optional_fields = set(["queryShape", "callbackInput"]) + nullable_fields = set(["queryShape"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/models/updateadgroupop.py b/src/ttd_workflows/models/updateadgroupop.py index 20f03f3..4683744 100644 --- a/src/ttd_workflows/models/updateadgroupop.py +++ b/src/ttd_workflows/models/updateadgroupop.py @@ -4,7 +4,8 @@ from .adgrouppayload import AdGroupPayload, AdGroupPayloadTypedDict from .httpmetadata import HTTPMetadata, HTTPMetadataTypedDict import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -20,3 +21,19 @@ class UpdateAdGroupResponse(BaseModel): ad_group_payload: Optional[AdGroupPayload] = None r"""OK""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["AdGroupPayload"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/updateadgroupsjobop.py b/src/ttd_workflows/models/updateadgroupsjobop.py index 7ef7bb2..d4a0386 100644 --- a/src/ttd_workflows/models/updateadgroupsjobop.py +++ b/src/ttd_workflows/models/updateadgroupsjobop.py @@ -7,7 +7,8 @@ StandardJobSubmitResponseTypedDict, ) import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -23,3 +24,19 @@ class UpdateAdGroupsJobResponse(BaseModel): standard_job_submit_response: Optional[StandardJobSubmitResponse] = None r"""Accepted""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["StandardJobSubmitResponse"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/updatecampaignop.py b/src/ttd_workflows/models/updatecampaignop.py index ab084e0..830e266 100644 --- a/src/ttd_workflows/models/updatecampaignop.py +++ b/src/ttd_workflows/models/updatecampaignop.py @@ -4,7 +4,8 @@ from .campaignpayload import CampaignPayload, CampaignPayloadTypedDict from .httpmetadata import HTTPMetadata, HTTPMetadataTypedDict import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -20,3 +21,19 @@ class UpdateCampaignResponse(BaseModel): campaign_payload: Optional[CampaignPayload] = None r"""OK""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["CampaignPayload"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/updatecampaignsjobop.py b/src/ttd_workflows/models/updatecampaignsjobop.py index 23f8f17..ec3fa96 100644 --- a/src/ttd_workflows/models/updatecampaignsjobop.py +++ b/src/ttd_workflows/models/updatecampaignsjobop.py @@ -8,7 +8,8 @@ StandardJobSubmitResponseTypedDict, ) import pydantic -from ttd_workflows.types import BaseModel +from pydantic import model_serializer +from ttd_workflows.types import BaseModel, UNSET_SENTINEL from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -29,3 +30,19 @@ class UpdateCampaignsJobResponse(BaseModel): campaign_payload: Optional[CampaignPayload] = None r"""OK""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["StandardJobSubmitResponse", "CampaignPayload"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/ttd_workflows/models/workflowcallbackinput.py b/src/ttd_workflows/models/workflowcallbackinput.py index 8c7c3c4..40d8919 100644 --- a/src/ttd_workflows/models/workflowcallbackinput.py +++ b/src/ttd_workflows/models/workflowcallbackinput.py @@ -28,30 +28,25 @@ class WorkflowCallbackInput(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["callbackHeaders"] - nullable_fields = ["callbackHeaders"] - null_default_fields = [] - + optional_fields = set(["callbackHeaders"]) + nullable_fields = set(["callbackHeaders"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/ttd_workflows/rest_request.py b/src/ttd_workflows/rest_request.py index 57c43c2..8658ef3 100644 --- a/src/ttd_workflows/rest_request.py +++ b/src/ttd_workflows/rest_request.py @@ -68,6 +68,7 @@ def submit_rest_request( get_serialized_body=lambda: utils.serialize_request_body( request, False, True, "json", Optional[models.CallRestAPIWorkflowInput] ), + allow_empty_value=None, timeout_ms=timeout_ms, ) @@ -178,6 +179,7 @@ async def submit_rest_request_async( get_serialized_body=lambda: utils.serialize_request_body( request, False, True, "json", Optional[models.CallRestAPIWorkflowInput] ), + allow_empty_value=None, timeout_ms=timeout_ms, ) diff --git a/src/ttd_workflows/types/basemodel.py b/src/ttd_workflows/types/basemodel.py index 231c2e3..a9a640a 100644 --- a/src/ttd_workflows/types/basemodel.py +++ b/src/ttd_workflows/types/basemodel.py @@ -2,7 +2,8 @@ from pydantic import ConfigDict, model_serializer from pydantic import BaseModel as PydanticBaseModel -from typing import TYPE_CHECKING, Literal, Optional, TypeVar, Union +from pydantic_core import core_schema +from typing import TYPE_CHECKING, Any, Literal, Optional, TypeVar, Union from typing_extensions import TypeAliasType, TypeAlias @@ -35,5 +36,42 @@ def __bool__(self) -> Literal[False]: "OptionalNullable", Union[Optional[Nullable[T]], Unset], type_params=(T,) ) -UnrecognizedInt: TypeAlias = int -UnrecognizedStr: TypeAlias = str + +class UnrecognizedStr(str): + @classmethod + def __get_pydantic_core_schema__(cls, _source_type: Any, _handler: Any) -> core_schema.CoreSchema: + # Make UnrecognizedStr only work in lax mode, not strict mode + # This makes it a "fallback" option when more specific types (like Literals) don't match + def validate_lax(v: Any) -> 'UnrecognizedStr': + if isinstance(v, cls): + return v + return cls(str(v)) + + # Use lax_or_strict_schema where strict always fails + # This forces Pydantic to prefer other union members in strict mode + # and only fall back to UnrecognizedStr in lax mode + return core_schema.lax_or_strict_schema( + lax_schema=core_schema.chain_schema([ + core_schema.str_schema(), + core_schema.no_info_plain_validator_function(validate_lax) + ]), + strict_schema=core_schema.none_schema(), # Always fails in strict mode + ) + + +class UnrecognizedInt(int): + @classmethod + def __get_pydantic_core_schema__(cls, _source_type: Any, _handler: Any) -> core_schema.CoreSchema: + # Make UnrecognizedInt only work in lax mode, not strict mode + # This makes it a "fallback" option when more specific types (like Literals) don't match + def validate_lax(v: Any) -> 'UnrecognizedInt': + if isinstance(v, cls): + return v + return cls(int(v)) + return core_schema.lax_or_strict_schema( + lax_schema=core_schema.chain_schema([ + core_schema.int_schema(), + core_schema.no_info_plain_validator_function(validate_lax) + ]), + strict_schema=core_schema.none_schema(), # Always fails in strict mode + ) diff --git a/src/ttd_workflows/utils/__init__.py b/src/ttd_workflows/utils/__init__.py index 87192dd..f4525b2 100644 --- a/src/ttd_workflows/utils/__init__.py +++ b/src/ttd_workflows/utils/__init__.py @@ -1,10 +1,22 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Callable, TypeVar from importlib import import_module +import asyncio import builtins import sys +_T = TypeVar("_T") + + +async def run_sync_in_thread(func: Callable[..., _T], *args) -> _T: + """Run a synchronous function in a thread pool to avoid blocking the event loop.""" + if sys.version_info >= (3, 9): + return await asyncio.to_thread(func, *args) + loop = asyncio.get_event_loop() + return await loop.run_in_executor(None, func, *args) + + if TYPE_CHECKING: from .annotations import get_discriminator from .datetimes import parse_datetime @@ -42,7 +54,6 @@ validate_decimal, validate_float, validate_int, - validate_open_enum, ) from .url import generate_url, template_url, remove_suffix from .values import ( @@ -104,7 +115,6 @@ "validate_const", "validate_float", "validate_int", - "validate_open_enum", "cast_partial", ] @@ -158,7 +168,6 @@ "validate_const": ".serializers", "validate_float": ".serializers", "validate_int": ".serializers", - "validate_open_enum": ".serializers", "cast_partial": ".values", } diff --git a/src/ttd_workflows/utils/enums.py b/src/ttd_workflows/utils/enums.py index c3bc13c..3324e1b 100644 --- a/src/ttd_workflows/utils/enums.py +++ b/src/ttd_workflows/utils/enums.py @@ -2,6 +2,10 @@ import enum import sys +from typing import Any + +from pydantic_core import core_schema + class OpenEnumMeta(enum.EnumMeta): # The __call__ method `boundary` kwarg was added in 3.11 and must be present @@ -72,3 +76,59 @@ def __call__( ) except ValueError: return value + + def __new__(mcs, name, bases, namespace, **kwargs): + cls = super().__new__(mcs, name, bases, namespace, **kwargs) + + # Add __get_pydantic_core_schema__ to make open enums work correctly + # in union discrimination. In strict mode (used by Pydantic for unions), + # only known enum values match. In lax mode, unknown values are accepted. + def __get_pydantic_core_schema__( + cls_inner: Any, _source_type: Any, _handler: Any + ) -> core_schema.CoreSchema: + # Create a validator that only accepts known enum values (for strict mode) + def validate_strict(v: Any) -> Any: + if isinstance(v, cls_inner): + return v + # Use the parent EnumMeta's __call__ which raises ValueError for unknown values + return enum.EnumMeta.__call__(cls_inner, v) + + # Create a lax validator that accepts unknown values + def validate_lax(v: Any) -> Any: + if isinstance(v, cls_inner): + return v + try: + return enum.EnumMeta.__call__(cls_inner, v) + except ValueError: + # Return the raw value for unknown enum values + return v + + # Determine the base type schema (str or int) + is_int_enum = False + for base in cls_inner.__mro__: + if base is int: + is_int_enum = True + break + if base is str: + break + + base_schema = ( + core_schema.int_schema() + if is_int_enum + else core_schema.str_schema() + ) + + # Use lax_or_strict_schema: + # - strict mode: only known enum values match (raises ValueError for unknown) + # - lax mode: accept any value, return enum member or raw value + return core_schema.lax_or_strict_schema( + lax_schema=core_schema.chain_schema( + [base_schema, core_schema.no_info_plain_validator_function(validate_lax)] + ), + strict_schema=core_schema.chain_schema( + [base_schema, core_schema.no_info_plain_validator_function(validate_strict)] + ), + ) + + setattr(cls, "__get_pydantic_core_schema__", classmethod(__get_pydantic_core_schema__)) + return cls diff --git a/src/ttd_workflows/utils/forms.py b/src/ttd_workflows/utils/forms.py index e873495..f961e76 100644 --- a/src/ttd_workflows/utils/forms.py +++ b/src/ttd_workflows/utils/forms.py @@ -142,16 +142,21 @@ def serialize_multipart_form( if field_metadata.file: if isinstance(val, List): # Handle array of files + array_field_name = f_name + "[]" for file_obj in val: if not _is_set(file_obj): continue - - file_name, content, content_type = _extract_file_properties(file_obj) + + file_name, content, content_type = _extract_file_properties( + file_obj + ) if content_type is not None: - files.append((f_name + "[]", (file_name, content, content_type))) + files.append( + (array_field_name, (file_name, content, content_type)) + ) else: - files.append((f_name + "[]", (file_name, content))) + files.append((array_field_name, (file_name, content))) else: # Handle single file file_name, content, content_type = _extract_file_properties(val) @@ -161,11 +166,16 @@ def serialize_multipart_form( else: files.append((f_name, (file_name, content))) elif field_metadata.json: - files.append((f_name, ( - None, - marshal_json(val, request_field_types[name]), - "application/json", - ))) + files.append( + ( + f_name, + ( + None, + marshal_json(val, request_field_types[name]), + "application/json", + ), + ) + ) else: if isinstance(val, List): values = [] @@ -175,7 +185,8 @@ def serialize_multipart_form( continue values.append(_val_to_string(value)) - form[f_name + "[]"] = values + array_field_name = f_name + "[]" + form[array_field_name] = values else: form[f_name] = _val_to_string(val) return media_type, form, files diff --git a/src/ttd_workflows/utils/queryparams.py b/src/ttd_workflows/utils/queryparams.py index 37a6e7f..c04e0db 100644 --- a/src/ttd_workflows/utils/queryparams.py +++ b/src/ttd_workflows/utils/queryparams.py @@ -27,12 +27,13 @@ def get_query_params( query_params: Any, gbls: Optional[Any] = None, + allow_empty_value: Optional[List[str]] = None, ) -> Dict[str, List[str]]: params: Dict[str, List[str]] = {} - globals_already_populated = _populate_query_params(query_params, gbls, params, []) + globals_already_populated = _populate_query_params(query_params, gbls, params, [], allow_empty_value) if _is_set(gbls): - _populate_query_params(gbls, None, params, globals_already_populated) + _populate_query_params(gbls, None, params, globals_already_populated, allow_empty_value) return params @@ -42,6 +43,7 @@ def _populate_query_params( gbls: Any, query_param_values: Dict[str, List[str]], skip_fields: List[str], + allow_empty_value: Optional[List[str]] = None, ) -> List[str]: globals_already_populated: List[str] = [] @@ -69,6 +71,16 @@ def _populate_query_params( globals_already_populated.append(name) f_name = field.alias if field.alias is not None else name + + allow_empty_set = set(allow_empty_value or []) + should_include_empty = f_name in allow_empty_set and ( + value is None or value == [] or value == "" + ) + + if should_include_empty: + query_param_values[f_name] = [""] + continue + serialization = metadata.serialization if serialization is not None: serialized_parms = _get_serialized_params( diff --git a/src/ttd_workflows/utils/requestbodies.py b/src/ttd_workflows/utils/requestbodies.py index d5240dd..1de32b6 100644 --- a/src/ttd_workflows/utils/requestbodies.py +++ b/src/ttd_workflows/utils/requestbodies.py @@ -44,15 +44,15 @@ def serialize_request_body( serialized_request_body = SerializedRequestBody(media_type) - if re.match(r"(application|text)\/.*?\+*json.*", media_type) is not None: + if re.match(r"^(application|text)\/([^+]+\+)*json.*", media_type) is not None: serialized_request_body.content = marshal_json(request_body, request_body_type) - elif re.match(r"multipart\/.*", media_type) is not None: + elif re.match(r"^multipart\/.*", media_type) is not None: ( serialized_request_body.media_type, serialized_request_body.data, serialized_request_body.files, ) = serialize_multipart_form(media_type, request_body) - elif re.match(r"application\/x-www-form-urlencoded.*", media_type) is not None: + elif re.match(r"^application\/x-www-form-urlencoded.*", media_type) is not None: serialized_request_body.data = serialize_form_data(request_body) elif isinstance(request_body, (bytes, bytearray, io.BytesIO, io.BufferedReader)): serialized_request_body.content = request_body diff --git a/src/ttd_workflows/utils/retries.py b/src/ttd_workflows/utils/retries.py index 4d60867..88a91b1 100644 --- a/src/ttd_workflows/utils/retries.py +++ b/src/ttd_workflows/utils/retries.py @@ -3,7 +3,9 @@ import asyncio import random import time -from typing import List +from datetime import datetime +from email.utils import parsedate_to_datetime +from typing import List, Optional import httpx @@ -51,9 +53,11 @@ def __init__(self, config: RetryConfig, status_codes: List[str]): class TemporaryError(Exception): response: httpx.Response + retry_after: Optional[int] def __init__(self, response: httpx.Response): self.response = response + self.retry_after = _parse_retry_after_header(response) class PermanentError(Exception): @@ -63,6 +67,62 @@ def __init__(self, inner: Exception): self.inner = inner +def _parse_retry_after_header(response: httpx.Response) -> Optional[int]: + """Parse Retry-After header from response. + + Returns: + Retry interval in milliseconds, or None if header is missing or invalid. + """ + retry_after_header = response.headers.get("retry-after") + if not retry_after_header: + return None + + try: + seconds = float(retry_after_header) + return round(seconds * 1000) + except ValueError: + pass + + try: + retry_date = parsedate_to_datetime(retry_after_header) + delta = (retry_date - datetime.now(retry_date.tzinfo)).total_seconds() + return round(max(0, delta) * 1000) + except (ValueError, TypeError): + pass + + return None + + +def _get_sleep_interval( + exception: Exception, + initial_interval: int, + max_interval: int, + exponent: float, + retries: int, +) -> float: + """Get sleep interval for retry with exponential backoff. + + Args: + exception: The exception that triggered the retry. + initial_interval: Initial retry interval in milliseconds. + max_interval: Maximum retry interval in milliseconds. + exponent: Base for exponential backoff calculation. + retries: Current retry attempt count. + + Returns: + Sleep interval in seconds. + """ + if ( + isinstance(exception, TemporaryError) + and exception.retry_after is not None + and exception.retry_after > 0 + ): + return exception.retry_after / 1000 + + sleep = (initial_interval / 1000) * exponent**retries + random.uniform(0, 1) + return min(sleep, max_interval / 1000) + + def retry(func, retries: Retries): if retries.config.strategy == "backoff": @@ -183,8 +243,10 @@ def retry_with_backoff( return exception.response raise - sleep = (initial_interval / 1000) * exponent**retries + random.uniform(0, 1) - sleep = min(sleep, max_interval / 1000) + + sleep = _get_sleep_interval( + exception, initial_interval, max_interval, exponent, retries + ) time.sleep(sleep) retries += 1 @@ -211,7 +273,9 @@ async def retry_with_backoff_async( return exception.response raise - sleep = (initial_interval / 1000) * exponent**retries + random.uniform(0, 1) - sleep = min(sleep, max_interval / 1000) + + sleep = _get_sleep_interval( + exception, initial_interval, max_interval, exponent, retries + ) await asyncio.sleep(sleep) retries += 1 diff --git a/src/ttd_workflows/utils/serializers.py b/src/ttd_workflows/utils/serializers.py index 378a14c..14321eb 100644 --- a/src/ttd_workflows/utils/serializers.py +++ b/src/ttd_workflows/utils/serializers.py @@ -102,26 +102,6 @@ def validate_int(b): return int(b) -def validate_open_enum(is_int: bool): - def validate(e): - if e is None: - return None - - if isinstance(e, Unset): - return e - - if is_int: - if not isinstance(e, int): - raise ValueError("Expected int") - else: - if not isinstance(e, str): - raise ValueError("Expected string") - - return e - - return validate - - def validate_const(v): def validate(c): # Optional[T] is a Union[T, None] From c1e4cd679c628939ef44f7246a751b288f324ed8 Mon Sep 17 00:00:00 2001 From: "speakeasy-github[bot]" <128539517+speakeasy-github[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 01:14:31 +0000 Subject: [PATCH 2/2] empty commit to trigger [run-tests] workflow