def filter(args): wf = workflow() prefs = Preferences.current_prefs() command = args[1] if len(args) > 1 else None duration_info = _duration_info(prefs.completed_duration) if command == 'duration': selected_duration = prefs.completed_duration # Apply selected duration option if len(args) > 2: try: selected_duration = int(args[2]) except: pass duration_info = _duration_info(selected_duration) if 'custom' in duration_info: wf.add_item(duration_info['label'], duration_info['subtitle'], arg='-completed duration %d' % (duration_info['days']), valid=True, icon=icons.RADIO_SELECTED if duration_info['days'] == selected_duration else icons.RADIO) for duration_info in _durations: wf.add_item(duration_info['label'], duration_info['subtitle'], arg='-completed duration %d' % (duration_info['days']), valid=True, icon=icons.RADIO_SELECTED if duration_info['days'] == selected_duration else icons.RADIO) wf.add_item('Back', autocomplete='-completed ', icon=icons.BACK) return # Force a sync if not done recently or join if already running if not prefs.last_sync or \ datetime.utcnow() - prefs.last_sync > timedelta(seconds=30) or \ is_running('sync'): sync() wf.add_item(duration_info['label'], subtitle='Change the duration for completed tasks', autocomplete='-completed duration ', icon=icons.YESTERDAY) conditions = True # Build task title query based on the args for arg in args[1:]: if len(arg) > 1: conditions = conditions & (Task.title.contains(arg) | TaskFolder.title.contains(arg)) if conditions is None: conditions = True tasks = Task.select().join(TaskFolder).where( (Task.completedDateTime > date.today() - timedelta(days=duration_info['days'])) & Task.list.is_null(False) & conditions )\ .order_by(Task.completedDateTime.desc(), Task.reminderDateTime.asc(), Task.changeKey.asc()) try: for t in tasks: wf.add_item(u'%s – %s' % (t.list_title, t.title), t.subtitle(), autocomplete='-task %s ' % t.id, icon=icons.TASK_COMPLETED if t.status == 'completed' else icons.TASK) except OperationalError: background_sync() wf.add_item('Main menu', autocomplete='', icon=icons.BACK) # Make sure tasks stay up-to-date background_sync_if_necessary(seconds=2)
def filter(args): wf = workflow() prefs = Preferences.current_prefs() command = args[1] if len(args) > 1 else None # Show sort options if command == 'sort': for i, order_info in enumerate(_due_orders): wf.add_item(order_info['title'], order_info['subtitle'], arg='-due sort %d' % (i + 1), valid=True, icon=icons.RADIO_SELECTED if order_info['due_order'] == prefs.due_order else icons.RADIO) wf.add_item( 'Highlight skipped recurring tasks', 'Hoists recurring tasks that have been missed multiple times over to the top', arg='-due sort toggle-skipped', valid=True, icon=icons.CHECKBOX_SELECTED if prefs.hoist_skipped_tasks else icons.CHECKBOX) wf.add_item('Back', autocomplete='-due ', icon=icons.BACK) return # Force a sync if not done recently or wait on the current sync if not prefs.last_sync or \ datetime.utcnow() - prefs.last_sync > timedelta(seconds=30) or \ is_running('sync'): sync() conditions = True # Build task title query based on the args for arg in args[1:]: if len(arg) > 1: conditions = conditions & (Task.title.contains(arg) | TaskFolder.title.contains(arg)) if conditions is None: conditions = True tasks = Task.select().join(TaskFolder).where( (Task.status != 'completed') & (Task.dueDateTime < datetime.now() + timedelta(days=1)) & Task.list_id.is_null(False) & conditions) # Sort the tasks according to user preference for key in prefs.due_order: order = 'asc' field = None if key[0] == '-': order = 'desc' key = key[1:] if key == 'due_date': field = Task.dueDateTime elif key == 'taskfolder.id': field = TaskFolder.id elif key == 'order': field = Task.lastModifiedDateTime if field: if order == 'asc': tasks = tasks.order_by(field.asc()) else: tasks = tasks.order_by(field.desc()) try: if prefs.hoist_skipped_tasks: log.debug('hoisting skipped tasks') tasks = sorted(tasks, key=lambda t: -t.overdue_times) for t in tasks: wf.add_item(u'%s – %s' % (t.list_title, t.title), t.subtitle(), autocomplete='-task %s ' % t.id, icon=icons.TASK_COMPLETED if t.status == 'completed' else icons.TASK) except OperationalError: background_sync() wf.add_item(u'Sort order', 'Change the display order of due tasks', autocomplete='-due sort', icon=icons.SORT) wf.add_item('Main menu', autocomplete='', icon=icons.BACK) # Make sure tasks stay up-to-date background_sync_if_necessary(seconds=2)
def route(args): handler = None command = [] command_string = '' action = 'none' logged_in = is_authorised() # Read the stored query, which will correspond to the user's alfred query # as of the very latest keystroke. This may be different than the query # when this script was launched due to the startup latency. if args[0] == '--stored-query': query_file = workflow().workflowfile('.query') with open(query_file, 'r') as f: command_string = workflow().decode(f.read()) os.remove(query_file) # Otherwise take the command from the first command line argument elif args: command_string = args[0] command_string = re.sub(COMMAND_PATTERN, '', command_string) command = re.split(r' +', command_string) if command: action = re.sub(ACTION_PATTERN, '', command[0]) or 'none' if 'about'.find(action) == 0: from mstodo.handlers import about handler = about elif not logged_in: from mstodo.handlers import login handler = login elif 'folder'.find(action) == 0: from mstodo.handlers import taskfolder handler = taskfolder elif 'task'.find(action) == 0: from mstodo.handlers import task handler = task elif 'search'.find(action) == 0: from mstodo.handlers import search handler = search elif 'due'.find(action) == 0: from mstodo.handlers import due handler = due elif 'upcoming'.find(action) == 0: from mstodo.handlers import upcoming handler = upcoming elif 'completed'.find(action) == 0: from mstodo.handlers import completed handler = completed elif 'logout'.find(action) == 0: from mstodo.handlers import logout handler = logout elif 'pref'.find(action) == 0: from mstodo.handlers import preferences handler = preferences # If the command starts with a space (no special keywords), the workflow # creates a new task elif not command_string: from mstodo.handlers import welcome handler = welcome else: from mstodo.handlers import new_task handler = new_task if handler: if '--commit' in args: modifier = re.search(r'--(alt|cmd|ctrl|fn)\b', ' '.join(args)) if modifier: modifier = modifier.group(1) handler.commit(command, modifier) else: handler.filter(command) if workflow().update_available: update_data = workflow().cached_data('__workflow_update_status', max_age=0) if update_data.get('version') != '0.1.2': workflow().add_item('An update is available!', 'Update the ToDo workflow from version 0.1.2 to %s' % update_data.get('version'), arg='-about update', valid=True, icon=icons.DOWNLOAD) workflow().send_feedback() if logged_in: background_sync_if_necessary()