Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wunderlist component #18339

Merged
merged 4 commits into from Nov 27, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
91 changes: 91 additions & 0 deletions homeassistant/components/wunderlist/__init__.py
@@ -0,0 +1,91 @@
"""
Component to interact with Wunderlist.

For more details about this component, please refer to the documentation at
https://home-assistant.io/components/wunderlist/
"""
import logging

import voluptuous as vol

import homeassistant.helpers.config_validation as cv
from homeassistant.const import (
CONF_NAME, CONF_ACCESS_TOKEN)

REQUIREMENTS = ['wunderpy2==0.1.6']

_LOGGER = logging.getLogger(__name__)

DOMAIN = 'wunderlist'
CONF_CLIENT_ID = 'client_id'
CONF_LIST_NAME = 'list_name'
CONF_STARRED = 'starred'


CONFIG_SCHEMA = vol.Schema({
DOMAIN: vol.Schema({
vol.Required(CONF_CLIENT_ID): cv.string,
vol.Required(CONF_ACCESS_TOKEN): cv.string
})
}, extra=vol.ALLOW_EXTRA)


SERVICE_CREATE_TASK = 'create_task'

SERVICE_SCHEMA_CREATE_TASK = vol.Schema({
vol.Required(CONF_LIST_NAME): cv.string,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We use constants named ATTR_* in service schemas.

vol.Required(CONF_NAME): cv.string,
vol.Optional(CONF_STARRED): cv.boolean
})


def setup(hass, config):
"""Set up the Wunderlist component."""
conf = config[DOMAIN]
client_id = conf.get(CONF_CLIENT_ID)
access_token = conf.get(CONF_ACCESS_TOKEN)
data = Wunderlist(access_token, client_id)
if not data.check_credentials():
_LOGGER.error("Invalid credentials")
return False

hass.services.register(DOMAIN, 'create_task', data.create_task)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The service schema should be used here.

return True


class Wunderlist:
"""Representation of an interface to Wunderlist."""

def __init__(self, access_token, client_id):
"""Create new instance of Wunderlist component."""
import wunderpy2

api = wunderpy2.WunderApi()
self._client = api.get_client(access_token, client_id)

_LOGGER.debug("Instance created")

def check_credentials(self):
"""Check if the provided credentials are valid."""
try:
self._client.get_lists()
return True
except ValueError:
return False

def create_task(self, call):
"""Create a new task on a list of Wunderlist."""
list_name = call.data.get(CONF_LIST_NAME)
task_title = call.data.get(CONF_NAME)
starred = call.data.get(CONF_STARRED)
list_id = self._list_by_name(list_name)
self._client.create_task(list_id, task_title, starred=starred)
return True
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nothing is checking this return value. Please remove the statement.


def _list_by_name(self, name):
"""Return a list ID by name."""
lists = self._client.get_lists()
tmp = [l for l in lists if l["title"] == name]
if tmp:
return tmp[0]["id"]
return None
15 changes: 15 additions & 0 deletions homeassistant/components/wunderlist/services.yaml
@@ -0,0 +1,15 @@
# Describes the format for available Wunderlist

create_task:
description: >
Create a new task in Wunderlist.
fields:
list_name:
description: name of the new list where the task will be created
example: 'Shopping list'
name:
description: name of the new task
example: 'Buy 5 bottles of beer'
starred:
description: Create the task as starred [Optional]
example: true
3 changes: 3 additions & 0 deletions requirements_all.txt
Expand Up @@ -1592,6 +1592,9 @@ websockets==6.0
# homeassistant.components.wirelesstag
wirelesstagpy==0.4.0

# homeassistant.components.wunderlist
wunderpy2==0.1.6

# homeassistant.components.zigbee
xbee-helper==0.0.7

Expand Down