Skip to content

Commit 43ffc73

Browse files
committed
Bump to v1.2.0
1 parent fb68433 commit 43ffc73

File tree

3 files changed

+97
-23
lines changed

3 files changed

+97
-23
lines changed

QOpenScienceFramework/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = "1.1.8"
1+
__version__ = "1.2.0"
22
__author__ = "Daniel Schreij"
33

44
import os

QOpenScienceFramework/widgets/osfexplorer.py

+50-14
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,14 @@ def create_context_menu(self, item):
351351
if data['type'] == 'nodes':
352352
return None
353353

354+
user_has_write_permissions = False
355+
try:
356+
user_has_write_permissions = "write" in \
357+
data["attributes"]["current_user_permissions"]
358+
except AttributeError as e:
359+
raise osf.OSFInvalidResponse('Could not retrieve permission info: '
360+
'{}'.format(e))
361+
354362
if data['type'] == 'files':
355363
kind = data["attributes"]["kind"]
356364

@@ -364,23 +372,31 @@ def create_context_menu(self, item):
364372

365373
menu = QtWidgets.QMenu(self.tree)
366374

367-
# Actions only allowd on files
375+
# Actions only allowed on files
368376
if kind == "file":
369377
menu.addAction(self.download_icon, _(u"Download file"),
370378
self._clicked_download_file)
371379

