Add web API methods for fetching donations from NationBuilder
This commit is contained in:
parent
49e07f04d9
commit
80f8608340
|
@ -24,9 +24,14 @@
|
||||||
NationBuilder Web API
|
NationBuilder Web API
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class NationBuilderWebAPI(object):
|
class NationBuilderWebAPI(object):
|
||||||
"""
|
"""
|
||||||
Simple web API for NationBuilder.
|
Simple web API for NationBuilder.
|
||||||
|
@ -84,7 +89,7 @@ class NationBuilderWebAPI(object):
|
||||||
"""
|
"""
|
||||||
return self._request('GET', api_method, params=params)
|
return self._request('GET', api_method, params=params)
|
||||||
|
|
||||||
def get_people(self, page_size=100, progress=None, **kwargs):
|
def get_people(self, page_size=10, progress=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Retrieve all Person records.
|
Retrieve all Person records.
|
||||||
|
|
||||||
|
@ -109,7 +114,7 @@ class NationBuilderWebAPI(object):
|
||||||
message="Fetching Person data from NationBuilder")
|
message="Fetching Person data from NationBuilder")
|
||||||
return people
|
return people
|
||||||
|
|
||||||
def get_people_with_tag(self, tag, page_size=100, max_pages=None, **kwargs):
|
def get_people_with_tag(self, tag, page_size=10, max_pages=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Retrieve all Person records with the given tag.
|
Retrieve all Person records with the given tag.
|
||||||
|
|
||||||
|
@ -135,3 +140,62 @@ class NationBuilderWebAPI(object):
|
||||||
pages += 1
|
pages += 1
|
||||||
|
|
||||||
return people
|
return people
|
||||||
|
|
||||||
|
def get_donations(self, page_size=10, max_pages=None, **kwargs):
|
||||||
|
"""
|
||||||
|
Retrieve all Donation records.
|
||||||
|
|
||||||
|
https://apiexplorer.nationbuilder.com/nationbuilder#Donations
|
||||||
|
"""
|
||||||
|
donations = []
|
||||||
|
|
||||||
|
# get first page
|
||||||
|
url = f'/api/v1/donations?limit={page_size}'
|
||||||
|
response = self.get(url)
|
||||||
|
data = response.json()
|
||||||
|
donations.extend(data['results'])
|
||||||
|
pages = 1
|
||||||
|
|
||||||
|
# get more pages, until complete
|
||||||
|
while data['next']:
|
||||||
|
if max_pages and pages >= max_pages:
|
||||||
|
break
|
||||||
|
response = self.get(data['next'])
|
||||||
|
data = response.json()
|
||||||
|
donations.extend(data['results'])
|
||||||
|
pages += 1
|
||||||
|
log.debug("have fetched %s pages", pages)
|
||||||
|
|
||||||
|
return donations
|
||||||
|
|
||||||
|
def search_donations(self, page_size=10, max_pages=None, **kwargs):
|
||||||
|
"""
|
||||||
|
Search for matching Donation records.
|
||||||
|
|
||||||
|
https://apiexplorer.nationbuilder.com/nationbuilder#Donations
|
||||||
|
"""
|
||||||
|
donations = []
|
||||||
|
|
||||||
|
# get first page
|
||||||
|
url = f'/api/v1/donations/search?limit={page_size}'
|
||||||
|
for field in ('created_since', 'succeeded_since', 'failed_since'):
|
||||||
|
value = kwargs.get(field)
|
||||||
|
if value:
|
||||||
|
value = value.strftime('%Y-%m-%dT%H:%M:%S%z')
|
||||||
|
url += f"&{field}={value}"
|
||||||
|
response = self.get(url)
|
||||||
|
data = response.json()
|
||||||
|
donations.extend(data['results'])
|
||||||
|
pages = 1
|
||||||
|
|
||||||
|
# get more pages, until complete
|
||||||
|
while data['next']:
|
||||||
|
if max_pages and pages >= max_pages:
|
||||||
|
break
|
||||||
|
response = self.get(data['next'])
|
||||||
|
data = response.json()
|
||||||
|
donations.extend(data['results'])
|
||||||
|
pages += 1
|
||||||
|
log.debug("have fetched %s pages", pages)
|
||||||
|
|
||||||
|
return donations
|
||||||
|
|
Loading…
Reference in a new issue