Minor clean-up of code

dev^2
Hoffelhas 2023-01-15 13:53:28 +01:00
parent a66905e88c
commit a4f99fa0c1
1 changed files with 25 additions and 37 deletions

View File

@ -5,7 +5,6 @@ from todoist_api_python.models import Task
from todoist_api_python.models import Section from todoist_api_python.models import Section
from todoist_api_python.models import Project from todoist_api_python.models import Project
from todoist_api_python.http_requests import get from todoist_api_python.http_requests import get
from todoist_api_python.http_requests import post
from urllib.parse import urljoin from urllib.parse import urljoin
from urllib.parse import quote from urllib.parse import quote
import sys import sys
@ -19,8 +18,6 @@ import sqlite3
import os import os
import re import re
import json import json
from collections import defaultdict
# Connect to SQLite database # Connect to SQLite database
@ -365,18 +362,13 @@ def initialise_api(args):
# Run the initial sync # Run the initial sync
logging.debug('Connecting to the Todoist API') logging.debug('Connecting to the Todoist API')
api_arguments = {'token': args.api_key} api_arguments = {'token': args.api_key}
if args.nocache:
logging.debug('Disabling local caching')
api_arguments['cache'] = None
api = TodoistAPI(**api_arguments) api = TodoistAPI(**api_arguments)
logging.info("Autodoist has successfully connected to Todoist!") logging.info("Autodoist has successfully connected to Todoist!")
sync_api = initialise_sync_api(api) sync_api = initialise_sync_api(api)
api.sync_token = sync_api['sync_token'] # Save SYNC API token to enable partial syncs # Save SYNC API token to enable partial syncs
api.sync_token = sync_api['sync_token']
# Check if labels exist # Check if labels exist
@ -452,7 +444,8 @@ def initialise_sync_api(api):
} }
data = 'sync_token=*&resource_types=["all"]' data = 'sync_token=*&resource_types=["all"]'
response = requests.post('https://api.todoist.com/sync/v9/sync', headers=headers, data=data) response = requests.post(
'https://api.todoist.com/sync/v9/sync', headers=headers, data=data)
return json.loads(response.text) return json.loads(response.text)
@ -507,7 +500,8 @@ def sync(api):
'Content-Type': 'application/x-www-form-urlencoded', 'Content-Type': 'application/x-www-form-urlencoded',
} }
data = 'sync_token=' + api.sync_token + '&commands=' + json.dumps(api.queue) data = 'sync_token=' + api.sync_token + \
'&commands=' + json.dumps(api.queue)
response = requests.post( response = requests.post(
'https://api.todoist.com/sync/v9/sync', headers=headers, data=data) 'https://api.todoist.com/sync/v9/sync', headers=headers, data=data)
@ -646,7 +640,7 @@ def get_task_type(args, connection, task, section, project):
# Logic to track addition of a label to a task # Logic to track addition of a label to a task
def add_label(connection, task, dominant_type, label, overview_task_ids, overview_task_labels): def add_label(task, label, overview_task_ids, overview_task_labels):
if label not in task.labels: if label not in task.labels:
labels = task.labels # To also copy other existing labels labels = task.labels # To also copy other existing labels
logging.debug('Updating \'%s\' with label', task.content) logging.debug('Updating \'%s\' with label', task.content)
@ -981,8 +975,8 @@ def autodoist_magic(args, api, connection):
# Get all todoist info # Get all todoist info
try: try:
all_projects = api.get_projects() # To save on request to stay under the limit all_projects = api.get_projects() # To save on request to stay under the limit
all_sections = api.get_sections() # To save on request to stay under the limit all_sections = api.get_sections() # To save on request to stay under the limit
all_tasks = api.get_tasks() all_tasks = api.get_tasks()
except Exception as error: except Exception as error:
@ -1011,7 +1005,8 @@ def autodoist_magic(args, api, connection):
# Get all tasks for the project # Get all tasks for the project
try: try:
project_tasks = [t for t in all_tasks if t.project_id == project.id] project_tasks = [
t for t in all_tasks if t.project_id == project.id]
except Exception as error: except Exception as error:
print(error) print(error)
@ -1025,12 +1020,6 @@ def autodoist_magic(args, api, connection):
db_update_value(connection, task, 'parent_type', None) db_update_value(connection, task, 'parent_type', None)
# Run for both non-sectioned and sectioned tasks # Run for both non-sectioned and sectioned tasks
# Get completed tasks:
# endpoint = 'https://api.todoist.com/sync/v9/completed/get_all'
# get(api._session, endpoint, api._token, '0')['items']
# $ curl https://api.todoist.com/sync/v9/sync-H "Authorization: Bearer e2f750b64e8fc06ae14383d5e15ea0792a2c1bf3" -d commands='[ {"type": "item_add", "temp_id": "63f7ed23-a038-46b5-b2c9-4abda9097ffa", "uuid": "997d4b43-55f1-48a9-9e66-de5785dfd69b", "args": {"content": "Buy Milk", "project_id": "2203306141","labels": ["Food", "Shopping"]}}]'
# for s in [0,1]: # for s in [0,1]:
# if s == 0: # if s == 0:
# sections = Section(None, None, 0, project.id) # sections = Section(None, None, 0, project.id)
@ -1223,6 +1212,7 @@ def autodoist_magic(args, api, connection):
# Inherit project type # Inherit project type
dominant_type = project_type dominant_type = project_type
# TODO: optimise below code
# If indicated on project level # If indicated on project level
if dominant_type[0] == 's': if dominant_type[0] == 's':
if not first_found[0]: if not first_found[0]:
@ -1230,7 +1220,7 @@ def autodoist_magic(args, api, connection):
if dominant_type[1] == 's': if dominant_type[1] == 's':
if not first_found[1]: if not first_found[1]:
add_label( add_label(
connection, task, dominant_type, next_action_label, overview_task_ids, overview_task_labels) task, next_action_label, overview_task_ids, overview_task_labels)
elif next_action_label in task.labels: elif next_action_label in task.labels:
# Probably the task has been manually moved, so if it has a label, let's remove it. # Probably the task has been manually moved, so if it has a label, let's remove it.
@ -1239,14 +1229,14 @@ def autodoist_magic(args, api, connection):
elif dominant_type[1] == 'p': elif dominant_type[1] == 'p':
add_label( add_label(
connection, task, dominant_type, next_action_label, overview_task_ids, overview_task_labels) task, next_action_label, overview_task_ids, overview_task_labels)
elif dominant_type[0] == 'p': elif dominant_type[0] == 'p':
if dominant_type[1] == 's': if dominant_type[1] == 's':
if not first_found[1]: if not first_found[1]:
add_label( add_label(
connection, task, dominant_type, next_action_label, overview_task_ids, overview_task_labels) task, next_action_label, overview_task_ids, overview_task_labels)
elif next_action_label in task.labels: elif next_action_label in task.labels:
# Probably the task has been manually moved, so if it has a label, let's remove it. # Probably the task has been manually moved, so if it has a label, let's remove it.
@ -1255,13 +1245,13 @@ def autodoist_magic(args, api, connection):
elif dominant_type[1] == 'p': elif dominant_type[1] == 'p':
add_label( add_label(
connection, task, dominant_type, next_action_label, overview_task_ids, overview_task_labels) task, next_action_label, overview_task_ids, overview_task_labels)
# If indicated on section level # If indicated on section level
if dominant_type[0] == 'x' and dominant_type[1] == 's': if dominant_type[0] == 'x' and dominant_type[1] == 's':
if not first_found[1]: if not first_found[1]:
add_label( add_label(
connection, task, dominant_type, next_action_label, overview_task_ids, overview_task_labels) task, next_action_label, overview_task_ids, overview_task_labels)
elif next_action_label in task.labels: elif next_action_label in task.labels:
# Probably the task has been manually moved, so if it has a label, let's remove it. # Probably the task has been manually moved, so if it has a label, let's remove it.
@ -1269,14 +1259,14 @@ def autodoist_magic(args, api, connection):
task, next_action_label, overview_task_ids, overview_task_labels) task, next_action_label, overview_task_ids, overview_task_labels)
elif dominant_type[0] == 'x' and dominant_type[1] == 'p': elif dominant_type[0] == 'x' and dominant_type[1] == 'p':
add_label(connection, task, dominant_type, next_action_label, add_label(task, next_action_label,
overview_task_ids, overview_task_labels) overview_task_ids, overview_task_labels)
# If indicated on parentless task level # If indicated on parentless task level
if dominant_type[1] == 'x' and dominant_type[2] == 's': if dominant_type[1] == 'x' and dominant_type[2] == 's':
if not first_found[1]: if not first_found[1]:
add_label( add_label(
connection, task, dominant_type, next_action_label, overview_task_ids, overview_task_labels) task, next_action_label, overview_task_ids, overview_task_labels)
if next_action_label in task.labels: if next_action_label in task.labels:
# Probably the task has been manually moved, so if it has a label, let's remove it. # Probably the task has been manually moved, so if it has a label, let's remove it.
@ -1284,7 +1274,7 @@ def autodoist_magic(args, api, connection):
task, next_action_label, overview_task_ids, overview_task_labels) task, next_action_label, overview_task_ids, overview_task_labels)
elif dominant_type[1] == 'x' and dominant_type[2] == 'p': elif dominant_type[1] == 'x' and dominant_type[2] == 'p':
add_label(connection, task, dominant_type, next_action_label, add_label(task, next_action_label,
overview_task_ids, overview_task_labels) overview_task_ids, overview_task_labels)
# If a parentless or sub-task which has children # If a parentless or sub-task which has children
@ -1326,7 +1316,7 @@ def autodoist_magic(args, api, connection):
# Pass label down to the first child # Pass label down to the first child
if not child_task.is_completed and next_action_label in task.labels: if not child_task.is_completed and next_action_label in task.labels:
add_label( add_label(
connection, child_task, dominant_type, next_action_label, overview_task_ids, overview_task_labels) child_task, next_action_label, overview_task_ids, overview_task_labels)
remove_label( remove_label(
task, next_action_label, overview_task_ids, overview_task_labels) task, next_action_label, overview_task_ids, overview_task_labels)
@ -1346,7 +1336,7 @@ def autodoist_magic(args, api, connection):
if not child_task.is_completed: if not child_task.is_completed:
add_label( add_label(
connection, child_task, dominant_type, next_action_label, overview_task_ids, overview_task_labels) child_task, next_action_label, overview_task_ids, overview_task_labels)
# Remove labels based on start / due dates # Remove labels based on start / due dates
@ -1432,7 +1422,6 @@ def autodoist_magic(args, api, connection):
first_found[1] = True first_found[1] = True
# Mark first found section with tasks in project (to account for None section) # Mark first found section with tasks in project (to account for None section)
# TODO: is this always true? What about starred tasks?
if next_action_label is not None and first_found[0] == False and section_tasks: if next_action_label is not None and first_found[0] == False and section_tasks:
first_found[0] = True first_found[0] = True
@ -1455,7 +1444,7 @@ def main():
parser.add_argument( parser.add_argument(
'-l', '--label', help='enable next action labelling. Define which label to use.', type=str) '-l', '--label', help='enable next action labelling. Define which label to use.', type=str)
parser.add_argument( parser.add_argument(
'-r', '--regeneration', help='enable regeneration of sub-tasks in recurring lists. Chose overall mode: 0 - regen off, 1 - regen all (default), 2 - regen only if all sub-tasks are completed. Task labels can be used to overwrite this mode.', nargs='?', const='1', default=None, type=int) '-r', '--regeneration', help='[CURRENTLY DISABLED FEATURE] enable regeneration of sub-tasks in recurring lists. Chose overall mode: 0 - regen off, 1 - regen all (default), 2 - regen only if all sub-tasks are completed. Task labels can be used to overwrite this mode.', nargs='?', const='1', default=None, type=int)
parser.add_argument( parser.add_argument(
'-e', '--end', help='enable alternative end-of-day time instead of default midnight. Enter a number from 1 to 24 to define which hour is used.', type=int) '-e', '--end', help='enable alternative end-of-day time instead of default midnight. Enter a number from 1 to 24 to define which hour is used.', type=int)
parser.add_argument( parser.add_argument(
@ -1465,13 +1454,11 @@ def main():
parser.add_argument( parser.add_argument(
'-s', '--s_suffix', help='change suffix for sequential labeling (default "-").', default='-') '-s', '--s_suffix', help='change suffix for sequential labeling (default "-").', default='-')
parser.add_argument( parser.add_argument(
'-df', '--dateformat', help='strptime() format of starting date (default "%%d-%%m-%%Y").', default='%d-%m-%Y') '-df', '--dateformat', help='[CURRENTLY DISABLED FEATURE] strptime() format of starting date (default "%%d-%%m-%%Y").', default='%d-%m-%Y')
parser.add_argument( parser.add_argument(
'-hf', '--hide_future', help='prevent labelling of future tasks beyond a specified number of days.', default=0, type=int) '-hf', '--hide_future', help='prevent labelling of future tasks beyond a specified number of days.', default=0, type=int)
parser.add_argument( parser.add_argument(
'--onetime', help='update Todoist once and exit.', action='store_true') '--onetime', help='update Todoist once and exit.', action='store_true')
parser.add_argument(
'--nocache', help='disables caching data to disk for quicker syncing.', action='store_true')
parser.add_argument('--debug', help='enable debugging and store detailed to a log file.', parser.add_argument('--debug', help='enable debugging and store detailed to a log file.',
action='store_true') action='store_true')
parser.add_argument('--inbox', help='the method the Inbox should be processed with.', parser.add_argument('--inbox', help='the method the Inbox should be processed with.',
@ -1492,6 +1479,7 @@ def main():
else: else:
log_level = logging.INFO log_level = logging.INFO
# Set logging config settings
logging.basicConfig(level=log_level, logging.basicConfig(level=log_level,
format='%(asctime)s %(levelname)-8s %(message)s', format='%(asctime)s %(levelname)-8s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S', datefmt='%Y-%m-%d %H:%M:%S',