add logo support (#104)

* fix lint

* fix lint p2

* fix api output

* fix decorator

* fix decorator p2

* fix UnboundLocalError

* revert

* fix trace bug

* fix conent type

* allow logo
This commit is contained in:
Pascal Vizeli 2017-07-21 00:23:31 +02:00 committed by GitHub
parent 251a43216e
commit 7e1bb42bb7
6 changed files with 25 additions and 18 deletions

3
API.md
View File

@ -299,7 +299,8 @@ Get all available addons
"installed": "none|INSTALL_VERSION", "installed": "none|INSTALL_VERSION",
"detached": "bool", "detached": "bool",
"build": "bool", "build": "bool",
"url": "null|url" "url": "null|url",
"logo": "bool"
} }
], ],
"repositories": [ "repositories": [

View File

@ -19,7 +19,7 @@ from ..const import (
ATTR_URL, ATTR_ARCH, ATTR_LOCATON, ATTR_DEVICES, ATTR_ENVIRONMENT, ATTR_URL, ATTR_ARCH, ATTR_LOCATON, ATTR_DEVICES, ATTR_ENVIRONMENT,
ATTR_HOST_NETWORK, ATTR_TMPFS, ATTR_PRIVILEGED, ATTR_STARTUP, ATTR_HOST_NETWORK, ATTR_TMPFS, ATTR_PRIVILEGED, ATTR_STARTUP,
STATE_STARTED, STATE_STOPPED, STATE_NONE, ATTR_USER, ATTR_SYSTEM, STATE_STARTED, STATE_STOPPED, STATE_NONE, ATTR_USER, ATTR_SYSTEM,
ATTR_STATE, ATTR_TIMEOUT, ATTR_AUTO_UPDATE, ATTR_NETWORK, ATTR_LOGO) ATTR_STATE, ATTR_TIMEOUT, ATTR_AUTO_UPDATE, ATTR_NETWORK)
from .util import check_installed from .util import check_installed
from ..dock.addon import DockerAddon from ..dock.addon import DockerAddon
from ..tools import write_json_file, read_json_file from ..tools import write_json_file, read_json_file
@ -130,7 +130,8 @@ class Addon(object):
@property @property
def auto_update(self): def auto_update(self):
"""Return if auto update is enable.""" """Return if auto update is enable."""
return self.data.user[self._id][ATTR_AUTO_UPDATE] if ATTR_AUTO_UPDATE in self.data.user.get(self._id, {}):
return self.data.user[self._id][ATTR_AUTO_UPDATE]
@auto_update.setter @auto_update.setter
def auto_update(self, value): def auto_update(self, value):

View File

@ -11,7 +11,8 @@ from ..const import (
ATTR_URL, ATTR_DESCRIPTON, ATTR_DETACHED, ATTR_NAME, ATTR_REPOSITORY, ATTR_URL, ATTR_DESCRIPTON, ATTR_DETACHED, ATTR_NAME, ATTR_REPOSITORY,
ATTR_BUILD, ATTR_AUTO_UPDATE, ATTR_NETWORK, ATTR_HOST_NETWORK, ATTR_SLUG, ATTR_BUILD, ATTR_AUTO_UPDATE, ATTR_NETWORK, ATTR_HOST_NETWORK, ATTR_SLUG,
ATTR_SOURCE, ATTR_REPOSITORIES, ATTR_ADDONS, ATTR_ARCH, ATTR_MAINTAINER, ATTR_SOURCE, ATTR_REPOSITORIES, ATTR_ADDONS, ATTR_ARCH, ATTR_MAINTAINER,
ATTR_INSTALLED, ATTR_LOGO, BOOT_AUTO, BOOT_MANUAL, CONTENT_TYPE_PNG) ATTR_INSTALLED, ATTR_LOGO, BOOT_AUTO, BOOT_MANUAL, CONTENT_TYPE_PNG,
CONTENT_TYPE_BINARY)
from ..validate import DOCKER_PORTS from ..validate import DOCKER_PORTS
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -107,6 +108,7 @@ class APIAddons(object):
ATTR_BUILD: addon.need_build, ATTR_BUILD: addon.need_build,
ATTR_NETWORK: addon.ports, ATTR_NETWORK: addon.ports,
ATTR_HOST_NETWORK: addon.network_mode == 'host', ATTR_HOST_NETWORK: addon.network_mode == 'host',
ATTR_LOGO: addon.with_logo,
} }
@api_process @api_process
@ -183,7 +185,7 @@ class APIAddons(object):
addon = self._extract_addon(request) addon = self._extract_addon(request)
return await asyncio.shield(addon.restart(), loop=self.loop) return await asyncio.shield(addon.restart(), loop=self.loop)
@api_process_raw @api_process_raw(CONTENT_TYPE_BINARY)
def logs(self, request): def logs(self, request):
"""Return logs from addon.""" """Return logs from addon."""
addon = self._extract_addon(request) addon = self._extract_addon(request)
@ -192,8 +194,8 @@ class APIAddons(object):
@api_process_raw(CONTENT_TYPE_PNG) @api_process_raw(CONTENT_TYPE_PNG)
async def logo(self, request): async def logo(self, request):
"""Return logo from addon.""" """Return logo from addon."""
addon = self._extract_addon(request) addon = self._extract_addon(request, check_installed=False)
if addon.with_logo: if not addon.with_logo:
raise RuntimeError("No image found!") raise RuntimeError("No image found!")
with addon.path_logo.open('rb') as png: with addon.path_logo.open('rb') as png:

