Skip to content

Commit 965070f

Browse files
committed
update to version 11.12.7
1 parent 60d36a5 commit 965070f

File tree

13 files changed

+149
-87
lines changed

13 files changed

+149
-87
lines changed

HISTORY.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
.. :changelog:
22
33
Release History
4+
-----------
5+
11.12.7(2018-10-10)
6+
+++++++++++++++++++
7+
*Update service proxies to reflect recent interface changes.
8+
*Map TitlePart3 and TextPart2 to BulkExpandedTextAd.
9+
410
-----------
511
11.12.6(2018-09-10)
612
+++++++++++++++++++

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 = '11.12.6'
2+
VERSION = '11.12.7'
33
BULK_FORMAT_VERSION_5 = '5.0'
44
BULK_FORMAT_VERSION_6 = '6.0'
55
WORKING_NAME = 'BingAdsSDKPython'

bingads/v11/proxies/campaign_management_service.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9959,7 +9959,7 @@
99599959
</wsdl:binding>
99609960
<wsdl:service name="CampaignManagementService">
99619961
<wsdl:port name="BasicHttpBinding_ICampaignManagementService" binding="tns:BasicHttpBinding_ICampaignManagementService">
9962-
<soap:address location="https://campaign.api.sandbox.bingads.microsoft.com/Api/Advertiser/CampaignManagement/v11/CampaignManagementService.svc" />
9962+
<soap:address location="https://campaign.api.bingads.microsoft.com/Api/Advertiser/CampaignManagement/v11/CampaignManagementService.svc" />
99639963
</wsdl:port>
99649964
</wsdl:service>
99659965
</wsdl:definitions>

