Skip to content

Commit

Permalink
Merge pull request #19 from DigitalSlideArchive/folder-move-route
Browse files Browse the repository at this point in the history
Add /folder/{id}/move API endpoint
  • Loading branch information
willdunklin authored Sep 27, 2023
2 parents 1bf04b8 + d47b262 commit 1095f09
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 2 deletions.
4 changes: 3 additions & 1 deletion import_tracker/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from girder_jobs.models.job import Job

from import_tracker.models import AssetstoreImport
from import_tracker.rest import listAllImports, listImports
from import_tracker.rest import listAllImports, listImports, moveFolder


class ImportTrackerCancelError(Exception):
Expand Down Expand Up @@ -176,3 +176,5 @@ def load(self, info):
info['apiRoot'].assetstore.route('GET', ('all_imports',), listAllImports)
wrapShouldImportFile()
wrapImportData(info['apiRoot'].assetstore)

info['apiRoot'].folder.route('PUT', (':id', 'move'), moveFolder)
48 changes: 47 additions & 1 deletion import_tracker/rest.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,14 @@
from girder.api import access
from girder.api.describe import Description, autoDescribeRoute
from girder.api.rest import boundHandler
from girder.constants import SortDir
from girder.constants import AccessType, SortDir
from girder.models.assetstore import Assetstore
from girder.models.file import File
from girder.models.folder import Folder
from girder.models.item import Item
from girder.models.upload import Upload
from girder.utility import model_importer, path
from girder.utility.progress import setResponseTimeLimit

from .models import AssetstoreImport

Expand Down Expand Up @@ -71,6 +76,36 @@ def getImports(query=None, user=None, unique=False, limit=None, offset=None, sor
return processCursor(cursor, user)


def moveLeafFiles(folder, user, assetstore):
Folder().updateFolder(folder)

folder_item = Item().findOne({
'folderId': folder['_id'],
})
unique_clause = {'assetstoreId': {'$ne': ObjectId(assetstore['_id'])}}

child_folders = Folder().childFolders(folder, 'folder', user=user)
child_items = Folder().childItems(folder, filters=unique_clause)

results = []
for attached_file in File().find({
'attachedToId': folder_item['_id'],
**unique_clause
}):
setResponseTimeLimit(86400)
results.append(Upload().moveFileToAssetstore(attached_file, user, assetstore))

for item in child_items:
setResponseTimeLimit(86400)
for file in File().find({'itemId': ObjectId(item['_id']), **unique_clause}):
results.append(Upload().moveFileToAssetstore(file, user, assetstore))

for child_folder in child_folders:
results += moveLeafFiles(child_folder, user, assetstore)

return results


@access.admin
@boundHandler
@autoDescribeRoute(
Expand Down Expand Up @@ -98,3 +133,14 @@ def listAllImports(self, unique, limit, offset, sort):
return getImports(
None,
self.getCurrentUser(), unique, limit, offset, sort)


@access.admin
@boundHandler
@autoDescribeRoute(
Description('Move folder contents to an assetstore.')
.modelParam('id', 'Source folder ID', model=Folder, level=AccessType.WRITE)
.modelParam('assetstoreId', 'Destination assetstore ID', model=Assetstore, paramType='formData')
)
def moveFolder(self, folder, assetstore):
return moveLeafFiles(folder, self.getCurrentUser(), assetstore)
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
description='A Girder plugin for data import tracking in HistomicsUI',
install_requires=[
'girder-jobs>=3.0.3',
'girder>=3.1.23',
],
license='Apache Software License 2.0',
long_description=readme,
Expand Down

0 comments on commit 1095f09

Please sign in to comment.