Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 25 additions & 16 deletions homeassistant/components/todoist/calendar.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
"""Support for Todoist task management (https://todoist.com)."""
from datetime import datetime, timedelta
from typing import Union
import logging

import voluptuous as vol
Expand All @@ -11,6 +12,7 @@
)
from homeassistant.const import CONF_ID, CONF_NAME, CONF_TOKEN
import homeassistant.helpers.config_validation as cv
import homeassistant.util.dt as dt_util
from homeassistant.helpers.template import DATE_STR_FORMAT
from homeassistant.util import Throttle, dt

Expand All @@ -36,6 +38,7 @@
DESCRIPTION = "description"
# Calendar Platform: Used in the '_get_date()' method
DATETIME = "dateTime"
DUE = "due"
# Service Call: When is this task due (in natural language)?
DUE_DATE_STRING = "due_date_string"
# Service Call: The language of DUE_DATE_STRING
Expand Down Expand Up @@ -206,7 +209,7 @@ def handle_new_task(call):
project_id = project_id_lookup[project_name]

# Create the task

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This call now requires a kwarg.

item = api.items.add(call.data[CONTENT], project_id)
item = api.items.add(call.data[CONTENT], project_id=project_id)

if LABELS in call.data:
task_labels = call.data[LABELS]
Expand All @@ -216,11 +219,12 @@ def handle_new_task(call):
if PRIORITY in call.data:
item.update(priority=call.data[PRIORITY])

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This is the primary change to get things working with the latest version. The due parameter is now an object

_due: dict = {}
if DUE_DATE_STRING in call.data:
item.update(date_string=call.data[DUE_DATE_STRING])
_due["string"] = call.data[DUE_DATE_STRING]

if DUE_DATE_LANG in call.data:
item.update(date_lang=call.data[DUE_DATE_LANG])
_due["lang"] = call.data[DUE_DATE_LANG]

if DUE_DATE in call.data:
due_date = dt.parse_datetime(call.data[DUE_DATE])
Expand All @@ -231,7 +235,11 @@ def handle_new_task(call):
due_date = dt.as_utc(due_date)
date_format = "%Y-%m-%dT%H:%M"
due_date = datetime.strftime(due_date, date_format)
item.update(due_date_utc=due_date)
_due["date"] = due_date

if _due:
item.update(due=_due)

# Commit changes
api.commit()
_LOGGER.debug("Created Todoist task: %s", call.data[CONTENT])
Expand Down Expand Up @@ -381,6 +389,16 @@ def __init__(
else:
self._project_id_whitelist = []

def _parse_due_date(self, data: dict) -> datetime:

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Dates can be in 3 formats:
'2019-10-01'
'2019-10-01T12:00:00'
'2019-10-01T12:00:00Z'

"""Parse the due date dict into a datetime object."""
# Add time information to date only strings.
if len(data["date"]) == 10:
data["date"] += "T00:00:00"
# If there is no timezone provided, use UTC.
if data["timezone"] is None:
data["date"] += "Z"
return dt_util.parse_datetime(data["date"])

def create_todoist_task(self, data):
"""
Create a dictionary based on a Task passed from the Todoist API.
Expand Down Expand Up @@ -412,16 +430,8 @@ def create_todoist_task(self, data):
# complete the task.
# Generally speaking, that means right now.
task[START] = dt.utcnow()
if data[DUE_DATE_UTC] is not None:
due_date = data[DUE_DATE_UTC]

# Due dates are represented in RFC3339 format, in UTC.
# Home Assistant exclusively uses UTC, so it'll
# handle the conversion.
time_format = "%a %d %b %Y %H:%M:%S %z"
# HASS' built-in parse time function doesn't like
# Todoist's time format; strptime has to be used.
task[END] = datetime.strptime(due_date, time_format)
if data[DUE] is not None:
task[END] = self._parse_due_date(data[DUE])

if self._latest_due_date is not None and (
task[END] > self._latest_due_date
Expand Down Expand Up @@ -540,9 +550,8 @@ async def async_get_events(self, hass, start_date, end_date):
project_task_data = project_data[TASKS]

events = []
time_format = "%a %d %b %Y %H:%M:%S %z"
for task in project_task_data:
due_date = datetime.strptime(task["due_date_utc"], time_format)
due_date = self._parse_due_date(task["due"])
if start_date < due_date < end_date:
event = {
"uid": task["id"],
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/todoist/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"name": "Todoist",
"documentation": "https://www.home-assistant.io/integrations/todoist",
"requirements": [
"todoist-python==7.0.17"
"todoist-python==8.0.0"
],
"dependencies": [],
"codeowners": []
Expand Down
25 changes: 25 additions & 0 deletions homeassistant/components/todoist/services.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
new_task:
description: Create a new task and add it to a project.
fields:
content:
description: The name of the task.
example: Pick up the mail.
project:
description: The name of the project this task should belong to. Defaults to Inbox.
example: Errands
labels:
description: Any labels that you want to apply to this task, separated by a comma.
example: Chores,Delivieries
priority:
description: The priority of this task, from 1 (normal) to 4 (urgent).
example: 2
due_date_string:
description: The day this task is due, in natural language.
example: Tomorrow
due_date_lang:
description: The language of due_date_string.
example: en
due_date:
description: The day this task is due, in format YYYY-MM-DD.
example: 2019-10-22

2 changes: 1 addition & 1 deletion requirements_all.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1891,7 +1891,7 @@ thingspeak==0.4.1
tikteck==0.4

# homeassistant.components.todoist
todoist-python==7.0.17
todoist-python==8.0.0

# homeassistant.components.toon
toonapilib==3.2.4
Expand Down