initial naive implementation of file_list sorting

This commit is contained in:
kafene 2018-04-25 21:19:56 -04:00
parent 1f1b348638
commit 326d0cb8a3

View file

@ -1,3 +1,5 @@
from pprint import pprint
import binascii import binascii
import logging.handlers import logging.handlers
import mimetypes import mimetypes
@ -97,6 +99,16 @@ CONNECTION_MESSAGES = {
SHORT_ID_LEN = 20 SHORT_ID_LEN = 20
MAX_UPDATE_FEE_ESTIMATE = 0.3 MAX_UPDATE_FEE_ESTIMATE = 0.3
FILE_SORT_FIELD_NAME = 'name'
FILE_SORT_FIELD_DATE = 'date'
FILE_SORT_FIELD_PRICE = 'price'
FILE_SORT_ORDER_ASCENDING = 'asc'
FILE_SORT_ORDER_DESCENDING = 'desc'
FILE_SORT_ORDERS = [
FILE_SORT_ORDER_ASCENDING,
FILE_SORT_ORDER_DESCENDING,
]
class IterableContainer(object): class IterableContainer(object):
def __iter__(self): def __iter__(self):
@ -925,11 +937,13 @@ class Daemon(AuthJSONRPCServer):
defer.returnValue(lbry_file) defer.returnValue(lbry_file)
@defer.inlineCallbacks @defer.inlineCallbacks
def _get_lbry_files(self, return_json=False, full_status=True, **kwargs): def _get_lbry_files(self, return_json=False, full_status=True, sorts=None, **kwargs):
lbry_files = list(self.lbry_file_manager.lbry_files) lbry_files = list(self.lbry_file_manager.lbry_files)
if kwargs: if kwargs:
for search_type, value in iter_lbry_file_search_values(kwargs): for search_type, value in iter_lbry_file_search_values(kwargs):
lbry_files = [l_f for l_f in lbry_files if l_f.__dict__[search_type] == value] lbry_files = [l_f for l_f in lbry_files if l_f.__dict__[search_type] == value]
if sorts:
lbry_files = self._sort_lbry_files(lbry_files, sorts)
if return_json: if return_json:
file_dicts = [] file_dicts = []
for lbry_file in lbry_files: for lbry_file in lbry_files:
@ -939,6 +953,33 @@ class Daemon(AuthJSONRPCServer):
log.debug("Collected %i lbry files", len(lbry_files)) log.debug("Collected %i lbry files", len(lbry_files))
defer.returnValue(lbry_files) defer.returnValue(lbry_files)
def _sort_lbry_files(self, lbry_files, sorts):
for field, order in sorts:
reverse = order == FILE_SORT_ORDER_DESCENDING
if field == FILE_SORT_FIELD_NAME:
lbry_files = sorted(lbry_files, key=lambda f: f.file_name, reverse=reverse)
elif field == FILE_SORT_FIELD_DATE:
lbry_files = sorted(lbry_files, reverse=reverse)
elif field == FILE_SORT_FIELD_PRICE:
lbry_files = sorted(lbry_files, key=lambda f: f.points_paid, reverse=reverse)
else:
raise Exception('Unrecognized sort field "{}"'.format(field))
return lbry_files
def _parse_lbry_files_sort(self, sort):
"""
Given a sort string like 'name, desc' or 'price',
parse the string into a tuple of (field, order).
Order defaults to ascending.
"""
pieces = sort.rsplit(',', 1)
field = pieces[0].strip()
order = pieces[1].strip().lower() if len(pieces) > 1 else None
if order and order not in FILE_SORT_ORDERS:
raise Exception('Sort order must be one of {}'.format(FILE_SORT_ORDERS))
return (field, order or FILE_SORT_ORDER_ASCENDING)
def _get_single_peer_downloader(self): def _get_single_peer_downloader(self):
downloader = SinglePeerDownloader() downloader = SinglePeerDownloader()
downloader.setup(self.session.wallet) downloader.setup(self.session.wallet)
@ -1358,7 +1399,7 @@ class Daemon(AuthJSONRPCServer):
defer.returnValue(response) defer.returnValue(response)
@defer.inlineCallbacks @defer.inlineCallbacks
def jsonrpc_file_list(self, **kwargs): def jsonrpc_file_list(self, sort=None, **kwargs):
""" """
List files limited by optional filters List files limited by optional filters
@ -1366,7 +1407,7 @@ class Daemon(AuthJSONRPCServer):
file_list [--sd_hash=<sd_hash>] [--file_name=<file_name>] [--stream_hash=<stream_hash>] file_list [--sd_hash=<sd_hash>] [--file_name=<file_name>] [--stream_hash=<stream_hash>]
[--rowid=<rowid>] [--claim_id=<claim_id>] [--outpoint=<outpoint>] [--txid=<txid>] [--nout=<nout>] [--rowid=<rowid>] [--claim_id=<claim_id>] [--outpoint=<outpoint>] [--txid=<txid>] [--nout=<nout>]
[--channel_claim_id=<channel_claim_id>] [--channel_name=<channel_name>] [--channel_claim_id=<channel_claim_id>] [--channel_name=<channel_name>]
[--claim_name=<claim_name>] [--full_status] [--claim_name=<claim_name>] [--full_status] [--sort=<sort_method>...]
Options: Options:
--sd_hash=<sd_hash> : (str) get file with matching sd hash --sd_hash=<sd_hash> : (str) get file with matching sd hash
@ -1383,6 +1424,8 @@ class Daemon(AuthJSONRPCServer):
--claim_name=<claim_name> : (str) get file with matching claim name --claim_name=<claim_name> : (str) get file with matching claim name
--full_status : (bool) full status, populate the --full_status : (bool) full status, populate the
'message' and 'size' fields 'message' and 'size' fields
--sort=<sort_method> : (str) sort by any of 'name', 'date', or 'price'
to specify order append ',asc' or ',desc'
Returns: Returns:
(list) List of files (list) List of files
@ -1418,7 +1461,8 @@ class Daemon(AuthJSONRPCServer):
] ]
""" """
result = yield self._get_lbry_files(return_json=True, **kwargs) sorts = [self._parse_lbry_files_sort(s) for s in sort] if sort else None
result = yield self._get_lbry_files(return_json=True, sorts=sorts, **kwargs)
response = yield self._render_response(result) response = yield self._render_response(result)
defer.returnValue(response) defer.returnValue(response)