def test_t007_wad_Budget_save(self): print('wad_Budget test t007') # save a new instance newbudget0 = Budget(budgetname='test007_budget0name0') newbudget0.save() newbudget0.delete()
def test_t006_wad_Budget_pre_init(self): print('wad_Budget test t006') newbudget0 = Budget(budgetname='test006_budget0name0') newbudget0.save() # try to init a new budget with the same name as the previous budget with self.assertRaises(suds.WebFault): newbudget1 = Budget(budgetname='test006_budget0name0') newbudget1.save() newbudget0.delete()
def save(self, *args, **kwargs): # TODO: create a campaign budget in advance of save # print ( 'save' ) # print ( dir ( self ) ) # print ( self.campaignbudget ) # print ( type ( self.campaignbudget ) ) try: dvar = self.campaignbudget except ObjectDoesNotExist: newbudget = Budget(budgetname='budget_for_%s' % self.campaignname, budgetamount=20000000) newbudget.save() self.campaignbudget = newbudget # if self.campaignname == '' or self.campaignname == None: # raise AttributeError( 'Saving a budget without required attribute campaignname' ) # if not isinstance ( self.campaignbudget, Budget ): # errorstr = 'Saving a campaign with a campaignbudget not of type Budget, ' # errorstr += 'campaigns must be connected with a valid Budget instance.' # raise AttributeError( errorstr ) # # create a new budget if one is not specified # if ( self.campaignbudget == None or self.campaignbudget == '' ): # newbudget = Budget ( budgetname = 'budget_for_%s' % self.campaignname, # budgetamount = 20000000 ) # newbudget.save() # self.campaignbudget = newbudget # if snyc_aw is in the arguments for save, assign it to a member # variable of self for pre_save and pop it if 'sync_aw' in kwargs: self.sync_aw = kwargs['sync_aw'] kwargs.pop('sync_aw') else: self.sync_aw = True super(Campaign, self).save(*args, **kwargs)
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_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_t023_wad_Campaign_sync_with_existing_budget(self): print('wad_Campaign test t023') client = adwords.AdWordsClient.LoadFromStorage() # sync with django db Campaign.sync(client) budget0 = Budget(budgetname='t023_budget0', budgetamount=10000000) budget0.save() budget1 = Budget(budgetname='t023_budget1', budgetamount=20000000) budget1.save() budget2 = Budget(budgetname='t023_budget2', budgetamount=30000000) budget2.save() campaign0 = Campaign(campaignname='t023_campaign0', campaignbudget=budget0) campaign0.save() campaign1 = Campaign(campaignname='t023_campaign1', campaignbudget=budget1) campaign1.save() campaign2 = Campaign(campaignname='t023_campaign2', campaignbudget=budget2) campaign2.save() allcampaigns = Campaign.listcampaigns(client) for campaign in allcampaigns: if campaign['budget']['budgetId'] == budget0.budgetid: self.assertEqual(campaign['budget']['amount']['microAmount'], budget0.budgetamount) if campaign['budget']['budgetId'] == budget1.budgetid: self.assertEqual(campaign['budget']['amount']['microAmount'], budget1.budgetamount) if campaign['budget']['budgetId'] == budget2.budgetid: self.assertEqual(campaign['budget']['amount']['microAmount'], budget2.budgetamount) campaign0.delete() campaign1.delete() campaign2.delete() removedbudgets = Budget.removenorefbudgets(client) self.assertEqual(len(removedbudgets), 3)
def test_t026_wad_Campaign_modify_sync(self): print('wad_Campaign test t026') client = adwords.AdWordsClient.LoadFromStorage() service = Campaign.serviceobj(client) # modify name campaign0 = Campaign(campaignname='t026_campaign0') campaign0.save() mdict = Campaign.modifydict( campaign0.campaignid, 't026_campaign0_renamed', campaign0.campaignstatus, campaign0.campaignbudget, campaign0.campaigntargetgooglesearch, campaign0.campaigntargetsearchnetwork, campaign0.campaigntargetcontentnetwork, ) service.mutate([mdict]) campaign0 = Campaign.objects.get(campaignid=campaign0.campaignid) self.assertEqual(campaign0.campaignname, 't026_campaign0') Campaign.sync(client) campaign0 = Campaign.objects.get(campaignid=campaign0.campaignid) self.assertEqual(campaign0.campaignname, 't026_campaign0_renamed') # modify status campaign1 = Campaign(campaignname='t026_campaign1') campaign1.save() statusnew = Campaign.objects.get( campaignid=campaign1.campaignid).campaignstatus if campaign1.campaignstatus == Campaign.STATE_ENABLED: statusnew = Campaign.STATE_PAUSED else: statusnew = Campaign.STATE_ENABLED mdict = Campaign.modifydict(campaign1.campaignid, campaign1.campaignname, statusnew, campaign1.campaignbudget, campaign1.campaigntargetgooglesearch, campaign1.campaigntargetsearchnetwork, campaign1.campaigntargetcontentnetwork) service.mutate([mdict]) if statusnew == Campaign.STATE_ENABLED: statusnew = Campaign.STATE_PAUSED else: statusnew = Campaign.STATE_ENABLED campaign1 = Campaign.objects.get(campaignid=campaign1.campaignid) self.assertEqual(campaign1.campaignstatus, statusnew) Campaign.sync(client) if statusnew == Campaign.STATE_ENABLED: statusnew = Campaign.STATE_PAUSED else: statusnew = Campaign.STATE_ENABLED campaign1 = Campaign.objects.get(campaignid=campaign1.campaignid) self.assertEqual(campaign1.campaignstatus, statusnew) # modify budget campaign2 = Campaign(campaignname='t026_campaign2') campaign2.save() oldbudget = Campaign.objects.get( campaignid=campaign2.campaignid).campaignbudget newbudget = Budget(client, 'test_t026_budget2', 6000000000) newbudget.save() mdict = Campaign.modifydict(campaign2.campaignid, campaign2.campaignname, campaign2.campaignstatus, newbudget.asdict(), campaign2.campaigntargetgooglesearch, campaign2.campaigntargetsearchnetwork, campaign2.campaigntargetcontentnetwork) service.mutate([mdict]) Campaign.sync(client) campaign2 = Campaign.objects.get(campaignid=campaign2.campaignid) self.assertNotEqual(campaign2.campaignbudget.budgetid, oldbudget.budgetid) self.assertEqual(campaign2.campaignbudget.budgetid, newbudget.budgetid) # modify budget name campaign3 = Campaign(campaignname='t026_campaign3') campaign3.save() abudget = campaign3.campaignbudget abudget.budgetname = 'budget_for_t026_new_budget_name' abudget.save() #mdict = Campaign.modifydict (campaign3.campaignid, #campaign3.campaignname, #campaign3.campaignstatus, #campaign3.campaignbudget, #campaign3.campaigntargetgooglesearch, #campaign3.campaigntargetsearchnetwork, #campaign3.campaigntargetcontentnetwork, #) #service.mutate ( [mdict] ) campaign3budgetname = Campaign.objects.get( campaignid=campaign3.campaignid).campaignbudget.budgetname self.assertEqual(campaign3budgetname, 'budget_for_t026_campaign3') Campaign.sync(client) campaign3budgetname = Campaign.objects.get( campaignid=campaign3.campaignid).campaignbudget.budgetname self.assertEqual(campaign3budgetname, 'budget_for_t026_new_budget_name') # modify budget 4 campaign4 = Campaign(campaignname='t026_campaign4') campaign4.save() oldbudget = Campaign.objects.get( campaignid=campaign4.campaignid).campaignbudget newbudget = Budget(client, 'test_t026_budget4', 6000000000) newbudget.save() campaign4.campaignbudget = newbudget campaign4.save() #Campaign.sync( client ) campaign4 = Campaign.objects.get(campaignid=campaign4.campaignid) self.assertNotEqual(campaign4.campaignbudget.budgetid, oldbudget.budgetid) self.assertEqual(campaign4.campaignbudget.budgetid, newbudget.budgetid) # modify ad channel type #campaign2 = Campaign ( campaignname = 't026_campaign2' ) #campaign2.save () #adchan = Campaign.objects.get ( campaignid = campaign2.campaignid ).campaignadchanneltype #if campaign2.campaignadchanneltype == Campaign.TYPE_AD_CHAN_SEARCH: #adchan = Campaign.TYPE_AD_CHAN_DISPLAY #else: #adchan = Campaign.TYPE_AD_CHAN_SEARCH #mdict = Campaign.modifydict (campaign2.campaignid, #campaign2.campaignname, #campaign2.campaignstatus, #adchan, #campaign2.campaignbudget ) #print ( mdict ) #service.mutate ( [mdict] ) #if adchan == Campaign.TYPE_AD_CHAN_SEARCH: #adchan = Campaign.TYPE_AD_CHAN_DISPLAY #else: #adchan = Campaign.TYPE_AD_CHAN_SEARCH #campaign2 = Campaign.objects.get ( campaignid = campaign2.campaignid ) #self.assertEqual ( campaign2.campaignadchanneltype, adchan ) #Campaign.sync( client ) #if adchan == Campaign.TYPE_AD_CHAN_SEARCH: #adchan = Campaign.TYPE_AD_CHAN_DISPLAY #else: #adchan = Campaign.TYPE_AD_CHAN_SEARCH #campaign2 = Campaign.objects.get ( campaignid = campaign2.campaignid ) #self.assertEqual ( campaign2.campaignadchanneltype, adchan ) campaign0.delete() campaign1.delete() campaign2.delete() campaign3.delete() campaign4.delete() removedbudgets = Budget.removenorefbudgets(client) self.assertEqual(len(removedbudgets), 5)
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