Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

Release History

13.0.23(2024-11-21)
+++++++++++++++++++++++++
* Update Bing Ads API Version 13 service proxies to reflect recent interface changes. For details please see the Bing Ads API Release Notes: https://learn.microsoft.com/en-us/advertising/guides/release-notes?view=bingads-13.
* Added bulk mappings for BulkAssetGroupUrlTarget.

13.0.21.2(2024-08-19)
+++++++++++++++++++++++++
* Fix Issue #295: https://github.com/BingAds/BingAds-Python-SDK/issues/295
Expand Down
2 changes: 1 addition & 1 deletion bingads/manifest.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import sys
VERSION = '13.0.21.2'
VERSION = '13.0.23'
BULK_FORMAT_VERSION_6 = '6.0'
WORKING_NAME = 'BingAdsSDKPython'
USER_AGENT = '{0} {1} {2}'.format(WORKING_NAME, VERSION, sys.version_info[0:3])
1 change: 1 addition & 0 deletions bingads/v13/bulk/entities/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
from .bulk_asset_group import *
from .bulk_audience_group import *
from .bulk_asset_group_listing_group import *
from .bulk_asset_group_url_target import *
from .bulk_audience_group_asset_group_association import *
from .bulk_campaign_negative_webpage import *
from .bulk_seasonality_adjustment import *
Expand Down
205 changes: 205 additions & 0 deletions bingads/v13/bulk/entities/bulk_asset_group_url_target.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
from bingads.service_client import _CAMPAIGN_OBJECT_FACTORY_V13

from bingads.v13.internal.bulk.string_table import _StringTable
from bingads.v13.internal.bulk.entities.single_record_bulk_entity import _SingleRecordBulkEntity
from bingads.v13.internal.bulk.mappings import _SimpleBulkMapping, _ComplexBulkMapping
from bingads.v13.internal.extensions import *

class BulkAssetGroupUrlTarget(_SingleRecordBulkEntity):
""" Represents an asset group url target.

This class exposes the property :attr:`asset_group_url_target` that can be read and written as fields of the asset group url target record
in a bulk file.

For more information, see Asset Group at https://go.microsoft.com/fwlink/?linkid=846127.

*See also:*

* :class:`.BulkServiceManager`
* :class:`.BulkOperation`
* :class:`.BulkFileReader`
* :class:`.BulkFileWriter`
"""

def __init__(self, status=None):
super(BulkAssetGroupUrlTarget, self).__init__()

self._status = status
self._id = None
self._asset_group_id = None
self._target_condition1 = None
self._target_condition2 = None
self._target_condition3 = None
self._target_condition_operator1 = None
self._target_condition_operator2 = None
self._target_condition_operator3 = None
self._target_value1 = None
self._target_value2 = None
self._target_value3 = None

@property
def status(self):
return self._status

@status.setter
def status(self, status):
self._status = status

@property
def id(self):
return self._id

@id.setter
def id(self, id):
self._id = id

@property
def asset_group_id(self):
return self._asset_group_id

@asset_group_id.setter
def asset_group_id(self, asset_group_id):
self._asset_group_id = asset_group_id

@property
def target_condition1(self):
return self._target_condition1

@target_condition1.setter
def target_condition1(self, target_condition1):
self._target_condition1 = target_condition1

@property
def target_condition2(self):
return self._target_condition2

@target_condition2.setter
def target_condition2(self, target_condition2):
self._target_condition2 = target_condition2

@property
def target_condition3(self):
return self._target_condition3

@target_condition3.setter
def target_condition3(self, target_condition3):
self._target_condition3 = target_condition3

@property
def target_condition_operator1(self):
return self._target_condition_operator1

@target_condition_operator1.setter
def target_condition_operator1(self, target_condition_operator1):
self._target_condition_operator1 = target_condition_operator1

@property
def target_condition_operator2(self):
return self._target_condition_operator2

@target_condition_operator2.setter
def target_condition_operator2(self, target_condition_operator2):
self._target_condition_operator2 = target_condition_operator2

@property
def target_condition_operator3(self):
return self._target_condition_operator3

@target_condition_operator3.setter
def target_condition_operator3(self, target_condition_operator3):
self._target_condition_operator3 = target_condition_operator3

@property
def target_value1(self):
return self._target_value1

@target_value1.setter
def target_value1(self, target_value1):
self._target_value1 = target_value1

@property
def target_value2(self):
return self._target_value2

@target_value2.setter
def target_value2(self, target_value2):
self._target_value2 = target_value2

@property
def target_value3(self):
return self._target_value3

@target_value3.setter
def target_value3(self, target_value3):
self._target_value3 = target_value3

