|
|
@@ -364,9 +364,11 @@ class GoogleDriveService(models.AbstractModel):
|
|
|
|
|
|
for level in range(max_levels):
|
|
|
try:
|
|
|
- response = self._do_request(f'/drive/v3/files/{current_id}', {
|
|
|
- 'fields': 'id,name,parents'
|
|
|
- })
|
|
|
+ # Use Shared Drive parameters to handle both regular and shared drive folders
|
|
|
+ params = self._build_shared_drive_params()
|
|
|
+ params['fields'] = 'id,name,parents'
|
|
|
+
|
|
|
+ response = self._do_request(f'/drive/v3/files/{current_id}', params)
|
|
|
|
|
|
folder_info = {
|
|
|
'id': response.get('id'),
|
|
|
@@ -382,8 +384,16 @@ class GoogleDriveService(models.AbstractModel):
|
|
|
|
|
|
current_id = parent_ids[0]
|
|
|
|
|
|
+ except UserError as e:
|
|
|
+ # Handle 404 errors gracefully - folder might not exist or be accessible
|
|
|
+ if '404' in str(e):
|
|
|
+ _logger.warning(f"Folder {current_id} not found or not accessible at level {level}")
|
|
|
+ break
|
|
|
+ else:
|
|
|
+ _logger.error(f"Error navigating folder hierarchy at level {level}: {str(e)}")
|
|
|
+ break
|
|
|
except Exception as e:
|
|
|
- _logger.error(f"Error navigating folder hierarchy at level {level}: {str(e)}")
|
|
|
+ _logger.error(f"Unexpected error navigating folder hierarchy at level {level}: {str(e)}")
|
|
|
break
|
|
|
|
|
|
return hierarchy
|
|
|
@@ -417,8 +427,16 @@ class GoogleDriveService(models.AbstractModel):
|
|
|
|
|
|
return matching_folders
|
|
|
|
|
|
+ except UserError as e:
|
|
|
+ # Handle access errors gracefully
|
|
|
+ if '404' in str(e) or '403' in str(e):
|
|
|
+ _logger.warning(f"Cannot access parent folder {parent_id}: {str(e)}")
|
|
|
+ return []
|
|
|
+ else:
|
|
|
+ _logger.error(f"Error finding folders by name: {str(e)}")
|
|
|
+ return []
|
|
|
except Exception as e:
|
|
|
- _logger.error(f"Error finding folders by name: {str(e)}")
|
|
|
+ _logger.error(f"Unexpected error finding folders by name: {str(e)}")
|
|
|
return []
|
|
|
|
|
|
def get_folder_info(self, folder_id):
|
|
|
@@ -428,9 +446,11 @@ class GoogleDriveService(models.AbstractModel):
|
|
|
if not validation.get('valid'):
|
|
|
return None
|
|
|
|
|
|
- response = self._do_request(f'/drive/v3/files/{folder_id}', {
|
|
|
- 'fields': 'id,name,parents,createdTime,modifiedTime,mimeType'
|
|
|
- })
|
|
|
+ # Use Shared Drive parameters to handle both regular and shared drive folders
|
|
|
+ params = self._build_shared_drive_params()
|
|
|
+ params['fields'] = 'id,name,parents,createdTime,modifiedTime,mimeType'
|
|
|
+
|
|
|
+ response = self._do_request(f'/drive/v3/files/{folder_id}', params)
|
|
|
|
|
|
return response
|
|
|
|
|
|
@@ -469,12 +489,14 @@ class GoogleDriveService(models.AbstractModel):
|
|
|
}
|
|
|
|
|
|
def move_folder(self, folder_id, new_parent_id):
|
|
|
- """Move a folder to a new parent"""
|
|
|
+ """Move a folder to a new parent with Shared Drive support"""
|
|
|
try:
|
|
|
- # Get current folder info
|
|
|
- response = self._do_request(f'/drive/v3/files/{folder_id}', {
|
|
|
- 'fields': 'parents'
|
|
|
- })
|
|
|
+ # Build Shared Drive parameters
|
|
|
+ params = self._build_shared_drive_params()
|
|
|
+ params['fields'] = 'parents'
|
|
|
+
|
|
|
+ # Get current folder info with Shared Drive support
|
|
|
+ response = self._do_request(f'/drive/v3/files/{folder_id}', params)
|
|
|
|
|
|
current_parents = response.get('parents', [])
|
|
|
|
|
|
@@ -484,18 +506,18 @@ class GoogleDriveService(models.AbstractModel):
|
|
|
'error': 'Folder has no current parent'
|
|
|
}
|
|
|
|
|
|
- # Use PATCH to update the parents
|
|
|
- update_data = {
|
|
|
+ # Use PATCH to update the parents with Shared Drive support
|
|
|
+ update_params = self._build_shared_drive_params()
|
|
|
+ update_params.update({
|
|
|
'addParents': new_parent_id,
|
|
|
'removeParents': current_parents[0]
|
|
|
- }
|
|
|
+ })
|
|
|
|
|
|
# Update the file with new parent
|
|
|
update_response = self._do_request(
|
|
|
f'/drive/v3/files/{folder_id}',
|
|
|
- update_data,
|
|
|
- method='PATCH',
|
|
|
- json_data=update_data
|
|
|
+ update_params,
|
|
|
+ method='PATCH'
|
|
|
)
|
|
|
|
|
|
return {
|