コード例 #1
0
  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
コード例 #2
0
    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
コード例 #3
0
  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
コード例 #4
0
 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]
コード例 #5
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
コード例 #6
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