Loading rpc/const.py +3 −0 Original line number Diff line number Diff line Loading @@ -12,7 +12,10 @@ NO_SUCH_METADATA = "no such metadata" NO_SUCH_METADATATYPE = "no such metadatatype" NO_SUCH_PROJECT = "no such project" NO_SUCH_RESOURCE = "no such resource" NO_SUCH_TAG = "no such tag" NO_SUCH_USER = "no such user" NO_PROJECT_ROOT = "project has no root" NOT_A_FILE = "not a file" PERM_COLLECTION_CREATE = "collection.create" PERM_COLLECTION_DELETE = "collection.delete" PERM_COLLECTION_PUBLIC_ONLY = "collection.public_only" Loading rpc/methods.py +61 −56 Original line number Diff line number Diff line Loading @@ -567,7 +567,7 @@ def delete_metadata(user: User, metadata_id: int) -> bool: metadata_instance.delete() return True except Metadata.DoesNotExist: return False raise ServiceException(NO_SUCH_METADATA) @_log_call Loading Loading @@ -666,7 +666,7 @@ def rename_collection(user: User, collection_id: int, title: str) -> bool: ) collection_instance = query_set.first() if not collection_instance: return False raise ServiceException(NO_SUCH_COLLECTION) _check_project_permission(user, collection_instance.project, PERM_COLLECTION_UPDATE) collection_instance.title = title collection_instance.save() Loading @@ -684,7 +684,7 @@ def rename_resource(user: User, resource_id: int, title: str) -> bool: ) resource_instance = query_set.first() if not resource_instance: return False raise ServiceException(NO_SUCH_RESOURCE) _check_project_permission(user, resource_instance.ptr_project, PERM_RESOURCE_UPDATE) resource_instance.title = title resource_instance.save() Loading @@ -700,7 +700,7 @@ def rename_meta(user: User, meta_id: int, title: str) -> bool: query_set: Union[Iterator[Metadata], QuerySet] = Metadata.objects.filter(pk=meta_id) meta_instance = query_set.first() if not meta_instance: return False raise ServiceException(NO_SUCH_METADATA) _check_project_permission(user, meta_instance.project, PERM_METADATA_UPDATE) meta_instance.title = title meta_instance.save() Loading Loading @@ -889,13 +889,10 @@ def remove_resource_from_collection( ) collection_instance.resources.remove(resource_instance) return True except ( Collection.DoesNotExist, Resource.DoesNotExist, Collection.MultipleObjectsReturned, Resource.MultipleObjectsReturned, ): return False except Collection.DoesNotExist: raise ServiceException(NO_SUCH_COLLECTION) except Resource.DoesNotExist: raise ServiceException(NO_SUCH_RESOURCE) @_log_call Loading Loading @@ -1389,7 +1386,7 @@ def remove_meta_from_resource(user: User, resource_id: int, meta_value_id: int) ) resource_instance = query_set.first() if not resource_instance: return False raise ServiceException(NO_SUCH_RESOURCE) # this is a resource.update permission, not a metadata.update _check_project_permission(user, resource_instance.ptr_project, PERM_RESOURCE_UPDATE) for meta_value in resource_instance.metadataresourcevalue_set.all(): Loading Loading @@ -1550,7 +1547,7 @@ def remove_meta_from_collection( ) collection_instance = query_set.first() if not collection_instance: return False raise ServiceException(NO_SUCH_COLLECTION) _check_project_permission(user, collection_instance.project, PERM_COLLECTION_UPDATE) for meta_value in collection_instance.metadatacollectionvalue_set.all(): if meta_value.id == meta_value_id: Loading Loading @@ -1858,7 +1855,7 @@ def publish_collection(user: User, collection_id: int) -> bool: ) collection_instance: Collection = query_set.first() if not collection_instance: return False raise ServiceException(NO_SUCH_COLLECTION) _check_project_permission(user, collection_instance.project, PERM_COLLECTION_UPDATE) collection_instance.public_access = True collection_instance.save() Loading @@ -1876,7 +1873,7 @@ def unpublish_collection(user: User, collection_id: int) -> bool: ) collection_instance: Collection = query_set.first() if not collection_instance: return False raise ServiceException(NO_SUCH_COLLECTION) _check_project_permission(user, collection_instance.project, PERM_COLLECTION_UPDATE) collection_instance.public_access = False collection_instance.save() Loading Loading @@ -1914,7 +1911,8 @@ def move_collection( raise ServiceException(NO_SUCH_COLLECTION) if parent_collection_instance in child_collection_instance.descendants(): raise ServiceException(NO_FOOTGUNS) if parent_collection_instance.project_id != child_collection_instance.project_id: raise ServiceException(PROJECT_MISMATCH) _check_project_permission( user, parent_collection_instance.project, PERM_COLLECTION_READ ) Loading Loading @@ -1967,8 +1965,8 @@ def delete_tag(user: User, uid: str) -> bool: _check_project_permission(user, tag_instance.project, PERM_TAG_DELETE) tag_instance.delete() return True except (Tag.DoesNotExist, Tag.MultipleObjectsReturned): return False except Tag.DoesNotExist: raise ServiceException(NO_SUCH_TAG) @_log_call Loading Loading @@ -2020,13 +2018,10 @@ def add_tag_to_collection(user: User, tag_uid: str, collection_id: int) -> bool: tag_instance = Tag.objects.get(project=project, uid=tag_uid) collection_instance.tags.add(tag_instance) return True except ( Collection.DoesNotExist, Tag.DoesNotExist, Collection.MultipleObjectsReturned, Tag.MultipleObjectsReturned, ): return False except Collection.DoesNotExist: raise ServiceException(NO_SUCH_COLLECTION) except Tag.DoesNotExist: raise ServiceException(NO_SUCH_TAG) @_log_call Loading @@ -2044,13 +2039,10 @@ def remove_tag_from_collection(user: User, tag_uid: str, collection_id: int) -> tag_instance = Tag.objects.get(project=project, uid=tag_uid) collection_instance.tags.remove(tag_instance) return True except ( Collection.DoesNotExist, Tag.DoesNotExist, Collection.MultipleObjectsReturned, Tag.MultipleObjectsReturned, ): return False except Collection.DoesNotExist: raise ServiceException(NO_SUCH_COLLECTION) except Tag.DoesNotExist: raise ServiceException(NO_SUCH_TAG) @_log_call Loading @@ -2068,13 +2060,10 @@ def add_tag_to_resource(user: User, tag_uid: str, resource_id: int) -> bool: tag_instance = Tag.objects.get(project=project, uid=tag_uid) resource_instance.tags.add(tag_instance) return True except ( Resource.DoesNotExist, Tag.DoesNotExist, Resource.MultipleObjectsReturned, Tag.MultipleObjectsReturned, ): return False except Resource.DoesNotExist: raise ServiceException(NO_SUCH_RESOURCE) except Tag.DoesNotExist: raise ServiceException(NO_SUCH_TAG) @_log_call Loading @@ -2092,13 +2081,10 @@ def remove_tag_from_resource(user: User, tag_uid: str, resource_id: int) -> bool tag_instance = Tag.objects.get(project=project, uid=tag_uid) resource_instance.tags.remove(tag_instance) return True except ( Resource.DoesNotExist, Tag.DoesNotExist, Resource.MultipleObjectsReturned, Tag.MultipleObjectsReturned, ): return False except Resource.DoesNotExist: raise ServiceException(NO_SUCH_RESOURCE) except Tag.DoesNotExist: raise ServiceException(NO_SUCH_TAG) @_log_call Loading Loading @@ -2135,9 +2121,12 @@ def set_representative_resource( collection_instance.representative = resource_instance collection_instance.save() return True return False except (Collection.DoesNotExist, Resource.DoesNotExist): return False else: raise ServiceException(PROJECT_MISMATCH) except Collection.DoesNotExist: raise ServiceException(NO_SUCH_COLLECTION) except Resource.DoesNotExist: raise ServiceException(NO_SUCH_RESOURCE) @_log_call Loading @@ -2163,12 +2152,12 @@ def replace_file(user: User, from_resource_id: int, to_resource_id: int) -> bool pk=from_resource_id, deleted_at__isnull=True ) if not from_resource_instance.file: return False raise ServiceException(NOT_A_FILE) to_resource_instance = Resource.objects.get( pk=to_resource_id, deleted_at__isnull=True ) if not to_resource_instance.file: return False raise ServiceException(NOT_A_FILE) _check_project_permission( user, from_resource_instance.ptr_project, PERM_RESOURCE_READ ) Loading Loading @@ -2205,7 +2194,7 @@ def replace_file(user: User, from_resource_id: int, to_resource_id: int) -> bool to_resource_instance.save() return True except Resource.DoesNotExist: return False raise ServiceException(NO_SUCH_RESOURCE) @_log_call Loading @@ -2227,7 +2216,7 @@ def set_is_oai_record( collection_instance.save() return True except Collection.DoesNotExist: return False raise ServiceException(NO_SUCH_COLLECTION) @_log_call Loading Loading @@ -2263,8 +2252,10 @@ def deactivate_rpc_access(user: User, user_name: str, api_key: str) -> bool: key_instance.active = False key_instance.save() return True except (User.DoesNotExist, APIKey.DoesNotExist): return False except User.DoesNotExist: raise ServiceException(NO_SUCH_USER) except APIKey.DoesNotExist: raise ServiceException(NO_SUCH_USER) @_log_call Loading Loading @@ -2597,7 +2588,21 @@ def restore_collection( """ Restore a deleted collection from the recycle bin """ pass collection_instance = Collection.objects.filter(pk=collection_id).first() if not collection_instance: raise ServiceException(NO_SUCH_COLLECTION) destination_collection_instance = Collection.objects.filter( pk=destination_collection_id ).first() if not destination_collection_instance: raise ServiceException(NO_SUCH_COLLECTION) if destination_collection_instance.project_id != collection_instance.project_id: raise ServiceException(PROJECT_MISMATCH) _check_project_permission(user, collection_instance.project, PERM_COLLECTION_UPDATE) collection_instance.deleted_at = None collection_instance.save() move_collection(user, collection_instance, destination_collection_instance) return True @_log_call Loading Loading
rpc/const.py +3 −0 Original line number Diff line number Diff line Loading @@ -12,7 +12,10 @@ NO_SUCH_METADATA = "no such metadata" NO_SUCH_METADATATYPE = "no such metadatatype" NO_SUCH_PROJECT = "no such project" NO_SUCH_RESOURCE = "no such resource" NO_SUCH_TAG = "no such tag" NO_SUCH_USER = "no such user" NO_PROJECT_ROOT = "project has no root" NOT_A_FILE = "not a file" PERM_COLLECTION_CREATE = "collection.create" PERM_COLLECTION_DELETE = "collection.delete" PERM_COLLECTION_PUBLIC_ONLY = "collection.public_only" Loading
rpc/methods.py +61 −56 Original line number Diff line number Diff line Loading @@ -567,7 +567,7 @@ def delete_metadata(user: User, metadata_id: int) -> bool: metadata_instance.delete() return True except Metadata.DoesNotExist: return False raise ServiceException(NO_SUCH_METADATA) @_log_call Loading Loading @@ -666,7 +666,7 @@ def rename_collection(user: User, collection_id: int, title: str) -> bool: ) collection_instance = query_set.first() if not collection_instance: return False raise ServiceException(NO_SUCH_COLLECTION) _check_project_permission(user, collection_instance.project, PERM_COLLECTION_UPDATE) collection_instance.title = title collection_instance.save() Loading @@ -684,7 +684,7 @@ def rename_resource(user: User, resource_id: int, title: str) -> bool: ) resource_instance = query_set.first() if not resource_instance: return False raise ServiceException(NO_SUCH_RESOURCE) _check_project_permission(user, resource_instance.ptr_project, PERM_RESOURCE_UPDATE) resource_instance.title = title resource_instance.save() Loading @@ -700,7 +700,7 @@ def rename_meta(user: User, meta_id: int, title: str) -> bool: query_set: Union[Iterator[Metadata], QuerySet] = Metadata.objects.filter(pk=meta_id) meta_instance = query_set.first() if not meta_instance: return False raise ServiceException(NO_SUCH_METADATA) _check_project_permission(user, meta_instance.project, PERM_METADATA_UPDATE) meta_instance.title = title meta_instance.save() Loading Loading @@ -889,13 +889,10 @@ def remove_resource_from_collection( ) collection_instance.resources.remove(resource_instance) return True except ( Collection.DoesNotExist, Resource.DoesNotExist, Collection.MultipleObjectsReturned, Resource.MultipleObjectsReturned, ): return False except Collection.DoesNotExist: raise ServiceException(NO_SUCH_COLLECTION) except Resource.DoesNotExist: raise ServiceException(NO_SUCH_RESOURCE) @_log_call Loading Loading @@ -1389,7 +1386,7 @@ def remove_meta_from_resource(user: User, resource_id: int, meta_value_id: int) ) resource_instance = query_set.first() if not resource_instance: return False raise ServiceException(NO_SUCH_RESOURCE) # this is a resource.update permission, not a metadata.update _check_project_permission(user, resource_instance.ptr_project, PERM_RESOURCE_UPDATE) for meta_value in resource_instance.metadataresourcevalue_set.all(): Loading Loading @@ -1550,7 +1547,7 @@ def remove_meta_from_collection( ) collection_instance = query_set.first() if not collection_instance: return False raise ServiceException(NO_SUCH_COLLECTION) _check_project_permission(user, collection_instance.project, PERM_COLLECTION_UPDATE) for meta_value in collection_instance.metadatacollectionvalue_set.all(): if meta_value.id == meta_value_id: Loading Loading @@ -1858,7 +1855,7 @@ def publish_collection(user: User, collection_id: int) -> bool: ) collection_instance: Collection = query_set.first() if not collection_instance: return False raise ServiceException(NO_SUCH_COLLECTION) _check_project_permission(user, collection_instance.project, PERM_COLLECTION_UPDATE) collection_instance.public_access = True collection_instance.save() Loading @@ -1876,7 +1873,7 @@ def unpublish_collection(user: User, collection_id: int) -> bool: ) collection_instance: Collection = query_set.first() if not collection_instance: return False raise ServiceException(NO_SUCH_COLLECTION) _check_project_permission(user, collection_instance.project, PERM_COLLECTION_UPDATE) collection_instance.public_access = False collection_instance.save() Loading Loading @@ -1914,7 +1911,8 @@ def move_collection( raise ServiceException(NO_SUCH_COLLECTION) if parent_collection_instance in child_collection_instance.descendants(): raise ServiceException(NO_FOOTGUNS) if parent_collection_instance.project_id != child_collection_instance.project_id: raise ServiceException(PROJECT_MISMATCH) _check_project_permission( user, parent_collection_instance.project, PERM_COLLECTION_READ ) Loading Loading @@ -1967,8 +1965,8 @@ def delete_tag(user: User, uid: str) -> bool: _check_project_permission(user, tag_instance.project, PERM_TAG_DELETE) tag_instance.delete() return True except (Tag.DoesNotExist, Tag.MultipleObjectsReturned): return False except Tag.DoesNotExist: raise ServiceException(NO_SUCH_TAG) @_log_call Loading Loading @@ -2020,13 +2018,10 @@ def add_tag_to_collection(user: User, tag_uid: str, collection_id: int) -> bool: tag_instance = Tag.objects.get(project=project, uid=tag_uid) collection_instance.tags.add(tag_instance) return True except ( Collection.DoesNotExist, Tag.DoesNotExist, Collection.MultipleObjectsReturned, Tag.MultipleObjectsReturned, ): return False except Collection.DoesNotExist: raise ServiceException(NO_SUCH_COLLECTION) except Tag.DoesNotExist: raise ServiceException(NO_SUCH_TAG) @_log_call Loading @@ -2044,13 +2039,10 @@ def remove_tag_from_collection(user: User, tag_uid: str, collection_id: int) -> tag_instance = Tag.objects.get(project=project, uid=tag_uid) collection_instance.tags.remove(tag_instance) return True except ( Collection.DoesNotExist, Tag.DoesNotExist, Collection.MultipleObjectsReturned, Tag.MultipleObjectsReturned, ): return False except Collection.DoesNotExist: raise ServiceException(NO_SUCH_COLLECTION) except Tag.DoesNotExist: raise ServiceException(NO_SUCH_TAG) @_log_call Loading @@ -2068,13 +2060,10 @@ def add_tag_to_resource(user: User, tag_uid: str, resource_id: int) -> bool: tag_instance = Tag.objects.get(project=project, uid=tag_uid) resource_instance.tags.add(tag_instance) return True except ( Resource.DoesNotExist, Tag.DoesNotExist, Resource.MultipleObjectsReturned, Tag.MultipleObjectsReturned, ): return False except Resource.DoesNotExist: raise ServiceException(NO_SUCH_RESOURCE) except Tag.DoesNotExist: raise ServiceException(NO_SUCH_TAG) @_log_call Loading @@ -2092,13 +2081,10 @@ def remove_tag_from_resource(user: User, tag_uid: str, resource_id: int) -> bool tag_instance = Tag.objects.get(project=project, uid=tag_uid) resource_instance.tags.remove(tag_instance) return True except ( Resource.DoesNotExist, Tag.DoesNotExist, Resource.MultipleObjectsReturned, Tag.MultipleObjectsReturned, ): return False except Resource.DoesNotExist: raise ServiceException(NO_SUCH_RESOURCE) except Tag.DoesNotExist: raise ServiceException(NO_SUCH_TAG) @_log_call Loading Loading @@ -2135,9 +2121,12 @@ def set_representative_resource( collection_instance.representative = resource_instance collection_instance.save() return True return False except (Collection.DoesNotExist, Resource.DoesNotExist): return False else: raise ServiceException(PROJECT_MISMATCH) except Collection.DoesNotExist: raise ServiceException(NO_SUCH_COLLECTION) except Resource.DoesNotExist: raise ServiceException(NO_SUCH_RESOURCE) @_log_call Loading @@ -2163,12 +2152,12 @@ def replace_file(user: User, from_resource_id: int, to_resource_id: int) -> bool pk=from_resource_id, deleted_at__isnull=True ) if not from_resource_instance.file: return False raise ServiceException(NOT_A_FILE) to_resource_instance = Resource.objects.get( pk=to_resource_id, deleted_at__isnull=True ) if not to_resource_instance.file: return False raise ServiceException(NOT_A_FILE) _check_project_permission( user, from_resource_instance.ptr_project, PERM_RESOURCE_READ ) Loading Loading @@ -2205,7 +2194,7 @@ def replace_file(user: User, from_resource_id: int, to_resource_id: int) -> bool to_resource_instance.save() return True except Resource.DoesNotExist: return False raise ServiceException(NO_SUCH_RESOURCE) @_log_call Loading @@ -2227,7 +2216,7 @@ def set_is_oai_record( collection_instance.save() return True except Collection.DoesNotExist: return False raise ServiceException(NO_SUCH_COLLECTION) @_log_call Loading Loading @@ -2263,8 +2252,10 @@ def deactivate_rpc_access(user: User, user_name: str, api_key: str) -> bool: key_instance.active = False key_instance.save() return True except (User.DoesNotExist, APIKey.DoesNotExist): return False except User.DoesNotExist: raise ServiceException(NO_SUCH_USER) except APIKey.DoesNotExist: raise ServiceException(NO_SUCH_USER) @_log_call Loading Loading @@ -2597,7 +2588,21 @@ def restore_collection( """ Restore a deleted collection from the recycle bin """ pass collection_instance = Collection.objects.filter(pk=collection_id).first() if not collection_instance: raise ServiceException(NO_SUCH_COLLECTION) destination_collection_instance = Collection.objects.filter( pk=destination_collection_id ).first() if not destination_collection_instance: raise ServiceException(NO_SUCH_COLLECTION) if destination_collection_instance.project_id != collection_instance.project_id: raise ServiceException(PROJECT_MISMATCH) _check_project_permission(user, collection_instance.project, PERM_COLLECTION_UPDATE) collection_instance.deleted_at = None collection_instance.save() move_collection(user, collection_instance, destination_collection_instance) return True @_log_call Loading