You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.4 KiB
100 lines
3.4 KiB
"""Adds config flow for HACS.""" |
|
# pylint: disable=dangerous-default-value |
|
import logging |
|
import voluptuous as vol |
|
from aiogithubapi import AIOGitHub, AIOGitHubException, AIOGitHubAuthentication |
|
from homeassistant import config_entries |
|
from homeassistant.core import callback |
|
from homeassistant.helpers import aiohttp_client |
|
|
|
from .const import DOMAIN |
|
from .configuration_schema import hacs_base_config_schema, hacs_config_option_schema |
|
|
|
|
|
_LOGGER = logging.getLogger(__name__) |
|
|
|
|
|
class HacsFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): |
|
"""Config flow for HACS.""" |
|
|
|
VERSION = 1 |
|
CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_POLL |
|
|
|
def __init__(self): |
|
"""Initialize.""" |
|
self._errors = {} |
|
|
|
async def async_step_user(self, user_input={}): |
|
"""Handle a flow initialized by the user.""" |
|
self._errors = {} |
|
if self._async_current_entries(): |
|
return self.async_abort(reason="single_instance_allowed") |
|
if self.hass.data.get(DOMAIN): |
|
return self.async_abort(reason="single_instance_allowed") |
|
|
|
if user_input is not None: |
|
if await self._test_token(user_input["token"]): |
|
return self.async_create_entry(title="", data=user_input) |
|
|
|
self._errors["base"] = "auth" |
|
return await self._show_config_form(user_input) |
|
|
|
return await self._show_config_form(user_input) |
|
|
|
async def _show_config_form(self, user_input): |
|
"""Show the configuration form to edit location data.""" |
|
return self.async_show_form( |
|
step_id="user", |
|
data_schema=vol.Schema(hacs_base_config_schema(user_input)), |
|
errors=self._errors, |
|
) |
|
|
|
@staticmethod |
|
@callback |
|
def async_get_options_flow(config_entry): |
|
return HacsOptionsFlowHandler(config_entry) |
|
|
|
async def async_step_import(self, user_input): |
|
"""Import a config entry. |
|
Special type of import, we're not actually going to store any data. |
|
Instead, we're going to rely on the values that are in config file. |
|
""" |
|
if self._async_current_entries(): |
|
return self.async_abort(reason="single_instance_allowed") |
|
|
|
return self.async_create_entry(title="configuration.yaml", data={}) |
|
|
|
async def _test_token(self, token): |
|
"""Return true if token is valid.""" |
|
try: |
|
session = aiohttp_client.async_get_clientsession(self.hass) |
|
client = AIOGitHub(token, session) |
|
await client.get_repo("hacs/org") |
|
return True |
|
except (AIOGitHubException, AIOGitHubAuthentication) as exception: |
|
_LOGGER.error(exception) |
|
return False |
|
|
|
|
|
class HacsOptionsFlowHandler(config_entries.OptionsFlow): |
|
"""HACS config flow options handler.""" |
|
|
|
def __init__(self, config_entry): |
|
"""Initialize HACS options flow.""" |
|
self.config_entry = config_entry |
|
|
|
async def async_step_init(self, user_input=None): |
|
"""Manage the options.""" |
|
return await self.async_step_user() |
|
|
|
async def async_step_user(self, user_input=None): |
|
"""Handle a flow initialized by the user.""" |
|
if user_input is not None: |
|
return self.async_create_entry(title="", data=user_input) |
|
|
|
return self.async_show_form( |
|
step_id="user", |
|
data_schema=vol.Schema( |
|
hacs_config_option_schema(self.config_entry.options) |
|
), |
|
)
|
|
|