Skip to content

Commit d8dced9

Browse files
authored
Merge pull request #306 from BingAds/v13.0.23
v13.0.23
2 parents d5dde35 + 8c685dd commit d8dced9

18 files changed

+3106
-466
lines changed

HISTORY.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
33
Release History
44

5+
13.0.23(2024-11-21)
6+
+++++++++++++++++++++++++
7+
* 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.
8+
* Added bulk mappings for BulkAssetGroupUrlTarget.
9+
510
13.0.21.2(2024-08-19)
611
+++++++++++++++++++++++++
712
* Fix Issue #295: https://github.com/BingAds/BingAds-Python-SDK/issues/295

bingads/manifest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import sys
2-
VERSION = '13.0.21.2'
2+
VERSION = '13.0.23'
33
BULK_FORMAT_VERSION_6 = '6.0'
44
WORKING_NAME = 'BingAdsSDKPython'
55
USER_AGENT = '{0} {1} {2}'.format(WORKING_NAME, VERSION, sys.version_info[0:3])

bingads/v13/bulk/entities/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
from .bulk_asset_group import *
4646
from .bulk_audience_group import *
4747
from .bulk_asset_group_listing_group import *
48+
from .bulk_asset_group_url_target import *
4849
from .bulk_audience_group_asset_group_association import *
4950
from .bulk_campaign_negative_webpage import *
5051
from .bulk_seasonality_adjustment import *
Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
from bingads.service_client import _CAMPAIGN_OBJECT_FACTORY_V13
2+
3+
from bingads.v13.internal.bulk.string_table import _StringTable
4+
from bingads.v13.internal.bulk.entities.single_record_bulk_entity import _SingleRecordBulkEntity
5+
from bingads.v13.internal.bulk.mappings import _SimpleBulkMapping, _ComplexBulkMapping
6+
from bingads.v13.internal.extensions import *
7+
8+
class BulkAssetGroupUrlTarget(_SingleRecordBulkEntity):
9+
""" Represents an asset group url target.
10+
11+
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
12+
in a bulk file.
13+
14+
For more information, see Asset Group at https://go.microsoft.com/fwlink/?linkid=846127.
15+
16+
*See also:*
17+
18+
* :class:`.BulkServiceManager`
19+
* :class:`.BulkOperation`
20+
* :class:`.BulkFileReader`
21+
* :class:`.BulkFileWriter`
22+
"""
23+
24+
def __init__(self, status=None):
25+
super(BulkAssetGroupUrlTarget, self).__init__()
26+
27+
self._status = status
28+
self._id = None
29+
self._asset_group_id = None
30+
self._target_condition1 = None
31+
self._target_condition2 = None
32+
self._target_condition3 = None
33+
self._target_condition_operator1 = None
34+
self._target_condition_operator2 = None
35+
self._target_condition_operator3 = None
36+
self._target_value1 = None
37+
self._target_value2 = None
38+
self._target_value3 = None
39+
40+
@property
41+
def status(self):
42+
return self._status
43+
44+
@status.setter
45+
def status(self, status):
46+
self._status = status
47+
48+
@property
49+
def id(self):
50+
return self._id
51+
52+
@id.setter
53+
def id(self, id):
54+
self._id = id
55+
56+
@property
57+
def asset_group_id(self):
58+
return self._asset_group_id
59+
60+
@asset_group_id.setter
61+
def asset_group_id(self, asset_group_id):
62+
self._asset_group_id = asset_group_id
63+
64+
@property
65+
def target_condition1(self):
66+
return self._target_condition1
67+
68+
@target_condition1.setter
69+
def target_condition1(self, target_condition1):
70+
self._target_condition1 = target_condition1
71+
72+
@property
73+
def target_condition2(self):
74+
return self._target_condition2
75+
76+
@target_condition2.setter
77+
def target_condition2(self, target_condition2):
78+
self._target_condition2 = target_condition2
79+
80+
@property
81+
def target_condition3(self):
82+
return self._target_condition3
83+
84+
@target_condition3.setter
85+
def target_condition3(self, target_condition3):
86+
self._target_condition3 = target_condition3
87+
88+
@property
89+
def target_condition_operator1(self):
90+
return self._target_condition_operator1
91+
92+
@target_condition_operator1.setter
93+
def target_condition_operator1(self, target_condition_operator1):
94+
self._target_condition_operator1 = target_condition_operator1
95+
96+
@property
97+
def target_condition_operator2(self):
98+
return self._target_condition_operator2
99+
100+
@target_condition_operator2.setter
101+
def target_condition_operator2(self, target_condition_operator2):
102+
self._target_condition_operator2 = target_condition_operator2
103+
104+
@property
105+
def target_condition_operator3(self):
106+
return self._target_condition_operator3
107+
108+
@target_condition_operator3.setter
109+
def target_condition_operator3(self, target_condition_operator3):
110+
self._target_condition_operator3 = target_condition_operator3
111+
112+
@property
113+
def target_value1(self):
114+
return self._target_value1
115+
116+
@target_value1.setter
117+
def target_value1(self, target_value1):
118+
self._target_value1 = target_value1
119+
120+
@property
121+
def target_value2(self):
122+
return self._target_value2
123+
124+
@target_value2.setter
125+
def target_value2(self, target_value2):
126+
self._target_value2 = target_value2
127+
128+
@property
129+
def target_value3(self):
130+
return self._target_value3
131+
132+
@target_value3.setter
133+
def target_value3(self, target_value3):
134+
self._target_value3 = target_value3
135+
136+
_MAPPINGS = [
137+
_SimpleBulkMapping(
138+
header=_StringTable.Id,
139+
field_to_csv=lambda c: bulk_str(c.id),
140+
csv_to_field=lambda c, v: setattr(c, 'id', int(v) if v else None)
141+
),
142+
_SimpleBulkMapping(
143+
header=_StringTable.Status,
144+
field_to_csv=lambda c: bulk_str(c.status),
145+
csv_to_field=lambda c, v: setattr(c, 'status', v if v else None)
146+
),
147+
_SimpleBulkMapping(
148+
header=_StringTable.ParentId,
149+
field_to_csv=lambda c: bulk_str(c.asset_group_id),
150+
csv_to_field=lambda c, v: setattr(c, 'asset_group_id', int(v) if v else None)
151+
),
152+
_SimpleBulkMapping(
153+
header=_StringTable.AssetGroupTargetCondition1,
154+
field_to_csv=lambda c: c.target_condition1,
155+
csv_to_field=lambda c, v: setattr(c, 'target_condition1', v)
156+
),
157+
_SimpleBulkMapping(
158+
header=_StringTable.AssetGroupTargetCondition2,
159+
field_to_csv=lambda c: c.target_condition2,
160+
csv_to_field=lambda c, v: setattr(c, 'target_condition2', v)
161+
),
162+
_SimpleBulkMapping(
163+
header=_StringTable.AssetGroupTargetCondition3,
164+
field_to_csv=lambda c: c.target_condition3,
165+
csv_to_field=lambda c, v: setattr(c, 'target_condition3', v)
166+
),
167+
_SimpleBulkMapping(
168+
header=_StringTable.AssetGroupTargetConditionOperator1,
169+
field_to_csv=lambda c: c.target_condition_operator1,
170+
csv_to_field=lambda c, v: setattr(c, 'target_condition_operator1', v)
171+
),
172+
_SimpleBulkMapping(
173+
header=_StringTable.AssetGroupTargetConditionOperator2,
174+
field_to_csv=lambda c: c.target_condition_operator2,
175+
csv_to_field=lambda c, v: setattr(c, 'target_condition_operator2', v)
176+
),_SimpleBulkMapping(
177+
header=_StringTable.AssetGroupTargetConditionOperator3,
178+
field_to_csv=lambda c: c.target_condition_operator3,
179+
csv_to_field=lambda c, v: setattr(c, 'target_condition_operator3', v)
180+
),
181+
_SimpleBulkMapping(
182+
header=_StringTable.AssetGroupTargetValue1,
183+
field_to_csv=lambda c: c.target_value1,
184+
csv_to_field=lambda c, v: setattr(c, 'target_value1', v)
185+
),
186+
_SimpleBulkMapping(
187+
header=_StringTable.AssetGroupTargetValue2,
188+
field_to_csv=lambda c: c.target_value2,
189+
csv_to_field=lambda c, v: setattr(c, 'target_value2', v)
190+
),_SimpleBulkMapping(
191+
header=_StringTable.AssetGroupTargetValue3,
192+
field_to_csv=lambda c: c.target_value3,
193+
csv_to_field=lambda c, v: setattr(c, 'target_value3', v)
194+
),
195+
]
196+
197+
198+
def process_mappings_from_row_values(self, row_values):
199+
row_values.convert_to_entity(self, BulkAssetGroupUrlTarget._MAPPINGS)
200+
201+
def process_mappings_to_row_values(self, row_values, exclude_readonly_data):
202+
self.convert_to_values(row_values, BulkAssetGroupUrlTarget._MAPPINGS)
203+
204+
def read_additional_data(self, stream_reader):
205+
super(BulkAssetGroupUrlTarget, self).read_additional_data(stream_reader)

