Repository URL to install this package:
|
Version:
0.1.0 ▾
|
from __future__ import unicode_literals
import json
import six
from .api import api_client
def _build_search_string(term_filters=None, range_filters=None,
order_by=None, limit=None, offset=None,
**kwargs):
data = {
'limit': limit or '',
'offset': offset or 0,
'orderBy': order_by or '',
}
filters = {}
for arg, value in six.iteritems(kwargs):
if term_filters and arg in term_filters:
filters[arg] = six.text_type(value)
elif range_filters and arg in range_filters:
try:
if not isinstance(value, (list, tuple)) or len(value) != 2:
raise ValueError
for v in value:
if not isinstance(v, (float, six.integer_types)):
raise ValueError
filters[arg] = value
except ValueError:
raise ValueError(
"Duedil range filter must be a list of 2 numeric values")
else:
raise TypeError(
"{arg} is not available as a filter".format(arg=arg))
data['filters'] = json.dumps(filters) if filters else ''
return data
class SearchableModelMeta(type):
term_filters = None
range_filters = None
search_path = None
def search(klass, order_by=None, limit=None, offset=None, **kwargs):
data = _build_search_string(term_filters=klass.term_filters,
range_filters=klass.range_filters,
order_by=order_by, limit=limit,
offset=offset, **kwargs)
results_raw = api_client.get(klass.search_path, data=data)
results = []
for r in results_raw['response']['data']:
results.append(
klass(**r)
)
return results