Skip to main content
DDP API python client
---------------------

This is a python client library for the OAuth2 DDP API. Currently the following services are supported:

* UserListService
* UserListClientService


Installation
------------

::

pip install ddpclient


Test
----

::

python setup.py test

Deploy
----
Update the version and dependencies in `setup.py` and then:

::

python setup.py sdist upload


Requirement
-----------

1. OAuth client ID and OAuth client secret

DDP API uses OAuth 2.0 for authorization, to authorize the DDP API,
you must first create a Client ID and a Client Secret. Visit the
`Developer Console`_ to create a project and a OAuth client with
credentials.

You will use the client ID and secret to authorize DDP API.

2. AdWards Client `Customer ID`_

A unique three-part number that’s assigned to each AdWords account,
listed at the top of every page in your account.

You can set it as an environment variable `DDP_CLIENT_CUSTOMER_ID`. Or you can pass the ID into the `Client` class constructor (details below).

Commands
--------

When installed, the DDP API client provide two command for authorizing
your application access to a DDP account.

These commands are provided to help quickly getting access to the DDP API to run the examples.
It stores crendentials in a file named ``.ddp_credentials``.
If you are using Flask or Django, consider using the ``oauth2client.contrib.flask_util`` and ``oauth2client.contrib.django_util``

Generate Authorize URL
^^^^^^^^^^^^^^^^^^^^^^

The ``ddp_authorize_url`` command expect the OAuth client id and client
secret as parameter and generate a URL for getting a AuthCode

::

$ ddp_authorize_url
usage: ddp_authorize_url [client_id client_secret]

Authorizing
^^^^^^^^^^^

The ``ddp_authorize`` command expect the OAuth client id, secrete and
the AuthCode obtained by using the ``ddp_authorize_url`` URL

::

$ ddp_authorize
usage: ddp_authorize [client_id client_secret auth_code]

Once this is done, a file ``.ddp_credentials`` is created and store the
resulting redentials. The credentials from this file will be used from
then on.

Usage
-----

Get UserList example:
^^^^^^^^^^^^^^^^^^^^^

::

from ddpclient import UserListSelector, Client, Auth

credentials = Auth().get_credentials()
api_client = Client(credentials)
selector = UserListSelector(). \
select_fields('Id', 'Size'). \
filter_by('Status', 'CLOSED'). \
order_by('Id', True). \
at_page(1, 3)
response = api_client.get(selector)

print response

# (UserListPage){
# totalNumEntries = 108
# Page.Type = "UserListPage"
# entries[] =
# (BasicUserList){
# id = 978704062
# isReadOnly = False
# name = "Name one"
# size = 0
# sizeRange = "LESS_THAN_FIVE_HUNDRED"
# listType = "REMARKETING"
# UserList.Type = "BasicUserList"
# },
# (BasicUserList){
# id = 178703382
# isReadOnly = False
# name = "Name two"
# size = 0
# sizeRange = "LESS_THAN_FIVE_HUNDRED"
# listType = "REMARKETING"
# UserList.Type = "BasicUserList"
# },
# (BasicUserList){
# id = 138700763
# isReadOnly = False
# name = "Name three"
# size = 0
# sizeRange = "LESS_THAN_FIVE_HUNDRED"
# listType = "REMARKETING"
# UserList.Type = "BasicUserList"
# },
# }


Add UserList example:
^^^^^^^^^^^^^^^^^^^^^

::

from ddpclient import UserListSelector, Client, Auth

credentials = Auth().get_credentials()
api_client = Client(credentials)

new_user_list = api_client.create_empty_user_list()
new_user_list.name = 'TEST'
new_user_list.description = 'TEST Description'
new_user_list.status = 'CLOSED'
new_user_list.integrationCode = '123'
new_user_list.accountUserListStatus = 'INACTIVE'

response = api_client.add(new_user_list)

print response


# (UserListReturnValue){
# ListReturnValue.Type = "UserListReturnValue"
# value[] =
# (BasicUserList){
# id = 12345678
# isReadOnly = False
# name = "TEST"
# description = "TEST Description"
# status = "CLOSED"
# integrationCode = "123"
# accessReason = "OWNED"
# accountUserListStatus = "INACTIVE"
# membershipLifeSpan = 30
# listType = "REMARKETING"
# isEligibleForSearch = True
# isEligibleForDisplay = True
# UserList.Type = "BasicUserList"
# },
# }


Update UserList example:
^^^^^^^^^^^^^^^^^^^^^^^^

::

from ddpclient import UserListSelector, Client, Auth

credentials = Auth().get_credentials()
api_client = Client(credentials)

new_user_list = api_client.create_empty_user_list()
new_user_list.id = 12345678
new_user_list.description = 'TEST Description'

