-
-
Notifications
You must be signed in to change notification settings - Fork 37.8k
Fix the todoist integration #27273
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
Fix the todoist integration #27273
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| 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 | ||
|
|
@@ -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 | ||
|
|
||
|
|
@@ -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 | ||
|
|
@@ -206,7 +209,7 @@ def handle_new_task(call): | |
| project_id = project_id_lookup[project_name] | ||
|
|
||
| # Create the task | ||
| 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] | ||
|
|
@@ -216,11 +219,12 @@ def handle_new_task(call): | |
| if PRIORITY in call.data: | ||
| item.update(priority=call.data[PRIORITY]) | ||
|
|
||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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: 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]) | ||
|
|
@@ -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]) | ||
|
|
@@ -381,6 +389,16 @@ def __init__( | |
| else: | ||
| self._project_id_whitelist = [] | ||
|
|
||
| def _parse_due_date(self, data: dict) -> datetime: | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Dates can be in 3 formats: |
||
| """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. | ||
|
|
@@ -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 | ||
|
|
@@ -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"], | ||
|
|
||
| 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 | ||
|
|
There was a problem hiding this comment.
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.