bingads/v13/internal/bulk/bulk_object_factory.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ class _BulkObjectFactory():
232232
_StringTable.BrandList: _EntityInfo(lambda: BulkBrandList()),
233233
_StringTable.BrandItem: _EntityInfo(lambda: BulkBrandItem()),
234234
_StringTable.CampaignBrandList: _EntityInfo(lambda: BulkCampaignBrandListAssociation()),
235+
_StringTable.AssetGroupUrlTarget: _EntityInfo(lambda: BulkAssetGroupUrlTarget()),
235236
}
236237

237238
ADDITIONAL_OBJECT_MAP = {

bingads/v13/internal/bulk/csv_headers.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,17 @@ class _CsvHeaders:
517517
_StringTable.BrandUrl,
518518
_StringTable.BrandName,
519519
_StringTable.StatusDateTime,
520+
521+
# Asset Group Url Target
522+
_StringTable.AssetGroupTargetCondition1,
523+
_StringTable.AssetGroupTargetCondition2,
524+
_StringTable.AssetGroupTargetCondition3,
525+
_StringTable.AssetGroupTargetConditionOperator1,
526+
_StringTable.AssetGroupTargetConditionOperator2,
527+
_StringTable.AssetGroupTargetConditionOperator3,
528+
_StringTable.AssetGroupTargetValue1,
529+
_StringTable.AssetGroupTargetValue2,
530+
_StringTable.AssetGroupTargetValue3,
520531
]
521532

