mirror of
https://github.com/krateng/maloja.git
synced 2025-04-15 16:30:32 +03:00
Experimental pagination feedback for API
This commit is contained in:
parent
7ac6473ce3
commit
f613abaa20
@ -18,7 +18,7 @@ from ..pkg_global.conf import malojaconfig, data_dir
|
||||
|
||||
|
||||
from ..__pkginfo__ import VERSION
|
||||
from ..malojauri import uri_to_internal, compose_querystring, internal_to_uri
|
||||
from ..malojauri import uri_to_internal, compose_querystring, internal_to_uri, create_uri
|
||||
from .. import images
|
||||
from ._apikeys import apikeystore, api_key_correct
|
||||
|
||||
@ -142,6 +142,37 @@ def add_common_args_to_docstring(filterkeys=False,limitkeys=False,delimitkeys=Fa
|
||||
|
||||
|
||||
|
||||
|
||||
def add_pagination(endpoint,filterkeys=False,limitkeys=False,delimitkeys=False):
|
||||
|
||||
def decorator(func):
|
||||
def wrapper(*args,**kwargs):
|
||||
|
||||
k_filter, k_limit, k_delimit, k_amount, _ = uri_to_internal(kwargs,api=True)
|
||||
keydicts = []
|
||||
if filterkeys: keydicts.append(k_filter)
|
||||
if limitkeys: keydicts.append(k_limit)
|
||||
if delimitkeys: keydicts.append(k_delimit)
|
||||
keydicts.append(k_amount)
|
||||
|
||||
|
||||
result = func(*args,**kwargs)
|
||||
|
||||
result['pagination'] = {
|
||||
'page': k_amount['page'],
|
||||
'perpage': k_amount['perpage'] if (k_amount['perpage'] is not math.inf) else None,
|
||||
'next_page': create_uri(api.pathprefix + '/' + endpoint,*keydicts,{'page':k_amount['page']+1}) if len(result.get('list',[]))==k_amount['perpage'] else None,
|
||||
'prev_page': create_uri(api.pathprefix + '/' + endpoint,*keydicts,{'page':k_amount['page']-1}) if k_amount['page'] > 0 else None
|
||||
}
|
||||
|
||||
return result
|
||||
|
||||
wrapper.__doc__ = func.__doc__
|
||||
wrapper.__annotations__ = func.__annotations__
|
||||
return wrapper
|
||||
|
||||
return decorator
|
||||
|
||||
@api.get("test")
|
||||
@catch_exceptions
|
||||
def test_server(key=None):
|
||||
@ -194,6 +225,7 @@ def server_info():
|
||||
@api.get("scrobbles")
|
||||
@catch_exceptions
|
||||
@add_common_args_to_docstring(filterkeys=True,limitkeys=True,amountkeys=True)
|
||||
@add_pagination("scrobbles",filterkeys=True,limitkeys=True)
|
||||
def get_scrobbles_external(**keys):
|
||||
"""Returns a list of scrobbles.
|
||||
|
||||
|
@ -73,7 +73,11 @@ def uri_to_internal(keys,forceTrack=False,forceArtist=False,forceAlbum=False,api
|
||||
#different max than the internal one! the user doesn't get to disable pagination
|
||||
if "page" in keys: amountkeys["page"] = int(keys["page"])
|
||||
if "perpage" in keys: amountkeys["perpage"] = int(keys["perpage"])
|
||||
|
||||
#amountkeys["reverse"] = (keys.get("reverse","no").lower() == "yes")
|
||||
# we have different defaults for different things, so here we need to actually pass true false or nothing dependent
|
||||
# on whether its specified
|
||||
if keys.get("reverse","").lower() == 'yes': amountkeys['reverse'] = True
|
||||
elif keys.get("reverse","").lower() == 'no': amountkeys['reverse'] = False
|
||||
|
||||
#5
|
||||
specialkeys = {}
|
||||
@ -144,6 +148,8 @@ def internal_to_uri(keys):
|
||||
urikeys.append("page",str(keys["page"]))
|
||||
if "perpage" in keys:
|
||||
urikeys.append("perpage",str(keys["perpage"]))
|
||||
if "reverse" in keys:
|
||||
urikeys.append("reverse","yes" if keys['reverse'] else "no")
|
||||
|
||||
if keys.get("separate",False):
|
||||
urikeys.append("separate","yes")
|
||||
|
Loading…
x
Reference in New Issue
Block a user