_MAPPINGS = [
_SimpleBulkMapping(
header=_StringTable.Id,
field_to_csv=lambda c: bulk_str(c.id),
csv_to_field=lambda c, v: setattr(c, 'id', int(v) if v else None)
),
_SimpleBulkMapping(
header=_StringTable.Status,
field_to_csv=lambda c: bulk_str(c.status),
csv_to_field=lambda c, v: setattr(c, 'status', v if v else None)
),
_SimpleBulkMapping(
header=_StringTable.ParentId,
field_to_csv=lambda c: bulk_str(c.asset_group_id),
csv_to_field=lambda c, v: setattr(c, 'asset_group_id', int(v) if v else None)
),
_SimpleBulkMapping(
header=_StringTable.AssetGroupTargetCondition1,
field_to_csv=lambda c: c.target_condition1,
csv_to_field=lambda c, v: setattr(c, 'target_condition1', v)
),
_SimpleBulkMapping(
header=_StringTable.AssetGroupTargetCondition2,
field_to_csv=lambda c: c.target_condition2,
csv_to_field=lambda c, v: setattr(c, 'target_condition2', v)
),
_SimpleBulkMapping(
header=_StringTable.AssetGroupTargetCondition3,
field_to_csv=lambda c: c.target_condition3,
csv_to_field=lambda c, v: setattr(c, 'target_condition3', v)
),
_SimpleBulkMapping(
header=_StringTable.AssetGroupTargetConditionOperator1,
field_to_csv=lambda c: c.target_condition_operator1,
csv_to_field=lambda c, v: setattr(c, 'target_condition_operator1', v)
),
_SimpleBulkMapping(
header=_StringTable.AssetGroupTargetConditionOperator2,
field_to_csv=lambda c: c.target_condition_operator2,
csv_to_field=lambda c, v: setattr(c, 'target_condition_operator2', v)
),_SimpleBulkMapping(
header=_StringTable.AssetGroupTargetConditionOperator3,
field_to_csv=lambda c: c.target_condition_operator3,
csv_to_field=lambda c, v: setattr(c, 'target_condition_operator3', v)
),
_SimpleBulkMapping(
header=_StringTable.AssetGroupTargetValue1,
field_to_csv=lambda c: c.target_value1,
csv_to_field=lambda c, v: setattr(c, 'target_value1', v)
),
_SimpleBulkMapping(
header=_StringTable.AssetGroupTargetValue2,
field_to_csv=lambda c: c.target_value2,
csv_to_field=lambda c, v: setattr(c, 'target_value2', v)
),_SimpleBulkMapping(
header=_StringTable.AssetGroupTargetValue3,
field_to_csv=lambda c: c.target_value3,
csv_to_field=lambda c, v: setattr(c, 'target_value3', v)
),
]


def process_mappings_from_row_values(self, row_values):
row_values.convert_to_entity(self, BulkAssetGroupUrlTarget._MAPPINGS)

def process_mappings_to_row_values(self, row_values, exclude_readonly_data):
self.convert_to_values(row_values, BulkAssetGroupUrlTarget._MAPPINGS)

def read_additional_data(self, stream_reader):
super(BulkAssetGroupUrlTarget, self).read_additional_data(stream_reader)
1 change: 1 addition & 0 deletions bingads/v13/internal/bulk/bulk_object_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@ class _BulkObjectFactory():
_StringTable.BrandList: _EntityInfo(lambda: BulkBrandList()),
_StringTable.BrandItem: _EntityInfo(lambda: BulkBrandItem()),
_StringTable.CampaignBrandList: _EntityInfo(lambda: BulkCampaignBrandListAssociation()),
_StringTable.AssetGroupUrlTarget: _EntityInfo(lambda: BulkAssetGroupUrlTarget()),
}

ADDITIONAL_OBJECT_MAP = {
Expand Down
11 changes: 11 additions & 0 deletions bingads/v13/internal/bulk/csv_headers.py
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,17 @@ class _CsvHeaders:
_StringTable.BrandUrl,
_StringTable.BrandName,
_StringTable.StatusDateTime,

# Asset Group Url Target
_StringTable.AssetGroupTargetCondition1,
_StringTable.AssetGroupTargetCondition2,
_StringTable.AssetGroupTargetCondition3,
_StringTable.AssetGroupTargetConditionOperator1,
_StringTable.AssetGroupTargetConditionOperator2,
_StringTable.AssetGroupTargetConditionOperator3,
_StringTable.AssetGroupTargetValue1,
_StringTable.AssetGroupTargetValue2,
_StringTable.AssetGroupTargetValue3,
]

@staticmethod
Expand Down
12 changes: 12 additions & 0 deletions bingads/v13/internal/bulk/string_table.py
Original file line number Diff line number Diff line change
Expand Up @@ -720,3 +720,15 @@ class _StringTable:
BrandUrl = "Brand Url"
BrandName = "Brand Name"
StatusDateTime = "Editorial Status Date"

