def test_t008_wad_Budget_save_update(self): print('wad_Budget test t008') client = adwords.AdWordsClient.LoadFromStorage() # test budget name modification # # create a budget with a name newbudget0 = Budget(budgetname='test008_budget0name0') newbudget0.save() # check that the name is correct aw_budget = Budget.getbudget(client, newbudget0.budgetid) self.assertEqual(aw_budget['name'], 'test008_budget0name0') # change the name newbudget0.budgetname = 'test008_budget0name0_modified' newbudget0.save() # check that the name change is correct aw_budget = Budget.getbudget(client, newbudget0.budgetid) self.assertEqual(aw_budget['name'], 'test008_budget0name0_modified') # test budget amount modification # # create a budget with an amount newbudget1 = Budget(budgetname='test008_budget1name1', budgetamount='50000000') newbudget1.save() # check that the amount is correct aw_budget = Budget.getbudget(client, newbudget1.budgetid) self.assertEqual(int(aw_budget['amount']['microAmount']), 50000000) # change the amount newbudget1.budgetamount = '60000000' newbudget1.save() # check that the amount change is correct aw_budget = Budget.getbudget(client, newbudget1.budgetid) self.assertEqual(int(aw_budget['amount']['microAmount']), 60000000) # clean up newbudget0.delete() newbudget1.delete()
def test_t003_wad_Campaign_sync_add_remove_usingsync(self): print('wad_Campaign test t003') client = adwords.AdWordsClient.LoadFromStorage() # sync with django db Campaign.sync(client) # beginning django campaigns queryset beginningcampaigns = Campaign.objects.all() # beginning awcampaignslst beginningawcampaignslst = Campaign.listcampaigns(client) # assert that the django campaign set and aw campaignset correspond self.assertEqual(len(beginningcampaigns), len(beginningawcampaignslst)) # create three new campaigns in aw campaign0id = Campaign._aw_addcampaign(client, 'test_t003_campaign0')['id'] campaign1id = Campaign._aw_addcampaign(client, 'test_t003_campaign1')['id'] campaign2id = Campaign._aw_addcampaign(client, 'test_t003_campaign2')['id'] # sync with django db Campaign.sync(client) # test if the new campaigns added to aw are in the Django system self.assertEqual( len(beginningcampaigns) + 3, len(Campaign.objects.all())) self.assertEqual( len(beginningawcampaignslst) + 3, len(Campaign.objects.all())) self.assertTrue( Campaign.objects.filter( campaignname='test_t003_campaign0').exists()) self.assertTrue( Campaign.objects.filter( campaignname='test_t003_campaign1').exists()) self.assertTrue( Campaign.objects.filter( campaignname='test_t003_campaign2').exists()) # removes the campaigns from aw Campaign.removecampaign(client, campaign0id) Campaign.removecampaign(client, campaign1id) Campaign.removecampaign(client, campaign2id) # sync with django db Campaign.sync(client) # test if the django campaign set is equal to the aw campaign set after deletions self.assertEqual(len(beginningcampaigns), len(Campaign.objects.all())) self.assertEqual(len(beginningawcampaignslst), len(Campaign.objects.all())) self.assertFalse( Campaign.objects.filter( campaignname='test_t003_campaign0').exists()) self.assertFalse( Campaign.objects.filter( campaignname='test_t003_campaign1').exists()) self.assertFalse( Campaign.objects.filter( campaignname='test_t003_campaign2').exists()) Budget.removenorefbudgets(client)
def test_t004_wad_Budget_sync_modify(self): print('wad_Budget test t004') client = adwords.AdWordsClient.LoadFromStorage() # add 3 budgets to aw only budget0 = Budget._aw_addbudget(client, 'test_t004_budget0', 7000000000) budget1 = Budget._aw_addbudget(client, 'test_t004_budget1', 7000000000) budget2 = Budget._aw_addbudget(client, 'test_t004_budget2', 7000000000) # initial sync Budget.sync(client) # control will be used to check if the values return to original after modifications beginningbudgets_control = Budget.objects.all() # queryset used to modify values beginningbudgets = Budget.objects.all() # make sure we are working with querysets that aren't empty, should be at least 3 self.assertTrue(len(beginningbudgets) >= 3) self.assertTrue(len(beginningbudgets_control) >= 3) # change values in the django database for budget in beginningbudgets: budget.budgetstatus = Budget.STATE_TESTING budget.budgetname = budget.budgetname + '_testing' budget.budgetamount = budget.budgetamount + 10000000 budget.save(sync_aw=False) # sync Budget.sync(client) # queryset used to test if values revert to original values postmodifybudgets = Budget.objects.all() # make sure we are working with querysets that aren't empty, should be at least 3 b/c of SetUp self.assertTrue(len(postmodifybudgets) >= 3) # iterate budgets in database to check if values returned to original for budget in postmodifybudgets: controlbudget = beginningbudgets_control.get(id=budget.id) self.assertEqual(controlbudget.budgetstatus, budget.budgetstatus) self.assertEqual(controlbudget.budgetname, budget.budgetname) self.assertEqual(controlbudget.budgetamount, budget.budgetamount) # remove the budgets we initially created Budget.removebudget(client, budget0['budgetId']) Budget.removebudget(client, budget1['budgetId']) Budget.removebudget(client, budget2['budgetId'])
def test_t005_wad_Budget_create_remove_sync(self): print('wad_Budget test t005') client = adwords.AdWordsClient.LoadFromStorage() # create the budgets in aw and django newbudget0 = Budget(budgetname='test005_budget0name0') newbudget1 = Budget(budgetname='test005_budget1name1') newbudget2 = Budget(budgetname='test005_budget2name2') newbudget0.save() newbudget1.save() newbudget2.save() # remove the budgets from aw Budget._aw_removebudget(client, newbudget0.budgetid) Budget._aw_removebudget(client, newbudget1.budgetid) Budget._aw_removebudget(client, newbudget2.budgetid) #Budget.removebudget ( client, newbudget0.budgetid ) #Budget.removebudget ( client, newbudget1.budgetid ) #Budget.removebudget ( client, newbudget2.budgetid ) # sync with django db Budget.sync(client) return
def test_t003_wad_Budget_sync_add_remove_usingsync(self): print('wad_Budget test t003') client = adwords.AdWordsClient.LoadFromStorage() # sync with django db Budget.sync(client) # beginning django budgets queryset beginningbudgets = Budget.objects.all() # beginning awbudgetslst beginningawbudgetslst = Budget.listbudgets(client) # assert that the django budget set and aw budgetset correspond self.assertEqual(len(beginningbudgets), len(beginningawbudgetslst)) # create three new budgets in aw budget0id = Budget._aw_addbudget(client, 'test_t003_budget0', 7000000000)['budgetId'] budget1id = Budget._aw_addbudget(client, 'test_t003_budget1', 7000000000)['budgetId'] budget2id = Budget._aw_addbudget(client, 'test_t003_budget2', 7000000000)['budgetId'] # sync with django db Budget.sync(client) # test if the new budgets added to aw are in the Django system self.assertEqual(len(beginningbudgets) + 3, len(Budget.objects.all())) self.assertEqual( len(beginningawbudgetslst) + 3, len(Budget.objects.all())) self.assertTrue( Budget.objects.filter(budgetname='test_t003_budget0').exists()) self.assertTrue( Budget.objects.filter(budgetname='test_t003_budget1').exists()) self.assertTrue( Budget.objects.filter(budgetname='test_t003_budget2').exists()) # removes the budgets from aw Budget.removebudget(client, budget0id) Budget.removebudget(client, budget1id) Budget.removebudget(client, budget2id) # sync with django db Budget.sync(client) # test if the django budget set is equal to the aw budget set after deletions self.assertEqual(len(beginningbudgets), len(Budget.objects.all())) self.assertEqual(len(beginningawbudgetslst), len(Budget.objects.all())) self.assertFalse( Budget.objects.filter(budgetname='test_t003_budget0').exists()) self.assertFalse( Budget.objects.filter(budgetname='test_t003_budget1').exists()) self.assertFalse( Budget.objects.filter(budgetname='test_t003_budget2').exists())
def test_t002_wad_Budget_add_remove_usingsync(self): print('wad_Budget test t002') client = adwords.AdWordsClient.LoadFromStorage() # creates three new budgets budget0id = Budget._aw_addbudget(client, 'test_t002_budget0', 6000000000)['budgetId'] budget1id = Budget._aw_addbudget(client, 'test_t002_budget1', 6000000000)['budgetId'] budget2id = Budget._aw_addbudget(client, 'test_t002_budget2', 6000000000)['budgetId'] # gets the lists of all budgets budgetlist = Budget.listbudgets(client) budgetidlist = [] # builds a list of budgets with status != REMOVED for budget in budgetlist: if budget['status'] != Budget.STATE_REMOVED: budgetidlist.append(budget['budgetId']) # asserts the budgets added are in the list self.assertTrue(budget0id in budgetidlist) self.assertTrue(budget1id in budgetidlist) self.assertTrue(budget2id in budgetidlist) # removes the budgets Budget.removebudget(client, budget0id) Budget.removebudget(client, budget1id) Budget.removebudget(client, budget2id) # gets the list of all budgets budgetlist = Budget.listbudgets(client) budgetidlist = [] # builds a list of budgets with status != REMOVED for budget in budgetlist: if budget['status'] != Budget.STATE_REMOVED: budgetidlist.append(budget['budgetId']) # asserts the budgets added are not in the list self.assertFalse(budget0id in budgetidlist) self.assertFalse(budget1id in budgetidlist) self.assertFalse(budget2id in budgetidlist)
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
def addcampaign(client, incampaignname, incampaignbudget=None, incampaignstatus=None, incampaignadchanneltype=None, incampaigntargetgooglesearch=None, incampaigntargetsearchnetwork=None, incampaigntargetcontentnetwork=None): """ Add an AdWords campaign entry. Attempts to add a campaign to AdWords. Does not check if the campaign exists. If it is successful adding the campaign to Ad Words, it also adds a campaign to Django DB. **Parameters** client \: googleads.adwords.AdWordsClient object The client to request API service from. incampaignname \: str The campaign name. incampaignbudget \: wad_Budget.Budget An instance of type wad_Budget.Budget representing the shared budget that the campaign will use. incampaignstatus \: str Enumerated str type, either REMOVED, PAUSED, ENABLED, TESTING Note \: AdWords prohibits Ad Channel Type being modified after creation. **Returns** wad_Campaign.Campaign \: newly created Campaign instance """ if incampaignstatus == None: incampaignstatus = Campaign.STATE_ENABLED if incampaignadchanneltype == None: incampaignadchanneltype = Campaign.TYPE_AD_CHAN_SEARCH if incampaigntargetgooglesearch == None: incampaigntargetgooglesearch = True if incampaigntargetsearchnetwork == None: incampaigntargetsearchnetwork = False if incampaigntargetcontentnetwork == None: incampaigntargetcontentnetwork = False # create a new budget if one is not specified if incampaignbudget == None or not isinstance(incampaignbudget, Budget): incampaignbudget = Budget.addbudget( client, 'budget_for_%s' % incampaignname) # Add new Django database entry for the newly added AdWords campaign # add it here because init checks adwords to see if it's possible to # enter this item, adwords does not let you ad an item that has same # name as their db newcampaign = Campaign( campaignid=None, campaignname=incampaignname, campaignadchanneltype=incampaignadchanneltype, campaignstatus=incampaignstatus, campaignbudget=incampaignbudget, campaigntargetgooglesearch=incampaigntargetgooglesearch, campaigntargetsearchnetwork=incampaigntargetsearchnetwork, campaigntargetcontentnetwork=incampaigntargetcontentnetwork, ) addcampaignobj = Campaign._aw_addcampaign(client, incampaignname, incampaignbudget, incampaignstatus) if addcampaignobj != None: # the unsaved db object needs updated after _aw_addcampaign if method paramaters were none newcampaign.campaignid = addcampaignobj['id'] # finally we are ready to save the database instance newcampaign.save(sync_aw=False) print('Campaign %s %s added to Django.' % (addcampaignobj['id'], addcampaignobj['name'])) else: print('Failed to add Campaign ( campaignname="%s" ... )' % incampaignname) return newcampaign
def _aw_addcampaign(client, incampaignname, incampaignbudget=None, incampaignstatus=None, incampaignadchanneltype=None, incampaigntargetgooglesearch=None, incampaigntargetsearchnetwork=None, incampaigntargetcontentnetwork=None): """ Add an AdWords campaign entry. Attempts to add a campaign to AdWords. Does not check if the campaign exists. Note \: Does not affect the Django database. **Parameters** client \: googleads.adwords.AdWordsClient object The client to request API service from. incampaignname \: str The campaign name. incampaignbudget \: wad_Budget.Budget An instance of type wad_Budget.Budget representing the shared budget that the campaign will use. incampaignstatus \: str Enumerated str type, either REMOVED, PAUSED, ENABLED, TESTING incampaignadchanneltype \: str Enumerated ad channel type, either SEARCH, DISPLAY, SHOPPING, MULTI_CHANNEL Note \: AdWords prohibits Ad Channel Type being modified after creation. **Returns** suds.sudsobject.Campaign \: newly created suds Campaign instance or suds.WebFault \: error message """ rval = None newbudget = None # set default campaign status if one is not specified if incampaignstatus == None: incampaignstatus = Campaign.STATE_ENABLED # set default campaign channel type if one is not specified if incampaignadchanneltype == None: incampaignadchanneltype = Campaign.TYPE_AD_CHAN_SEARCH if incampaigntargetgooglesearch == None: incampaigntargetgooglesearch = True if incampaigntargetsearchnetwork == None: incampaigntargetsearchnetwork = False if incampaigntargetcontentnetwork == None: incampaigntargetcontentnetwork = False # create a new budget if one is not specified if incampaignbudget == None or not isinstance(incampaignbudget, Budget): incampaignbudget = Budget.addbudget( client, 'budget_for_%s' % incampaignname) # request a service object from the client object service = Campaign.serviceobj(client) # create the mutate string mutatestring = Campaign.adddict( incampaignname, incampaignstatus, incampaignadchanneltype, incampaignbudget, incampaigntargetgooglesearch, incampaigntargetsearchnetwork, incampaigntargetcontentnetwork, ) client.validate_only = True # set this to true to test for errors success = False # assume failure, change the value for success try: # call mutate rslts = service.mutate([mutatestring]) # if there is a partial failure or success, # the var success will be set to true success = True except suds.WebFault as e: # if there is an error print the error print('Add campaign failed: %s' % e) # if the mutate was successful set validate_only to False if success: client.validate_only = False # make the mutate call rslts = service.mutate([mutatestring]) rval = rslts['value'][0] # print the results print('Campaign %s %s added to AdWords.' % (rval['id'], rval['name'])) return rval