Skip to content

Commit

Permalink
Manager rewritten using the new BaseAPI class and a better descriptio…
Browse files Browse the repository at this point in the history
…n for pagination methods.
  • Loading branch information
koalalorenzo committed Aug 11, 2014
1 parent 148756d commit b4af900
Showing 1 changed file with 37 additions and 33 deletions.
70 changes: 37 additions & 33 deletions digitalocean/Manager.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import requests
from .baseapi import BaseAPI
from .Droplet import Droplet
from .Region import Region
from .Size import Size
Expand All @@ -7,35 +7,39 @@
from .SSHKey import SSHKey


class Manager(object):
class Manager(BaseAPI):
def __init__(self, token=""):
self.token = token
self.call_response = None

def __call_api(self, path, params=dict()):
payload = {}
headers = {'Authorization':'Bearer ' + self.token}
payload.update(params)
r = requests.get("https://api.digitalocean.com/v2/%s" % path,
headers=headers,
params=payload)
data = r.json()

self.call_response = data
if r.status_code != requests.codes.ok:
msg = [data[m] for m in ("id", "message") if m in data][1]
raise Exception(msg)

# Deal with pagination.
super(Image, self).__init__()
if token:
self.token = token

def get_data(*args, **kwargs):
"""
Customized version of get_data to perform __check_actions_in_data
"""
data = super(Droplet, self).get_data(*args, **kwargs)

params = {}
if kwargs.has_key("params"):
params = kwargs['params']
unpaged_data = self.__deal_with_pagination(args[0], data, params)

return unpaged_data

def __deal_with_pagination(self, url, data, params):
"""
Perform multiple calls in order to have a full list of elements
when the API are "paginated". (content list is divided in more
than one page)
"""
try:
pages = data['links']['pages']['last'].split('=')[-1]
key, values = data.popitem()
for page in range(2, int(pages) + 1):
payload.update({'page': page})
r = requests.get("https://api.digitalocean.com/v2/%s" % path,
headers=headers,
params=payload)
more_values = r.json().values()[0]
params.update({'page': page})
new_data = self.get_data(url, params=params)

more_values = new_data.values()[0]
for value in more_values:
values.append(value)
data = {}
Expand All @@ -49,7 +53,7 @@ def get_all_regions(self):
"""
This function returns a list of Region object.
"""
data = self.__call_api("/regions/")
data = self.get_data("/regions/")
regions = list()
for jsoned in data['regions']:
region = Region()
Expand All @@ -66,7 +70,7 @@ def get_all_droplets(self):
"""
This function returns a list of Droplet object.
"""
data = self.__call_api("/droplets/")
data = self.get_data("/droplets/")
droplets = list()
for jsoned in data['droplets']:
droplet = Droplet()
Expand Down Expand Up @@ -103,7 +107,7 @@ def get_all_sizes(self):
"""
This function returns a list of Size object.
"""
data = self.__call_api("/sizes/")
data = self.get_data("/sizes/")
sizes = list()
for jsoned in data['sizes']:
size = Size()
Expand All @@ -123,7 +127,7 @@ def get_all_images(self):
"""
This function returns a list of Image object.
"""
data = self.__call_api("/images/")
data = self.get_data("/images/")
images = list()
for jsoned in data['images']:
image = Image()
Expand All @@ -142,7 +146,7 @@ def get_my_images(self):
"""
This function returns a list of Image object.
"""
data = self.__call_api("/images/")
data = self.get_data("/images/")
images = list()
for jsoned in data['images']:
if not jsoned['public']:
Expand All @@ -162,7 +166,7 @@ def get_global_images(self):
"""
This function returns a list of Image object.
"""
data = self.__call_api("/images/")
data = self.get_data("/images/")
images = list()
for jsoned in data['images']:
if jsoned['public']:
Expand All @@ -182,7 +186,7 @@ def get_all_domains(self):
"""
This function returns a list of Domain object.
"""
data = self.__call_api("/domains/")
data = self.get_data("/domains/")
domains = list()
for jsoned in data['domains']:
domain = Domain()
Expand All @@ -197,7 +201,7 @@ def get_all_sshkeys(self):
"""
This function returns a list of SSHKey object.
"""
data = self.__call_api("/account/keys/")
data = self.get_data("/account/keys/")
ssh_keys = list()
for jsoned in data['ssh_keys']:
ssh_key = SSHKey()
Expand Down

0 comments on commit b4af900

Please sign in to comment.