| 190 | |
| 191 | @extend_schema(exclude=True) |
| 192 | class ImportStorageListFilesAPI(generics.CreateAPIView): |
| 193 | |
| 194 | permission_required = all_permissions.storages_change |
| 195 | parser_classes = (JSONParser, FormParser, MultiPartParser) |
| 196 | serializer_class = None # Default serializer |
| 197 | |
| 198 | def __init__(self, serializer_class=None, *args, **kwargs): |
| 199 | self.serializer_class = serializer_class |
| 200 | super().__init__(*args, **kwargs) |
| 201 | |
| 202 | @extend_schema(exclude=True) |
| 203 | def create(self, request, *args, **kwargs): |
| 204 | from .functions import validate_storage_instance |
| 205 | |
| 206 | instance = validate_storage_instance(request, self.serializer_class) |
| 207 | limit = int(request.data.get('limit', settings.DEFAULT_STORAGE_LIST_LIMIT)) |
| 208 | |
| 209 | try: |
| 210 | files = [] |
| 211 | start_time = time.time() |
| 212 | timeout_seconds = 30 |
| 213 | |
| 214 | for object in instance.iter_objects(): |
| 215 | files.append(instance.get_unified_metadata(object)) |
| 216 | |
| 217 | # Check if we've reached the file limit |
| 218 | if len(files) >= limit: |
| 219 | files.append({'key': None, 'last_modified': None, 'size': None}) |
| 220 | break |
| 221 | |
| 222 | # Check if we've exceeded the timeout |
| 223 | if time.time() - start_time > timeout_seconds: |
| 224 | files.append({'key': '... storage scan timeout reached ...', 'last_modified': None, 'size': None}) |
| 225 | break |
| 226 | |
| 227 | return Response({'files': files}) |
| 228 | except Exception as exc: |
| 229 | logger.exception('Error listing storage files: %s', exc) |
| 230 | raise ValidationError('Failed to list storage files') |
| 231 | |
| 232 | |
| 233 | @extend_schema(exclude=True) |
no outgoing calls