I'm passing this on from my colleague. Is this approach similar to
what you ended up doing? It should make it into the official Python
client library release.
==================================================
I've tested this with SOAPpy and it works just fine. Campaign object
should look something like below. In SanityCheck.py, he will need to
replace ValidateGeoTarget function with the new version below.
campaign = {
'dailyBudget': '1000000',
'enableSeparateContentBids': 'False',
'geoTargeting': {
'proximityTargets': {
'circles': [
{
'latitudeMicroDegrees': '40763600',
'longitudeMicroDegrees': '-73830030',
'radiusMeters': '9656'
}
]
},
},
'languageTargeting': ['en'],
'networkTargeting': ['GoogleSearch', 'SearchNetwork'],
'status': 'Paused'
}
def ValidateGeoTarget(geo_target):
"""Validate GeoTarget object.
Args:
geo_target: dict geographic targeting rules for this entity.
Returns:
str geographic targeting converted into str type.
"""
SanityCheck.ValidateTypes(((geo_target, dict),))
targeting = ''
for key in geo_target:
if key == 'targetAll':
SanityCheck.ValidateTypes(((geo_target[key], str),))
targeting += '<%s>%s</%s>' % (key, geo_target[key], key)
elif key == 'cityTargets':
SanityCheck.ValidateTypes(((geo_target[key], list),))
targeting += '<%s>' % key
for item in geo_target[key]:
SanityCheck.ValidateTypes(((item, str),))
targeting += '<cities>%s</cities>' % item
targeting += '</%s>' % key
elif key == 'countryTargets':
SanityCheck.ValidateTypes(((geo_target[key], list),))
targeting += '<%s>' % key
for item in geo_target[key]:
SanityCheck.ValidateTypes(((item, str),))
targeting += '<countries>%s</countries>' % item
targeting += '</%s>' % key
elif key == 'metroTargets':
SanityCheck.ValidateTypes(((geo_target[key], list),))
targeting += '<%s>' % key
for item in geo_target[key]:
SanityCheck.ValidateTypes(((item, str),))
targeting += '<metros>%s</metros>' % item
targeting += '</%s>' % key
elif key == 'regionTargets':
SanityCheck.ValidateTypes(((geo_target[key], list),))
targeting += '<%s>' % key
for item in geo_target[key]:
SanityCheck.ValidateTypes(((item, str),))
targeting += '<regions>%s</regions>' % item
targeting += '</%s>' % key
elif key == 'proximityTargets':
SanityCheck.ValidateTypes(((geo_target[key], dict),))
targeting += '<%s>' % key
for sub_key in geo_target[key]:
targeting += '<%s>' % sub_key
SanityCheck.ValidateTypes(((geo_target[key][sub_key], list),))
for item in geo_target[key][sub_key]:
SanityCheck.ValidateTypes(((item, dict),))
for sub_sub_key in item:
SanityCheck.ValidateTypes(((item[sub_sub_key], str),))
targeting += '<%s>%s</%s>' % (sub_sub_key,
item[sub_sub_key], sub_sub_key)
targeting += '</%s>' % sub_key
targeting += '</%s>' % key
else:
pass
return targeting
===========================================