View File

@ -6,7 +6,8 @@ import voluptuous as vol
from .util import api_process, api_process_raw, api_validate from .util import api_process, api_process_raw, api_validate
from ..const import ( from ..const import (
ATTR_VERSION, ATTR_LAST_VERSION, ATTR_DEVICES, ATTR_IMAGE, ATTR_CUSTOM) ATTR_VERSION, ATTR_LAST_VERSION, ATTR_DEVICES, ATTR_IMAGE, ATTR_CUSTOM,
CONTENT_TYPE_BINARY)
from ..validate import HASS_DEVICES from ..validate import HASS_DEVICES
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -79,7 +80,7 @@ class APIHomeAssistant(object):
return await asyncio.shield( return await asyncio.shield(
self.homeassistant.restart(), loop=self.loop) self.homeassistant.restart(), loop=self.loop)
@api_process_raw @api_process_raw(CONTENT_TYPE_BINARY)
def logs(self, request): def logs(self, request):
"""Return homeassistant docker logs. """Return homeassistant docker logs.

View File

@ -10,7 +10,7 @@ from ..const import (
HASSIO_VERSION, ATTR_ADDONS_REPOSITORIES, ATTR_REPOSITORIES, HASSIO_VERSION, ATTR_ADDONS_REPOSITORIES, ATTR_REPOSITORIES,
ATTR_REPOSITORY, ATTR_DESCRIPTON, ATTR_NAME, ATTR_SLUG, ATTR_INSTALLED, ATTR_REPOSITORY, ATTR_DESCRIPTON, ATTR_NAME, ATTR_SLUG, ATTR_INSTALLED,
ATTR_DETACHED, ATTR_SOURCE, ATTR_MAINTAINER, ATTR_URL, ATTR_ARCH, ATTR_DETACHED, ATTR_SOURCE, ATTR_MAINTAINER, ATTR_URL, ATTR_ARCH,
ATTR_BUILD, ATTR_TIMEZONE) ATTR_BUILD, ATTR_TIMEZONE, CONTENT_TYPE_BINARY)
from ..tools import validate_timezone from ..tools import validate_timezone
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -150,7 +150,7 @@ class APISupervisor(object):
return True return True
@api_process_raw @api_process_raw(CONTENT_TYPE_BINARY)
def logs(self, request): def logs(self, request):
"""Return supervisor docker logs. """Return supervisor docker logs.

View File

@ -66,21 +66,23 @@ def api_process_hostcontrol(method):
return wrap_hostcontrol return wrap_hostcontrol
def api_process_raw(content=CONTENT_TYPE_BINARY): def api_process_raw(content):
def api_raw(method): """Wrap content_type into function."""
def wrap_method(method):
"""Wrap function with raw output to rest api.""" """Wrap function with raw output to rest api."""
async def wrap_api(api, *args, **kwargs): async def wrap_api(api, *args, **kwargs):
"""Return api information.""" """Return api information."""
try: try:
message = await method(api, *args, **kwargs) msg_data = await method(api, *args, **kwargs)
msg_type = content
except RuntimeError as err: except RuntimeError as err:
message = str(err).encode() msg_data = str(err).encode()
content = CONTENT_TYPE_BINARY msg_type = CONTENT_TYPE_BINARY
return web.Response(body=message, content_type=content) return web.Response(body=msg_data, content_type=msg_type)
return wrap_api return wrap_api
return api_raw return wrap_method
def api_return_error(message=None): def api_return_error(message=None):