Exemplo n.º 1
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()
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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'])
Exemplo n.º 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
Exemplo n.º 5
0
    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())
Exemplo n.º 6
0
    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)
Exemplo n.º 7
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
Exemplo n.º 8
0
    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
Exemplo n.º 9
0
    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