372380
# Actions only allowed on folders
373381
if kind == "folder":
374-
menu.addAction(self.upload_icon, _(u"Upload file to folder"),
382+
upload_action = menu.addAction(self.upload_icon, _(u"Upload file to folder"),
375383
self.__clicked_upload_file)
376-
menu.addAction(self.new_folder_icon, _(u"Create new folder"),
384+
newfolder_action = menu.addAction(self.new_folder_icon, _(u"Create new folder"),
377385
self.__clicked_new_folder)
378386
menu.addAction(self.refresh_icon, _(u"Refresh contents"),
379387
self.__clicked_partial_refresh)
380388

389+
if not user_has_write_permissions:
390+
upload_action.setDisabled(True)
391+
newfolder_action.setDisabled(True)
392+
381393
# Only allow deletion of files and subfolders of repos
382394
if kind == "file" or not item_is_repo:
383-
menu.addAction(self.delete_icon, _(u"Delete"), self.__clicked_delete)
395+
delete_action = menu.addAction(self.delete_icon, _(u"Delete"),
396+
self.__clicked_delete)
397+
398+
if not user_has_write_permissions:
399+
delete_action.setDisabled(True)
384400

385401
return menu
386402

@@ -572,7 +588,11 @@ def set_folder_properties(self, data):
572588
level = "Public"
573589
else:
574590
level = "Private"
575-
self.properties["Type"][1].setText(level + " " + attributes["category"])
591+
access_level = ""
592+
if not "write" in attributes["current_user_permissions"]:
593+
access_level = " (read only)"
594+
self.properties["Type"][1].setText(level + " " + \
595+
attributes["category"] + access_level)
576596
elif "name" in attributes and "kind" in attributes:
577597
self.properties["Name"][1].setText(attributes["name"])
578598
self.properties["Type"][1].setText(attributes["kind"])
@@ -700,36 +720,52 @@ def __slot_currentItemChanged(self, item, col):
700720
self.abort_preview.emit()
701721

702722
data = item.data(0, QtCore.Qt.UserRole)
723+
724+
user_has_write_permissions = "write" in \
725+
data["attributes"]["current_user_permissions"]
726+
703727
if data['type'] == 'nodes':
704728
name = data["attributes"]["title"]
705-
if data["attributes"]["public"]:
706-
access = "public "
729+
if not user_has_write_permissions:
730+
kind = "readonly " + data["attributes"]["category"]
707731
else:
708-
access = "private "
709-
kind = access + data["attributes"]["category"]
732+
if data["attributes"]["public"]:
733+
access = "public "
734+
else:
735+
access = "private "
736+
kind = access + data["attributes"]["category"]
710737
if data['type'] == 'files':
711738
name = data["attributes"]["name"]
712739
kind = data["attributes"]["kind"]
713740

714741
pm = self.tree.get_icon(kind, name).pixmap(self.preview_size)
715742
self.image_space.setPixmap(pm)
716743

717-
if kind == "file":
744+
if kind == "file":
718745
self.set_file_properties(data)
719746
self.download_button.setDisabled(False)
720747
self.upload_button.setDisabled(True)
721-
self.delete_button.setDisabled(False)
722748
self.new_folder_button.setDisabled(True)
749+
if user_has_write_permissions:
750+
self.delete_button.setDisabled(False)
751+
else:
752+
self.delete_button.setDisabled(True)
753+
723754
elif kind == "folder":
724755
self.set_folder_properties(data)
725-
self.new_folder_button.setDisabled(False)
756+
if user_has_write_permissions:
757+
self.new_folder_button.setDisabled(False)
758+
self.upload_button.setDisabled(False)
759+
else:
760+
self.new_folder_button.setDisabled(True)
761+
self.upload_button.setDisabled(True)
762+
726763
self.download_button.setDisabled(True)
727-
self.upload_button.setDisabled(False)
728764
# Check if the parent node is a project
729765
# If so the current 'folder' must be a storage provider (e.g. dropbox)
730766
# which should not be allowed to be deleted.
731767
parent_data = item.parent().data(0, QtCore.Qt.UserRole)
732-
if parent_data['type'] == 'nodes':
768+
if parent_data['type'] == 'nodes' or not user_has_write_permissions:
733769
self.delete_button.setDisabled(True)
734770
else:
735771
self.delete_button.setDisabled(False)

QOpenScienceFramework/widgets/projecttree.py

+46-8
Original file line numberDiff line numberDiff line change
@@ -323,18 +323,22 @@ def get_icon(self, datatype, name):
323323
's3' : 'web-microsoft-onedrive',
324324
}
325325

326-
if datatype.lower() in ['public project','private project']:
327-
# return QtGui.QIcon.fromTheme(
328-
# 'gbrainy',
329-
# QtGui.QIcon(osf_logo_path)
330-
# )
326+
if datatype.lower() in ['public project','private project', \
327+
'readonly project']:
331328
if datatype.lower() == 'public project':
332329
return qta.icon('fa.cube', 'fa.globe',
333330
options=[
334331
{},
335332
{'scale_factor': 0.75,
336333
'offset': (0.2, 0.20),
337334
'color': 'green'}])
335+
elif datatype.lower() == "readonly project":
336+
return qta.icon('fa.cube', 'fa.lock',
337+
options=[
338+
{},
339+
{'scale_factor': 0.75,
340+
'offset': (0.2, 0.20),
341+
'color': 'red'}])
338342
else:
339343
return qta.icon('fa.cube')
340344

@@ -485,13 +489,27 @@ def add_item(self, parent, data):
485489
# Create item
486490
item = QtWidgets.QTreeWidgetItem(parent, values)
487491

488-
# Set icon
489-
icon = self.get_icon(icon_type, name)
490-
item.setIcon(0, icon)
492+
# Copy permission data of project to child elements
493+
if kind != "project" and parent:
494+
try:
495+
parent_data = parent.data(0, QtCore.Qt.UserRole)
496+
if parent_data and "current_user_permissions" in parent_data["attributes"]:
497+
data["attributes"]["current_user_permissions"] = \
498+
parent_data["attributes"]["current_user_permissions"]
499+
except AttributeError as e:
500+
raise osf.OSFInvalidResponse("Could not obtain permission data: {}".format(e))
501+
elif kind == "project":
502+
# Show a lock icon if project has read-only permissions
503+
if not "write" in data["attributes"]["current_user_permissions"]:
504+
icon_type = "readonly project"
491505

492506
# Add data
493507
item.setData(0, QtCore.Qt.UserRole, data)
494508

509+
# Set icon
510+
icon = self.get_icon(icon_type, name)
511+
item.setIcon(0, icon)
512+
495513
return item, kind
496514

497515
def populate_tree(self, reply, parent=None):
@@ -555,6 +573,26 @@ def populate_tree(self, reply, parent=None):
555573
if req:
556574
self.active_requests.append(req)
557575

576+
# Check if there are linked projects.
577+
if kind == "project":
578+
try:
579+
linked_projects_entrypoint = entry['relationships']['linked_nodes']\
580+
['links']['related']['href']
581+
except AttributeError as e:
582+
raise osf.OSFInvalidResponse("Invalid api call for getting "
583+
"linked projects: {}".format(e))
584+
585+
linked_projects_entrypoint += "?page[size]={}".format(self.ITEMS_PER_PAGE)
586+
req = self.manager.get(
587+
linked_projects_entrypoint,
588+
self.populate_tree,
589+
item,
590+
errorCallback=self.__cleanup_reply
591+
)
592+
# If something went wrong, req should be None
593+
if req:
594+
self.active_requests.append(req)
595+
558596
# If the results are paginated, see if there is another page that needs
559597
# to be processed
560598
try:

0 commit comments

Comments
 (0)