Commit 201f8763 authored by Alok Saldanha's avatar Alok Saldanha
Browse files

#14 added custom method to create data dirs

parent 736541c4
......@@ -23,7 +23,7 @@ def recurse_dir(path):
x[:-4] if x.endwith('.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', "path":full_path.replace(env.cellxgene_data, "")}] + entries
return [{"name":'new', "class":'new', "path":full_path.replace(env.cellxgene_data, "")}] + entries
def make_entry(el):
full_path = os.path.join(path, el)
......@@ -56,12 +56,14 @@ def render_entries(entries):
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 href='{get_url(a)}'>{a['name']}</a>" for a in entry['annotations']])
return ' | annotations: ' + ", ".join([f"<a href='{get_url(a)}'{get_class(a)}>{a['name']}</a>" for a in entry['annotations']])
else:
return '';
return ''
def render_entry(entry):
if entry["type"] == "file":
......
......@@ -17,6 +17,7 @@ import json
from flask import (
Flask,
redirect,
make_response,
render_template,
request,
send_from_directory,
......@@ -163,11 +164,16 @@ if env.enable_upload:
def filecrawl():
entries = recurse_dir(env.cellxgene_data)
rendered_html = render_entries(entries)
return render_template(
resp = make_response(render_template(
"filecrawl.html",
extra_scripts=get_extra_scripts(),
rendered_html=rendered_html,
)
))
resp.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
resp.headers["Pragma"] = "no-cache"
resp.headers["Expires"] = "0"
resp.headers['Cache-Control'] = 'public, max-age=0'
return resp
@app.route("/filecrawl/<path:path>")
def do_filecrawl(path):
......
......@@ -28,12 +28,13 @@ def get_key(path):
if trimmed.endswith('.h5ad') and data_file_exists(trimmed):
# 1) somedir/dataset.h5ad: a dataset
return CacheKey(trimmed, trimmed, None)
elif trimmed.endswith('.csv') and data_file_exists(trimmed):
elif trimmed.endswith('.csv'):
# 2) somedir/dataset_annotations/saldaal1-T5HMVBNV.csv : an actual annotaitons file.
# 2) somedir/dataset_annotations/saldaal1-T5HMVBNV.csv : an actual annotations file.
annotations_dir = os.path.split(trimmed)[0]
dataset = make_h5ad(annotations_dir)
if data_file_exists(dataset):
data_dir_ensure(annotations_dir)
return CacheKey(trimmed, dataset, trimmed)
elif trimmed.endswith('_annotations') and data_dir_exists(trimmed):
# 3) somedir/dataset_annotations: an annotation directory. The corresponding h5ad must exist, but the directory may not.
......@@ -74,6 +75,10 @@ def data_dir_exists(dataset):
file_path = os.path.join(env.cellxgene_data, dataset)
validate_is_dir(file_path)
return True
def data_dir_ensure(dataset):
file_path = os.path.join(env.cellxgene_data, dataset)
if not os.path.exists(file_path):
os.makedirs(file_path)
def get_file_path(key):
dataset = key.dataset
......@@ -82,12 +87,9 @@ def get_file_path(key):
return file_path
def get_annotation_file_path(key):
print(f"getting annotaiton_file_path for {key.annotation_file}")
if key.annotation_file is None:
return None
if key.annotation_file == '':
return ''
file_path = os.path.join(env.cellxgene_data, key.annotation_file)
print(f"getting annotaiton_file_path for {key}, file_path {file_path}")
validate_is_file(file_path)
return file_path
// neandertal javascript
const new_annotation_callback = (() =>{
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
const pickn = (c, n) => n==0?'':c.substr(Math.random()*c.length,1) + pickn(c,n-1);
const suffix = `_${pickn(chars,8)}.csv`;
return (e) => {
e.preventDefault();
const el = $(e.target);
const href = el.attr('href');
const base = prompt(`Name your annotations collection\nnote: the suffix "${suffix}" will be appended`);
if (base !== null && base.length > 0) {
if (/^[0-9a-zA-Z_]+$/.test(base)) {
window.location = `${href}/${base}${suffix}`;
} else {
alert("Error: name must match ^[0-9a-zA-Z_]+$\nthat is, only numbers, letters and underscore are allowed")
}
}
return false;
}
})()
......@@ -16,7 +16,8 @@
<link rel="icon" type="image/png" href="{{ url_for('static', filename='nibr.ico') }}">
{% for script in extra_scripts %}
<script src="{{ script }}"></script>
{% endfor %}
{% endfor %}
<script src="{{ url_for('static', filename='js/annotation.js') }}"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
</head>
<body>
......@@ -41,5 +42,10 @@
<li><a href="/">homepage</a></li>
</ul>
</p>
<script>
$(() => {
$("a.new").click(new_annotation_callback);
})
</script>
</body>
</html>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment