def listbudgetsincluderemoved ( client ): """ Return a list of ALL budgets as suds dictionary objects. Makes a call to the AdWords API using AWQL requesting BudgetId, BudgetName, Amount, BudgetStatus Note \: Does not affect the Django database. **Parameters** client \: googleads.adwords.AdWordsClient object The client to request API service from. **Returns** suds[] \: list of budgets as suds dictionary objects """ # request a service object from the client object service = Budget.serviceobj ( client ) querytext = Budget.querytext_includeremoved() rslts = list_from_query ( client, service, querytext ) return rslts
def listcampaigns(client): """ Return a list of campaigns as suds dictionary objects. Makes a call to the AdWords API using AWQL requesting Id, Status, Name, BudgetId, BudgetName, Amount, DeliveryMethod, BudgetStatus WHERE Status != "REMOVED" Note \: Does not affect the Django database. **Parameters** client \: googleads.adwords.AdWordsClient object The client to request API service from. **Returns** suds[] \: list of campaigns as suds dictionary objects """ # request a service object from the client object service = Campaign.serviceobj(client) querytext = Campaign.querytext() rslts = list_from_query(client, service, querytext) return rslts
def _aw_removenorefbudgets ( client ): """ Removes budgets with 0 reference count. This happens to budgets after their associated campaign is removed. Queries AW API for list of budgets with 0 refcount and deletes all occurences of them. **Parameters** client \: googleads.adwords.AdWordsClient object The client to request API service from. **Returns** suds.sudsobject.Budget[] \: list of removed budgets """ # request a service object from the client object service = Budget.serviceobj ( client ) querystring = Budget.querytextref ( ) rslts = list_from_query ( client, service, querystring ) dellst = [] rval = [] for item in rslts: if item['referenceCount'] == 0: dellst.append ( Budget.deldict ( item['budgetId'] ) ) if ( len ( dellst ) != 0 ): # call mutate for the list of deletes rval = service.mutate ( dellst )['value'] else: rval = [] return rval
def getbudget ( client, inbudgetid ): """ Returns the suds object dict representing the budget specified by inbudgetid. **Parameters** client \: googleads.adwords.AdWordsClient object The client to request API service from. **Returns** suds{} \: budget as suds dictionary object """ # request a service object from the client object service = Budget.serviceobj ( client ) querytext = Budget.querytextid ( inbudgetid ) rslts = list_from_query ( client, service, querytext ) return rslts[0]
def sync ( client, budgetid = None ): """ Synchronize AdWords budgets with Django. Queries all budgets in AdWords and inserts, deletes or modifies Django database entries corresponding to the AdWords entries. Note \: AdWords budgets with status "REMOVED" are not sychronized. **Parameters** client \: googleads.adwords.AdWordsClient object The client to request API service from. budgetid \: str Optional budgetid to sync a single budget **Returns** class \: { rremoved[], rmodified[], radded[] } rremoved \: list of instances removed from Django rmodified \: list of instances modified in Django radded \: list of instances added to Django """ class rvalc (): rremoved = [] rmodified = [] radded = [] rval = rvalc() service = Budget.serviceobj( client ) query = Budget.querytext( budgetid ) rslt = list_from_query ( client, service, query ) for awbudgetobj in rslt: # if the budget has not been marked as 'REMOVED' if awbudgetobj['status'] != 'REMOVED': try: # # Update existing Django values from AdWords account. # # budgetamount, budgetname, budgetstatus # get current values from Django database obj = Budget.objects.get ( budgetid = awbudgetobj['budgetId'] ) updated = False # todo: update delivery method if obj.budgetname != awbudgetobj['name']: obj.budgetname = awbudgetobj['name'] print ( 'Updated budget %s %s name in Django databse.' % ( obj.budgetid, obj.budgetname ) ) updated = True if obj.budgetstatus != awbudgetobj['status']: obj.budgetstatus = awbudgetobj['status'] print ( 'Updated budget %s %s status in Django databse.' % ( obj.budgetid, obj.budgetname ) ) updated = True if obj.budgetamount != awbudgetobj['amount']['microAmount']: obj.budgetamount = awbudgetobj['amount']['microAmount'] print ( 'Updated budget %s %s budget amount in Django database.' % (obj.budgetid, obj.budgetamount ) ) updated = True if updated == True: obj.save( sync_aw=False ) rval.rmodified.append(obj) except ObjectDoesNotExist: # # Add new Django values from AdWords account. # newbudget = Budget( budgetid = awbudgetobj['budgetId'], budgetstatus = awbudgetobj['status'], budgetname = awbudgetobj['name'], budgetamount = awbudgetobj['amount']['microAmount'], ) newbudget.save( sync_aw=False ) print ( 'Added budget %s %s to Django database.' % ( newbudget.budgetid, newbudget.budgetname ) ) rval.radded.append(newbudget) # # Remove old Django values according to AdWords account. # remove any old campaigns from Django db that don't exist in # adwords anymore # # make a list of awcampaignobj ids awbudgetobjids = [] for awbudgetobj in rslt: if awbudgetobj['status'] != 'REMOVED': awbudgetobjids.append ( awbudgetobj['budgetId'] ) # iterate Django db entries and check if the entry exists # in adwords, remove the entry if it doesn't exist for dbbudgetobj in Budget.objects.all ( ): if dbbudgetobj.budgetid not in awbudgetobjids: dbbudgetobj.delete() print ( 'Deleted budget %s %s from Django database.' % ( dbbudgetobj.budgetid, dbbudgetobj.budgetname ) ) rval.rremoved.append ( dbbudgetobj ) return rval
def sync(client): """ Synchronize AdWords campaigns with Django. Queries all campaigns in AdWords and inserts, deletes or modifies Django database entries corresponding to the AdWords entries. Note \: AdWords campaigns with status "REMOVED" are not sychronized. **Parameters** client \: googleads.adwords.AdWordsClient object The client to request API service from. **Returns** class \: { rremoved[], rmodified[], radded[] } rremoved \: list of instances removed from Django rmodified \: list of instances modified in Django radded \: list of instances added to Django """ class rvalc(): rremoved = [] rmodified = [] radded = [] rval = rvalc() service = Campaign.serviceobj(client) query = Campaign.querytext() rslt = list_from_query(client, service, query) for awcampaignobj in rslt: # if the campaign has not been marked as 'REMOVED' if awcampaignobj['status'] != 'REMOVED': try: # # Update existing Django values from AdWords account. # # campaignamount, campaignname, campaignstatus # get current values from Django database obj = Campaign.objects.get(campaignid=awcampaignobj['id']) updated = False # todo: update delivery method if obj.campaignname != awcampaignobj['name']: obj.campaignname = awcampaignobj['name'] print( 'Updated campaign %s %s name in Django database.' % (obj.campaignid, obj.campaignname)) updated = True if obj.campaignstatus != awcampaignobj['status']: obj.campaignstatus = awcampaignobj['status'] print( 'Updated campaign %s %s status in Django database.' % (obj.campaignid, obj.campaignname)) updated = True print(awcampaignobj) if obj.campaigntargetgooglesearch != awcampaignobj[ 'networkSetting']['targetGoogleSearch']: obj.campaigntargetgooglesearch = awcampaignobj[ 'networkSetting']['targetGoogleSearch'] print( 'Updated campaign %s %s targetGoogleSearch in Django database.' % (obj.campaignid, obj.campaignname)) updated = True if obj.campaigntargetsearchnetwork != awcampaignobj[ 'networkSetting']['targetSearchNetwork']: obj.campaigntargetsearchnetwork = awcampaignobj[ 'networkSetting']['targetSearchNetwork'] print( 'Updated campaign %s %s targetSearchNetwork in Django database.' % (obj.campaignid, obj.campaignname)) updated = True if obj.campaigntargetcontentnetwork != awcampaignobj[ 'networkSetting']['targetContentNetwork']: obj.campaigntargetcontentnetwork = awcampaignobj[ 'networkSetting']['targetContentNetwork'] print( 'Updated campaign %s %s targetContentNetwork in Django database.' % (obj.campaignid, obj.campaignname)) updated = True # if we are syncing a campaign that has a different budget id if obj.campaignbudget.budgetid != awcampaignobj['budget'][ 'budgetId']: # check if the new budget id exists in Django try: # if it exists use the existing one obj.campaignbudget = Budget.objects.get( budgetid=awcampaignobj['budget']['budgetId']) obj.save(sync_aw=False) except ObjectDoesNotExist: # if it doesn't exist use a new one obj.campaignbudget = Budget( budgetid=awcampaignobj['budget']['budgetId'], budgetname=awcampaignobj['budget'] ['budgetName'], budgetamount=awcampaignobj['budget'] ['budgetAmount'], budgetdeliverymethod=awcampaignobj['budget'] ['deliveryMethod'], budgetstatus=awcampaignobj['budget']['status'], ) obj.campaignbudget.save() obj.save(sync_aw=False) print( 'Updated campaign %s %s campaign budget in Django database.' % (obj.campaignid, obj.campaignamount)) updated = True #if ( obj.campaignbudget.budgetname != awcampaignobj['budget']['budgetName'] or #obj.campaignbudget.budgetamount != awcampaignobj['budget']['budgetAmount'] or #obj.campaignbudget.budgetdeliverymethod != awcampaignobj['budget']['deliveryMethod'] or #obj.campaignbudget.budgetstatus != awcampaignobj['budget']['status'] ): #Budget.sync ( obj.campaignbudget.budgetid ) if updated == True: obj.save(sync_aw=False) rval.rmodified.append(obj) except ObjectDoesNotExist: # # Add new Django values from AdWords account. # # create / sync the budget associated with the new campaign budget = None # query the django database to see if the budget exists in the database try: budget = Budget.objects.get( budgetid=awcampaignobj['budget']['budgetId']) # if the budget doesn't exist create it in django db with sync_aw=False except ObjectDoesNotExist: budget = Budget( budgetid=awcampaignobj['budget']['budgetId'], budgetname=awcampaignobj['budget']['name'], budgetdeliverymethod=awcampaignobj['budget'] ['deliveryMethod'], budgetstatus=awcampaignobj['budget']['status'], budgetamount=awcampaignobj['budget']['amount'] ['microAmount']) budget.save(sync_aw=False) newcampaign = Campaign( campaignid=awcampaignobj['id'], campaignstatus=awcampaignobj['status'], campaignname=awcampaignobj['name'], campaignbudget=budget, campaignadchanneltype=awcampaignobj[ 'advertisingChannelType'], ) newcampaign.save(sync_aw=False) print('Added campaign %s %s to Django database.' % (newcampaign.campaignid, newcampaign.campaignname)) rval.radded.append(newcampaign) # # Remove old Django values according to AdWords account. # remove any old campaigns from Django db that don't exist in # adwords anymore # # make a list of awcampaignobj ids awcampaignobjids = [] for awcampaignobj in rslt: if awcampaignobj['status'] != 'REMOVED': awcampaignobjids.append(awcampaignobj['id']) # iterate Django db entries and check if the entry exists # in adwords, remove the entry if it doesn't exist for dbcampaignobj in Campaign.objects.all(): if dbcampaignobj.campaignid not in awcampaignobjids: dbcampaignobj.delete() print('Deleted campaign %s %s from Django database.' % (dbcampaignobj.campaignid, dbcampaignobj.campaignname)) rval.rremoved.append(dbcampaignobj) return rval