Skip to content

Commit

Permalink
Merge pull request #33 from the-virtual-brain/WID_175
Browse files Browse the repository at this point in the history
WID-175. DriveWidget accepts initial selection of the collab and folder
  • Loading branch information
popaula937 authored Feb 2, 2023
2 parents 2bc1ce9 + efd29f7 commit f5ff56b
Show file tree
Hide file tree
Showing 6 changed files with 41 additions and 25 deletions.
4 changes: 2 additions & 2 deletions tvbwidgets/tests/test_drive_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ def mockk(token):
assert widget.get_chosen_repo() is None

# this triggers the observe events on dropbox widget
widget.repos_dropdown.value = widget.repos_dropdown.options[0][1]
widget.repos_dropdown.value = widget.repos_dropdown.options['repo1']
assert isinstance(widget.get_chosen_repo(), Repo)
assert widget.get_selected_file_path() is None
assert len(widget.files_list.options) == 3 # 3 because the parent dir is also added
Expand Down Expand Up @@ -122,7 +122,7 @@ def mockk(token):
os.environ[CLB_AUTH] = "test_auth_token"
widget = StorageWidget()

widget.api.repos_dropdown.value = widget.api.repos_dropdown.options[0][1]
widget.api.repos_dropdown.value = widget.api.repos_dropdown.options['repo1']
widget.api.files_list.value = widget.api.files_list.options[1]

assert widget.get_selected_file_name() == DUMMY_FILENAME
Expand Down
2 changes: 1 addition & 1 deletion tvbwidgets/tests/test_head_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ def mockk(token):
widget._TVBWidgetWithBrowser__display_message('ABC')
assert widget.message_label.value == HeadBrowser.MSG_TEMPLATE.format('ABC', HeadBrowser.MSG_COLOR)

widget.storage_widget.api.repos_dropdown.value = widget.storage_widget.api.repos_dropdown.options[0][1]
widget.storage_widget.api.repos_dropdown.value = widget.storage_widget.api.repos_dropdown.options['repo1']
widget.storage_widget.api.files_list.value = widget.storage_widget.api.files_list.options[1]

widget.load_selected_file(Surface)
Expand Down
48 changes: 32 additions & 16 deletions tvbwidgets/ui/drive_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ class DriveWidget(ipywidgets.VBox, TVBWidget):
PARENT_DIR = '..'
DIR_ICON = '\U0001F4C1'

def __init__(self, **kwargs):
def __init__(self, collab=None, folder=None, **kwargs):
TVBWidget.__init__(self, **kwargs)
self.collab = collab
self.folder = folder
bearer_token = get_current_token()
self.client = ebrains_drive.connect(token=bearer_token)

Expand All @@ -28,10 +30,10 @@ def __init__(self, **kwargs):
except Exception:
self.logger.error("Could not retrieve Repos from EBRAINS Drive!")
all_repos = []
dropdown_options = [(repo.name, repo) for repo in all_repos]
dropdown_options = {repo.name: repo for repo in all_repos}

