import os from cellxgene_gateway import env from cellxgene_gateway.dir_util import make_h5ad, make_annotations, annotations_suffix def recurse_dir(path): if not os.path.exists(path): raise CellxgeneException( "The given path does not exist.", status.HTTP_400_BAD_REQUEST ) all_entries = os.listdir(path) def is_h5ad(el): return el.endswith('.h5ad') and os.path.isfile(os.path.join(path, el)) h5ad_entries = [x for x in all_entries if is_h5ad(x)] annotation_dir_entries = [x for x in all_entries if x.endswith(annotations_suffix) and make_h5ad(x) in h5ad_entries] def list_annotations(el): full_path = os.path.join(path, el) if not os.path.isdir(full_path): entries = [] else: entries = [{ "name": x[:-13] if (len(x) > 13 and x[-13] in ['-','_']) else ( x[:-4] if x.endswith('.csv') else x), "path": os.path.join(full_path, x).replace(env.cellxgene_data, ""), } for x in os.listdir(full_path) if x.endswith('.csv') and os.path.isfile(os.path.join(full_path, x))] return [{"name":'new', "class":'new', "path":full_path.replace(env.cellxgene_data, "")}] + entries def make_entry(el): full_path = os.path.join(path, el) if el in h5ad_entries: return { "path": full_path.replace(env.cellxgene_data, ""), "name": el, "type": "file", "annotations": list_annotations(make_annotations(el)), } elif os.path.isdir(full_path) and el not in annotation_dir_entries: return { "path": full_path.replace(env.cellxgene_data, ""), "name": el, "type": "directory", "children": recurse_dir(full_path), } else: return { "path": full_path, "name": el, "type": "neither", } return [make_entry(x) for x in os.listdir(path)] def render_entries(entries): return "" def get_url(entry): return f"/view/{ entry['path'].lstrip('/') }" def get_class(entry): return f" class='{entry['class']}'" if 'class' in entry else '' def render_annotations(entry): if len(entry['annotations']) > 0: return ' | annotations: ' + ", ".join([f"{a['name']}" for a in entry['annotations']]) else: return '' def render_entry(entry): if entry["type"] == "file": return f"
  • {entry['name']} {render_annotations(entry)}
  • " elif entry["type"] == "directory": url = f"/filecrawl/{entry['path'].lstrip('/')}" return f"
  • {entry['name']}{render_entries(entry['children'])}
  • " else: return ""