522533
@staticmethod

bingads/v13/internal/bulk/string_table.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,3 +720,15 @@ class _StringTable:
720720
BrandUrl = "Brand Url"
721721
BrandName = "Brand Name"
722722
StatusDateTime = "Editorial Status Date"
723+
724+
# Asset Group Url Target
725+
AssetGroupUrlTarget = "Asset Group Url Target";
726+
AssetGroupTargetCondition1 = "Asset Group Target Condition 1";
727+
AssetGroupTargetCondition2 = "Asset Group Target Condition 2";
728+
AssetGroupTargetCondition3 = "Asset Group Target Condition 3";
729+
AssetGroupTargetConditionOperator1 = "Asset Group Target Condition Operator 1";
730+
AssetGroupTargetConditionOperator2 = "Asset Group Target Condition Operator 2";
731+
AssetGroupTargetConditionOperator3 = "Asset Group Target Condition Operator 3";
732+
AssetGroupTargetValue1 = "Asset Group Target Value 1";
733+
AssetGroupTargetValue2 = "Asset Group Target Value 2";
734+
AssetGroupTargetValue3 = "Asset Group Target Value 3";

bingads/v13/internal/extensions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,7 @@ def field_to_csv_ImageAssetLinks(entity):
753753
contract['pinnedField'] = assetLink.PinnedField if hasattr(assetLink, 'PinnedField') else None
754754
contract['targetWidth'] = assetLink.TargetWidth if hasattr(assetLink, 'TargetWidth') else None
755755
contract['targetHeight'] = assetLink.TargetHeight if hasattr(assetLink, 'TargetHeight') else None
756+
contract['subType'] = assetLink.Asset.SubType if hasattr(assetLink.Asset, 'SubType') else None
756757
assetLinkContracts.append(contract)
757758
if len(assetLinkContracts) > 0:
758759
return json.dumps(assetLinkContracts)
@@ -778,6 +779,7 @@ def csv_to_field_ImageAssetLinks(assetLinks, value):
778779
asset_link.EditorialStatus = assetLinkContract.get('editorialStatus')
779780
asset_link.TargetWidth = assetLinkContract.get('targetWidth')
780781
asset_link.TargetHeight = assetLinkContract.get('targetHeight')
782+
asset_link.Asset.SubType = assetLinkContract.get('subType')
781783
assetLinks.AssetLink.append(asset_link)
782784

783785
def field_to_csv_TextAssetLinks(entity):

bingads/v13/proxies/production/adinsight_service.xml

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3165,8 +3165,11 @@
31653165
<xs:complexType name="RecommendationBase">
31663166
<xs:sequence>
31673167
<xs:element minOccurs="0" name="AccountId" type="xs:long" />
3168+
<xs:element minOccurs="0" name="AccountName" nillable="true" type="xs:string" />
31683169
<xs:element minOccurs="0" name="AdGroupId" nillable="true" type="xs:long" />
3170+
<xs:element minOccurs="0" name="AdGroupName" nillable="true" type="xs:string" />
31693171
<xs:element minOccurs="0" name="CampaignId" nillable="true" type="xs:long" />
3172+
<xs:element minOccurs="0" name="CampaignName" nillable="true" type="xs:string" />
31703173
<xs:element minOccurs="0" name="CurrentClicks" type="xs:long" />
31713174
<xs:element minOccurs="0" name="CurrentConversions" type="xs:long" />
31723175
<xs:element minOccurs="0" name="CurrentCost" type="xs:double" />
@@ -3206,6 +3209,27 @@
32063209
</xs:appinfo>
32073210
</xs:annotation>
32083211
</xs:enumeration>
3212+
<xs:enumeration value="RemoveConflictingNegativeKeywordRecommendation">
3213+
<xs:annotation>
3214+
<xs:appinfo>
3215+
<EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">4</EnumerationValue>
3216+
</xs:appinfo>
3217+
</xs:annotation>
3218+
</xs:enumeration>
3219+
<xs:enumeration value="UseBroadMatchKeywordRecommendation">
3220+
<xs:annotation>
3221+
<xs:appinfo>
3222+
<EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">5</EnumerationValue>
3223+
</xs:appinfo>
3224+
</xs:annotation>
3225+
</xs:enumeration>
3226+
<xs:enumeration value="ResponsiveSearchAdAssetRecommendation">
3227+
<xs:annotation>
3228+
<xs:appinfo>
3229+
<EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">6</EnumerationValue>
3230+
</xs:appinfo>
3231+
</xs:annotation>
3232+
</xs:enumeration>
32093233
</xs:restriction>
32103234
</xs:simpleType>
32113235
<xs:element name="RecommendationType" nillable="true" type="tns:RecommendationType" />
@@ -3246,6 +3270,48 @@
32463270
</xs:complexContent>
32473271
</xs:complexType>
32483272
<xs:element name="ResponsiveSearchAdRecommendation" nillable="true" type="tns:ResponsiveSearchAdRecommendation" />
3273+
<xs:complexType name="RemoveConflictingNegativeKeywordRecommendation">
3274+
<xs:complexContent mixed="false">
3275+
<xs:extension base="tns:RecommendationBase">
3276+
<xs:sequence>
3277+
<xs:element minOccurs="0" name="NegativeKeyword" nillable="true" type="xs:string" />
3278+
<xs:element minOccurs="0" name="NegativeKeywordId" type="xs:long" />
3279+
<xs:element minOccurs="0" name="NegativeKeywordListName" nillable="true" type="xs:string" />
3280+
<xs:element minOccurs="0" name="NegativeKeywordMatchType" type="xs:int" />
3281+
<xs:element minOccurs="0" name="NegativeKeywordSharedListId" nillable="true" type="xs:long" />
3282+
<xs:element minOccurs="0" name="Source" nillable="true" type="xs:string" />
3283+
</xs:sequence>
3284+
</xs:extension>
3285+
</xs:complexContent>
3286+
</xs:complexType>
3287+
<xs:element name="RemoveConflictingNegativeKeywordRecommendation" nillable="true" type="tns:RemoveConflictingNegativeKeywordRecommendation" />
3288+
<xs:complexType name="UseBroadMatchKeywordRecommendation">
3289+
<xs:complexContent mixed="false">
3290+
<xs:extension base="tns:RecommendationBase">
3291+
<xs:sequence>
3292+
<xs:element minOccurs="0" name="CurrentMatchType" type="xs:int" />
3293+
<xs:element minOccurs="0" name="CurrentStatus" nillable="true" type="xs:string" />
3294+
<xs:element minOccurs="0" name="Keyword" nillable="true" type="xs:string" />
3295+
<xs:element minOccurs="0" name="KeywordOrderItemId" type="xs:long" />
3296+
<xs:element minOccurs="0" name="SuggestedBid" type="xs:double" />
3297+
<xs:element minOccurs="0" name="SuggestedMatchType" type="xs:int" />
3298+
<xs:element minOccurs="0" name="SuggestedStatus" nillable="true" type="xs:string" />
3299+
</xs:sequence>
3300+
</xs:extension>
3301+
</xs:complexContent>
3302+
</xs:complexType>
3303+
<xs:element name="UseBroadMatchKeywordRecommendation" nillable="true" type="tns:UseBroadMatchKeywordRecommendation" />
3304+
<xs:complexType name="ResponsiveSearchAdAssetRecommendation">
3305+
<xs:complexContent mixed="false">
3306+
<xs:extension base="tns:RecommendationBase">
3307+
<xs:sequence>
3308+
<xs:element minOccurs="0" name="RecommendedResponsiveSearchAd" nillable="true" type="tns:SuggestedResponsiveSearchAd" />
3309+
<xs:element minOccurs="0" name="ResponsiveSearchAdId" type="xs:long" />
3310+
</xs:sequence>
3311+
</xs:extension>
3312+
</xs:complexContent>
3313+
</xs:complexType>
3314+
<xs:element name="ResponsiveSearchAdAssetRecommendation" nillable="true" type="tns:ResponsiveSearchAdAssetRecommendation" />
32493315
<xs:element name="GetAudienceFullEstimationRequest">
32503316
<xs:complexType>
32513317
<xs:sequence>

0 commit comments

Comments
 (0)