layout = ipywidgets.Layout(width='400px')
self.repos_dropdown = ipywidgets.Dropdown(description='Repository', value=None,
self.repos_dropdown = ipywidgets.Dropdown(description='Repository', value=dropdown_options.get(self.collab),
options=dropdown_options, layout=layout)
self.files_list = ipywidgets.Select(description='Files', value=None, disabled=False, layout=layout)

Expand All @@ -41,6 +43,11 @@ def __init__(self, **kwargs):
self._parent_dir = None
self._map_names_to_files = dict()

if self.collab:
self.select_repo(None, folder=self.folder)
if self.collab not in list(dropdown_options):
self.logger.warning(f"Could not find the Collab: {self.collab}. You can manually browse for it.")

ipywidgets.VBox.__init__(self, [self.repos_dropdown, self.files_list], **kwargs)

def get_chosen_repo(self):
Expand All @@ -57,33 +64,42 @@ def get_selected_file_content(self):
file_obj = repo_obj.get_file(self.get_selected_file_path())
return file_obj.get_content()

def select_repo(self, _):
self.update_files_for_chosen_dir(self.ROOT)
def select_repo(self, _, folder=None):
if folder is None:
folder = self.ROOT
if not folder.startswith(self.ROOT):
folder = self.ROOT + folder
self.update_files_for_chosen_dir(folder)

def select_dir(self, _):
current_selection = self._map_names_to_files.get(self.files_list.value)
if not current_selection or not current_selection.isdir:
return
self.update_files_for_chosen_dir(self.ROOT + current_selection.name)
self.update_files_for_chosen_dir(current_selection.path)

def update_files_for_chosen_dir(self, selected_dir):
self.files_list.unobserve(self.select_dir, names='value')

selected_repo = self.get_chosen_repo()
self.logger.debug("Update Files called with {} and {}".format(selected_repo, selected_dir))
self._gather_files(selected_repo, selected_dir)
self.files_list.options = list(self._map_names_to_files.keys())
self.files_list.value = None

self.files_list.observe(self.select_dir, names='value')
try:
selected_repo = self.get_chosen_repo()
self.logger.debug("Update Files called with {} and {}".format(selected_repo, selected_dir))
self._gather_files(selected_repo, selected_dir)
self.files_list.options = list(self._map_names_to_files.keys())
self.files_list.value = None
except Exception as e:
raise e
finally:
self.files_list.observe(self.select_dir, names='value')

def _gather_files(self, repo, sub_folder):
dir_icon = self.DIR_ICON
self._map_names_to_files = {self.PARENT_DIR: self._parent_dir}

try:
dir_obj = repo.get_dir(sub_folder)
self._parent_dir = repo.get_dir(os.path.dirname(dir_obj.path))
if sub_folder == self.ROOT:
self._parent_dir = None
else:
self._parent_dir = repo.get_dir(os.path.dirname(dir_obj.path))
self._map_names_to_files = {self.PARENT_DIR: self._parent_dir}

files_in_repository = dir_obj.ls(force_refresh=True)

Expand Down
4 changes: 2 additions & 2 deletions tvbwidgets/ui/storage_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@

class StorageWidget(ipywidgets.Tab, TVBWidget):

def __init__(self, **kwargs):
def __init__(self, collab=None, folder=None, **kwargs):
tab1 = ipywidgets.VBox()
tab2 = DriveWidget()
tab2 = DriveWidget(collab, folder)
tab3 = ipywidgets.VBox()

super().__init__([tab1, tab2, tab3], selected_index=1,
Expand Down
4 changes: 2 additions & 2 deletions tvbwidgets/ui/ts_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -547,8 +547,8 @@ def _update_fig(self):

class TimeSeriesBrowser(widgets.VBox, TVBWidgetWithBrowser):

def __init__(self):
super().__init__()
def __init__(self, collab=None, folder=None):
super().__init__(**{'collab': collab, 'folder': folder})
timeseries_button = widgets.Button(description='View time series')
self.buttons = widgets.HBox([timeseries_button], layout=widgets.Layout(margin="0px 0px 0px 20px"))
self.timeseries_widget = TimeSeriesWidget()
Expand Down
4 changes: 2 additions & 2 deletions tvbwidgets/ui/widget_with_browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ class TVBWidgetWithBrowser(TVBWidget):
MSG_TEMPLATE = '<span style="color:{1};">{0}</span>'
MSG_COLOR = 'red'

def __init__(self):
def __init__(self, collab=None, folder=None):
super().__init__()
self.storage_widget = StorageWidget()
self.storage_widget = StorageWidget(collab, folder)
self.message_label = ipywidgets.HTML(layout=ipywidgets.Layout(height='25px'))

def __display_message(self, msg):
Expand Down

0 comments on commit f5ff56b

Please sign in to comment.