in gnm_deliverables/views/views.py [0:0]
def attempt_create_bundle(self, bundle, auto_name, attempt_number, request):
"""
Function to attempt to create a bundle.
:param bundle: DeliverableSerializer object.
:param auto_name: Boolean indicating if auto naming should be attempted if there is a problem with the name.
:param attempt_number: Number of attempts.
:param request: request object.
:return: a Response object indicating the outcome of the attempt.
"""
if attempt_number > 200:
return Response({"status": "conflict", "field": "name", "detail": "This field must be a unique value. Two hundred attempts where made at automatically setting a unique value for it."}, status=409)
if not bundle.is_valid():
for field, error_details in bundle.errors.items():
uniqueness_errors = list(filter(lambda entry: entry.code == 'unique', error_details))
if (len(uniqueness_errors) > 0) and (field == "name") and auto_name:
data_to_set = copy.copy(request.data)
new_name = "{0}{1}".format(request.data["name"], attempt_number)
data_to_set["name"] = new_name
logger.debug('About to attempt to create a bundle with the name: {0}'.format(new_name))
new_bundle = DeliverableSerializer(data=data_to_set)
return self.attempt_create_bundle(new_bundle, auto_name, attempt_number + 1, request)
if len(uniqueness_errors) > 0:
return Response({"status": "conflict", "field": field, "detail": "This field must be a unique value"}, status=409)
return Response({"status": "error", "detail": str(bundle.errors)}, status=400)
# If we get here then the request is definitely valid so proceed.
name = bundle.validated_data['name']
try:
path, created = create_folder_for_deliverable(name)
if created and path:
logger.info('Created folder for deliverable at: %s', path)
bundle.save()
return Response({"status": "ok", "data": bundle.data}, status=200)
elif not created and path:
logger.error('The folder already exists for deliverable at: %s', path)
bundle.save()
return Response({"status": "ok", "data": bundle.data}, status=200)
else:
logger.error('Failed to create folder for deliverable at: %s', path)
return Response({"status": "error", "data": bundle.data}, status=409)
except OSError as e:
logger.error('Failed to create folder for {name}: {e}'.format(name=name, e=e.strerror))
return Response({"status": "error", "data": e.strerror}, status=500)