| @@ -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 | |||||