initial naive implementation of file_list sorting
This commit is contained in:
parent
1f1b348638
commit
326d0cb8a3
1 changed files with 48 additions and 4 deletions
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue