in backend/model_garden/views/media_asset.py [0:0]
def upload(self, request):
validated_attrs = self._validate_request_params(request=request)
bucket = validated_attrs['bucket']
files = validated_attrs['files']
dataset_format = validated_attrs['dataset_format']
dataset_serializer = DatasetSerializer(data={
'path': request.data.get('path'),
'bucket': bucket.pk,
'dataset_format': dataset_format,
})
dataset_serializer.is_valid(raise_exception=True)
dataset = dataset_serializer.save()
files_to_upload = []
for file in files:
if file.content_type in ('application/zip', 'application/x-zip-compressed'):
if not zipfile.is_zipfile(file.file):
raise ParseError(detail={"message": f"File '{file.name}' is not a zip file"})
zip_file = zipfile.ZipFile(file.file)
for zip_filename in zip_file.filelist:
if zip_filename.filename.endswith('/'):
continue
with zip_file.open(zip_filename) as fp:
files_to_upload.append((zip_filename.filename, io.BytesIO(fp.read())))
elif 'image' in file.content_type:
files_to_upload.append((file.name, file.file))
else:
logger.warning(f"Got unexpected file content type: {file.content_type}")
continue
media_assets_to_upload = []
for filename, file_obj in files_to_upload:
try:
media_asset = MediaAsset.objects.create(dataset=dataset, filename=filename)
except IntegrityError as e:
logger.error(f"Failed to create media asset: {e}")
raise ParseError(
detail={'message': f"Media asset for dataset='{dataset.path}' and filename='{filename}' already exists"},
)
else:
media_assets_to_upload.append((media_asset, file_obj))
self._upload_media_assets_to_s3(
bucket_name=bucket.name,
media_assets_to_upload=media_assets_to_upload,
)
return Response(data={'message': f"{len(media_assets_to_upload)} media asset(s) uploaded"})