bingads/v12/bulk/entities/ad_extensions/common.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ def performance_data(self):
178178
_SimpleBulkMapping(
179179
header=_StringTable.ParentId,
180180
field_to_csv=lambda c: bulk_str(c.ad_extension_id_to_entity_id_association.EntityId),
181-
csv_to_field=lambda c, v: setattr(c.ad_extension_id_to_entity_id_association, 'EntityId', int(v))
181+
csv_to_field=lambda c, v: setattr(c.ad_extension_id_to_entity_id_association, 'EntityId', int(v) if v else None)
182182
),
183183
_SimpleBulkMapping(
184184
header=_StringTable.EditorialStatus,

bingads/v12/bulk/entities/bulk_ads.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,11 @@ def expanded_text_ad(self, expanded_text_ad):
450450
field_to_csv=lambda c: c.expanded_text_ad.Text,
451451
csv_to_field=lambda c, v: setattr(c.expanded_text_ad, 'Text', v)
452452
),
453+
_SimpleBulkMapping(
454+
header=_StringTable.TextPart2,
455+
field_to_csv=lambda c: bulk_optional_str(c.expanded_text_ad.TextPart2),
456+
csv_to_field=lambda c, v: setattr(c.expanded_text_ad, 'TextPart2', v if v else '')
457+
),
453458
_SimpleBulkMapping(
454459
header=_StringTable.TitlePart1,
455460
field_to_csv=lambda c: c.expanded_text_ad.TitlePart1,
@@ -460,6 +465,11 @@ def expanded_text_ad(self, expanded_text_ad):
460465
field_to_csv=lambda c: c.expanded_text_ad.TitlePart2,
461466
csv_to_field=lambda c, v: setattr(c.expanded_text_ad, 'TitlePart2', v)
462467
),
468+
_SimpleBulkMapping(
469+
header=_StringTable.TitlePart3,
470+
field_to_csv=lambda c: bulk_optional_str(c.expanded_text_ad.TitlePart3),
471+
csv_to_field=lambda c, v: setattr(c.expanded_text_ad, 'TitlePart3', v if v else '')
472+
),
463473
_SimpleBulkMapping(
464474
header=_StringTable.Path1,
465475
field_to_csv=lambda c: bulk_optional_str(c.expanded_text_ad.Path1),

bingads/v12/bulk/entities/bulk_campaign.py

Lines changed: 98 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from bingads.v12.internal.extensions import *
77

88
_ShoppingSetting = type(_CAMPAIGN_OBJECT_FACTORY_V12.create('ShoppingSetting'))
9+
_DsaSetting = type(_CAMPAIGN_OBJECT_FACTORY_V12.create('DynamicSearchAdsSetting'))
910

1011
class BulkCampaign(_SingleRecordBulkEntity):
1112
""" Represents a campaign that can be read or written in a bulk file.
@@ -93,13 +94,19 @@ def performance_data(self):
9394
return self._performance_data
9495

9596
def _get_shopping_setting(self):
97+
return self._get_setting(_ShoppingSetting, 'ShoppingSetting')
98+
99+
def _get_dsa_setting(self):
100+
return self._get_setting(_DsaSetting, 'DynamicSearchAdsSetting')
101+
102+
def _get_setting(self, setting_type, setting_name):
96103
if not self.campaign.Settings.Setting:
97104
return None
98-
shopping_settings = [setting for setting in self.campaign.Settings.Setting if
99-
isinstance(setting, _ShoppingSetting)]
100-
if len(shopping_settings) != 1:
101-
raise ValueError('Can only have 1 ShoppingSetting in Campaign Settings.')
102-
return shopping_settings[0]
105+
settings = [setting for setting in self.campaign.Settings.Setting if
106+
isinstance(setting, setting_type)]
107+
if len(settings) != 1:
108+
raise ValueError('Can only have 1 ' + setting_name + ' in Campaign Settings.')
109+
return settings[0]
103110

104111
@staticmethod
105112
def _write_campaign_type(c):
@@ -116,10 +123,16 @@ def _read_campaign_type(c, v):
116123
campaign_type = v
117124
c.campaign.CampaignType = [campaign_type]
118125
if campaign_type.lower() == 'shopping' or campaign_type.lower() == 'audience':
119-
c.campaign.Settings = _CAMPAIGN_OBJECT_FACTORY_V12.create('ArrayOfSetting')
120-
shopping_setting = _CAMPAIGN_OBJECT_FACTORY_V12.create('ShoppingSetting')
121-
shopping_setting.Type = 'ShoppingSetting'
122-
c.campaign.Settings.Setting = [shopping_setting]
126+
BulkCampaign._create_campaign_setting(c.campaign, 'ShoppingSetting')
127+
elif campaign_type.lower() == 'dynamicsearchads':
128+
BulkCampaign._create_campaign_setting(c.campaign, 'DynamicSearchAdsSetting')
129+
130+
@staticmethod
131+
def _create_campaign_setting(campaign, setting_type):
132+
campaign.Settings = _CAMPAIGN_OBJECT_FACTORY_V12.create('ArrayOfSetting')
133+
setting = _CAMPAIGN_OBJECT_FACTORY_V12.create(setting_type)
134+
setting.Type = setting_type
135+
campaign.Settings.Setting = [setting]
123136

124137
@staticmethod
125138
def _write_store_id(c):
@@ -208,7 +221,73 @@ def _read_local_inventory_ads_enabled(c, v):
208221
if not shopping_setting:
209222
return None
210223
shopping_setting.LocalInventoryAdsEnabled = v.lower() == 'true' if v else None
224+
225+
@staticmethod
226+
def _read_source(c, v):
227+
if not c.campaign.CampaignType:
228+
return None
229+
campgaign_types = [campaign_type.lower() for campaign_type in c.campaign.CampaignType]
230+
if 'dynamicsearchads' in campgaign_types:
231+
dsa_setting = c._get_dsa_setting()
232+
if not dsa_setting:
233+
return None
234+
dsa_setting.Source = v
235+
236+
@staticmethod
237+
def _write_source(c):
238+
if not c.campaign.CampaignType:
239+
return None
240+
campgaign_types = [campaign_type.lower() for campaign_type in c.campaign.CampaignType]
241+
if 'dynamicsearchads' in campgaign_types:
242+
dsa_setting = c._get_dsa_setting()
243+
if not dsa_setting:
244+
return None
245+
return bulk_str(dsa_setting.Source)
246+
247+
@staticmethod
248+
def _read_domain_language(c, v):
249+
if not c.campaign.CampaignType:
250+
return None
251+
campgaign_types = [campaign_type.lower() for campaign_type in c.campaign.CampaignType]
252+
if 'dynamicsearchads' in campgaign_types:
253+
dsa_setting = c._get_dsa_setting()
254+
if not dsa_setting:
255+
return None
256+
dsa_setting.Language = v
211257

258+
@staticmethod
259+
def _write_domain_language(c):
260+
if not c.campaign.CampaignType:
261+
return None
262+
campgaign_types = [campaign_type.lower() for campaign_type in c.campaign.CampaignType]
263+
if 'dynamicsearchads' in campgaign_types:
264+
dsa_setting = c._get_dsa_setting()
265+
if not dsa_setting:
266+
return None
267+
return bulk_str(dsa_setting.Language)
268+
269+
@staticmethod
270+
def _read_website(c, v):
271+
if not c.campaign.CampaignType:
272+
return None
273+
campgaign_types = [campaign_type.lower() for campaign_type in c.campaign.CampaignType]
274+
if 'dynamicsearchads' in campgaign_types:
275+
dsa_setting = c._get_dsa_setting()
276+
if not dsa_setting:
277+
return None
278+
dsa_setting.DomainName = v
279+
280+
@staticmethod
281+
def _write_website(c):
282+
if not c.campaign.CampaignType:
283+
return None
284+
campgaign_types = [campaign_type.lower() for campaign_type in c.campaign.CampaignType]
285+
if 'dynamicsearchads' in campgaign_types:
286+
dsa_setting = c._get_dsa_setting()
287+
if not dsa_setting:
288+
return None
289+
return bulk_str(dsa_setting.DomainName)
290+
212291
_MAPPINGS = [
213292
_SimpleBulkMapping(
214293
header=_StringTable.CampaignType,
@@ -311,13 +390,19 @@ def _read_local_inventory_ads_enabled(c, v):
311390
),
312391
_SimpleBulkMapping(
313392
header=_StringTable.Website,
314-
field_to_csv=lambda c: field_to_csv_DSAWebsite(c.campaign),
315-
csv_to_field=lambda c, v: csv_to_field_DSAWebsite(c.campaign, v)
393+
field_to_csv=lambda c: BulkCampaign._write_website(c),
394+
csv_to_field=lambda c, v: BulkCampaign._read_website(c, v)
395+
316396
),
317397
_SimpleBulkMapping(
318398
header=_StringTable.DomainLanguage,
319-
field_to_csv=lambda c: field_to_csv_DSADomainLanguage(c.campaign),
320-
csv_to_field=lambda c, v: csv_to_field_DSADomainLanguage(c.campaign, v)
399+
field_to_csv=lambda c: BulkCampaign._write_domain_language(c),
400+
csv_to_field=lambda c, v: BulkCampaign._read_domain_language(c, v)
401+
),
402+
_SimpleBulkMapping(
403+
header=_StringTable.Source,
404+
field_to_csv=lambda c: BulkCampaign._write_source(c),
405+
csv_to_field=lambda c, v: BulkCampaign._read_source(c, v)
321406
),
322407
_SimpleBulkMapping(
323408
header=_StringTable.SubType,

bingads/v12/bulk/entities/bulk_campaign_product_scope.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def _add_product_condition_to_row_values(cls, entity, value):
5454
_SimpleBulkMapping(
5555
header=_StringTable.ParentId,
5656
field_to_csv=lambda c: bulk_str(c.biddable_campaign_criterion.CampaignId),
57-
csv_to_field=lambda c, v: setattr(c.biddable_campaign_criterion, 'CampaignId', int(v))
57+
csv_to_field=lambda c, v: setattr(c.biddable_campaign_criterion, 'CampaignId', int(v) if v else None)
5858
),
5959
_SimpleBulkMapping(
6060
header=_StringTable.Campaign,

bingads/v12/internal/bulk/csv_headers.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class _CsvHeaders:
3535
# Ads
3636
_StringTable.Title,
3737
_StringTable.Text,
38+
_StringTable.TextPart2,
3839
_StringTable.DisplayUrl,
3940
_StringTable.DestinationUrl,
4041
_StringTable.BusinessName,
@@ -281,6 +282,7 @@ class _CsvHeaders:
281282
# Expanded Text Ad
282283
_StringTable.TitlePart1,
283284
_StringTable.TitlePart2,
285+
_StringTable.TitlePart3,
284286
_StringTable.Path1,
285287
_StringTable.Path2,
286288
_StringTable.Domain,

bingads/v12/internal/bulk/string_table.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class _StringTable:
4444
KeywordNegativeKeyword = "Keyword Negative Keyword"
4545
AdGroupNegativeSite = "Ad Group Negative Site"
4646
Text = "Text"
47+
TextPart2="Text Part 2"
4748
Website = "Website"
4849
Target = "Target"
4950
PhysicalIntent = "Physical Intent"
@@ -350,6 +351,7 @@ class _StringTable:
350351
# Expanded Text Ad
351352
TitlePart1 = "Title Part 1"
352353
TitlePart2 = "Title Part 2"
354+
TitlePart3 = "Title Part 3"
353355
Path1 = "Path 1"
354356
Path2 = "Path 2"
355357
Domain = "Domain"

bingads/v12/internal/extensions.py

Lines changed: 0 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -630,74 +630,6 @@ def csv_to_field_BudgetType(entity, value, version=12):
630630
else:
631631
raise ValueError('Unable to parse BudgetType: {0}'.format(value))
632632

633-
634-
def csv_to_field_DSAWebsite(entity, value):
635-
"""
636-
Set Campaign settings Domain Name from bulk value if the campaign type is Dynamic Search Campaign
637-
:param entity: campaign entity
638-
:param value: bulk str value
639-
"""
640-
if not entity.CampaignType or len(entity.CampaignType) == 0 or entity.CampaignType[0] != "DynamicSearchAds":
641-
return
642-
if len(entity.Settings.Setting) > 0 and entity.Settings.Setting[0].Type == 'DynamicSearchAdsSetting':
643-
entity.Settings.Setting[0].DomainName = value
644-
else:
645-
setting = _CAMPAIGN_OBJECT_FACTORY_V12.create('DynamicSearchAdsSetting')
646-
setting.DomainName = value
647-
setting.Type = 'DynamicSearchAdsSetting'
648-
entity.Settings.Setting.append(setting)
649-
650-
651-
def field_to_csv_DSAWebsite(entity):
652-
"""
653-
convert campaign settings Domain Name to bulk str if the campaign is Dynamic Search Campaign
654-
:param entity: campaign entity
655-
:return: bulk str
656-
"""
657-
if entity.CampaignType is not None and (entity.CampaignType == 'DynamicSearchAds' or (
658-
len(entity.CampaignType) != 0 and entity.CampaignType[0] == 'DynamicSearchAds')):
659-
if entity.Settings is None or entity.Settings.Setting is None or len(entity.Settings.Setting) == 0:
660-
return None
661-
setting = entity.Settings.Setting[0]
662-
if isinstance(setting, type(DynamicSearchAdsSetting)):
663-
return setting.DomainName
664-
return None
665-
666-
667-
def csv_to_field_DSADomainLanguage(entity, value):
668-
"""
669-
Set Campaign settings Language from bulk value if the campaign type is Dynamic Search Campaign
670-
:param entity: campaign entity
671-
:param value: bulk str value
672-
"""
673-
if not entity.CampaignType or len(entity.CampaignType) == 0 or entity.CampaignType[0] != "DynamicSearchAds":
674-
return
675-
if len(entity.Settings.Setting) > 0 and entity.Settings.Setting[0].Type == 'DynamicSearchAdsSetting':
676-
entity.Settings.Setting[0].Language = value
677-
else:
678-
setting = _CAMPAIGN_OBJECT_FACTORY_V12.create('DynamicSearchAdsSetting')
679-
setting.Language = value
680-
setting.Type = 'DynamicSearchAdsSetting'
681-
entity.Settings.Setting.append(setting)
682-
683-
684-
def field_to_csv_DSADomainLanguage(entity):
685-
"""
686-
convert campaign settings Language to bulk str if the campaign is Dynamic Search Campaign
687-
:param entity: campaign entity
688-
:return: bulk str
689-
"""
690-
if entity.CampaignType is not None and (entity.CampaignType == 'DynamicSearchAds' or (
691-
len(entity.CampaignType) != 0 and entity.CampaignType[0] == 'DynamicSearchAds')):
692-
if not entity.Settings or not entity.Settings.Setting or len(entity.Settings.Setting) == 0:
693-
return None
694-
setting = entity.Settings.Setting[0]
695-
if isinstance(setting, type(DynamicSearchAdsSetting)):
696-
return setting.Language
697-
698-
return None
699-
700-
701633
def field_to_csv_WebpageParameter_CriterionName(entity):
702634
if entity.Criterion is None or entity.Criterion.Parameter is None or entity.Criterion.Parameter.CriterionName is None:
703635
return None

0 commit comments

Comments
 (0)