# Asset Group Url Target
AssetGroupUrlTarget = "Asset Group Url Target";
AssetGroupTargetCondition1 = "Asset Group Target Condition 1";
AssetGroupTargetCondition2 = "Asset Group Target Condition 2";
AssetGroupTargetCondition3 = "Asset Group Target Condition 3";
AssetGroupTargetConditionOperator1 = "Asset Group Target Condition Operator 1";
AssetGroupTargetConditionOperator2 = "Asset Group Target Condition Operator 2";
AssetGroupTargetConditionOperator3 = "Asset Group Target Condition Operator 3";
AssetGroupTargetValue1 = "Asset Group Target Value 1";
AssetGroupTargetValue2 = "Asset Group Target Value 2";
AssetGroupTargetValue3 = "Asset Group Target Value 3";
2 changes: 2 additions & 0 deletions bingads/v13/internal/extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -753,6 +753,7 @@ def field_to_csv_ImageAssetLinks(entity):
contract['pinnedField'] = assetLink.PinnedField if hasattr(assetLink, 'PinnedField') else None
contract['targetWidth'] = assetLink.TargetWidth if hasattr(assetLink, 'TargetWidth') else None
contract['targetHeight'] = assetLink.TargetHeight if hasattr(assetLink, 'TargetHeight') else None
contract['subType'] = assetLink.Asset.SubType if hasattr(assetLink.Asset, 'SubType') else None
assetLinkContracts.append(contract)
if len(assetLinkContracts) > 0:
return json.dumps(assetLinkContracts)
Expand All @@ -778,6 +779,7 @@ def csv_to_field_ImageAssetLinks(assetLinks, value):
asset_link.EditorialStatus = assetLinkContract.get('editorialStatus')
asset_link.TargetWidth = assetLinkContract.get('targetWidth')
asset_link.TargetHeight = assetLinkContract.get('targetHeight')
asset_link.Asset.SubType = assetLinkContract.get('subType')
assetLinks.AssetLink.append(asset_link)

def field_to_csv_TextAssetLinks(entity):
Expand Down
66 changes: 66 additions & 0 deletions bingads/v13/proxies/production/adinsight_service.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3165,8 +3165,11 @@
<xs:complexType name="RecommendationBase">
<xs:sequence>
<xs:element minOccurs="0" name="AccountId" type="xs:long" />
<xs:element minOccurs="0" name="AccountName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="AdGroupId" nillable="true" type="xs:long" />
<xs:element minOccurs="0" name="AdGroupName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="CampaignId" nillable="true" type="xs:long" />
<xs:element minOccurs="0" name="CampaignName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="CurrentClicks" type="xs:long" />
<xs:element minOccurs="0" name="CurrentConversions" type="xs:long" />
<xs:element minOccurs="0" name="CurrentCost" type="xs:double" />
Expand Down Expand Up @@ -3206,6 +3209,27 @@
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="RemoveConflictingNegativeKeywordRecommendation">
<xs:annotation>
<xs:appinfo>
<EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">4</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="UseBroadMatchKeywordRecommendation">
<xs:annotation>
<xs:appinfo>
<EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">5</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="ResponsiveSearchAdAssetRecommendation">
<xs:annotation>
<xs:appinfo>
<EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">6</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:element name="RecommendationType" nillable="true" type="tns:RecommendationType" />
Expand Down Expand Up @@ -3246,6 +3270,48 @@
</xs:complexContent>
</xs:complexType>
<xs:element name="ResponsiveSearchAdRecommendation" nillable="true" type="tns:ResponsiveSearchAdRecommendation" />
<xs:complexType name="RemoveConflictingNegativeKeywordRecommendation">
<xs:complexContent mixed="false">
<xs:extension base="tns:RecommendationBase">
<xs:sequence>
<xs:element minOccurs="0" name="NegativeKeyword" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="NegativeKeywordId" type="xs:long" />
<xs:element minOccurs="0" name="NegativeKeywordListName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="NegativeKeywordMatchType" type="xs:int" />
<xs:element minOccurs="0" name="NegativeKeywordSharedListId" nillable="true" type="xs:long" />
<xs:element minOccurs="0" name="Source" nillable="true" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="RemoveConflictingNegativeKeywordRecommendation" nillable="true" type="tns:RemoveConflictingNegativeKeywordRecommendation" />
<xs:complexType name="UseBroadMatchKeywordRecommendation">
<xs:complexContent mixed="false">
<xs:extension base="tns:RecommendationBase">
<xs:sequence>
<xs:element minOccurs="0" name="CurrentMatchType" type="xs:int" />
<xs:element minOccurs="0" name="CurrentStatus" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="Keyword" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="KeywordOrderItemId" type="xs:long" />
<xs:element minOccurs="0" name="SuggestedBid" type="xs:double" />
<xs:element minOccurs="0" name="SuggestedMatchType" type="xs:int" />
<xs:element minOccurs="0" name="SuggestedStatus" nillable="true" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="UseBroadMatchKeywordRecommendation" nillable="true" type="tns:UseBroadMatchKeywordRecommendation" />
<xs:complexType name="ResponsiveSearchAdAssetRecommendation">
<xs:complexContent mixed="false">
<xs:extension base="tns:RecommendationBase">
<xs:sequence>
<xs:element minOccurs="0" name="RecommendedResponsiveSearchAd" nillable="true" type="tns:SuggestedResponsiveSearchAd" />
<xs:element minOccurs="0" name="ResponsiveSearchAdId" type="xs:long" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="ResponsiveSearchAdAssetRecommendation" nillable="true" type="tns:ResponsiveSearchAdAssetRecommendation" />
<xs:element name="GetAudienceFullEstimationRequest">
<xs:complexType>
<xs:sequence>
Expand Down
Loading