def ValidateAdExtension(extension, web_services): """Validate AdExtension object. Args: extension: dict AdExtension object. web_services: module for web services. Returns: AdExtension instance. """ if IsPyClass(extension): return extension glob_sanity_check.ValidateTypes(((extension, dict),)) if 'type' in extension: new_extension = GetPyClass(extension['type'], web_services) else: new_extension = GetPyClass('AdExtension', web_services) for key in extension: if extension[key] == 'None': continue if key in ('address',): data = ValidateAddress(extension[key], web_services) elif key in ('geoPoint',): data = ValidateGeoPoint(extension[key], web_services) else: glob_sanity_check.ValidateTypes(((extension[key], (str, unicode)),)) data = extension[key] new_extension.__dict__.__setitem__('_%s' % key, data) return new_extension
def ValidateBiddingStrategy(strategy, web_services): """Validate BiddingStrategy object. A BiddingStrategy is one of BudgetOptimizer, ConversionOptimizer, ManualCPC, ManualCPM. Args: strategy: dict BiddingStrategy object. web_services: module for web services. Returns: BiddingStrategy instance. """ if IsPyClass(strategy): return strategy glob_sanity_check.ValidateTypes(((strategy, dict),)) if 'type' in strategy: new_strategy = GetPyClass(strategy['type'], web_services) elif 'BiddingStrategy_Type' in strategy: new_strategy = GetPyClass(strategy['BiddingStrategy_Type'], web_services) else: msg = 'The \'type\' of the bidding transition is missing.' raise ValidationError(msg) for key in strategy: if strategy[key] == 'None': continue if key in ('bidCeiling',): data = ValidateMoney(strategy[key], web_services) else: glob_sanity_check.ValidateTypes(((strategy[key], (str, unicode)),)) data = strategy[key] new_strategy.__dict__.__setitem__('_%s' % key, data) return new_strategy
def ValidateBulkMutateRequest(bmr, web_services): """Validate BulkMutateRequest object. Args: bmr: dict BulkMutateRequest object. web_services: module for web services. Returns: BulkMutateRequest instance. """ if IsPyClass(bmr): return bmr glob_sanity_check.ValidateTypes(((bmr, dict),)) new_bmr = GetPyClass('BulkMutateRequest', web_services) for key in bmr: if bmr[key] == 'None': continue if key in ('operationStreams',): glob_sanity_check.ValidateTypes(((bmr[key], list),)) streams = [] for item in bmr[key]: stream = ValidateOperationStream(item, web_services) streams.append(stream) data = streams else: glob_sanity_check.ValidateTypes(((bmr[key], (str, unicode)),)) data = bmr[key] new_bmr.__dict__.__setitem__('_%s' % key, data) return new_bmr
def ValidateBid(bid, web_services): """Validate Bid object. Args: bid: dict Bid object. web_services: module for web services. Returns: Bid instance. """ if IsPyClass(bid): return bid glob_sanity_check.ValidateTypes(((bid, dict),)) new_bid = GetPyClass('Bid', web_services) for key in bid: if bid[key] == 'None': continue if key in ('amount',): data = ValidateMoney(bid[key], web_services) else: glob_sanity_check.ValidateTypes(((bid[key], (str, unicode)),)) data = bid[key] new_bid.__dict__.__setitem__('_%s' % key, data) return new_bid
def Mutate(self, ops): """Create, update, or remove ad params. Args: ops: list unique operations. Returns: tuple mutated ad params. """ method_name = 'mutateAdParam' if self.__config['soap_lib'] == SOAPPY: glob_sanity_check.ValidateTypes(((ops, list), )) new_ops = [] for op in ops: self.__sanity_check.ValidateOperation(op) new_ops.append( self.__message_handler.PackDictAsXml(op, 'operations')) ops = ''.join(new_ops) return self.__service.CallMethod( method_name.split( self.__class__.__name__.split('Service')[0])[0], (ops)) elif self.__config['soap_lib'] == ZSI: web_services = self.__web_services glob_sanity_check.ValidateTypes(((ops, list), )) for op in ops: op = self.__sanity_check.ValidateOperation(op, web_services) request = eval('web_services.%sRequest()' % method_name) return self.__service.CallMethod(method_name, (({ 'operations': ops }, )), 'AdParam', self.__loc, request)
def ValidateCriterion(operator, criterion, web_services): """Validate Criterion object. A Criterion object is one of Keyword, Website, Placement. Args: operator: str operator to use. criterion: dict Criterion object. web_services: module for web services. Returns: dict/Criterion updated criterion object or Criterion instance. """ if IsPyClass(criterion): return criterion glob_sanity_check.ValidateTypes(((criterion, dict),)) if operator in ('ADD', ''): if 'criterionType' in criterion: new_criterion = GetPyClass(criterion['criterionType'], web_services) elif 'type' in criterion: new_criterion = GetPyClass(criterion['type'], web_services) elif 'Criterion_Type' in criterion: new_criterion = GetPyClass(criterion['Criterion_Type'], web_services) else: msg = 'The \'criterionType\' or \'type\' of the criterion is missing.' raise ValidationError(msg) elif operator in ('SET', 'REMOVE'): new_criterion = GetPyClass('Criterion', web_services) for key in criterion: if criterion[key] == 'None': continue glob_sanity_check.ValidateTypes(((criterion[key], (str, unicode)),)) new_criterion.__dict__.__setitem__('_%s' % key, criterion[key]) return new_criterion
def ValidateDefinedReportJobV13(job, name_space): """Validate DefinedReportJob object. Args: job: dict report job object. name_space: str namespace to use for this ReportJob. Returns: instance untyped instance of ReportJob. """ items = [] for key in job: if (key == 'adWordsType' or key == 'crossClient' or key == 'endDay' or key == 'includeZeroImpression' or key == 'keywordType' or key == 'name' or key == 'selectedReportType' or key == 'startDay'): glob_sanity_check.ValidateTypes(((job[key], (str, unicode)),)) items.append('<%s>%s</%s>' % (key, job[key], key)) else: glob_sanity_check.ValidateTypes(((job[key], list),)) for item in job[key]: glob_sanity_check.ValidateTypes(((item, (str, unicode)),)) items.append('<%s>%s</%s>' % (key, item, key)) # Explicitly set job's namespace and type. job = UnType(''.join(items)) job._setAttr('xmlns:impl', name_space) job._setAttr('xsi3:type', 'impl:DefinedReportJob') return job
def Upload(self, media): """Upload a list of media. Args: media: list media objects whose byte data should be uploaded. Returns: tuple uploaded media objects. """ method_name = 'upload' if self.__config['soap_lib'] == SOAPPY: glob_sanity_check.ValidateTypes(((media, list),)) new_media = [] for item in media: self.__sanity_check.ValidateMedia(item) new_media.append(self.__message_handler.PackDictAsXml( item, 'media', [])) media = ''.join(new_media) return self.__service.CallMethod( method_name.split(self.__class__.__name__.split('Service')[0])[0], (media)) elif self.__config['soap_lib'] == ZSI: web_services = self.__web_services glob_sanity_check.ValidateTypes(((media, list),)) new_media = [] for item in media: new_media.append(self.__sanity_check.ValidateMedia(item, web_services)) request = eval('web_services.%sRequest()' % method_name) return self.__service.CallMethod(method_name, (({'media': new_media},)), 'Media', self.__loc, request)
def ValidateOperationStream(stream, web_services): """Validate OperationStream object. Args: stream: dict OperationStream object. web_services: module for web services. Returns: OperationStream instance. """ if IsPyClass(stream): return stream glob_sanity_check.ValidateTypes(((stream, dict),)) new_stream = GetPyClass('OperationStream', web_services) for key in stream: if stream[key] == 'None': continue if key in ('operations',): glob_sanity_check.ValidateTypes(((stream[key], list),)) ops = [] for item in stream[key]: ops.append(ValidateJobOperation(item, web_services)) data = ops elif key in ('scopingEntityId',): data = ValidateEntityId(stream[key], 'EntityId', web_services) else: glob_sanity_check.ValidateTypes(((stream[key], (str, unicode)),)) data = stream[key] new_stream.__dict__.__setitem__('_%s' % key, data) return new_stream
def ValidateDefinedReportJobV13(job, web_services): """Validate DefinedReportJob object. Args: job: dict DefinedReportJob object. web_services: module for web services. Returns: DefinedReportJob instance. """ report_type = GetPyClass('DefinedReportJob', web_services) new_job = report_type() for key in job: if job[key] == 'None': continue if key in ('adGroups', 'adGroupStatuses', 'aggregationTypes', 'campaigns', 'campaignStatuses', 'clientEmails', 'keywords', 'keywordStatuses', 'selectedColumns'): glob_sanity_check.ValidateTypes(((job[key], list),)) for item in job[key]: glob_sanity_check.ValidateTypes(((item, (str, unicode)),)) else: glob_sanity_check.ValidateTypes(((job[key], (str, unicode)),)) new_job.__dict__.__setitem__('_%s' % key, job[key]) return new_job
def ValidateTemplateElementField(field, web_services): """Validate TemplateElementField object. Args: field: dict TemplateElementField object. web_services: module for web services. Returns: TemplateElementField instance. """ if IsPyClass(field): return field glob_sanity_check.ValidateTypes(((field, dict),)) new_field = GetPyClass('TemplateElementField', web_services) for key in field: if field[key] == 'None': continue if key in ('fieldMedia',): data = ValidateMedia(field[key], web_services) else: glob_sanity_check.ValidateTypes(((field[key], (str, unicode)),)) data = field[key] new_field.__dict__.__setitem__('_%s' % key, data) return new_field
def ValidateProximityTarget(target, web_services): """Validate ProximityTarget object. Args: target: dict ProximityTarget object. web_services: module for web services. Returns: ProximityTarget instance. """ if IsPyClass(target): return target glob_sanity_check.ValidateTypes(((target, dict),)) new_target = GetPyClass('ProximityTarget', web_services) for key in target: if target[key] == 'None': continue if key in ('geoPoint',): data = ValidateGeoPoint(target[key], web_services) elif key in ('address',): data = ValidateAddress(target[key], web_services) else: glob_sanity_check.ValidateTypes(((target[key], (str, unicode)),)) data = target[key] new_target.__dict__.__setitem__('_%s' % key, data) return new_target
def ValidateTemplateElement(element, web_services): """Validate TemplateElement object. Args: element: dict TemplateElement object. web_services: module for web services. Returns: TemplateElement instance. """ if IsPyClass(element): return element glob_sanity_check.ValidateTypes(((element, dict),)) new_element = GetPyClass('TemplateElement', web_services) for key in element: if element[key] == 'None': continue if key in ('fields',): glob_sanity_check.ValidateTypes(((element[key], list),)) fields = [] for item in element[key]: fields.append(ValidateTemplateElementField(item, web_services)) data = fields else: glob_sanity_check.ValidateTypes(((element[key], (str, unicode)),)) data = element[key] new_element.__dict__.__setitem__('_%s' % key, data) return new_element
def ValidateMapEntry(entry, type, web_services): """Validate MapEntry object. MapEntry object is one of Media_MediaExtendedCapabilityType_Media_MediaExtendedCapabilityStateMapEntry, Media_Size, Media_Size_StringMapEntry, Type_AttributeMapEntry. Args: entry: dict MapEntry object. web_services: module for web services. Returns: XxxMapEntry instance. """ if IsPyClass(entry): return entry glob_sanity_check.ValidateTypes(((entry, dict),)) new_entry = GetPyClass(type, web_services) for key in entry: if entry[key] == 'None': continue if type in ('Media_Size_DimensionsMapEntry',) and key in ('value',): data = ValidateDimensions(entry[key], web_services) else: glob_sanity_check.ValidateTypes(((entry[key], (str, unicode)),)) data = entry[key] new_entry.__dict__.__setitem__('_%s' % key, data) return new_entry
def ValidateAd(operator, ad, web_services): """Validate Ad object. An Ad object is one of DeprecatedAd, MobileAd, MobileImageAd, ImageAd, LocalBusinessAd, TemplateAd, TextAd, Args: operator: str operator to use. ad: dict ad object. web_services: module for web services. Returns: dict/Ad updated ad object or Ad instance. """ if IsPyClass(ad): return ad glob_sanity_check.ValidateTypes(((ad, dict),)) if operator in ('ADD', ''): if 'adType' in ad: new_ad = GetPyClass(ad['adType'], web_services) elif 'type' in ad: new_ad = GetPyClass(ad['type'], web_services) elif 'Ad_Type' in ad: new_ad = GetPyClass(ad['Ad_Type'], web_services) else: msg = 'The \'adType\' or \'type\' of the ad is missing.' raise ValidationError(msg) elif operator in ('SET', 'REMOVE'): new_ad = GetPyClass('Ad', web_services) for key in ad: if ad[key] == 'None': continue if key in ('productImage', 'image', 'businessImage', 'customIcon', 'icon'): data = ValidateImage(ad[key], web_services) elif key in ('video',): data = ValidateVideo(ad[key], web_services) elif key in ('markupLanguages', 'mobileCarriers'): glob_sanity_check.ValidateTypes(((ad[key], list),)) for item in ad[key]: glob_sanity_check.ValidateTypes(((item, (str, unicode)),)) data = ad[key] elif key in ('target',): data = ValidateProximityTarget(ad[key], web_services) elif key in ('adUnionId',): data = ValidateEntityId(ad[key], 'AdUnionId', web_services) elif key in ('templateElements',): glob_sanity_check.ValidateTypes(((ad[key], list),)) elements = [] for item in ad[key]: elements.append(ValidateTemplateElement(item, web_services)) data = elements elif key in ('dimensions',): data = ValidateDimensions(ad[key], web_services) else: glob_sanity_check.ValidateTypes(((ad[key], (str, unicode)),)) data = ad[key] new_ad.__dict__.__setitem__('_%s' % key, data) return new_ad
def ValidateKeywordRequestV13(request): """Validate KeywordRequest object. Args: request: dict KeywordRequest object. """ glob_sanity_check.ValidateTypes(((request, dict),)) for key in request: glob_sanity_check.ValidateTypes(((request[key], (str, unicode)),))
def ValidateBids(bids, web_services): """Validate Bids object. A Bids object is on of AdGroupBids, AdGroupCriterionBids, BudgetOptimizerAdGroupBids, BudgetOptimizerAdGroupCriterionBids, ConversionOptimizerAdGroupBids, ConversionOptimizerAdGroupCriterionBids, ManualCPCAdGroupBids, ManualCPCAdGroupCriterionBids, ManualCPMAdGroupBids, ManualCPMAdGroupCriterionBids, PositionPreferenceAdGroupCriterionBids. Args: bids: dict Bids object. web_services: module for web services. Returns: XxxBids instance. """ if IsPyClass(bids): return bids glob_sanity_check.ValidateTypes(((bids, dict),)) if 'type' in bids: new_bids = GetPyClass(bids['type'], web_services) elif 'AdGroupBids_Type' in bids: new_bids = GetPyClass(bids['AdGroupBids_Type'], web_services) elif 'AdGroupCriterionBids_Type' in bids: new_bids = GetPyClass(bids['AdGroupCriterionBids_Type'], web_services) else: msg = 'The \'type\' of the bid is missing.' raise ValidationError(msg) for key in bids: if bids[key] == 'None': continue if key in ('proxyBid', 'maxCpc', 'maxCpm', 'proxyMaxCpc', 'proxyKeywordMaxCpc', 'proxySiteMaxCpc', 'targetCpa', 'keywordMaxCpc', 'keywordContentMaxCpc', 'siteMaxCpc', 'targetCpa'): data = ValidateBid(bids[key], web_services) elif key in ('positionPreferenceBids',): glob_sanity_check.ValidateTypes(((bids[key], dict),)) new_bids = GetPyClass('PositionPreferenceAdGroupCriterionBids', web_services) for sub_key in bids[key]: if sub_key in ('proxyMaxCpc',): data = ValidateBid(bids[key][sub_key], web_services) else: glob_sanity_check.ValidateTypes(((bids[key][sub_key], (str, unicode)),)) data = bids[key][sub_key] new_bids.__dict__.__setitem__('_%s' % sub_key, data) data = new_bids else: glob_sanity_check.ValidateTypes(((bids[key], (str, unicode)),)) data = bids[key] new_bids.__dict__.__setitem__('_%s' % key, data) return new_bids
def ValidateAdGroupRequestV13(request): """Validate AdGroupRequest object. Args: request: dict AdGroupRequest object. """ glob_sanity_check.ValidateTypes(((request, dict),)) for key in request: if key in ('keywordRequests',): glob_sanity_check.ValidateTypes(((request[key], list),)) for item in request[key]: ValidateKeywordRequestV13(item) else: glob_sanity_check.ValidateTypes(((request[key], (str, unicode)),))
def GetGzipReportDownloadUrl(self, report_job_id): """Return a URL for a compressed report. URL from which a compressed report with the given job ID can be downloaded (in Gzip format). Args: report_job_id: str ID of the report job. Ex: report_job_id = '1234567890' Returns: tuple response from the API method. """ glob_sanity_check.ValidateTypes(((report_job_id, (str, unicode)), )) method_name = 'getGzipReportDownloadUrl' if self.__config['soap_lib'] == SOAPPY: report_job_id = self.__sanity_check.UnType(report_job_id) return self.__service.CallMethod(method_name, (report_job_id)) elif self.__config['soap_lib'] == ZSI: web_services = self.__web_services request = eval('web_services.%sRequest()' % method_name) return self.__service.CallMethod(method_name, (({ 'reportJobId': report_job_id }, )), 'Report', self.__loc, request)
def ValidateKeywordRequestV13(request): """Validate KeywordRequest object. Args: request: dict keyword request. Returns: str keyword request converted into str type. """ glob_sanity_check.ValidateTypes(((request, dict),)) items = [] for key in request: glob_sanity_check.ValidateTypes(((request[key], (str, unicode)),)) items.append('<%s>%s</%s>' % (key, request[key], key)) return ''.join(items)
def ValidateNetworkTargetV13(network_target): """Validate NetworkTarget object. Args: network_target: list advertising networks targeted by this entity. Returns: str adertising networks converted into str type. """ glob_sanity_check.ValidateTypes(((network_target, list),)) items = [] for item in network_target: glob_sanity_check.ValidateTypes(((item, (str, unicode)),)) items.append('<networkTypes>%s</networkTypes>' % item) return ''.join(items)
def ValidateLanguageTargetV13(language_target): """Validate LanguageTarget object. Args: language_target: list languages targeted by this entity. Returns: str languages targeted converted into str type. """ glob_sanity_check.ValidateTypes(((language_target, list),)) items = [] for item in language_target: glob_sanity_check.ValidateTypes(((item, (str, unicode)),)) items.append('<languages>%s</languages>' % item) return ''.join(items)
def CheckKeywordTraffic(self, requests): """Check a batch of keywords to see whether they will get any traffic. Args: requests: list requests for keyword traffic checks. Ex: requests = [ { 'keywordText': 'Flowers', 'keywordType': 'Broad', 'language': 'en' } ] Returns: tuple response from the API method. """ glob_sanity_check.ValidateTypes(((requests, list), )) for item in requests: self.__sanity_check.ValidateKeywordTrafficRequestV13(item) method_name = 'checkKeywordTraffic' if self.__config['soap_lib'] == SOAPPY: return self.__service.CallMethod(method_name, (requests)) elif self.__config['soap_lib'] == ZSI: web_services = self.__web_services request = eval('web_services.%sRequest()' % method_name) return self.__service.CallMethod(method_name, (({ 'requests': requests }, )), 'TrafficEstimator', self.__loc, request)
def ValidateLanguageTargetV13(targets): """Validate LanguageTarget object. Args: targets: list LanguageTarget objects. Returns: list updated LanguageTarget objects. """ glob_sanity_check.ValidateTypes(((targets, list),)) languages = [] for item in targets: glob_sanity_check.ValidateTypes(((item, (str, unicode)),)) languages.append({'languages': item}) return languages
def PackRequestAsComplexType(request, version): """Pack (recursively) a Python tuple object into a SOAP data holder. Args: request: instance of Python tuple object. version: str the API version being used. Returns: ZSI.TCcompound.ComplexType packed Python data. """ if isinstance(request, dict): cpl = ZSI.TCcompound.ComplexType(ZSI.TCcompound.ComplexType, []) for key in request: value = request.get(key) data = PackRequestAsComplexType(value, version) if data and data != 'None': cpl.__dict__.__setitem__('_%s' % key, data) return cpl elif isinstance(request, list): if not SanityCheck.IsNewApi(version): request = CustomPackList(request) if isinstance(request, dict): return PackRequestAsComplexType(request, version) lst = [] for item in request: data = PackRequestAsComplexType(item, version) lst.append(data) return lst elif isinstance(request, tuple): return request else: return request
def GetReportFields(self, report_type): """Return a list of supported report fields. Args: report_type: str type of the report. Returns: tuple list of report fields. """ glob_sanity_check.ValidateTypes(((report_type, str), )) method_name = 'getReportFields' if self.__config['soap_lib'] == SOAPPY: report_type = self.__message_handler.PackDictAsXml( report_type, 'reportType', []) return self.__service.CallMethod( method_name.split( self.__class__.__name__.split('Service')[0])[0], (report_type)) elif self.__config['soap_lib'] == ZSI: web_services = self.__web_services request = eval('web_services.%sRequest()' % method_name) return self.__service.CallMethod(method_name, (({ 'reportType': report_type }, )), 'ReportDefinition', self.__loc, request)
def GetReportJobStatus(self, report_job_id): """Return the status of the report job with the given report job ID. Args: report_job_id: str ID of the report job. Ex: report_job_id = '1234567890' Returns: tuple response from the API method. """ glob_sanity_check.ValidateTypes(((report_job_id, (str, unicode)), )) method_name = 'getReportJobStatus' if self.__config['soap_lib'] == SOAPPY: report_job_id = self.__sanity_check.UnType(report_job_id) return self.__service.CallMethod(method_name, (report_job_id)) elif self.__config['soap_lib'] == ZSI: web_services = self.__web_services request = eval('web_services.%sRequest()' % method_name) return self.__service.CallMethod(method_name, (({ 'reportJobId': report_job_id }, )), 'Report', self.__loc, request)
def ValidateExemptionRequest(exemption): """Validate ExemptionRequest object. Args: exemption: dict ExemptionRequest object. """ glob_sanity_check.ValidateTypes(((exemption, dict),)) for key in exemption: if key in ('key',): glob_sanity_check.ValidateTypes(((exemption[key], dict),)) for sub_key in exemption[key]: if (isinstance(exemption[key][sub_key], tuple) and not exemption[key][sub_key]): continue glob_sanity_check.ValidateTypes(((exemption[key][sub_key], (str, unicode)),))
def GetCampaignCriterionService(self, server='https://adwords.google.com', version=None, http_proxy=None): """Call API method in CampaignCriterionService. Args: [optional] server: str API server to access for this API call. Possible values are: 'https://adwords.google.com' for live site and 'https://adwords-sandbox.google.com' for sandbox. The default behavior is to access live site. version: str API version to use. http_proxy: str HTTP proxy to use. Returns: CampaignCriterionService new instance of CampaignCriterionService object. """ headers = self.__GetAuthCredentialsForAccessLevel() if version is None: version = MIN_API_VERSION if Utils.BoolTypeConvert(self.__config['use_strict']): SanityCheck.ValidateServer(server, version) # Load additional configuration data. op_config = { 'server': server, 'version': version, 'group': 'cm', 'http_proxy': http_proxy } return CampaignCriterionService(headers, self.__config, op_config, self.__lock, self.__logger)
def ValidateNetworkTargetV13(targets): """Validate NetworkTarget object. Args: targets: list NetworkTarget objects. Returns: list updated NetworkTarget objects. """ glob_sanity_check.ValidateTypes(((targets, list),)) networks = [] for item in targets: glob_sanity_check.ValidateTypes(((item, (str, unicode)),)) networks.append({'networkTypes': item}) return networks