mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 03:07:37 +00:00
Add ability to send attachments in pushover notifications (#24806)
* Added ability to send attachments in pushover notifications * Added full name for exception to satisfy static check * Fixed hanging indent lint problem * Added path checking, removed import re, changed url check method to use startswith. * Removed argument from logging statement. * Changed IOError to OSError, fixed logging, added logging statement.
This commit is contained in:
parent
8dca73d08e
commit
61c88db8a1
@ -3,7 +3,7 @@
|
|||||||
"name": "Pushover",
|
"name": "Pushover",
|
||||||
"documentation": "https://www.home-assistant.io/components/pushover",
|
"documentation": "https://www.home-assistant.io/components/pushover",
|
||||||
"requirements": [
|
"requirements": [
|
||||||
"python-pushover==0.3"
|
"python-pushover==0.4"
|
||||||
],
|
],
|
||||||
"dependencies": [],
|
"dependencies": [],
|
||||||
"codeowners": []
|
"codeowners": []
|
||||||
|
@ -12,6 +12,7 @@ from homeassistant.components.notify import (
|
|||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
ATTR_ATTACHMENT = 'attachment'
|
||||||
|
|
||||||
CONF_USER_KEY = 'user_key'
|
CONF_USER_KEY = 'user_key'
|
||||||
|
|
||||||
@ -24,10 +25,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
|||||||
def get_service(hass, config, discovery_info=None):
|
def get_service(hass, config, discovery_info=None):
|
||||||
"""Get the Pushover notification service."""
|
"""Get the Pushover notification service."""
|
||||||
from pushover import InitError
|
from pushover import InitError
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return PushoverNotificationService(
|
return PushoverNotificationService(
|
||||||
config[CONF_USER_KEY], config[CONF_API_KEY])
|
hass, config[CONF_USER_KEY], config[CONF_API_KEY])
|
||||||
except InitError:
|
except InitError:
|
||||||
_LOGGER.error("Wrong API key supplied")
|
_LOGGER.error("Wrong API key supplied")
|
||||||
return None
|
return None
|
||||||
@ -36,9 +36,10 @@ def get_service(hass, config, discovery_info=None):
|
|||||||
class PushoverNotificationService(BaseNotificationService):
|
class PushoverNotificationService(BaseNotificationService):
|
||||||
"""Implement the notification service for Pushover."""
|
"""Implement the notification service for Pushover."""
|
||||||
|
|
||||||
def __init__(self, user_key, api_token):
|
def __init__(self, hass, user_key, api_token):
|
||||||
"""Initialize the service."""
|
"""Initialize the service."""
|
||||||
from pushover import Client
|
from pushover import Client
|
||||||
|
self._hass = hass
|
||||||
self._user_key = user_key
|
self._user_key = user_key
|
||||||
self._api_token = api_token
|
self._api_token = api_token
|
||||||
self.pushover = Client(
|
self.pushover = Client(
|
||||||
@ -53,6 +54,44 @@ class PushoverNotificationService(BaseNotificationService):
|
|||||||
|
|
||||||
data['title'] = kwargs.get(ATTR_TITLE, ATTR_TITLE_DEFAULT)
|
data['title'] = kwargs.get(ATTR_TITLE, ATTR_TITLE_DEFAULT)
|
||||||
|
|
||||||
|
# Check for attachment.
|
||||||
|
if ATTR_ATTACHMENT in data:
|
||||||
|
# If attachment is a URL, use requests to open it as a stream.
|
||||||
|
if data[ATTR_ATTACHMENT].startswith('http'):
|
||||||
|
try:
|
||||||
|
import requests
|
||||||
|
response = requests.get(
|
||||||
|
data[ATTR_ATTACHMENT],
|
||||||
|
stream=True,
|
||||||
|
timeout=5)
|
||||||
|
if response.status_code == 200:
|
||||||
|
# Replace the attachment identifier with file object.
|
||||||
|
data[ATTR_ATTACHMENT] = response.content
|
||||||
|
else:
|
||||||
|
_LOGGER.error('Image not found')
|
||||||
|
# Remove attachment key to send without attachment.
|
||||||
|
del data[ATTR_ATTACHMENT]
|
||||||
|
except requests.exceptions.RequestException as ex_val:
|
||||||
|
_LOGGER.error(ex_val)
|
||||||
|
# Remove attachment key to try sending without attachment
|
||||||
|
del data[ATTR_ATTACHMENT]
|
||||||
|
else:
|
||||||
|
# Not a URL, check valid path first
|
||||||
|
if self._hass.config.is_allowed_path(data[ATTR_ATTACHMENT]):
|
||||||
|
# try to open it as a normal file.
|
||||||
|
try:
|
||||||
|
file_handle = open(data[ATTR_ATTACHMENT], 'rb')
|
||||||
|
# Replace the attachment identifier with file object.
|
||||||
|
data[ATTR_ATTACHMENT] = file_handle
|
||||||
|
except OSError as ex_val:
|
||||||
|
_LOGGER.error(ex_val)
|
||||||
|
# Remove attachment key to send without attachment.
|
||||||
|
del data[ATTR_ATTACHMENT]
|
||||||
|
else:
|
||||||
|
_LOGGER.error('Path is not whitelisted')
|
||||||
|
# Remove attachment key to send without attachment.
|
||||||
|
del data[ATTR_ATTACHMENT]
|
||||||
|
|
||||||
targets = kwargs.get(ATTR_TARGET)
|
targets = kwargs.get(ATTR_TARGET)
|
||||||
|
|
||||||
if not isinstance(targets, list):
|
if not isinstance(targets, list):
|
||||||
@ -65,6 +104,6 @@ class PushoverNotificationService(BaseNotificationService):
|
|||||||
try:
|
try:
|
||||||
self.pushover.send_message(message, **data)
|
self.pushover.send_message(message, **data)
|
||||||
except ValueError as val_err:
|
except ValueError as val_err:
|
||||||
_LOGGER.error(str(val_err))
|
_LOGGER.error(val_err)
|
||||||
except RequestError:
|
except RequestError:
|
||||||
_LOGGER.exception("Could not send pushover notification")
|
_LOGGER.exception("Could not send pushover notification")
|
||||||
|
@ -1454,7 +1454,7 @@ python-nest==4.1.0
|
|||||||
python-nmap==0.6.1
|
python-nmap==0.6.1
|
||||||
|
|
||||||
# homeassistant.components.pushover
|
# homeassistant.components.pushover
|
||||||
python-pushover==0.3
|
python-pushover==0.4
|
||||||
|
|
||||||
# homeassistant.components.qbittorrent
|
# homeassistant.components.qbittorrent
|
||||||
python-qbittorrent==0.3.1
|
python-qbittorrent==0.3.1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user