response = api_client.set(new_user_list)

print response

# (UserListReturnValue){
# ListReturnValue.Type = "UserListReturnValue"
# value[] =
# (BasicUserList){
# id = 12345678
# isReadOnly = False
# name = "TEST Updated Name"
# description = "TEST Description"
# status = "CLOSED"
# integrationCode = "123"
# accessReason = "OWNED"
# accountUserListStatus = "INACTIVE"
# membershipLifeSpan = 30
# listType = "REMARKETING"
# isEligibleForSearch = True
# isEligibleForDisplay = True
# UserList.Type = "BasicUserList"
# },
# }


Remove UserList example:
^^^^^^^^^^^^^^^^^^^^^^^^

::

from ddpclient import UserListSelector, Client, Auth

credentials = Auth().get_credentials()
api_client = Client(credentials)

new_user_list = api_client.create_empty_user_list()
new_user_list.id = 395803975

response = api_client.remove(new_user_list)

print response

# suds.WebFault: Server raised fault: '[OperatorError.OPERATOR_NOT_SUPPORTED @ operations[0]]'
# Note: UserListService does not support deleting user list, this code servers as example of 'remove' operations



Classes
-------

``Auth``
^^^^^^^^

``Auth`` class can be used to generate URL (``authorize_url``) for user giving authorization:

::

Auth().authorize_url(client_id, client_secret)



``Auth`` also accept a auth code and obtain credentials after user having visited the above URL and granted the authorization to you application.
The credentials object returned will be saved into a ``storage`` object.

::

Auth().authorize(client_id, client_secret, auth_code)


When the ``authorize`` method is done, by default ``Auth`` save the credentials object ( ``oauth2client.client.OAuth2Credentials``)
into a file (``.ddp_credentials``) using ``oauth2client.file.Storage``. Once saved, this credential can be retrieved by:

::

credentials = Auth().get_credentials()


Saving credentials into a file for later retrieval is very simple but does not work for environments like Heroku.
You might want to save the credentials object into a database so that the credentials can survive between deployments.
The ``Auth`` constructor can accept a custom storage object with ``put`` and ``get`` methods defined.
Using custom storage object can save/retrieve credentials object into/from a database, for example.

::

storage = MyDBStorage()
auth = Auth(storage)

auth.authorize(client_id, client_secret, auth_code)
credentials = auth.get_credentials()


``Client``
^^^^^^^^^^

``Client`` manages SOAP services. It requires an ``oauth2client.client.OAuth2Credentials`` object ( most likely retrieved by ``Auth``)
to its constructor. ``Client`` then use the crendentials details to make SOAP API calls to available services (``UserListService`` and ``UserListClientService``)

A client customer id is also required to set the SOAP header in every request. You can provide it via an environment variable ``DDP_CLIENT_CUSTOMER_ID`` or pass it
explicitly to the constructor.


::

credentials = Auth().get_credentials()
client_customer_id = '123-123-1234'
api_service = Client(credentials, client_customer_id).user_list_service_soap_client


``UserListSelector`` and ``UserListClientSelector``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

These two selector classes are provided to specified entities to retrieve. They share the same interface. Example


::

from ddpclient import UserListClientSelector, Client, Auth
import datetime

selector = UserListClientSelector(). \
select_fields('ClientCustomerName', 'UserListId'). \
filter_by('Status', 'ACTIVE'). \
order_by('UserListId'). \
order_by('ClientCustomerName', desc=True). \
from_date_range(datetime.date(2016, 1, 1), datetime.date(2016, 1, 7)). \
at_page(1, 3)

.. _Developer Console: http://
.. _Customer ID: https://support.google.com/adwords/answer/29198?hl=en-AU

Release files for ddpclient 2.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ddpclient 2.0.3
File Size Uploaded
ddpclient-2.0.3.tar.gz 9.4 kB Details

Release files / ddpclient-2.0.3.tar.gz

Download URL ddpclient-2.0.3.tar.gz
Size 9.4 kB
Tags Source
SHA-256 checksum
How to use checksums
816821b3d7760699ce0b38cc49ee4bb64d2f04ac824cb5a1428a2b61499d9933
BLAKE2b-256 checksum
How to use checksums
eedb9c04a864f2b28f5e34bde5233bae36cc2df15b9091f0e9043a9f2d89673f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via Python-urllib/3.7

Release history Release notifications | RSS feed

This release

2.0.3 This release

1 release file

2.0.2

1 release file

2.0.1

1 release file

2.0.0

1 release file

1.0.1

1 release file

1.0.0

1 release file

0.1.4

1 release file

0.1.3

1 release file

0.1.2

1 release file

0.1.1

1 release file

0.1.0

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page