Source code for twilio.base.page
import json
from twilio.base.exceptions import TwilioException
[docs]class Page(object):
"""
Represents a page of records in a collection.
A `Page` lets you iterate over its records and fetch the next and previous
pages in the collection.
"""
META_KEYS = {
'end',
'first_page_uri',
'next_page_uri',
'last_page_uri',
'page',
'page_size',
'previous_page_uri',
'total',
'num_pages',
'start',
'uri'
}
def __init__(self, version, response):
payload = self.process_response(response)
self._version = version
self._payload = payload
self._solution = {}
self._records = iter(self.load_page(payload))
def __iter__(self):
"""
A `Page` is a valid iterator.
"""
return self
def __next__(self):
return self.next()
[docs] def next(self):
"""
Returns the next record in the `Page`.
"""
return self.get_instance(next(self._records))
[docs] @classmethod
def process_response(cls, response):
"""
Load a JSON response.
:param Response response: The HTTP response.
:return dict: The JSON-loaded content.
"""
if response.status_code != 200:
raise TwilioException('Unable to fetch page', response)
return json.loads(response.text)
[docs] def load_page(self, payload):
"""
Parses the collection of records out of a list payload.
:param dict payload: The JSON-loaded content.
:return list: The list of records.
"""
if 'meta' in payload and 'key' in payload['meta']:
return payload[payload['meta']['key']]
else:
keys = set(payload.keys())
key = keys - self.META_KEYS
if len(key) == 1:
return payload[key.pop()]
raise TwilioException('Page Records can not be deserialized')
@property
def previous_page_url(self):
"""
:return str: Returns a link to the previous_page_url or None if doesn't exist.
"""
if 'meta' in self._payload and 'previous_page_url' in self._payload['meta']:
return self._payload['meta']['previous_page_url']
elif 'previous_page_uri' in self._payload and self._payload['previous_page_uri']:
return self._version.domain.absolute_url(self._payload['previous_page_uri'])
return None
@property
def next_page_url(self):
"""
:return str: Returns a link to the next_page_url or None if doesn't exist.
"""
if 'meta' in self._payload and 'next_page_url' in self._payload['meta']:
return self._payload['meta']['next_page_url']
elif 'next_page_uri' in self._payload and self._payload['next_page_uri']:
return self._version.domain.absolute_url(self._payload['next_page_uri'])
return None
[docs] def get_instance(self, payload):
"""
:param dict payload: A JSON-loaded representation of an instance record.
:return: A rich, resource-dependent object.
"""
raise TwilioException('Page.get_instance() must be implemented in the derived class')
[docs] def next_page(self):
"""
Return the `Page` after this one.
:return Page: The next page.
"""
if not self.next_page_url:
return None
response = self._version.domain.twilio.request('GET', self.next_page_url)
cls = type(self)
return cls(self._version, response, self._solution)
[docs] def previous_page(self):
"""
Return the `Page` before this one.
:return Page: The previous page.
"""
if not self.previous_page_url:
return None
response = self._version.domain.twilio.request('GET', self.previous_page_url)
cls = type(self)
return cls(self._version, response, self._solution)
def __repr__(self):
return '<Page>'