Skip to content

Commit

Permalink
Merge branch 'feature/filtering' into master
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelkuty committed Nov 9, 2015
2 parents 88e696b + 63f6bbe commit 86174f4
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 14 deletions.
13 changes: 12 additions & 1 deletion horizon_contrib/api/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ class ClientBase(object):
"""

def do_request(self, path, method="GET", params={}, headers={}):
'''make raw request'''

if method == "GET":
response = requests.get(path, headers=headers)
elif method == "POST":
Expand All @@ -48,6 +50,7 @@ def do_request(self, path, method="GET", params={}, headers={}):
return response

def process_response(self, response, request):
'''process response and handle statues and exceptions'''

if response.status_code <= 204:
result = response.json()
Expand All @@ -68,6 +71,10 @@ def process_response(self, response, request):
raise exceptions.HTTPError('Unexpected exception 500')
return Exception(response.status_code)

def process_data(self, result, request):
'''process result and returns data'''
return result

def request(self, path, method="GET", params={}, request={}, headers={}):
"""main method which provide
Expand Down Expand Up @@ -97,15 +104,19 @@ def request(self, path, method="GET", params={}, request={}, headers={}):

LOG.debug("%s - %s%s - %s" % (method, self.api, path, params))

# do request
response = self.do_request(
'%s%s' % (self.api, path),
method,
params,
headers)

# process response
result = self.process_response(response, _request)
# process data
data = self.process_data(result, _request)

return result
return data

def set_api(self):
self.api = '%s://%s:%s%s' % (
Expand Down
47 changes: 34 additions & 13 deletions horizon_contrib/api/managers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,30 @@

import operator
from horizon_contrib.api.base import ClientBase
from urllib import urlencode


class Manager(ClientBase):
class SearchOptionsMixin(object):

'''Encapsulation of search options'''

def get_search_options(self, opts={}):
'''merge search options with defaults'''
opts.update(getattr(self, 'search_options', {}))
return opts

def get_query_string(self, search_opts):
'''returns query string from search options'''
return urlencode(search_opts)

def get_url(self, id=None, search_opts={}):
base_url = '/%s' % self.scope if not id else '/{0}/{1}'.format(
self.scope, id)
return '?'.join([base_url,
self.get_query_string(search_opts)])


class Manager(ClientBase, SearchOptionsMixin):

"""base manager class which provide consistent interface
for working with API
Expand All @@ -24,33 +45,33 @@ def all(self, *args, **kwargs):

def get(self, id, request=None):
return self.request(
'/{0}/{1}'.format(self.scope, id),
self.get_url(id),
'GET',
request)
request=request)

def create(self, data, request=None):
return self.request(
'/{0}/'.format(self.scope),
self.get_url(),
'POST',
data,
request)
params=data,
request=request)

def update(self, id, data, request=None):
return self.request(
'/{0}/{1}/'.format(self.scope, id),
self.get_url(id),
'PUT',
data,
request)
params=data,
request=request)

def delete(self, id, request=None, *args, **kwargs):
return self.request(
'/{0}/{1}/'.format(self.scope, id),
self.get_url(id),
'DELETE',
request)
request=request)

def list(self, request=None):
def list(self, request=None, search_opts={}):
return self.request(
'/%s' % self.scope,
self.get_url(id, search_opts=search_opts),
'GET',
request=request)

Expand Down

0 comments on commit 86174f4

Please sign in to comment.