From 59ffb9cc4804a0a25fa85b66a1f53c2607d7c228 Mon Sep 17 00:00:00 2001 From: Xinyu Wen Date: Wed, 7 Jun 2023 10:48:25 +0800 Subject: [PATCH 1/3] v13.0.16 --- HISTORY.rst | 7 + README.rst | 5 - bingads/manifest.py | 2 +- bingads/v13/bulk/bulk_operation.py | 7 +- bingads/v13/bulk/bulk_service_manager.py | 7 +- bingads/v13/bulk/entities/__init__.py | 6 + bingads/v13/bulk/entities/bulk_asset_group.py | 179 ++++++++++++++++++ .../bulk_asset_group_listing_group.py | 151 +++++++++++++++ .../v13/bulk/entities/bulk_audience_group.py | 148 +++++++++++++++ ..._audience_group_asset_group_association.py | 108 +++++++++++ bingads/v13/bulk/entities/bulk_campaign.py | 34 ++++ .../bulk_campaign_negative_webpage.py | 14 ++ bingads/v13/bulk/entities/bulk_entity.py | 3 +- .../bulk/entities/bulk_offline_conversion.py | 1 - .../bulk_online_conversion_adjustment.py | 1 - .../v13/bulk/entities/labels/bulk_label.py | 1 - .../labels/bulk_label_associations.py | 1 - bingads/v13/internal/bulk/bulk_object.py | 3 +- .../v13/internal/bulk/bulk_object_factory.py | 5 + bingads/v13/internal/bulk/csv_headers.py | 13 ++ bingads/v13/internal/bulk/csv_reader.py | 17 +- bingads/v13/internal/bulk/csv_writer.py | 16 +- .../bulk/entities/bulk_entity_identifier.py | 5 +- .../bulk/entities/multi_record_bulk_entity.py | 3 +- .../entities/single_record_bulk_entity.py | 4 +- bingads/v13/internal/bulk/mappings.py | 5 +- bingads/v13/internal/bulk/object_reader.py | 7 +- bingads/v13/internal/bulk/row_values.py | 3 - bingads/v13/internal/bulk/string_table.py | 13 ++ bingads/v13/internal/extensions.py | 60 ++++-- bingads/v13/internal/reporting/csv_reader.py | 13 +- bingads/v13/reporting/reporting_operation.py | 6 +- requirements.txt | 3 - setup.py | 4 +- 34 files changed, 749 insertions(+), 106 deletions(-) create mode 100644 bingads/v13/bulk/entities/bulk_asset_group.py create mode 100644 bingads/v13/bulk/entities/bulk_asset_group_listing_group.py create mode 100644 bingads/v13/bulk/entities/bulk_audience_group.py create mode 100644 bingads/v13/bulk/entities/bulk_audience_group_asset_group_association.py create mode 100644 bingads/v13/bulk/entities/bulk_campaign_negative_webpage.py diff --git a/HISTORY.rst b/HISTORY.rst index 701ae506..a769dd13 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,6 +1,13 @@ .. :changelog: Release History +13.0.16(2023-06-02) ++++++++++++++++++++++++++ +* Update Bing Ads API Version 13 service proxies to reflect recent interface changes. For details please see the Bing Ads API Release Notes: https://docs.microsoft.com/en-us/bingads/guides/release-notes. +* Add bulk mappings for performance max campaign i.e., BulkAssetGroup, BulkAssetGroupListingGroup, BulkAudienceGroup, BulkAudienceGroupAssetGroupAssociation, BulkCampaignNegativeWebPage. +* Add mappings for new fields in BulkCampaign: UrlExpansionOptOut. +* Support new bidding scheme: ManualCpaScheme and CostPerSaleBiddingScheme. + 13.0.15(2022-12-23) +++++++++++++++++++++++++ * Update Bing Ads API Version 13 service proxies to reflect recent interface changes. For details please see the Bing Ads API Release Notes: https://docs.microsoft.com/en-us/bingads/guides/release-notes. diff --git a/README.rst b/README.rst index 85b855fb..3ca06a4a 100644 --- a/README.rst +++ b/README.rst @@ -25,8 +25,6 @@ External Dependencies - `suds-community`_ - `requests`_ - - `future`_ - - `six`_ - `enum34`_ .. _Bing Ads Client Libraries: https://docs.microsoft.com/en-us/bingads/guides/client-libraries @@ -35,7 +33,4 @@ External Dependencies .. _suds-community: https://pypi.org/pypi/suds-community/ .. _requests: http://pypi.python.org/pypi/requests -.. _chardet: http://pypi.python.org/pypi/chardet -.. _future: http://pypi.python.org/pypi/future -.. _six: http://pypi.python.org/pypi/six .. _enum34: http://pypi.python.org/pypi/enum34 diff --git a/bingads/manifest.py b/bingads/manifest.py index 831a59ac..0790b948 100644 --- a/bingads/manifest.py +++ b/bingads/manifest.py @@ -1,5 +1,5 @@ import sys -VERSION = '13.0.15' +VERSION = '13.0.16' BULK_FORMAT_VERSION_6 = '6.0' WORKING_NAME = 'BingAdsSDKPython' USER_AGENT = '{0} {1} {2}'.format(WORKING_NAME, VERSION, sys.version_info[0:3]) diff --git a/bingads/v13/bulk/bulk_operation.py b/bingads/v13/bulk/bulk_operation.py index 66fee5b6..dec25288 100644 --- a/bingads/v13/bulk/bulk_operation.py +++ b/bingads/v13/bulk/bulk_operation.py @@ -4,7 +4,6 @@ import requests import zipfile import os -import six import sys import shutil @@ -94,10 +93,8 @@ def download_result_file(self, result_file_directory, result_file_name, decompre zip_file_path = result_file_path if os.path.exists(result_file_path) and overwrite is False: - if six.PY3: - raise FileExistsError('Result file: {0} exists'.format(result_file_path)) - else: - raise OSError('Result file: {0} exists'.format(result_file_path)) + raise FileExistsError('Result file: {0} exists'.format(result_file_path)) + headers = { 'User-Agent': USER_AGENT, } diff --git a/bingads/v13/bulk/bulk_service_manager.py b/bingads/v13/bulk/bulk_service_manager.py index dd5fce38..1f9b33b4 100644 --- a/bingads/v13/bulk/bulk_service_manager.py +++ b/bingads/v13/bulk/bulk_service_manager.py @@ -13,8 +13,6 @@ from bingads.authorization import * from bingads.util import _TimeHelper from bingads.exceptions import TimeoutException -from six import PY2, PY3 - class BulkServiceManager: SYNC_THRESHOLD = 1000 @@ -186,10 +184,7 @@ def bulkupload_entitie_records(self, entity_upload_parameters, tmp_file, progres records = self.service_client.factory.create("ns2:ArrayOfstring") tmp_csv_file = io.open(tmp_file, encoding='utf-8-sig') - if PY3: - records.string = [x.strip() for x in tmp_csv_file.readlines()] - elif PY2: - records.string = [line.encode('utf-8').strip() for line in tmp_csv_file] + records.string = [x.strip() for x in tmp_csv_file.readlines()] try: #print(self.service_client) diff --git a/bingads/v13/bulk/entities/__init__.py b/bingads/v13/bulk/entities/__init__.py index 099aad4b..e466cd25 100644 --- a/bingads/v13/bulk/entities/__init__.py +++ b/bingads/v13/bulk/entities/__init__.py @@ -41,3 +41,9 @@ from .bulk_ad_customizer_attribute_campaign import * from .bulk_ad_customizer_attribute_ad_group import * from .bulk_ad_customizer_attribute_keyword import * + +from .bulk_asset_group import * +from .bulk_audience_group import * +from .bulk_asset_group_listing_group import * +from .bulk_audience_group_asset_group_association import * +from .bulk_campaign_negative_webpage import * diff --git a/bingads/v13/bulk/entities/bulk_asset_group.py b/bingads/v13/bulk/entities/bulk_asset_group.py new file mode 100644 index 00000000..bc056b2f --- /dev/null +++ b/bingads/v13/bulk/entities/bulk_asset_group.py @@ -0,0 +1,179 @@ +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 BulkAssetGroup(_SingleRecordBulkEntity): + """ Represents an asset group. + + This class exposes the property :attr:`asset_group` that can be read and written as fields of the Asset Group 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, campaign_id=None, campaign_name=None, asset_group=None): + super(BulkAssetGroup, self).__init__() + + self._campaign_id = campaign_id + self._campaign_name = campaign_name + self._asset_group = asset_group + + + @property + def campaign_id(self): + """ The identifier of the campaign that contains the asset group. + + Corresponds to the 'Parent Id' field in the bulk file. + + :rtype: int + """ + + return self._campaign_id + + @campaign_id.setter + def campaign_id(self, campaign_id): + self._campaign_id = campaign_id + + @property + def campaign_name(self): + """ The name of the campaign that contains the asset group. + + Corresponds to the 'Campaign' field in the bulk file. + + :rtype: str + """ + + return self._campaign_name + + @campaign_name.setter + def campaign_name(self, campaign_name): + self._campaign_name = campaign_name + + @property + def asset_group(self): + """ The AssetGroup Data Object of the Campaign Management Service. + + A subset of AssetGroup properties are available in the Ad Group record. + For more information, see Ad Group at https://go.microsoft.com/fwlink/?linkid=846127. + """ + return self._asset_group + + @asset_group.setter + def asset_group(self, asset_group): + self._asset_group = asset_group + + _MAPPINGS = [ + _SimpleBulkMapping( + header=_StringTable.Id, + 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.Status, + field_to_csv=lambda c: bulk_str(c.asset_group.Status), + csv_to_field=lambda c, v: setattr(c.asset_group, 'Status', v if v else None) + ), + _SimpleBulkMapping( + header=_StringTable.ParentId, + field_to_csv=lambda c: bulk_str(c.campaign_id), + csv_to_field=lambda c, v: setattr(c, 'campaign_id', int(v) if v else None) + ), + _SimpleBulkMapping( + header=_StringTable.Campaign, + field_to_csv=lambda c: c.campaign_name, + csv_to_field=lambda c, v: setattr(c, 'campaign_name', v) + ), + _SimpleBulkMapping( + header=_StringTable.AssetGroup, + field_to_csv=lambda c: bulk_str(c.asset_group.Name), + csv_to_field=lambda c, v: setattr(c.asset_group, 'Name', v) + ), + _SimpleBulkMapping( + header=_StringTable.StartDate, + field_to_csv=lambda c: bulk_date_str(c.asset_group.StartDate), + csv_to_field=lambda c, v: setattr(c.asset_group, 'StartDate', parse_date(v)) + ), + _SimpleBulkMapping( + header=_StringTable.EndDate, + field_to_csv=lambda c: bulk_date_str(c.asset_group.EndDate), + csv_to_field=lambda c, v: setattr(c.asset_group, 'EndDate', parse_date(v)) + ), + _SimpleBulkMapping( + header=_StringTable.BusinessName, + field_to_csv=lambda c: c.asset_group.BusinessName, + csv_to_field=lambda c, v: setattr(c.asset_group, 'BusinessName', v) + ), + _SimpleBulkMapping( + header=_StringTable.CallToAction, + field_to_csv=lambda c: c.asset_group.CallToAction, + csv_to_field=lambda c, v: setattr(c.asset_group, 'CallToAction', v if v else None) + ), + _SimpleBulkMapping( + header=_StringTable.Descriptions, + field_to_csv=lambda c: field_to_csv_TextAssetLinks(c.asset_group.Descriptions), + csv_to_field=lambda c, v: csv_to_field_TextAssetLinks(c.asset_group.Descriptions ,v) + ), + _SimpleBulkMapping( + header=_StringTable.EditorialStatus, + field_to_csv=lambda c: c.asset_group.EditorialStatus, + csv_to_field=lambda c, v: setattr(c.asset_group, 'EditorialStatus', v if v else None) + ), + _SimpleBulkMapping( + header=_StringTable.FinalMobileUrl, + field_to_csv=lambda c: field_to_csv_Urls(c.asset_group.FinalMobileUrls, c.asset_group.Id), + csv_to_field=lambda c, v: csv_to_field_Urls(c.asset_group.FinalMobileUrls, v) + ), + _SimpleBulkMapping( + header=_StringTable.FinalUrl, + field_to_csv=lambda c: field_to_csv_Urls(c.asset_group.FinalUrls, c.asset_group.Id), + csv_to_field=lambda c, v: csv_to_field_Urls(c.asset_group.FinalUrls, v) + ), + _SimpleBulkMapping( + header=_StringTable.Headlines, + field_to_csv=lambda c: field_to_csv_TextAssetLinks(c.asset_group.Headlines), + csv_to_field=lambda c, v: csv_to_field_TextAssetLinks(c.asset_group.Headlines, v) + ), + _SimpleBulkMapping( + header=_StringTable.Images, + field_to_csv=lambda c: field_to_csv_ImageAssetLinks(c.asset_group.Images), + csv_to_field=lambda c, v: csv_to_field_ImageAssetLinks(c.asset_group.Images, v) + ), + _SimpleBulkMapping( + header=_StringTable.LongHeadlines, + field_to_csv=lambda c: field_to_csv_TextAssetLinks(c.asset_group.LongHeadlines), + csv_to_field=lambda c, v: csv_to_field_TextAssetLinks(c.asset_group.LongHeadlines ,v) + ), + _SimpleBulkMapping( + header=_StringTable.Path1, + field_to_csv=lambda c: bulk_optional_str(c.asset_group.Path1, c.asset_group.Id), + csv_to_field=lambda c, v: setattr(c.asset_group, 'Path1', v) + ), + _SimpleBulkMapping( + header=_StringTable.Path2, + field_to_csv=lambda c: bulk_optional_str(c.asset_group.Path2, c.asset_group.Id), + csv_to_field=lambda c, v: setattr(c.asset_group, 'Path2', v) + ), + ] + + + def process_mappings_from_row_values(self, row_values): + self.asset_group = _CAMPAIGN_OBJECT_FACTORY_V13.create('AssetGroup') + + row_values.convert_to_entity(self, BulkAssetGroup._MAPPINGS) + + def process_mappings_to_row_values(self, row_values, exclude_readonly_data): + self._validate_property_not_null(self._asset_group, 'AssetGroup') + self.convert_to_values(row_values, BulkAssetGroup._MAPPINGS) + + def read_additional_data(self, stream_reader): + super(BulkAssetGroup, self).read_additional_data(stream_reader) diff --git a/bingads/v13/bulk/entities/bulk_asset_group_listing_group.py b/bingads/v13/bulk/entities/bulk_asset_group_listing_group.py new file mode 100644 index 00000000..7aa9af71 --- /dev/null +++ b/bingads/v13/bulk/entities/bulk_asset_group_listing_group.py @@ -0,0 +1,151 @@ +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 BulkAssetGroupListingGroup(_SingleRecordBulkEntity): + """ Represents an asset group listing group. + + This class exposes the property :attr:`asset_group_listing_group` that can be read and written as fields of the Asset Group Listing Group 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, asset_group_listing_group=None): + super(BulkAssetGroupListingGroup, self).__init__() + + self._status = status + self._asset_group_listing_group = asset_group_listing_group + self._asset_group_name = None + self._campaign_name = None + + @property + def status(self): + return self._status + + @status.setter + def status(self, status): + self._status = status + + @property + def asset_group_name(self): + return self._asset_group_name + + @asset_group_name.setter + def asset_group_name(self, asset_group_name): + self._asset_group_name = asset_group_name + + @property + def campaign_name(self): + return self._campaign_name + + @campaign_name.setter + def campaign_name(self, campaign_name): + self._campaign_name = campaign_name + + @property + def asset_group_listing_group(self): + """ The AssetGroupListingGroup Data Object of the Campaign Management Service. + + A subset of AssetGroupListingGroup properties are available in the Ad Group record. + For more information, see Ad Group at https://go.microsoft.com/fwlink/?linkid=846127. + """ + return self._asset_group_listing_group + + @asset_group_listing_group.setter + def asset_group_listing_group(self, asset_group_listing_group): + self._asset_group_listing_group = asset_group_listing_group + + @classmethod + def _get_condition_operand(cls, entity): + if entity.asset_group_listing_group is not None and \ + hasattr(entity.asset_group_listing_group, 'Dimension') and \ + entity.asset_group_listing_group.Dimension is not None and \ + hasattr(entity.asset_group_listing_group.Dimension, 'Operand'): + return entity.asset_group_listing_group.Dimension.Operand + return None + + @classmethod + def _get_condition_attribute(cls, entity): + if entity.asset_group_listing_group is not None and \ + hasattr(entity.asset_group_listing_group, 'Dimension') and \ + entity.asset_group_listing_group.Dimension is not None and \ + hasattr(entity.asset_group_listing_group.Dimension, 'Attribute'): + return entity.asset_group_listing_group.Dimension.Attribute + return None + + _MAPPINGS = [ + _SimpleBulkMapping( + header=_StringTable.Id, + field_to_csv=lambda c: bulk_str(c.asset_group_listing_group.Id), + csv_to_field=lambda c, v: setattr(c.asset_group_listing_group, '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_listing_group.AssetGroupId), + csv_to_field=lambda c, v: setattr(c.asset_group_listing_group, 'AssetGroupId', int(v) if v else None) + ), + _SimpleBulkMapping( + header=_StringTable.AssetGroup, + field_to_csv=lambda c: c.asset_group_name, + csv_to_field=lambda c, v: setattr(c, 'asset_group_name', v) + ), + _SimpleBulkMapping( + header=_StringTable.Campaign, + field_to_csv=lambda c: c.campaign_name, + csv_to_field=lambda c, v: setattr(c, 'campaign_name', v) + ), + _SimpleBulkMapping( + header=_StringTable.IsExcluded, + field_to_csv=lambda c: bulk_str(c.asset_group_listing_group.IsExcluded), + csv_to_field=lambda c, v: setattr(c.asset_group_listing_group, 'IsExcluded', parse_bool(v)) + ), + _SimpleBulkMapping( + header=_StringTable.ParentListingGroupId, + field_to_csv=lambda c: bulk_str(c.asset_group_listing_group.ParentListingGroupId), + csv_to_field=lambda c, v: setattr(c.asset_group_listing_group, 'ParentListingGroupId', int(v) if v else None) + ), + _SimpleBulkMapping( + header=_StringTable.SubType, + field_to_csv=lambda c: bulk_str(c.asset_group_listing_group.AssetGroupListingType), + csv_to_field=lambda c, v: setattr(c.asset_group_listing_group, 'AssetGroupListingType', v if v else None) + ), + _SimpleBulkMapping( + _StringTable.ProductCondition1, + field_to_csv=lambda c: BulkAssetGroupListingGroup._get_condition_operand(c), + csv_to_field=lambda c, v: setattr(c.asset_group_listing_group.Dimension, 'Operand', v) + ), + _SimpleBulkMapping( + _StringTable.ProductValue1, + field_to_csv=lambda c: BulkAssetGroupListingGroup._get_condition_attribute(c), + csv_to_field=lambda c, v: setattr(c.asset_group_listing_group.Dimension, 'Attribute', v) + ), + ] + + + def process_mappings_from_row_values(self, row_values): + self.asset_group_listing_group = _CAMPAIGN_OBJECT_FACTORY_V13.create('AssetGroupListingGroup') + + row_values.convert_to_entity(self, BulkAssetGroupListingGroup._MAPPINGS) + + def process_mappings_to_row_values(self, row_values, exclude_readonly_data): + self._validate_property_not_null(self._asset_group_listing_group, 'AssetGroupListingGroup') + self.convert_to_values(row_values, BulkAssetGroupListingGroup._MAPPINGS) + + def read_additional_data(self, stream_reader): + super(BulkAssetGroupListingGroup, self).read_additional_data(stream_reader) diff --git a/bingads/v13/bulk/entities/bulk_audience_group.py b/bingads/v13/bulk/entities/bulk_audience_group.py new file mode 100644 index 00000000..dcdd9b4c --- /dev/null +++ b/bingads/v13/bulk/entities/bulk_audience_group.py @@ -0,0 +1,148 @@ +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 BulkAudienceGroup(_SingleRecordBulkEntity): + """ Represents an audience group. + + This class exposes the property :attr:`audience_group` that can be read and written as fields of the Audience Group record + in a bulk file. + + For more information, see Audience Group at https://go.microsoft.com/fwlink/?linkid=846127. + + *See also:* + + * :class:`.BulkServiceManager` + * :class:`.BulkOperation` + * :class:`.BulkFileReader` + * :class:`.BulkFileWriter` + """ + + def __init__(self, account_id=None, status=None, audience_group=None, audience_ids=None): + super(BulkAudienceGroup, self).__init__() + + self._account_id = account_id + self._audience_group = audience_group + self._status = status + self._audience_ids = audience_ids + self._age_ranges = None + self._gender_types = None + + @property + def status(self): + return self._status + + @status.setter + def status(self, status): + self._status = status + + @property + def audience_ids(self): + return self._audience_ids + + @audience_ids.setter + def audience_ids(self, audience_ids): + self._audience_ids = audience_ids + + @property + def age_ranges(self): + return self._age_ranges + + @age_ranges.setter + def age_ranges(self, age_ranges): + self._age_ranges = age_ranges + + @property + def gender_types(self): + return self._gender_types + + @gender_types.setter + def gender_types(self, gender_types): + self._gender_types = gender_types + + @property + def account_id(self): + """ The identifier of the account that contains the audience group. + + Corresponds to the 'Parent Id' field in the bulk file. + + :rtype: int + """ + + return self._account_id + + @account_id.setter + def account_id(self, account_id): + self._account_id = account_id + + @property + def audience_group(self): + """ The AudienceGroup Data Object of the Campaign Management Service. + + A subset of AudienceGroup properties are available in the Audience Group record. + For more information, see Ad Group at https://go.microsoft.com/fwlink/?linkid=846127. + """ + return self._audience_group + + @audience_group.setter + def audience_group(self, audience_group): + self._audience_group = audience_group + + _MAPPINGS = [ + _SimpleBulkMapping( + header=_StringTable.Id, + field_to_csv=lambda c: bulk_str(c.audience_group.Id), + csv_to_field=lambda c, v: setattr(c.audience_group, '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.account_id), + csv_to_field=lambda c, v: setattr(c, 'account_id', int(v) if v else None) + ), + _SimpleBulkMapping( + header=_StringTable.AudienceGroupName, + field_to_csv=lambda c: c.audience_group.Name, + csv_to_field=lambda c, v: setattr(c.audience_group, 'Name', v) + ), + _SimpleBulkMapping( + header=_StringTable.Audiences, + field_to_csv=lambda c: field_to_csv_AudienceIds(c), + csv_to_field=lambda c, v: csv_to_field_AudienceIds(c, v) + ), + _SimpleBulkMapping( + header=_StringTable.AgeRanges, + field_to_csv=lambda c: field_to_csv_AgeRanges(c), + csv_to_field=lambda c, v: csv_to_field_AgeRanges(c, v) + ), + _SimpleBulkMapping( + header=_StringTable.GenderTypes, + field_to_csv=lambda c: field_to_csv_GenderTypes(c), + csv_to_field=lambda c, v: csv_to_field_GenderTypes(c, v) + ), + _SimpleBulkMapping( + header=_StringTable.Description, + field_to_csv=lambda c: bulk_str(c.audience_group.Description), + csv_to_field=lambda c, v: setattr(c.audience_group, 'Description', v) + ), + ] + + + def process_mappings_from_row_values(self, row_values): + self.audience_group = _CAMPAIGN_OBJECT_FACTORY_V13.create('AudienceGroup') + + row_values.convert_to_entity(self, BulkAudienceGroup._MAPPINGS) + + def process_mappings_to_row_values(self, row_values, exclude_readonly_data): + self._validate_property_not_null(self._audience_group, 'AudienceGroup') + self.convert_to_values(row_values, BulkAudienceGroup._MAPPINGS) + + def read_additional_data(self, stream_reader): + super(BulkAudienceGroup, self).read_additional_data(stream_reader) diff --git a/bingads/v13/bulk/entities/bulk_audience_group_asset_group_association.py b/bingads/v13/bulk/entities/bulk_audience_group_asset_group_association.py new file mode 100644 index 00000000..95e5af7c --- /dev/null +++ b/bingads/v13/bulk/entities/bulk_audience_group_asset_group_association.py @@ -0,0 +1,108 @@ +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 BulkAudienceGroupAssetGroupAssociation(_SingleRecordBulkEntity): + """ Represents an audience group asset group association. + + This class exposes the property :attr:`audience_group_asset_group_association` that can be read and written as fields of the audience group asset group association record + in a bulk file. + + For more information, see audience group asset group association at https://go.microsoft.com/fwlink/?linkid=846127. + + *See also:* + + * :class:`.BulkServiceManager` + * :class:`.BulkOperation` + * :class:`.BulkFileReader` + * :class:`.BulkFileWriter` + """ + + def __init__(self, status=None, audience_group_asset_group_association=None): + super(BulkAudienceGroupAssetGroupAssociation, self).__init__() + + self._status = status + self._audience_group_asset_group_association = audience_group_asset_group_association + self._asset_group_name = None + self._campaign_name = None + + @property + def status(self): + return self._status + + @status.setter + def status(self, status): + self._status = status + + @property + def asset_group_name(self): + return self._asset_group_name + + @asset_group_name.setter + def asset_group_name(self, asset_group_name): + self._asset_group_name = asset_group_name + + @property + def campaign_name(self): + return self._campaign_name + + @campaign_name.setter + def campaign_name(self, campaign_name): + self._campaign_name = campaign_name + + @property + def audience_group_asset_group_association(self): + """ The AudienceGroupAssetGroupAssociation Data Object of the Campaign Management Service. + + A subset of AudienceGroupAssetGroupAssociation properties are available in the Ad Group record. + For more information, see Ad Group at https://go.microsoft.com/fwlink/?linkid=846127. + """ + return self._audience_group_asset_group_association + + @audience_group_asset_group_association.setter + def audience_group_asset_group_association(self, audience_group_asset_group_association): + self._audience_group_asset_group_association = audience_group_asset_group_association + + _MAPPINGS = [ + _SimpleBulkMapping( + header=_StringTable.Id, + field_to_csv=lambda c: bulk_str(c.audience_group_asset_group_association.AudienceGroupId), + csv_to_field=lambda c, v: setattr(c.audience_group_asset_group_association, 'AudienceGroupId', 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.audience_group_asset_group_association.AssetGroupId), + csv_to_field=lambda c, v: setattr(c.audience_group_asset_group_association, 'AssetGroupId', int(v) if v else None) + ), + _SimpleBulkMapping( + header=_StringTable.AssetGroup, + field_to_csv=lambda c: c.asset_group_name, + csv_to_field=lambda c, v: setattr(c, 'asset_group_name', v) + ), + _SimpleBulkMapping( + header=_StringTable.Campaign, + field_to_csv=lambda c: c.campaign_name, + csv_to_field=lambda c, v: setattr(c, 'campaign_name', v) + ), + ] + + + def process_mappings_from_row_values(self, row_values): + self.audience_group_asset_group_association = _CAMPAIGN_OBJECT_FACTORY_V13.create('AudienceGroupAssetGroupAssociation') + + row_values.convert_to_entity(self, BulkAudienceGroupAssetGroupAssociation._MAPPINGS) + + def process_mappings_to_row_values(self, row_values, exclude_readonly_data): + self._validate_property_not_null(self._audience_group_asset_group_association, 'AudienceGroupAssetGroupAssociation') + self.convert_to_values(row_values, BulkAudienceGroupAssetGroupAssociation._MAPPINGS) + + def read_additional_data(self, stream_reader): + super(BulkAudienceGroupAssetGroupAssociation, self).read_additional_data(stream_reader) diff --git a/bingads/v13/bulk/entities/bulk_campaign.py b/bingads/v13/bulk/entities/bulk_campaign.py index f55c36b8..c5e3ef3c 100644 --- a/bingads/v13/bulk/entities/bulk_campaign.py +++ b/bingads/v13/bulk/entities/bulk_campaign.py @@ -11,6 +11,7 @@ _DsaSetting = type(_CAMPAIGN_OBJECT_FACTORY_V13.create('DynamicSearchAdsSetting')) _DisclaimerSetting = type(_CAMPAIGN_OBJECT_FACTORY_V13.create('DisclaimerSetting')) _VerifiedTrackingSetting = type(_CAMPAIGN_OBJECT_FACTORY_V13.create('VerifiedTrackingSetting')) +_PerformanceMaxSetting = type(_CAMPAIGN_OBJECT_FACTORY_V13.create('PerformanceMaxSetting')) class BulkCampaign(_SingleRecordBulkEntity): """ Represents a campaign that can be read or written in a bulk file. @@ -136,6 +137,9 @@ def _get_disclaimer_setting(self): def _get_verified_tracking_setting(self): return self._get_setting(_VerifiedTrackingSetting, 'VerifiedTrackingSetting') + def _get_performance_max_setting(self): + return self._get_setting(_PerformanceMaxSetting, 'PerformanceMaxSetting') + def _get_setting(self, setting_type, setting_name): if not self.campaign.Settings.Setting: return None @@ -171,6 +175,9 @@ def _read_campaign_type(c, v): if campaign_type.lower() == 'dynamicsearchads' or campaign_type.lower() == 'search': BulkCampaign._create_campaign_setting(c.campaign, 'DynamicSearchAdsSetting') BulkCampaign._create_campaign_setting(c.campaign, 'DisclaimerSetting') + if campaign_type.lower() == 'performancemax': + BulkCampaign._create_campaign_setting(c.campaign, 'PerformanceMaxSetting') + BulkCampaign._create_campaign_setting(c.campaign, 'ShoppingSetting') @staticmethod def _create_campaign_setting(campaign, setting_type): @@ -181,6 +188,28 @@ def _create_campaign_setting(campaign, setting_type): setting.Type = setting_type campaign.Settings.Setting.append(setting) + @staticmethod + def _write_final_url_expansion_opt_out(c): + if not c.campaign.CampaignType: + return None + campgaign_types = [campaign_type.lower() for campaign_type in c.campaign.CampaignType] + if 'performancemax' in campgaign_types: + performance_max_setting = c._get_performance_max_setting() + if not performance_max_setting: + return None + return bulk_str(performance_max_setting.FinalUrlExpansionOptOut) + + @staticmethod + def _read_final_url_expansion_opt_out(c, v): + if not c.campaign.CampaignType: + return None + campgaign_types = [campaign_type.lower() for campaign_type in c.campaign.CampaignType] + if 'performancemax' in campgaign_types: + performance_max_setting = c._get_performance_max_setting() + if not performance_max_setting: + return None + performance_max_setting.FinalUrlExpansionOptOut = parse_bool(v) + @staticmethod def _write_store_id(c): if not c.campaign.CampaignType: @@ -461,6 +490,11 @@ def _write_website(c): int(v) if v else None ) ), + _SimpleBulkMapping( + header=_StringTable.FinalUrlExpansionOptOut, + field_to_csv=lambda c: BulkCampaign._write_final_url_expansion_opt_out(c), + csv_to_field=lambda c, v: BulkCampaign._read_final_url_expansion_opt_out(c, v) + ), _SimpleBulkMapping( header=_StringTable.MerchantCenterId, field_to_csv=lambda c: BulkCampaign._write_store_id(c), diff --git a/bingads/v13/bulk/entities/bulk_campaign_negative_webpage.py b/bingads/v13/bulk/entities/bulk_campaign_negative_webpage.py new file mode 100644 index 00000000..10e5e0c9 --- /dev/null +++ b/bingads/v13/bulk/entities/bulk_campaign_negative_webpage.py @@ -0,0 +1,14 @@ +from bingads.v13.bulk.entities.bulk_campaign_negative_dynamic_search_ad_target import BulkCampaignNegativeDynamicSearchAdTarget + +class BulkCampaignNegativeWebpage(BulkCampaignNegativeDynamicSearchAdTarget): + """ Represents an Campaign Negative Webpage that can be read or written in a bulk file. + + For more information, see Campaign Negative Webpage at https://go.microsoft.com/fwlink/?linkid=846127. + + *See also:* + + * :class:`.BulkServiceManager` + * :class:`.BulkOperation` + * :class:`.BulkFileReader` + * :class:`.BulkFileWriter` + """ diff --git a/bingads/v13/bulk/entities/bulk_entity.py b/bingads/v13/bulk/entities/bulk_entity.py index 3554257c..c6935c1c 100644 --- a/bingads/v13/bulk/entities/bulk_entity.py +++ b/bingads/v13/bulk/entities/bulk_entity.py @@ -1,12 +1,11 @@ from abc import ABCMeta, abstractproperty -from future.utils import with_metaclass from bingads.internal.error_messages import _ErrorMessages from bingads.v13.internal.bulk.bulk_object import _BulkObject -class BulkEntity(with_metaclass(ABCMeta, _BulkObject)): +class BulkEntity(_BulkObject, metaclass=ABCMeta): """ The abstract base class for all bulk entities that can be read or written in a bulk file. For more information, see Bulk File Schema at https://go.microsoft.com/fwlink/?linkid=846127. diff --git a/bingads/v13/bulk/entities/bulk_offline_conversion.py b/bingads/v13/bulk/entities/bulk_offline_conversion.py index f8c7ce0b..93a74789 100644 --- a/bingads/v13/bulk/entities/bulk_offline_conversion.py +++ b/bingads/v13/bulk/entities/bulk_offline_conversion.py @@ -1,4 +1,3 @@ -from __future__ import print_function 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 diff --git a/bingads/v13/bulk/entities/bulk_online_conversion_adjustment.py b/bingads/v13/bulk/entities/bulk_online_conversion_adjustment.py index 7161a172..bbe59a85 100644 --- a/bingads/v13/bulk/entities/bulk_online_conversion_adjustment.py +++ b/bingads/v13/bulk/entities/bulk_online_conversion_adjustment.py @@ -1,4 +1,3 @@ -from __future__ import print_function 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 diff --git a/bingads/v13/bulk/entities/labels/bulk_label.py b/bingads/v13/bulk/entities/labels/bulk_label.py index 9779af3d..81a8c0eb 100644 --- a/bingads/v13/bulk/entities/labels/bulk_label.py +++ b/bingads/v13/bulk/entities/labels/bulk_label.py @@ -1,4 +1,3 @@ -from __future__ import print_function 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 diff --git a/bingads/v13/bulk/entities/labels/bulk_label_associations.py b/bingads/v13/bulk/entities/labels/bulk_label_associations.py index 71594215..709e93f6 100644 --- a/bingads/v13/bulk/entities/labels/bulk_label_associations.py +++ b/bingads/v13/bulk/entities/labels/bulk_label_associations.py @@ -1,4 +1,3 @@ -from __future__ import print_function 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 diff --git a/bingads/v13/internal/bulk/bulk_object.py b/bingads/v13/internal/bulk/bulk_object.py index 222d8afb..701c08ab 100644 --- a/bingads/v13/internal/bulk/bulk_object.py +++ b/bingads/v13/internal/bulk/bulk_object.py @@ -1,11 +1,10 @@ from abc import ABCMeta, abstractmethod, abstractproperty -from future.utils import with_metaclass from bingads.v13.internal.bulk.mappings import _SimpleBulkMapping from bingads.v13.bulk import EntityWriteException -class _BulkObject(with_metaclass(ABCMeta)): +class _BulkObject(metaclass=ABCMeta): """ The abstract base class for all bulk objects that can be read and written in a file that conforms to the Bing Ad Bulk File Schema. For more information about the Bulk File Schema, see https://go.microsoft.com/fwlink/?linkid=846127. diff --git a/bingads/v13/internal/bulk/bulk_object_factory.py b/bingads/v13/internal/bulk/bulk_object_factory.py index a0bc8df1..94b42ba9 100644 --- a/bingads/v13/internal/bulk/bulk_object_factory.py +++ b/bingads/v13/internal/bulk/bulk_object_factory.py @@ -202,6 +202,11 @@ class _BulkObjectFactory(): _StringTable.AdCustomizerCampaign: _EntityInfo(lambda: BulkCampaignAdCustomizerAttribute()), _StringTable.AdCustomizerAdGroup: _EntityInfo(lambda: BulkAdGroupAdCustomizerAttribute()), _StringTable.AdCustomizerKeyword: _EntityInfo(lambda: BulkKeywordAdCustomizerAttribute()), + _StringTable.AssetGroup: _EntityInfo(lambda: BulkAssetGroup()), + _StringTable.AudienceGroup: _EntityInfo(lambda: BulkAudienceGroup()), + _StringTable.CampaignNegativeWebpage: _EntityInfo(lambda: BulkCampaignNegativeWebpage()), + _StringTable.AssetGroupListingGroup: _EntityInfo(lambda: BulkAssetGroupListingGroup()), + _StringTable.AudienceGroupAssetGroupAssociation: _EntityInfo(lambda: BulkAudienceGroupAssetGroupAssociation()), } ADDITIONAL_OBJECT_MAP = { diff --git a/bingads/v13/internal/bulk/csv_headers.py b/bingads/v13/internal/bulk/csv_headers.py index 172ae379..30ec085a 100644 --- a/bingads/v13/internal/bulk/csv_headers.py +++ b/bingads/v13/internal/bulk/csv_headers.py @@ -42,6 +42,7 @@ class _CsvHeaders: _StringTable.HotelAdGroupType, _StringTable.CommissionRate, _StringTable.PercentCpcBid, + _StringTable.FinalUrlExpansionOptOut, _StringTable.HotelListingGroupType, _StringTable.HotelAttribute, _StringTable.HotelAttributeValue, @@ -452,6 +453,18 @@ class _CsvHeaders: # Hotel Ad _StringTable.MinTargetValue, _StringTable.MaxTargetValue, + + # PMax + _StringTable.Audiences, + _StringTable.AssetGroup, + _StringTable.AudienceGroup, + _StringTable.AgeRanges, + _StringTable.GenderTypes, + _StringTable.ParentListingGroupId, + _StringTable.AudienceGroupName, + _StringTable.CampaignNegativeWebpage, + _StringTable.AssetGroupListingGroup, + _StringTable.AudienceGroupAssetGroupAssociation, ] @staticmethod diff --git a/bingads/v13/internal/bulk/csv_reader.py b/bingads/v13/internal/bulk/csv_reader.py index 83a05302..e6218ec8 100644 --- a/bingads/v13/internal/bulk/csv_reader.py +++ b/bingads/v13/internal/bulk/csv_reader.py @@ -1,6 +1,5 @@ import csv import io -from six import PY2, PY3 class _CsvReader: @@ -18,12 +17,8 @@ def __init__(self, filename, delimiter, encoding='utf-8-sig'): self._csv_file = io.open(self.filename, encoding=self.encoding) - if PY3: - self._csv_reader = csv.reader(self._csv_file, dialect=self._dialect) - elif PY2: - byte_lines = [line.encode('utf-8') for line in self._csv_file] - self._csv_reader = csv.reader(byte_lines, dialect=self._dialect) - + self._csv_reader = csv.reader(self._csv_file, dialect=self._dialect) + def __enter__(self): return self @@ -40,12 +35,8 @@ def close(self): self.__exit__(None, None, None) def next(self): - if PY3: - return next(self._csv_reader) - elif PY2: - row = next(self._csv_reader) - return [unicode(cell, encoding='utf-8') for cell in row] - + return next(self._csv_reader) + @property def filename(self): return self._filename diff --git a/bingads/v13/internal/bulk/csv_writer.py b/bingads/v13/internal/bulk/csv_writer.py index 5d8c4ff4..ce4c5df8 100644 --- a/bingads/v13/internal/bulk/csv_writer.py +++ b/bingads/v13/internal/bulk/csv_writer.py @@ -1,6 +1,5 @@ import csv import codecs -from six import PY2, PY3 class _CsvWriter: @@ -16,11 +15,7 @@ def __init__(self, filename, delimiter): else: raise ValueError('Do not support delimiter: {0}', delimiter) - if PY3: - self._csv_file = codecs.open(filename, mode='w', encoding=self._encoding) - elif PY2: - self._csv_file = open(filename, mode='wb') - self._csv_file.write(codecs.BOM_UTF8) + self._csv_file = codecs.open(filename, mode='w', encoding=self._encoding) self._csv_writer = csv.writer(self._csv_file, dialect=self._dialect) def __enter__(self): @@ -34,14 +29,7 @@ def close(self): self.__exit__(None, None, None) def writerow(self, row): - if PY3: - self._csv_writer.writerow(row) - elif PY2: - def unicode_to_str(value): - if not isinstance(value, unicode): - return value - return value.encode('utf-8') - self._csv_writer.writerow([unicode_to_str(cell) for cell in row]) + self._csv_writer.writerow(row) def writerows(self, rows): for row in rows: diff --git a/bingads/v13/internal/bulk/entities/bulk_entity_identifier.py b/bingads/v13/internal/bulk/entities/bulk_entity_identifier.py index 32d9d975..df086930 100644 --- a/bingads/v13/internal/bulk/entities/bulk_entity_identifier.py +++ b/bingads/v13/internal/bulk/entities/bulk_entity_identifier.py @@ -1,13 +1,10 @@ -from __future__ import absolute_import, division, print_function from abc import ABCMeta, abstractproperty, abstractmethod -from future.utils import with_metaclass - from bingads.v13.bulk.entities import BulkError from bingads.v13.internal.bulk.bulk_object import _BulkObject -class _BulkEntityIdentifier(with_metaclass(ABCMeta, _BulkObject)): +class _BulkEntityIdentifier(_BulkObject, metaclass=ABCMeta): @abstractproperty def is_delete_row(self): diff --git a/bingads/v13/internal/bulk/entities/multi_record_bulk_entity.py b/bingads/v13/internal/bulk/entities/multi_record_bulk_entity.py index f5ea7495..57ac25c7 100644 --- a/bingads/v13/internal/bulk/entities/multi_record_bulk_entity.py +++ b/bingads/v13/internal/bulk/entities/multi_record_bulk_entity.py @@ -1,9 +1,8 @@ from abc import ABCMeta, abstractproperty -from future.utils import with_metaclass from bingads.v13.bulk.entities.bulk_entity import BulkEntity -class _MultiRecordBulkEntity(with_metaclass(ABCMeta, BulkEntity)): +class _MultiRecordBulkEntity(BulkEntity, metaclass=ABCMeta): """ Bulk entity that has its data in multiple records within the bulk file. For more information, see Bulk File Schema at https://go.microsoft.com/fwlink/?linkid=846127. diff --git a/bingads/v13/internal/bulk/entities/single_record_bulk_entity.py b/bingads/v13/internal/bulk/entities/single_record_bulk_entity.py index 7069f1fd..e96c0bb4 100644 --- a/bingads/v13/internal/bulk/entities/single_record_bulk_entity.py +++ b/bingads/v13/internal/bulk/entities/single_record_bulk_entity.py @@ -1,7 +1,5 @@ from abc import ABCMeta, abstractmethod -from future.utils import with_metaclass - from bingads.v13.internal.bulk.string_table import _StringTable from bingads.v13.internal.bulk.mappings import _SimpleBulkMapping from bingads.v13.bulk.entities.bulk_entity import BulkEntity @@ -9,7 +7,7 @@ from bingads.v13.internal.extensions import * -class _SingleRecordBulkEntity(with_metaclass(ABCMeta, BulkEntity)): +class _SingleRecordBulkEntity(BulkEntity,metaclass=ABCMeta): def __init__(self): self._client_id = None self._last_modified_time = None diff --git a/bingads/v13/internal/bulk/mappings.py b/bingads/v13/internal/bulk/mappings.py index 24b4cdc3..5a5cc048 100644 --- a/bingads/v13/internal/bulk/mappings.py +++ b/bingads/v13/internal/bulk/mappings.py @@ -1,8 +1,7 @@ -from future.utils import with_metaclass from abc import ABCMeta, abstractmethod -class _BulkMapping(with_metaclass(ABCMeta)): +class _BulkMapping(metaclass=ABCMeta): @abstractmethod def convert_to_csv(self, entity, row_values): raise NotImplementedError() @@ -12,7 +11,7 @@ def convert_to_entity(self, row_values, entity): raise NotImplementedError() -class _SingleFieldBulkMapping(with_metaclass(ABCMeta, _BulkMapping)): +class _SingleFieldBulkMapping(_BulkMapping, metaclass=ABCMeta): def __init__(self, csv_to_field, filed_to_csv): self._csv_to_field = csv_to_field self._field_to_csv = filed_to_csv diff --git a/bingads/v13/internal/bulk/object_reader.py b/bingads/v13/internal/bulk/object_reader.py index fa3c8b03..59abdcee 100644 --- a/bingads/v13/internal/bulk/object_reader.py +++ b/bingads/v13/internal/bulk/object_reader.py @@ -1,5 +1,4 @@ import csv -from six import PY2, PY3 from .bulk_object_factory import _BulkObjectFactory from .row_values import _RowValues from .csv_reader import _CsvReader @@ -84,11 +83,7 @@ def encoding(self): class _CsvRowsReader: def __init__(self, csv_rows): - if PY3: - self._csv_reader = csv.reader(csv_rows, dialect=csv.excel) - elif PY2: - byte_lines = [line.encode('utf-8') for line in csv_rows] - self._csv_reader = csv.reader(byte_lines, dialect=csv.excel) + self._csv_reader = csv.reader(csv_rows, dialect=csv.excel) def __enter__(self): return self diff --git a/bingads/v13/internal/bulk/row_values.py b/bingads/v13/internal/bulk/row_values.py index 9492926b..52b98701 100644 --- a/bingads/v13/internal/bulk/row_values.py +++ b/bingads/v13/internal/bulk/row_values.py @@ -1,7 +1,6 @@ from .csv_headers import _CsvHeaders from .mappings import _SimpleBulkMapping from bingads.v13.bulk import EntityReadException -import six class _RowValues: @@ -47,8 +46,6 @@ def _create_entity_read_exception(self, entity, mapping, ex): else: message = "Couldn't parse {0} entity: {1}".format(entity_type, str(ex)) message += " See ColumnValues for detailed row information and InnerException for error details." - if six.PY2: - message = message.decode('ascii') message += u' row values: {0}'.format(self) return EntityReadException(message=message, row_values=str(self), inner_exception=ex) diff --git a/bingads/v13/internal/bulk/string_table.py b/bingads/v13/internal/bulk/string_table.py index d42ecd58..a3d824ae 100644 --- a/bingads/v13/internal/bulk/string_table.py +++ b/bingads/v13/internal/bulk/string_table.py @@ -24,6 +24,7 @@ class _StringTable: HotelAdGroupType = "Hotel Ad Group Type" CommissionRate = "Commission Rate" PercentCpcBid = "Percent Cpc Bid" + FinalUrlExpansionOptOut = "Url Expansion Opt Out" HotelListingGroupType = "Ad Group Hotel Listing Group" HotelAttribute = "Hotel Attribute" HotelAttributeValue = "Hotel Attribute Value" @@ -632,3 +633,15 @@ class _StringTable: # Campaign Conversion Goal CampaignConversionGoal = "Campaign Conversion Goal" GoalId = "Goal Id" + + # PMax + AssetGroup = "Asset Group" + AudienceGroup = "Audience Group" + CampaignNegativeWebpage = "Campaign Negative Webpage" + AssetGroupListingGroup = "Asset Group Listing Group" + AudienceGroupAssetGroupAssociation = "Audience Group Asset Group Association" + Audiences = "Audiences" + AudienceGroupName = "Audience Group Name" + AgeRanges = "Age Ranges" + GenderTypes = "Gender Types" + ParentListingGroupId = "Parent Listing Group Id" diff --git a/bingads/v13/internal/extensions.py b/bingads/v13/internal/extensions.py index 3ae19a23..341969c8 100644 --- a/bingads/v13/internal/extensions.py +++ b/bingads/v13/internal/extensions.py @@ -1,7 +1,6 @@ from datetime import datetime from bingads.v13.internal.bulk.string_table import _StringTable -from six import PY2 import re import json from bingads.service_client import _CAMPAIGN_OBJECT_FACTORY_V13, _CAMPAIGN_MANAGEMENT_SERVICE_V13 @@ -63,9 +62,6 @@ def bulk_str(value): return None if isinstance(value, str): return value - if PY2: - if isinstance(value, unicode): - return value return str(value) @@ -325,7 +321,40 @@ def parse_device_preference(value): elif value.lower() == "mobile": return 30001 else: - raise ValueError("Unknown device preference") + return None + +def field_to_csv_AudienceIds(entity): + audience_ids = entity.audience_ids + if audience_ids is None or len(audience_ids) == 0: + return None + return ';'.join(str(audience_id) for audience_id in audience_ids) + +def csv_to_field_AudienceIds(entity, value): + if value is None or value.strip() == '': + return + entity.audience_ids = [None if i == 'None' else int(i) for i in value.split(';')] + +def field_to_csv_AgeRanges(entity): + age_ranges = entity.age_ranges + if age_ranges is None or len(age_ranges) == 0: + return None + return ';'.join(age_range for age_range in age_ranges) + +def csv_to_field_AgeRanges(entity, value): + if value is None or value.strip() == '': + return + entity.age_ranges = [None if i == 'None' else i for i in value.split(';')] + +def field_to_csv_GenderTypes(entity): + gender_types = entity.gender_types + if gender_types is None or len(gender_types) == 0: + return None + return ';'.join(gender_type for gender_type in gender_types) + +def csv_to_field_GenderTypes(entity, value): + if value is None or value.strip() == '': + return + entity.gender_types = [None if i == 'None' else i for i in value.split(';')] def field_to_csv_MediaIds(entity): """ @@ -507,6 +536,10 @@ def field_to_csv_BidStrategyType(entity): return 'PercentCpc' elif type(entity.BiddingScheme) == type(_CAMPAIGN_OBJECT_FACTORY_V13.create('CommissionBiddingScheme')): return 'Commission' + elif type(entity.BiddingScheme) == type(_CAMPAIGN_OBJECT_FACTORY_V13.create('ManualCpaBiddingScheme')): + return 'ManualCpa' + elif type(entity.BiddingScheme) == type(_CAMPAIGN_OBJECT_FACTORY_V13.create('CostPerSaleBiddingScheme')): + return 'CostPerSale' else: raise TypeError('Unsupported Bid Strategy Type') @@ -548,8 +581,12 @@ def csv_to_field_BidStrategyType(entity, value): entity.BiddingScheme = _CAMPAIGN_OBJECT_FACTORY_V13.create('PercentCpcBiddingScheme') elif value == 'Commission': entity.BiddingScheme = _CAMPAIGN_OBJECT_FACTORY_V13.create('CommissionBiddingScheme') + elif value == 'ManualCpa': + entity.BiddingScheme = _CAMPAIGN_OBJECT_FACTORY_V13.create('ManualCpaBiddingScheme') + elif value == 'CostPerSale': + entity.BiddingScheme = _CAMPAIGN_OBJECT_FACTORY_V13.create('CostPerSaleBiddingScheme') else: - raise ValueError('Unknown Bid Strategy Type') + return None entity.BiddingScheme.Type = value @@ -985,7 +1022,7 @@ def csv_to_field_BudgetType(entity, value, version=13): elif value == 'DailyBudgetStandard': entity.BudgetType = BudgetLimitType.DailyBudgetStandard else: - raise ValueError('Unable to parse BudgetType: {0}'.format(value)) + entity.BudgetType = None def field_to_csv_WebpageParameter_CriterionName(entity): if entity.Criterion is None or entity.Criterion.Parameter is None or entity.Criterion.Parameter.CriterionName is None: @@ -1060,7 +1097,7 @@ def csv_to_entity_DSAWebpageParameter(row_values, entity): # TODO wait bug 54825 to be fixed if webpage_condition.lower() == 'none': continue - raise ValueError("Unknown WebpageConditionOperand value: {0}".format(webpage_condition)) + return None if condition_operator_success: condition.Operator = webpage_condition_operator @@ -1254,7 +1291,7 @@ def csv_to_field_RemarketingRule(entity, value): elif rule_type.lower() == 'customevents': entity.Rule = parse_rule_CustomEvents(rule) else: - raise ValueError('Invalid Remarketing Rule Type: {0}'.format(rule_type)) + entity.Rule = None def field_to_csv_CriterionAudienceId(entity): @@ -1866,7 +1903,8 @@ def parse_number_operator(operator): return NumberOperator.LessThanEqualTo if oper == 'notequals': return NumberOperator.NotEquals - raise ValueError('Invalid Number Rule Item operator:{0}'.format(operator)) + + return None def parse_string_operator(operator): @@ -1888,7 +1926,7 @@ def parse_string_operator(operator): if oper == 'doesnotendwith': return StringOperator.DoesNotEndWith - raise ValueError('Invalid String Rule Item operator:{0}'.format(operator)) + return None def csv_to_field_SupportedCampaignTypes(entity, value): diff --git a/bingads/v13/internal/reporting/csv_reader.py b/bingads/v13/internal/reporting/csv_reader.py index 49a55088..2684ae6b 100644 --- a/bingads/v13/internal/reporting/csv_reader.py +++ b/bingads/v13/internal/reporting/csv_reader.py @@ -1,6 +1,5 @@ import csv import io -from six import PY2, PY3 class _CsvReader: @@ -17,11 +16,7 @@ def __init__(self, filename, delimiter, encoding='utf-8-sig'): self._csv_file = io.open(self.filename, encoding=encoding) - if PY3: - self._csv_reader = csv.reader(self._csv_file, dialect=self._dialect) - elif PY2: - byte_lines = [line.encode('utf-8') for line in self._csv_file] - self._csv_reader = csv.reader(byte_lines, dialect=self._dialect) + self._csv_reader = csv.reader(self._csv_file, dialect=self._dialect) def __enter__(self): return self @@ -39,11 +34,7 @@ def close(self): self.__exit__(None, None, None) def next(self): - if PY3: - return next(self._csv_reader) - elif PY2: - row = next(self._csv_reader) - return [unicode(cell, encoding='utf-8') for cell in row] + return next(self._csv_reader) @property def filename(self): diff --git a/bingads/v13/reporting/reporting_operation.py b/bingads/v13/reporting/reporting_operation.py index de3f8b30..96c7a2d6 100644 --- a/bingads/v13/reporting/reporting_operation.py +++ b/bingads/v13/reporting/reporting_operation.py @@ -4,7 +4,6 @@ import requests import zipfile import os -import six import sys import shutil @@ -101,10 +100,7 @@ def download_result_file(self, result_file_directory, result_file_name, decompre zip_file_path = result_file_path if os.path.exists(result_file_path) and overwrite is False: - if six.PY3: - raise FileExistsError('Result file: {0} exists'.format(result_file_path)) - else: - raise OSError('Result file: {0} exists'.format(result_file_path)) + raise FileExistsError('Result file: {0} exists'.format(result_file_path)) headers = { 'User-Agent': USER_AGENT, } diff --git a/requirements.txt b/requirements.txt index f1601d1e..56cfaf5e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,8 @@ suds-community>=1.1.0 requests>=2.0.0 -future -six enum34 pytest mock -parameterizedtestcase coverage flake8 setuptools diff --git a/setup.py b/setup.py index bd36ac86..2c8a8b58 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ except ImportError: from distutils.core import setup -VERSION = '13.0.15' +VERSION = '13.0.16' with open('README.rst', 'r') as f: readme = f.read() @@ -12,8 +12,6 @@ requirements = [ 'suds-community>=1.1.0', - 'future', - 'six', 'requests', 'enum34;python_version<"3.9"', ] From 9298f3e5481a9937e102627ff97c3486fb1d683a Mon Sep 17 00:00:00 2001 From: Xinyu Wen Date: Wed, 7 Jun 2023 10:56:35 +0800 Subject: [PATCH 2/3] add history --- HISTORY.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HISTORY.rst b/HISTORY.rst index a5b7566b..7c142e36 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -7,6 +7,7 @@ Release History * Add bulk mappings for performance max campaign i.e., BulkAssetGroup, BulkAssetGroupListingGroup, BulkAudienceGroup, BulkAudienceGroupAssetGroupAssociation, BulkCampaignNegativeWebPage. * Add mappings for new fields in BulkCampaign: UrlExpansionOptOut. * Support new bidding scheme: ManualCpaScheme and CostPerSaleBiddingScheme. +* get rid of six/future as we support python3 only. Refer to https://github.com/BingAds/BingAds-Python-SDK/issues/233. 13.0.15(2022-12-23) +++++++++++++++++++++++++ @@ -16,7 +17,6 @@ Release History * Add bulk mappings for AdGroupHotelListingGroup. * Add mappings for new fields in BulkAdgroup: UseOptimizedTargeting, HotelSetting, CommissionRate and PercentCpcBid. * Support new bidding scheme: percentCpcBiddingScheme and commissionBiddingScheme. -* get rid of six/future as we support python3 only. Refer to https://github.com/BingAds/BingAds-Python-SDK/issues/233. 13.0.14(2022-06-30) +++++++++++++++++++++++++ From 4162f4ea8fa56eced0463181f86d699fd8712f76 Mon Sep 17 00:00:00 2001 From: Xinyu Wen Date: Wed, 7 Jun 2023 11:00:09 +0800 Subject: [PATCH 3/3] update proxies --- .../proxies/production/adinsight_service.xml | 138 +- .../v13/proxies/production/bulk_service.xml | 73 +- .../production/campaignmanagement_service.xml | 3460 ++++++++++++----- .../proxies/production/reporting_service.xml | 48 +- .../v13/proxies/sandbox/adinsight_service.xml | 138 +- bingads/v13/proxies/sandbox/bulk_service.xml | 71 +- .../sandbox/campaignmanagement_service.xml | 3305 +++++++++++----- .../v13/proxies/sandbox/reporting_service.xml | 48 +- 8 files changed, 5038 insertions(+), 2243 deletions(-) diff --git a/bingads/v13/proxies/production/adinsight_service.xml b/bingads/v13/proxies/production/adinsight_service.xml index df8d7c2f..048afd96 100644 --- a/bingads/v13/proxies/production/adinsight_service.xml +++ b/bingads/v13/proxies/production/adinsight_service.xml @@ -1,6 +1,6 @@ - - + + @@ -98,7 +98,7 @@ - + @@ -310,7 +310,7 @@ - + @@ -481,7 +481,7 @@ - + @@ -541,7 +541,7 @@ - + @@ -585,10 +585,10 @@ - + - + @@ -688,7 +688,7 @@ - + @@ -718,13 +718,13 @@ - + - - + + @@ -800,13 +800,13 @@ - + - + - + @@ -859,7 +859,7 @@ - + @@ -902,10 +902,10 @@ - + - + @@ -953,10 +953,10 @@ - + - + @@ -1031,9 +1031,9 @@ - + - + @@ -1067,7 +1067,7 @@ - + @@ -1120,7 +1120,7 @@ - + @@ -1488,7 +1488,7 @@ - + @@ -1640,7 +1640,7 @@ - + @@ -1788,7 +1788,7 @@ - + @@ -1815,7 +1815,7 @@ - + @@ -3012,9 +3012,9 @@ - + - + @@ -3052,7 +3052,7 @@ - + @@ -3073,12 +3073,12 @@ - + - + @@ -3119,7 +3119,7 @@ - + @@ -3152,7 +3152,7 @@ - + @@ -3166,11 +3166,11 @@ - + - + @@ -3199,7 +3199,7 @@ - + @@ -3223,7 +3223,7 @@ - + @@ -3247,7 +3247,7 @@ - + @@ -3271,7 +3271,7 @@ - + @@ -3295,7 +3295,7 @@ - + @@ -3319,7 +3319,7 @@ - + @@ -3343,7 +3343,7 @@ - + @@ -3367,7 +3367,7 @@ - + @@ -3391,7 +3391,7 @@ - + @@ -3415,7 +3415,7 @@ - + @@ -3439,7 +3439,7 @@ - + @@ -3463,7 +3463,7 @@ - + @@ -3487,7 +3487,7 @@ - + @@ -3511,7 +3511,7 @@ - + @@ -3535,7 +3535,7 @@ - + @@ -3559,7 +3559,7 @@ - + @@ -3583,7 +3583,7 @@ - + @@ -3607,7 +3607,7 @@ - + @@ -3631,7 +3631,7 @@ - + @@ -3655,7 +3655,7 @@ - + @@ -3679,7 +3679,7 @@ - + @@ -3703,7 +3703,7 @@ - + @@ -3727,7 +3727,7 @@ - + @@ -3751,7 +3751,7 @@ - + @@ -3775,7 +3775,7 @@ - + @@ -3799,7 +3799,7 @@ - + @@ -3823,7 +3823,7 @@ - + @@ -3847,7 +3847,7 @@ - + @@ -4022,8 +4022,8 @@ - - + + @@ -4671,8 +4671,8 @@ - - + + diff --git a/bingads/v13/proxies/production/bulk_service.xml b/bingads/v13/proxies/production/bulk_service.xml index 2f7e4838..9cd8e8e7 100644 --- a/bingads/v13/proxies/production/bulk_service.xml +++ b/bingads/v13/proxies/production/bulk_service.xml @@ -1,5 +1,5 @@ - + @@ -34,7 +34,7 @@ - + @@ -1086,6 +1086,41 @@ + + + + 146 + + + + + + + 147 + + + + + + + 148 + + + + + + + 149 + + + + + + + 150 + + + @@ -1113,7 +1148,7 @@ - + @@ -1134,7 +1169,7 @@ - + @@ -1214,7 +1249,7 @@ - + @@ -1255,7 +1290,7 @@ - + @@ -1265,7 +1300,7 @@ - + @@ -1274,7 +1309,7 @@ - + @@ -1282,7 +1317,7 @@ - + @@ -1323,7 +1358,7 @@ - + @@ -1355,7 +1390,7 @@ - + @@ -1388,7 +1423,7 @@ - + @@ -1433,7 +1468,7 @@ - + @@ -1457,7 +1492,7 @@ - + @@ -1481,7 +1516,7 @@ - + @@ -1505,7 +1540,7 @@ - + @@ -1529,7 +1564,7 @@ - + @@ -1553,7 +1588,7 @@ - + @@ -1740,7 +1775,7 @@ - + diff --git a/bingads/v13/proxies/production/campaignmanagement_service.xml b/bingads/v13/proxies/production/campaignmanagement_service.xml index 19818905..8bc21086 100644 --- a/bingads/v13/proxies/production/campaignmanagement_service.xml +++ b/bingads/v13/proxies/production/campaignmanagement_service.xml @@ -1,5 +1,5 @@ - + @@ -26,7 +26,7 @@ - + @@ -92,10 +92,10 @@ - + - - + + @@ -240,7 +240,7 @@ - + @@ -739,8 +739,8 @@ - - + + @@ -764,7 +764,7 @@ - + @@ -943,6 +943,24 @@ + + + + + + + + + + + + + + + + + + @@ -976,6 +994,13 @@ + + + + 64 + + + @@ -1029,7 +1054,7 @@ - + @@ -1103,7 +1128,7 @@ - + @@ -1140,6 +1165,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -1150,7 +1195,7 @@ - + @@ -1167,7 +1212,7 @@ - + @@ -1191,7 +1236,7 @@ - + @@ -1241,6 +1286,8 @@ + + @@ -1257,7 +1304,7 @@ - + @@ -1275,7 +1322,7 @@ - + @@ -1305,7 +1352,7 @@ - + @@ -1326,7 +1373,7 @@ - + @@ -1367,7 +1414,7 @@ - + @@ -1401,7 +1448,14 @@ - + + + + + + + + @@ -1461,6 +1515,13 @@ + + + + + + + @@ -1529,6 +1590,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -1559,8 +1644,8 @@ - - + + @@ -1569,7 +1654,7 @@ - + @@ -1584,7 +1669,7 @@ - + @@ -1602,6 +1687,7 @@ + @@ -1643,7 +1729,7 @@ - + @@ -1652,7 +1738,7 @@ - + @@ -1673,7 +1759,7 @@ - + @@ -1734,14 +1820,14 @@ - + - + @@ -1761,7 +1847,7 @@ - + @@ -1811,7 +1897,7 @@ - + @@ -1878,10 +1964,10 @@ - + - - + + @@ -1928,8 +2014,8 @@ - - + + @@ -1938,7 +2024,7 @@ - + @@ -1968,7 +2054,7 @@ - + @@ -2006,7 +2092,7 @@ - + @@ -2140,7 +2226,7 @@ - + @@ -2149,7 +2235,7 @@ - + @@ -2352,7 +2438,7 @@ - + @@ -2490,10 +2576,10 @@ - + - - + + @@ -2501,7 +2587,7 @@ - + @@ -2524,9 +2610,9 @@ - + - + @@ -2566,9 +2652,9 @@ - + - + @@ -2581,9 +2667,9 @@ - + - + @@ -2683,7 +2769,7 @@ - + @@ -2729,8 +2815,8 @@ - - + + @@ -2770,9 +2856,9 @@ - + - + @@ -2846,11 +2932,11 @@ - + - + - + @@ -2910,12 +2996,12 @@ - + - + - - + + @@ -2932,9 +3018,9 @@ - + - + @@ -2952,9 +3038,9 @@ - + - + @@ -3000,7 +3086,7 @@ - + @@ -3025,7 +3111,7 @@ - + @@ -3097,7 +3183,7 @@ - + @@ -3186,7 +3272,7 @@ - + @@ -3214,7 +3300,7 @@ - + @@ -3291,7 +3377,7 @@ - + @@ -3330,7 +3416,7 @@ - + @@ -3338,7 +3424,7 @@ - + @@ -3425,7 +3511,7 @@ - + @@ -3441,7 +3527,7 @@ - + @@ -3476,7 +3562,7 @@ - + @@ -4018,7 +4104,7 @@ - + @@ -4070,6 +4156,7 @@ + @@ -4142,9 +4229,9 @@ - + - + @@ -4203,7 +4290,7 @@ - + @@ -4226,7 +4313,7 @@ - + @@ -4288,7 +4375,7 @@ - + @@ -4303,11 +4390,90 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4320,6 +4486,7 @@ + @@ -4345,6 +4512,13 @@ + + + + + + + @@ -4409,7 +4583,7 @@ - + @@ -4441,14 +4615,14 @@ - + - + @@ -4499,7 +4673,7 @@ - + @@ -4572,7 +4746,7 @@ - + @@ -4605,7 +4779,7 @@ - + @@ -4628,7 +4802,7 @@ - + @@ -4697,7 +4871,7 @@ - + @@ -4714,7 +4888,7 @@ - + @@ -4748,7 +4922,7 @@ - + @@ -4790,7 +4964,7 @@ - + @@ -4983,7 +5157,7 @@ - + @@ -5006,7 +5180,7 @@ - + @@ -5022,7 +5196,7 @@ - + @@ -5063,7 +5237,7 @@ - + @@ -5085,7 +5259,7 @@ - + @@ -5099,7 +5273,7 @@ - + @@ -5114,7 +5288,7 @@ - + @@ -5152,7 +5326,7 @@ - + @@ -5174,7 +5348,7 @@ - + @@ -5188,7 +5362,7 @@ - + @@ -5203,7 +5377,7 @@ - + @@ -5215,141 +5389,483 @@ - + - + - + - + - - + + - - + - + - - - - - - - - - - - - - - - + + - + - - + + - - - + - - - - - + + + + + + + + + + + + + + + + + - - + + - - + - - + + - + - - + - - + + - + - - + + - + - - - - - - - - + - - - - - - - 1 - - - - - - - 2 - - - - - - - + + - + - - + + - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + 2 + + + + + + + + + + + + + + + + + + + + + + + + @@ -5514,7 +6030,7 @@ - + @@ -5545,10 +6061,18 @@ + + + + + + + + - + @@ -5570,7 +6094,7 @@ - + @@ -5584,7 +6108,7 @@ - + @@ -5612,7 +6136,7 @@ - + @@ -5682,7 +6206,7 @@ - + @@ -5752,6 +6276,13 @@ + + + + + + + @@ -5941,7 +6472,7 @@ - + @@ -5965,7 +6496,7 @@ - + @@ -6005,6 +6536,20 @@ + + + + + + + + + + + + + + @@ -6037,6 +6582,20 @@ + + + + + + + + + + + + + + @@ -6104,7 +6663,7 @@ - + @@ -6112,7 +6671,7 @@ - + @@ -6140,7 +6699,7 @@ - + @@ -6199,7 +6758,7 @@ - + @@ -6216,7 +6775,7 @@ - + @@ -6259,7 +6818,7 @@ - + @@ -6267,7 +6826,7 @@ - + @@ -6295,7 +6854,7 @@ - + @@ -6413,7 +6972,7 @@ - + @@ -6524,6 +7083,13 @@ + + + + + + + @@ -6609,7 +7175,7 @@ - + @@ -6628,7 +7194,7 @@ - + @@ -6638,7 +7204,7 @@ - + @@ -6717,6 +7283,13 @@ + + + + 512 + + + @@ -6739,7 +7312,7 @@ - + @@ -6767,7 +7340,7 @@ - + @@ -6784,7 +7357,7 @@ - + @@ -6800,7 +7373,7 @@ - + @@ -6819,7 +7392,7 @@ - + @@ -6834,7 +7407,7 @@ - + @@ -6871,7 +7444,7 @@ - + @@ -6879,7 +7452,7 @@ - + @@ -6893,7 +7466,7 @@ - + @@ -6962,7 +7535,7 @@ - + @@ -6994,7 +7567,7 @@ - + @@ -7047,7 +7620,7 @@ - + @@ -7055,7 +7628,7 @@ - + @@ -7092,7 +7665,271 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -7101,22 +7938,22 @@ - - + + - + - - + + - + - - + + - + @@ -7125,22 +7962,22 @@ - - + + - + - - + + - + - - + + - + @@ -7149,22 +7986,22 @@ - - + + - + - - + + - + - - + + - + @@ -7173,22 +8010,22 @@ - - + + - + - - + + - + - - + + - + @@ -7197,22 +8034,22 @@ - - + + - + - - + + - + - - + + - + @@ -7221,22 +8058,22 @@ - - + + - + - - + + - + - - + + - + @@ -7245,22 +8082,46 @@ - - + + - + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + @@ -7269,22 +8130,22 @@ - - + + - + - - + + - + - - + + - + @@ -7293,22 +8154,22 @@ - - + + - + - - + + - + - - + + - + @@ -7317,22 +8178,94 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - + - - + + - + @@ -7341,22 +8274,22 @@ - - + + - + - - + + - + - - + + - + @@ -7365,22 +8298,22 @@ - - + + - + - - + + - + - - + + - + @@ -7389,22 +8322,22 @@ - - + + - + - - + + - + - - + + - + @@ -7413,22 +8346,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7437,22 +8370,22 @@ - - + + - + - - + + - + - - + + - + @@ -7461,22 +8394,22 @@ - - + + - + - - + + - + - - + + - + @@ -7485,22 +8418,22 @@ - - + + - + - - + + - + - - + + - + @@ -7509,22 +8442,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7533,22 +8466,22 @@ - - + + - + - - + + - + - - + + - + @@ -7557,22 +8490,22 @@ - - + + - + - - + + - + - - + + - + @@ -7581,22 +8514,22 @@ - - + + - + - - + + - + - - + + - + @@ -7605,22 +8538,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7629,22 +8562,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7653,22 +8586,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7677,22 +8610,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7701,22 +8634,22 @@ - - + + - + - - + + - + - - + + - + @@ -7725,22 +8658,22 @@ - - + + - + - - + + - + - - + + - + @@ -7749,22 +8682,22 @@ - - + + - + - - + + - + - - + + - + @@ -7773,22 +8706,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7797,22 +8730,22 @@ - - + + - + - - + + - + - - + + - + @@ -7821,22 +8754,22 @@ - - + + - + - - + + - + - - + + - + @@ -7845,22 +8778,22 @@ - - + + - + - - + + - + - - + + - + @@ -7869,22 +8802,22 @@ - - + + - + - - + + - + - - + + - + @@ -7893,22 +8826,22 @@ - - + + - + - - + + - + - - + + - + @@ -7917,22 +8850,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7941,22 +8874,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7965,22 +8898,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7989,22 +8922,22 @@ - - + + - + - - + + - + - - + + - + @@ -8013,22 +8946,22 @@ - - + + - + - - + + - + - - + + - + @@ -8037,22 +8970,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -8061,22 +8994,22 @@ - - + + - + - - + + - + - - + + - + @@ -8085,22 +9018,22 @@ - - + + - + - - + + - + - - + + - + @@ -8109,22 +9042,22 @@ - - + + - + - - + + - + - - + + - + @@ -8133,22 +9066,22 @@ - - + + - + - - + + - + - - + + - + @@ -8157,22 +9090,22 @@ - - + + - + - - + + - + - - + + - + @@ -8181,22 +9114,22 @@ - - + + - + - - + + - + - - + + - + @@ -8205,22 +9138,22 @@ - - + + - + - - + + - + - - + + - + @@ -8229,22 +9162,22 @@ - - + + - + - - + + - + - - + + - + @@ -8253,22 +9186,22 @@ - - + + - + - - + + - + - - + + - + @@ -8277,22 +9210,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -8301,22 +9234,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -8325,22 +9258,22 @@ - - + + - + - - + + - + - - + + - + @@ -8349,22 +9282,22 @@ - - + + - + - - + + - + - - + + - + @@ -8373,22 +9306,22 @@ - - + + - + - - + + - + - - + + - + @@ -8397,22 +9330,22 @@ - - + + - + - - + + - + - - + + - + @@ -8421,22 +9354,22 @@ - - + + - + - - + + - + - - + + - + @@ -8445,22 +9378,22 @@ - - + + - + - - + + - + - - + + - + @@ -8469,22 +9402,22 @@ - - + + - + - - + + - + - - + + - + @@ -8493,22 +9426,22 @@ - - + + - + - - + + - + - - + + - + @@ -8517,22 +9450,22 @@ - - + + - + - - + + - + - - + + - + @@ -8541,22 +9474,22 @@ - - + + - + - - + + - + - - + + - + @@ -8565,22 +9498,22 @@ - - + + - + - - + + - + - - + + - + @@ -8589,22 +9522,22 @@ - - + + - + - - + + - + - - + + - + @@ -8613,22 +9546,22 @@ - - + + - + - - + + - + - - + + - + @@ -8637,22 +9570,22 @@ - - + + - + - - + + - + - - + + - + @@ -8661,22 +9594,22 @@ - - + + - + - - + + - + - - + + - + @@ -8685,22 +9618,22 @@ - - + + - + - - + + - + - - + + - + @@ -8709,22 +9642,22 @@ - - + + - + - - + + - + - - + + - + @@ -8733,22 +9666,22 @@ - - + + - + - - + + - + - - + + - + @@ -8757,22 +9690,22 @@ - - + + - + - - + + - + - - + + - + @@ -8781,22 +9714,22 @@ - - + + - + - - + + - + - - + + - + @@ -8805,22 +9738,22 @@ - - + + - + - - + + - + - - + + - + @@ -8829,22 +9762,22 @@ - - + + - + - - + + - + - - + + - + @@ -8853,22 +9786,22 @@ - - + + - + - - + + - + - - + + - + @@ -8877,22 +9810,22 @@ - - + + - + - - + + - + - - + + - + @@ -8901,22 +9834,22 @@ - - + + - + - - + + - + - - + + - + @@ -8925,22 +9858,22 @@ - - + + - + - - + + - + - - + + - + @@ -8949,22 +9882,22 @@ - - + + - + - - + + - + - - + + - + @@ -8973,22 +9906,22 @@ - - + + - + - - + + - + - - + + - + @@ -8997,22 +9930,22 @@ - - + + - + - - + + - + - - + + - + @@ -9021,22 +9954,22 @@ - - + + - + - - + + - + - - + + - + @@ -9045,22 +9978,22 @@ - - + + - + - - + + - + - - + + - + @@ -9069,22 +10002,22 @@ - - + + - + - - + + - + - - + + - + @@ -9093,22 +10026,22 @@ - - + + - + - - + + - + - - + + - + @@ -9117,16 +10050,16 @@ - - + + - + - - + + - + @@ -9148,7 +10081,7 @@ - + @@ -9172,7 +10105,7 @@ - + @@ -9196,7 +10129,7 @@ - + @@ -9220,7 +10153,7 @@ - + @@ -9244,7 +10177,7 @@ - + @@ -9268,7 +10201,7 @@ - + @@ -9292,7 +10225,7 @@ - + @@ -9316,7 +10249,7 @@ - + @@ -9340,7 +10273,7 @@ - + @@ -9364,7 +10297,7 @@ - + @@ -9388,7 +10321,7 @@ - + @@ -9412,7 +10345,7 @@ - + @@ -9436,7 +10369,7 @@ - + @@ -9460,7 +10393,7 @@ - + @@ -9484,7 +10417,7 @@ - + @@ -9508,7 +10441,7 @@ - + @@ -9532,7 +10465,7 @@ - + @@ -9556,7 +10489,7 @@ - + @@ -9580,7 +10513,7 @@ - + @@ -9604,7 +10537,7 @@ - + @@ -9628,7 +10561,7 @@ - + @@ -9652,7 +10585,7 @@ - + @@ -9676,7 +10609,7 @@ - + @@ -9700,7 +10633,7 @@ - + @@ -9724,7 +10657,7 @@ - + @@ -9748,7 +10681,7 @@ - + @@ -9772,7 +10705,7 @@ - + @@ -9796,7 +10729,7 @@ - + @@ -9820,7 +10753,7 @@ - + @@ -9844,7 +10777,7 @@ - + @@ -9868,7 +10801,7 @@ - + @@ -9892,7 +10825,7 @@ - + @@ -9916,7 +10849,7 @@ - + @@ -9940,7 +10873,7 @@ - + @@ -9964,7 +10897,7 @@ - + @@ -9988,7 +10921,7 @@ - + @@ -10012,7 +10945,7 @@ - + @@ -10036,7 +10969,7 @@ - + @@ -10060,7 +10993,7 @@ - + @@ -10084,7 +11017,7 @@ - + @@ -10108,7 +11041,7 @@ - + @@ -10438,6 +11371,18 @@ + + + + + + + + + + + + @@ -10624,6 +11569,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12116,6 +13139,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12829,6 +13898,305 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13775,7 +15143,7 @@ - + diff --git a/bingads/v13/proxies/production/reporting_service.xml b/bingads/v13/proxies/production/reporting_service.xml index 9121b9d3..b0e85c49 100644 --- a/bingads/v13/proxies/production/reporting_service.xml +++ b/bingads/v13/proxies/production/reporting_service.xml @@ -1,5 +1,5 @@ - + @@ -246,7 +246,7 @@ - + @@ -998,7 +998,7 @@ - + @@ -1254,7 +1254,7 @@ - + @@ -1646,19 +1646,19 @@ - + - + - - + + - + @@ -2089,7 +2089,7 @@ - + @@ -2275,7 +2275,7 @@ - + @@ -2354,7 +2354,7 @@ - + @@ -2417,7 +2417,7 @@ - + @@ -2992,7 +2992,7 @@ - + @@ -3418,7 +3418,7 @@ - + @@ -3654,7 +3654,7 @@ - + @@ -3751,7 +3751,7 @@ - + @@ -4141,7 +4141,7 @@ - + @@ -4211,7 +4211,7 @@ - + @@ -4252,7 +4252,7 @@ - + @@ -4272,7 +4272,7 @@ - + @@ -4325,7 +4325,7 @@ - + @@ -4349,7 +4349,7 @@ - + @@ -4420,7 +4420,7 @@ - + diff --git a/bingads/v13/proxies/sandbox/adinsight_service.xml b/bingads/v13/proxies/sandbox/adinsight_service.xml index fb63f1bc..099ada7d 100644 --- a/bingads/v13/proxies/sandbox/adinsight_service.xml +++ b/bingads/v13/proxies/sandbox/adinsight_service.xml @@ -1,6 +1,6 @@ - - + + @@ -98,7 +98,7 @@ - + @@ -310,7 +310,7 @@ - + @@ -481,7 +481,7 @@ - + @@ -541,7 +541,7 @@ - + @@ -585,10 +585,10 @@ - + - + @@ -688,7 +688,7 @@ - + @@ -718,13 +718,13 @@ - + - - + + @@ -800,13 +800,13 @@ - + - + - + @@ -859,7 +859,7 @@ - + @@ -902,10 +902,10 @@ - + - + @@ -953,10 +953,10 @@ - + - + @@ -1031,9 +1031,9 @@ - + - + @@ -1067,7 +1067,7 @@ - + @@ -1120,7 +1120,7 @@ - + @@ -1488,7 +1488,7 @@ - + @@ -1640,7 +1640,7 @@ - + @@ -1788,7 +1788,7 @@ - + @@ -1815,7 +1815,7 @@ - + @@ -3012,9 +3012,9 @@ - + - + @@ -3052,7 +3052,7 @@ - + @@ -3073,12 +3073,12 @@ - + - + @@ -3119,7 +3119,7 @@ - + @@ -3152,7 +3152,7 @@ - + @@ -3166,11 +3166,11 @@ - + - + @@ -3199,7 +3199,7 @@ - + @@ -3223,7 +3223,7 @@ - + @@ -3247,7 +3247,7 @@ - + @@ -3271,7 +3271,7 @@ - + @@ -3295,7 +3295,7 @@ - + @@ -3319,7 +3319,7 @@ - + @@ -3343,7 +3343,7 @@ - + @@ -3367,7 +3367,7 @@ - + @@ -3391,7 +3391,7 @@ - + @@ -3415,7 +3415,7 @@ - + @@ -3439,7 +3439,7 @@ - + @@ -3463,7 +3463,7 @@ - + @@ -3487,7 +3487,7 @@ - + @@ -3511,7 +3511,7 @@ - + @@ -3535,7 +3535,7 @@ - + @@ -3559,7 +3559,7 @@ - + @@ -3583,7 +3583,7 @@ - + @@ -3607,7 +3607,7 @@ - + @@ -3631,7 +3631,7 @@ - + @@ -3655,7 +3655,7 @@ - + @@ -3679,7 +3679,7 @@ - + @@ -3703,7 +3703,7 @@ - + @@ -3727,7 +3727,7 @@ - + @@ -3751,7 +3751,7 @@ - + @@ -3775,7 +3775,7 @@ - + @@ -3799,7 +3799,7 @@ - + @@ -3823,7 +3823,7 @@ - + @@ -3847,7 +3847,7 @@ - + @@ -4022,8 +4022,8 @@ - - + + @@ -4671,8 +4671,8 @@ - - + + diff --git a/bingads/v13/proxies/sandbox/bulk_service.xml b/bingads/v13/proxies/sandbox/bulk_service.xml index ef10d5d5..2a7416ce 100644 --- a/bingads/v13/proxies/sandbox/bulk_service.xml +++ b/bingads/v13/proxies/sandbox/bulk_service.xml @@ -1,5 +1,5 @@ - + @@ -34,7 +34,7 @@ - + @@ -1086,6 +1086,41 @@ + + + + 146 + + + + + + + 147 + + + + + + + 148 + + + + + + + 149 + + + + + + + 150 + + + @@ -1113,7 +1148,7 @@ - + @@ -1134,7 +1169,7 @@ - + @@ -1214,7 +1249,7 @@ - + @@ -1255,7 +1290,7 @@ - + @@ -1265,7 +1300,7 @@ - + @@ -1274,7 +1309,7 @@ - + @@ -1282,7 +1317,7 @@ - + @@ -1323,7 +1358,7 @@ - + @@ -1355,7 +1390,7 @@ - + @@ -1388,7 +1423,7 @@ - + @@ -1433,7 +1468,7 @@ - + @@ -1457,7 +1492,7 @@ - + @@ -1481,7 +1516,7 @@ - + @@ -1505,7 +1540,7 @@ - + @@ -1529,7 +1564,7 @@ - + @@ -1553,7 +1588,7 @@ - + diff --git a/bingads/v13/proxies/sandbox/campaignmanagement_service.xml b/bingads/v13/proxies/sandbox/campaignmanagement_service.xml index 995068e7..6bc27d73 100644 --- a/bingads/v13/proxies/sandbox/campaignmanagement_service.xml +++ b/bingads/v13/proxies/sandbox/campaignmanagement_service.xml @@ -1,5 +1,5 @@ - + @@ -26,7 +26,7 @@ - + @@ -92,10 +92,10 @@ - + - - + + @@ -240,7 +240,7 @@ - + @@ -739,8 +739,8 @@ - - + + @@ -764,7 +764,7 @@ - + @@ -943,6 +943,24 @@ + + + + + + + + + + + + + + + + + + @@ -976,6 +994,13 @@ + + + + 64 + + + @@ -1029,7 +1054,7 @@ - + @@ -1103,7 +1128,7 @@ - + @@ -1150,6 +1175,16 @@ + + + + + + + + + + @@ -1160,7 +1195,7 @@ - + @@ -1177,7 +1212,7 @@ - + @@ -1201,7 +1236,7 @@ - + @@ -1252,6 +1287,7 @@ + @@ -1268,7 +1304,7 @@ - + @@ -1286,7 +1322,7 @@ - + @@ -1316,7 +1352,7 @@ - + @@ -1337,7 +1373,7 @@ - + @@ -1378,7 +1414,7 @@ - + @@ -1412,7 +1448,14 @@ - + + + + + + + + @@ -1472,6 +1515,13 @@ + + + + + + + @@ -1540,6 +1590,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -1570,8 +1644,8 @@ - - + + @@ -1580,7 +1654,7 @@ - + @@ -1595,7 +1669,7 @@ - + @@ -1613,6 +1687,7 @@ + @@ -1654,7 +1729,7 @@ - + @@ -1663,7 +1738,7 @@ - + @@ -1684,7 +1759,7 @@ - + @@ -1745,14 +1820,14 @@ - + - + @@ -1772,7 +1847,7 @@ - + @@ -1822,7 +1897,7 @@ - + @@ -1889,10 +1964,10 @@ - + - - + + @@ -1939,8 +2014,8 @@ - - + + @@ -1949,7 +2024,7 @@ - + @@ -1979,7 +2054,7 @@ - + @@ -2017,7 +2092,7 @@ - + @@ -2151,7 +2226,7 @@ - + @@ -2160,7 +2235,7 @@ - + @@ -2363,7 +2438,7 @@ - + @@ -2501,10 +2576,10 @@ - + - - + + @@ -2512,7 +2587,7 @@ - + @@ -2535,9 +2610,9 @@ - + - + @@ -2577,9 +2652,9 @@ - + - + @@ -2592,9 +2667,9 @@ - + - + @@ -2694,7 +2769,7 @@ - + @@ -2740,8 +2815,8 @@ - - + + @@ -2781,9 +2856,9 @@ - + - + @@ -2857,11 +2932,11 @@ - + - + - + @@ -2921,12 +2996,12 @@ - + - + - - + + @@ -2943,9 +3018,9 @@ - + - + @@ -2963,9 +3038,9 @@ - + - + @@ -3011,7 +3086,7 @@ - + @@ -3036,7 +3111,7 @@ - + @@ -3108,7 +3183,7 @@ - + @@ -3197,7 +3272,7 @@ - + @@ -3225,7 +3300,7 @@ - + @@ -3302,7 +3377,7 @@ - + @@ -3341,7 +3416,7 @@ - + @@ -3349,7 +3424,7 @@ - + @@ -3436,7 +3511,7 @@ - + @@ -3452,7 +3527,7 @@ - + @@ -3487,7 +3562,7 @@ - + @@ -4029,7 +4104,7 @@ - + @@ -4081,6 +4156,7 @@ + @@ -4153,9 +4229,9 @@ - + - + @@ -4214,7 +4290,7 @@ - + @@ -4237,7 +4313,7 @@ - + @@ -4299,7 +4375,7 @@ - + @@ -4314,11 +4390,90 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4331,6 +4486,7 @@ + @@ -4356,6 +4512,13 @@ + + + + + + + @@ -4420,7 +4583,7 @@ - + @@ -4452,14 +4615,14 @@ - + - + @@ -4510,7 +4673,7 @@ - + @@ -4583,7 +4746,7 @@ - + @@ -4616,7 +4779,7 @@ - + @@ -4639,7 +4802,7 @@ - + @@ -4708,7 +4871,7 @@ - + @@ -4725,7 +4888,7 @@ - + @@ -4759,7 +4922,7 @@ - + @@ -4801,7 +4964,7 @@ - + @@ -4994,7 +5157,7 @@ - + @@ -5017,7 +5180,7 @@ - + @@ -5033,7 +5196,7 @@ - + @@ -5074,7 +5237,7 @@ - + @@ -5096,7 +5259,7 @@ - + @@ -5110,7 +5273,7 @@ - + @@ -5125,7 +5288,7 @@ - + @@ -5163,7 +5326,7 @@ - + @@ -5185,7 +5348,7 @@ - + @@ -5199,7 +5362,7 @@ - + @@ -5214,7 +5377,7 @@ - + @@ -5226,147 +5389,489 @@ - + - + - + - + - - + + - - + - + - - - - - - - - - - - - - - - + + - + - - + + - - - + - - - - - + + + + + + + + + + + + + + + + + - - + + - - + - - + + - + - - + - - + + - + - - + + - + - - - - - - - - + - - - - - - - 1 - - - - - - - 2 - - - - - - - + + - + - - + + - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5525,7 +6030,7 @@ - + @@ -5556,10 +6061,18 @@ + + + + + + + + - + @@ -5581,7 +6094,7 @@ - + @@ -5595,7 +6108,7 @@ - + @@ -5623,7 +6136,7 @@ - + @@ -5693,7 +6206,7 @@ - + @@ -5763,6 +6276,13 @@ + + + + + + + @@ -5952,7 +6472,7 @@ - + @@ -5976,7 +6496,7 @@ - + @@ -6016,6 +6536,20 @@ + + + + + + + + + + + + + + @@ -6048,6 +6582,20 @@ + + + + + + + + + + + + + + @@ -6115,7 +6663,7 @@ - + @@ -6123,7 +6671,7 @@ - + @@ -6151,7 +6699,7 @@ - + @@ -6210,7 +6758,7 @@ - + @@ -6227,7 +6775,7 @@ - + @@ -6270,7 +6818,7 @@ - + @@ -6278,7 +6826,7 @@ - + @@ -6306,7 +6854,7 @@ - + @@ -6424,7 +6972,7 @@ - + @@ -6535,6 +7083,13 @@ + + + + + + + @@ -6620,7 +7175,7 @@ - + @@ -6639,7 +7194,7 @@ - + @@ -6649,7 +7204,7 @@ - + @@ -6728,6 +7283,13 @@ + + + + 512 + + + @@ -6750,7 +7312,7 @@ - + @@ -6778,7 +7340,7 @@ - + @@ -6795,7 +7357,7 @@ - + @@ -6811,7 +7373,7 @@ - + @@ -6830,7 +7392,7 @@ - + @@ -6845,7 +7407,7 @@ - + @@ -6882,7 +7444,7 @@ - + @@ -6890,7 +7452,7 @@ - + @@ -6904,7 +7466,7 @@ - + @@ -6973,7 +7535,7 @@ - + @@ -7005,7 +7567,7 @@ - + @@ -7058,7 +7620,7 @@ - + @@ -7066,7 +7628,7 @@ - + @@ -7119,7 +7681,7 @@ - + @@ -7143,7 +7705,7 @@ - + @@ -7167,7 +7729,7 @@ - + @@ -7191,7 +7753,7 @@ - + @@ -7215,7 +7777,7 @@ - + @@ -7239,7 +7801,7 @@ - + @@ -7263,7 +7825,7 @@ - + @@ -7287,7 +7849,7 @@ - + @@ -7311,7 +7873,7 @@ - + @@ -7331,19 +7893,379 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - + + - + @@ -7352,22 +8274,22 @@ - - + + - + - - + + - + - - + + - + @@ -7376,22 +8298,22 @@ - - + + - + - - + + - + - - + + - + @@ -7400,22 +8322,22 @@ - - + + - + - - + + - + - - + + - + @@ -7424,22 +8346,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7448,22 +8370,22 @@ - - + + - + - - + + - + - - + + - + @@ -7472,22 +8394,22 @@ - - + + - + - - + + - + - - + + - + @@ -7496,22 +8418,22 @@ - - + + - + - - + + - + - - + + - + @@ -7520,22 +8442,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7544,22 +8466,22 @@ - - + + - + - - + + - + - - + + - + @@ -7568,22 +8490,22 @@ - - + + - + - - + + - + - - + + - + @@ -7592,22 +8514,22 @@ - - + + - + - - + + - + - - + + - + @@ -7616,22 +8538,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7640,22 +8562,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7664,22 +8586,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7688,22 +8610,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7712,22 +8634,22 @@ - - + + - + - - + + - + - - + + - + @@ -7736,22 +8658,22 @@ - - + + - + - - + + - + - - + + - + @@ -7760,22 +8682,22 @@ - - + + - + - - + + - + - - + + - + @@ -7784,22 +8706,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7808,22 +8730,22 @@ - - + + - + - - + + - + - - + + - + @@ -7832,22 +8754,22 @@ - - + + - + - - + + - + - - + + - + @@ -7856,22 +8778,22 @@ - - + + - + - - + + - + - - + + - + @@ -7880,22 +8802,22 @@ - - + + - + - - + + - + - - + + - + @@ -7904,22 +8826,22 @@ - - + + - + - - + + - + - - + + - + @@ -7928,22 +8850,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7952,22 +8874,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -7976,22 +8898,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -8000,22 +8922,22 @@ - - + + - + - - + + - + - - + + - + @@ -8024,22 +8946,22 @@ - - + + - + - - + + - + - - + + - + @@ -8048,22 +8970,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -8072,22 +8994,22 @@ - - + + - + - - + + - + - - + + - + @@ -8096,22 +9018,22 @@ - - + + - + - - + + - + - - + + - + @@ -8120,22 +9042,22 @@ - - + + - + - - + + - + - - + + - + @@ -8144,22 +9066,22 @@ - - + + - + - - + + - + - - + + - + @@ -8168,22 +9090,22 @@ - - + + - + - - + + - + - - + + - + @@ -8192,22 +9114,22 @@ - - + + - + - - + + - + - - + + - + @@ -8216,22 +9138,22 @@ - - + + - + - - + + - + - - + + - + @@ -8240,22 +9162,22 @@ - - + + - + - - + + - + - - + + - + @@ -8264,22 +9186,22 @@ - - + + - + - - + + - + - - + + - + @@ -8288,22 +9210,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -8312,22 +9234,22 @@ - - + + - + - - + + - - + + - - + + - + @@ -8336,22 +9258,22 @@ - - + + - + - - + + - + - - + + - + @@ -8360,22 +9282,22 @@ - - + + - + - - + + - + - - + + - + @@ -8384,22 +9306,22 @@ - - + + - + - - + + - + - - + + - + @@ -8408,22 +9330,22 @@ - - + + - + - - + + - + - - + + - + @@ -8432,22 +9354,22 @@ - - + + - + - - + + - + - - + + - + @@ -8456,22 +9378,22 @@ - - + + - + - - + + - + - - + + - + @@ -8480,22 +9402,22 @@ - - + + - + - - + + - + - - + + - + @@ -8504,22 +9426,22 @@ - - + + - + - - + + - + - - + + - + @@ -8528,22 +9450,22 @@ - - + + - + - - + + - + - - + + - + @@ -8552,22 +9474,22 @@ - - + + - + - - + + - + - - + + - + @@ -8576,22 +9498,22 @@ - - + + - + - - + + - + - - + + - + @@ -8600,22 +9522,22 @@ - - + + - + - - + + - + - - + + - + @@ -8624,22 +9546,22 @@ - - + + - + - - + + - + - - + + - + @@ -8648,22 +9570,22 @@ - - + + - + - - + + - + - - + + - + @@ -8672,22 +9594,22 @@ - - + + - + - - + + - + - - + + - + @@ -8696,22 +9618,22 @@ - - + + - + - - + + - + - - + + - + @@ -8720,22 +9642,22 @@ - - + + - + - - + + - + - - + + - + @@ -8744,22 +9666,22 @@ - - + + - + - - + + - + - - + + - + @@ -8768,22 +9690,22 @@ - - + + - + - - + + - + - - + + - + @@ -8792,22 +9714,22 @@ - - + + - + - - + + - + - - + + - + @@ -8816,22 +9738,22 @@ - - + + - + - - + + - + - - + + - + @@ -8840,22 +9762,22 @@ - - + + - + - - + + - + - - + + - + @@ -8864,22 +9786,22 @@ - - + + - + - - + + - + - - + + - + @@ -8888,22 +9810,22 @@ - - + + - + - - + + - + - - + + - + @@ -8912,22 +9834,22 @@ - - + + - + - - + + - + - - + + - + @@ -8936,22 +9858,22 @@ - - + + - + - - + + - + - - + + - + @@ -8960,22 +9882,22 @@ - - + + - + - - + + - + - - + + - + @@ -8984,22 +9906,22 @@ - - + + - + - - + + - + - - + + - + @@ -9008,22 +9930,22 @@ - - + + - + - - + + - + - - + + - + @@ -9032,22 +9954,22 @@ - - + + - + - - + + - + - - + + - + @@ -9056,22 +9978,22 @@ - - + + - + - - + + - + - - + + - + @@ -9080,22 +10002,22 @@ - - + + - + - - + + - + - - + + - + @@ -9104,22 +10026,22 @@ - - + + - + - - + + - + - - + + - + @@ -9128,16 +10050,16 @@ - - + + - + - - + + - + @@ -9159,7 +10081,7 @@ - + @@ -9183,7 +10105,7 @@ - + @@ -9207,7 +10129,7 @@ - + @@ -9231,7 +10153,7 @@ - + @@ -9255,7 +10177,7 @@ - + @@ -9279,7 +10201,7 @@ - + @@ -9303,7 +10225,7 @@ - + @@ -9327,7 +10249,7 @@ - + @@ -9351,7 +10273,7 @@ - + @@ -9375,7 +10297,7 @@ - + @@ -9399,7 +10321,7 @@ - + @@ -9423,7 +10345,7 @@ - + @@ -9447,7 +10369,7 @@ - + @@ -9471,7 +10393,7 @@ - + @@ -9495,7 +10417,7 @@ - + @@ -9519,7 +10441,7 @@ - + @@ -9543,7 +10465,7 @@ - + @@ -9567,7 +10489,7 @@ - + @@ -9591,7 +10513,7 @@ - + @@ -9615,7 +10537,7 @@ - + @@ -9639,7 +10561,7 @@ - + @@ -9663,7 +10585,7 @@ - + @@ -9687,7 +10609,7 @@ - + @@ -9711,7 +10633,7 @@ - + @@ -9735,7 +10657,7 @@ - + @@ -9759,7 +10681,7 @@ - + @@ -9783,7 +10705,7 @@ - + @@ -9807,7 +10729,7 @@ - + @@ -9831,7 +10753,7 @@ - + @@ -9855,7 +10777,7 @@ - + @@ -9879,7 +10801,7 @@ - + @@ -9903,7 +10825,7 @@ - + @@ -9927,7 +10849,7 @@ - + @@ -9951,7 +10873,7 @@ - + @@ -9975,7 +10897,7 @@ - + @@ -9999,7 +10921,7 @@ - + @@ -10023,7 +10945,7 @@ - + @@ -10047,7 +10969,7 @@ - + @@ -10071,7 +10993,7 @@ - + @@ -10095,7 +11017,7 @@ - + @@ -10119,7 +11041,7 @@ - + @@ -10449,6 +11371,18 @@ + + + + + + + + + + + + @@ -10635,6 +11569,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12127,6 +13139,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12840,6 +13898,305 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13786,7 +15143,7 @@ - + diff --git a/bingads/v13/proxies/sandbox/reporting_service.xml b/bingads/v13/proxies/sandbox/reporting_service.xml index 836af773..f5596187 100644 --- a/bingads/v13/proxies/sandbox/reporting_service.xml +++ b/bingads/v13/proxies/sandbox/reporting_service.xml @@ -1,5 +1,5 @@ - + @@ -246,7 +246,7 @@ - + @@ -998,7 +998,7 @@ - + @@ -1254,7 +1254,7 @@ - + @@ -1646,19 +1646,19 @@ - + - + - - + + - + @@ -2089,7 +2089,7 @@ - + @@ -2275,7 +2275,7 @@ - + @@ -2354,7 +2354,7 @@ - + @@ -2417,7 +2417,7 @@ - + @@ -2992,7 +2992,7 @@ - + @@ -3418,7 +3418,7 @@ - + @@ -3654,7 +3654,7 @@ - + @@ -3751,7 +3751,7 @@ - + @@ -4141,7 +4141,7 @@ - + @@ -4211,7 +4211,7 @@ - + @@ -4252,7 +4252,7 @@ - + @@ -4272,7 +4272,7 @@ - + @@ -4325,7 +4325,7 @@ - + @@ -4349,7 +4349,7 @@ - + @@ -4420,7 +4420,7 @@ - +