72 lines
2.2 KiB
Python
72 lines
2.2 KiB
Python
import datetime
|
|
import time
|
|
|
|
from .search import parse_search_terms, satisfies_search_terms
|
|
|
|
|
|
# pylint: disable=too-many-branches,too-many-locals,too-many-arguments
|
|
def iter_tasks(events, limit=None, offset=0, type=None, worker=None, state=None,
|
|
sort_by=None, received_start=None, received_end=None,
|
|
started_start=None, started_end=None, search=None):
|
|
i = 0
|
|
tasks = events.state.tasks_by_timestamp()
|
|
if sort_by is not None:
|
|
tasks = sort_tasks(tasks, sort_by)
|
|
|
|
def convert(x):
|
|
return time.mktime(datetime.datetime.strptime(x, '%Y-%m-%d %H:%M').timetuple())
|
|
|
|
search_terms = parse_search_terms(search or {})
|
|
|
|
for uuid, task in tasks:
|
|
if type and task.name != type:
|
|
continue
|
|
if worker and task.worker and task.worker.hostname != worker:
|
|
continue
|
|
if state and task.state != state:
|
|
continue
|
|
if received_start and task.received and\
|
|
task.received < convert(received_start):
|
|
continue
|
|
if received_end and task.received and\
|
|
task.received > convert(received_end):
|
|
continue
|
|
if started_start and task.started and\
|
|
task.started < convert(started_start):
|
|
continue
|
|
if started_end and task.started and\
|
|
task.started > convert(started_end):
|
|
continue
|
|
if not satisfies_search_terms(task, search_terms):
|
|
continue
|
|
if i >= offset:
|
|
yield uuid, task
|
|
i += 1
|
|
if limit is not None:
|
|
if i == limit + offset:
|
|
break
|
|
|
|
|
|
sort_keys = {'name': str, 'state': str, 'received': float, 'started': float}
|
|
|
|
|
|
def sort_tasks(tasks, sort_by):
|
|
assert sort_by.lstrip('-') in sort_keys
|
|
reverse = False
|
|
if sort_by.startswith('-'):
|
|
sort_by = sort_by.lstrip('-')
|
|
reverse = True
|
|
for task in sorted(
|
|
tasks,
|
|
key=lambda x: getattr(x[1], sort_by) or sort_keys[sort_by](),
|
|
reverse=reverse):
|
|
yield task
|
|
|
|
|
|
def get_task_by_id(events, task_id):
|
|
return events.state.tasks.get(task_id)
|
|
|
|
|
|
def as_dict(task):
|
|
return task.as_dict()
|