Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 34 additions & 1 deletion addons/base/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@
from website.ember_osf_web.decorators import ember_flag_is_active
from website.project.utils import serialize_node
from website.util import rubeus, timestamp, inspect_info # noqa
import re
import json as _json

from osf.features import (
SLOAN_COI_DISPLAY,
Expand Down Expand Up @@ -433,6 +435,9 @@ def get_auth(auth, **kwargs):
credentials = node.serialize_waterbutler_credentials(provider_name)
waterbutler_settings = node.serialize_waterbutler_settings(provider_name)

if is_node_process and provider_settings:
waterbutler_settings['max_file_size'] = getattr(provider_settings.config, 'max_file_size', None)

if not is_node_process:
# for only location_id value
storage = ExportDataLocation.objects.get(pk=location_id)
Expand Down Expand Up @@ -582,6 +587,33 @@ def create_waterbutler_log(payload, **kwargs):
params=payload
)
if payload.get('email') is True or payload.get('errors'):
# Parse structured error info from WaterButler exception repr strings
# e.g. "<InvalidParameters(413, {"message_key": "quota_exceeded", ...})>"
error_info = None
if payload.get('errors'):
for err_str in payload['errors']:
# Try to extract JSON payload embedded in the repr string
json_match = re.search(r'\((?:\d+),\s*(\{.*\})\)', err_str, re.DOTALL)
if json_match:
try:
err_data = _json.loads(json_match.group(1))
message_key = err_data.get('message_key', '')
if message_key == 'quota_exceeded' or 'quota_exceeded' in err_str:
error_info = {'type': 'quota_exceeded'}
break
elif err_data.get('oversized_files'):
error_info = {
'type': 'oversized',
'oversized_files': err_data['oversized_files'],
'max_size': err_data.get('max_size'),
}
break
except Exception as e:
logger.warning(
f'Failed to parse WaterButler error representation string: {err_str}. '
f'Error: {e}'
)

mails.send_mail(
user.username,
mails.FILE_OPERATION_FAILED if payload.get('errors')
Expand All @@ -592,7 +624,8 @@ def create_waterbutler_log(payload, **kwargs):
source_path=payload['source']['materialized'],
source_addon=payload['source']['addon'],
destination_addon=payload['destination']['addon'],
osf_support_email=settings.OSF_SUPPORT_EMAIL
osf_support_email=settings.OSF_SUPPORT_EMAIL,
error_info=error_info,
)
if payload.get('errors'):
# Action failed but our function succeeded
Expand Down
3 changes: 2 additions & 1 deletion addons/osfstorage/decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ def wrapped(payload, *args, **kwargs):
'source': source,
'destination': dest_parent,
'name': payload['destination']['name'],
'is_check_permission': is_check_permission
'is_check_permission': is_check_permission,
'replaced_size': int(payload.get('replaced_size', 0)),
})
except KeyError:
raise HTTPError(http_status.HTTP_400_BAD_REQUEST)
Expand Down
Loading
Loading