Skip to content

Commit

Permalink
Support 'attach' keyword (alias of 'attachment')
Browse files Browse the repository at this point in the history
  • Loading branch information
caronc committed Feb 18, 2024
1 parent b4805f0 commit b1adfaf
Show file tree
Hide file tree
Showing 3 changed files with 121 additions and 7 deletions.
45 changes: 45 additions & 0 deletions apprise_api/api/tests/test_notify.py
Original file line number Diff line number Diff line change
Expand Up @@ -847,6 +847,22 @@ def test_partial_notify_by_loaded_urls(self, mock_notify):
assert response.status_code == 400
assert mock_notify.call_count == 0

# Reset our mock object
mock_notify.reset_mock()

# Preare our form data
form_data = {
'body': 'test notifiction',
'attach': 'https://localhost/invalid/path/to/image.png',
}

# Send our notification
response = self.client.post(
'/notify/{}'.format(key), form_data)
# We fail because we couldn't retrieve our attachment
assert response.status_code == 400
assert mock_notify.call_count == 0

@mock.patch('apprise.Apprise.notify')
def test_notify_by_loaded_urls_with_json(self, mock_notify):
"""
Expand Down Expand Up @@ -998,9 +1014,38 @@ def test_notify_by_loaded_urls_with_json(self, mock_notify):
assert response.status_code == 200
assert mock_notify.call_count == 1


# Reset our mock object
mock_notify.reset_mock()

# If an empty format is specified, it is accepted and
# no imput format is specified
json_data = {
'body': 'test message',
'format': None,
'attach': 'https://localhost/invalid/path/to/image.png',
}

# Test case with format changed
response = self.client.post(
'/notify/{}'.format(key),
data=json.dumps(json_data),
content_type='application/json',
)

# We failed to send notification because we couldn't fetch the
# attachment
assert response.status_code == 400
assert mock_notify.call_count == 0

# Reset our mock object
mock_notify.reset_mock()

json_data = {
'body': 'test message',
'format': None,
}

# Same results for any empty string:
json_data['format'] = ''
response = self.client.post(
Expand Down
44 changes: 44 additions & 0 deletions apprise_api/api/tests/test_stateless_notify.py
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,50 @@ def test_partial_notify(self, mock_notify):
assert response.status_code == 400
assert mock_notify.call_count == 0

# Reset our mock object
mock_notify.reset_mock()

# Preare our form data (support attach keyword)
form_data = {
'body': 'test notifiction',
'urls': ', '.join([
'mailto://user:[email protected]',
'mailto://user:[email protected]',
]),
'attach': 'https://localhost/invalid/path/to/image.png',
}

# Send our notification
response = self.client.post('/notify', form_data)
# We fail because we couldn't retrieve our attachment
assert response.status_code == 400
assert mock_notify.call_count == 0

# Reset our mock object
mock_notify.reset_mock()

# Preare our json data (and support attach keyword as alias)
json_data = {
'body': 'test notifiction',
'urls': ', '.join([
'mailto://user:[email protected]',
'mailto://user:[email protected]',
]),
'attach': 'https://localhost/invalid/path/to/image.png',
}

# Same results
response = self.client.post(
'/notify/',
data=json.dumps(json_data),
content_type='application/json',
)

# We fail because we couldn't retrieve our attachment
assert response.status_code == 400
assert mock_notify.call_count == 0


@override_settings(APPRISE_RECURSION_MAX=1)
@mock.patch('apprise.Apprise.notify')
def test_stateless_notify_recursion(self, mock_notify):
Expand Down
39 changes: 32 additions & 7 deletions apprise_api/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -610,9 +610,19 @@ def post(self, request, key):

# Handle Attachments
attach = None
if not content.get('attachment') and 'attachment' in request.POST:
# Acquire attachments to work with them
content['attachment'] = request.POST.getlist('attachment')
if not content.get('attachment'):
if 'attachment' in request.POST:
# Acquire attachments to work with them
content['attachment'] = request.POST.getlist('attachment')

elif 'attach' in request.POST:
# Acquire kw (alias) attach to work with them
content['attachment'] = request.POST.getlist('attach')

elif content.get('attach'):
# Acquire kw (alias) attach from payload to work with
content['attachment'] = content['attach']
del content['attach']

if 'attachment' in content or request.FILES:
try:
Expand Down Expand Up @@ -1029,7 +1039,7 @@ def post(self, request):
logger.warning(
'NOTIFY - %s - Invalid FORM Payload provided',
request.META['REMOTE_ADDR'])

return HttpResponse(
_('Bad FORM Payload provided.'),
status=ResponseCode.bad_request)
Expand Down Expand Up @@ -1148,16 +1158,31 @@ def post(self, request):

# Handle Attachments
attach = None
if not content.get('attachment') and 'attachment' in request.POST:
# Acquire attachments to work with them
content['attachment'] = request.POST.getlist('attachment')
if not content.get('attachment'):
if 'attachment' in request.POST:
# Acquire attachments to work with them
content['attachment'] = request.POST.getlist('attachment')

elif 'attach' in request.POST:
# Acquire kw (alias) attach to work with them
content['attachment'] = request.POST.getlist('attach')

elif content.get('attach'):
# Acquire kw (alias) attach from payload to work with
content['attachment'] = content['attach']
del content['attach']

if 'attachment' in content or request.FILES:
try:
attach = parse_attachments(
content.get('attachment'), request.FILES)

except (TypeError, ValueError):
# Invalid entry found in list
logger.warning(
'NOTIFY - %s - Bad attachment specified',
request.META['REMOTE_ADDR'])

return HttpResponse(
_('Bad attachment'),
status=ResponseCode.bad_request)
Expand Down

0 comments on commit b1adfaf

Please sign in to comment.