Пример #1
0
    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()
Пример #2
0
    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()
Пример #3
0
    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)
Пример #4
0
    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
Пример #5
0
    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()
Пример #6
0
    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)
Пример #7
0
    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)
Пример #8
0
    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