@@ -0,0 +1,3 @@ | |||
__pycache__ | |||
*.pyc | |||
@@ -0,0 +1,31 @@ | |||
import dash | |||
import dash_bootstrap_components as dbc | |||
import dash_html_components as html | |||
import socket | |||
import arvados | |||
import functools | |||
from .projects import list_projects_html | |||
from .collections import list_collections_html | |||
def main(): | |||
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP]) | |||
arv = arvados.api('v1') | |||
user = arv.users().current().execute() | |||
# nav_btns = [ dbc.Button(a['name']) for a in projects ] | |||
projects_table = list_projects_html(arv, user['uuid']) | |||
collections_table = list_collections_html(arv, user['uuid']) | |||
app.layout = html.Div([ | |||
html.H5('Projects'), | |||
projects_table, | |||
html.H5('Collections'), | |||
collections_table | |||
], style={ 'margin': '10px' }) | |||
app.run_server(host=socket.getfqdn(), debug=True) | |||
main() |
@@ -0,0 +1,56 @@ | |||
import dash_html_components as html | |||
import dash_bootstrap_components as dbc | |||
import humanize | |||
from .users import get_user | |||
def list_collections(arv, owner_uuid): | |||
res = arv.collections().list(where = { | |||
'owner_uuid': owner_uuid | |||
}).execute() | |||
res = res['items'] | |||
#while res['items_available'] > len(res['items']): | |||
#res = arv.collections().list(where = {}) | |||
return res | |||
def list_collections_html(arv, parent): | |||
projects = list_collections(arv, parent) | |||
header = html.Tr([ | |||
html.Th('Name'), | |||
html.Th('Description'), | |||
html.Th('Owner'), | |||
html.Th('Size') | |||
]) | |||
header = [ html.Thead(header) ] | |||
rows = [] | |||
for a in projects: | |||
owner = get_user(arv, a['owner_uuid']) | |||
rows.append( | |||
html.Tr([ | |||
html.Td([ | |||
html.Div(html.A(href='/projects/' + a['uuid'], | |||
children=a['name'])), | |||
html.Div(a['uuid']) | |||
]), | |||
html.Td(a['description'] or 'Modified at ' + a['modified_at']), | |||
html.Td([ | |||
html.Div(html.A(href='mailto:' + owner['email'], | |||
children=owner['first_name'] + ' ' + owner['last_name'])), | |||
html.Div(a['owner_uuid']) | |||
]), | |||
html.Td(humanize.naturalsize(a['file_size_total'])) | |||
])) | |||
rows = [ html.Tbody(rows) ] | |||
res = dbc.Table(header + rows, | |||
striped=True, | |||
hover=True, | |||
responsive=True) | |||
return res |
@@ -0,0 +1,50 @@ | |||
import dash_bootstrap_components as dbc | |||
import dash_html_components as html | |||
from .users import get_user | |||
def list_projects(arv, parent): | |||
res = arv.groups().list(where={ | |||
'owner_uuid': parent, | |||
'group_class': 'project' | |||
}).execute()['items'] | |||
return res | |||
def list_projects_html(arv, parent): | |||
projects = list_projects(arv, parent) | |||
header = html.Tr([ | |||
html.Th('Name'), | |||
html.Th('Description'), | |||
html.Th('Owner') | |||
]) | |||
header = [ html.Thead(header) ] | |||
rows = [] | |||
for a in projects: | |||
owner = get_user(arv, a['owner_uuid']) | |||
rows.append( | |||
html.Tr([ | |||
html.Td([ | |||
html.Div(html.A(href='/projects/' + a['uuid'], | |||
children=a['name'])), | |||
html.Div(a['uuid']) | |||
]), | |||
html.Td(a['description'] or 'Project'), | |||
html.Td([ | |||
html.Div(html.A(href='mailto:' + owner['email'], | |||
children=owner['first_name'] + ' ' + owner['last_name'])), | |||
html.Div(a['owner_uuid']) | |||
]) | |||
])) | |||
rows = [ html.Tbody(rows) ] | |||
res = dbc.Table(header + rows, | |||
striped=True, | |||
hover=True, | |||
responsive=True) | |||
return res |
@@ -0,0 +1,6 @@ | |||
import functools | |||
@functools.lru_cache(maxsize=128) | |||
def get_user(arv, uuid): | |||
res = arv.users().get(uuid=uuid).execute() | |||
return res |