from os.path import isfile
from difflib import Differ
from sqlite3 import connect as sql_connect, Cursor, Row
-from typing import Any, Self, TypeVar, Generic
+from typing import Any, Self, TypeVar, Generic, Callable
from plomtask.exceptions import HandledException, NotFoundException
from plomtask.dating import valid_date
to_search: list[str] = []
can_create_by_id = False
_exists = True
+ sorters: dict[str, Callable[..., Any]] = {}
def __init__(self, id_: BaseModelId | None) -> None:
if isinstance(id_, int) and id_ < 1:
"""Convenience method to return cls' name in lowercase."""
return cls.__name__.lower()
+ @classmethod
+ def sort_by(cls, seq: list[Any], sort_key: str, default: str = 'title'
+ ) -> str:
+ """Sort cls list by cls.sorters[sort_key] (reverse if '-'-prefixed)."""
+ reverse = False
+ if len(sort_key) > 1 and '-' == sort_key[0]:
+ sort_key = sort_key[1:]
+ reverse = True
+ if sort_key not in cls.sorters:
+ sort_key = default
+ sorter: Callable[..., Any] = cls.sorters[sort_key]
+ seq.sort(key=sorter, reverse=reverse)
+ if reverse:
+ sort_key = f'-{sort_key}'
+ return sort_key
+
# cache management
# (we primarily use the cache to ensure we work on the same object in
# memory no matter where and how we retrieve it, e.g. we don't want
todos = [t for t in todos_by_date_range
if comment_pattern in t.comment
and ((not process_id) or t.process.id_ == process_id)]
- if sort_by == 'doneness':
- todos.sort(key=lambda t: t.is_done)
- elif sort_by == '-doneness':
- todos.sort(key=lambda t: t.is_done, reverse=True)
- elif sort_by == 'title':
- todos.sort(key=lambda t: t.title_then)
- elif sort_by == '-title':
- todos.sort(key=lambda t: t.title_then, reverse=True)
- elif sort_by == 'comment':
- todos.sort(key=lambda t: t.comment)
- elif sort_by == '-comment':
- todos.sort(key=lambda t: t.comment, reverse=True)
- elif sort_by == '-date':
- todos.sort(key=lambda t: t.date, reverse=True)
- else:
- todos.sort(key=lambda t: t.date)
- sort_by = 'title'
+ sort_by = Todo.sort_by(todos, sort_by)
return {'start': start, 'end': end, 'process_id': process_id,
'comment_pattern': comment_pattern, 'todos': todos,
'all_processes': Process.all(self.conn), 'sort_by': sort_by}
pattern = self._params.get_str('pattern')
sort_by = self._params.get_str('sort_by')
conditions = Condition.matching(self.conn, pattern)
- if sort_by == 'is_active':
- conditions.sort(key=lambda c: c.is_active)
- elif sort_by == '-is_active':
- conditions.sort(key=lambda c: c.is_active, reverse=True)
- elif sort_by == '-title':
- conditions.sort(key=lambda c: c.title.newest, reverse=True)
- else:
- conditions.sort(key=lambda c: c.title.newest)
- sort_by = 'title'
+ sort_by = Condition.sort_by(conditions, sort_by)
return {'conditions': conditions,
'sort_by': sort_by,
'pattern': pattern}
pattern = self._params.get_str('pattern')
sort_by = self._params.get_str('sort_by')
processes = Process.matching(self.conn, pattern)
- if sort_by == 'steps':
- processes.sort(key=lambda p: len(p.explicit_steps))
- elif sort_by == '-steps':
- processes.sort(key=lambda p: len(p.explicit_steps), reverse=True)
- elif sort_by == 'owners':
- processes.sort(key=lambda p: p.n_owners or 0)
- elif sort_by == '-owners':
- processes.sort(key=lambda p: p.n_owners or 0, reverse=True)
- elif sort_by == 'effort':
- processes.sort(key=lambda p: p.effort.newest)
- elif sort_by == '-effort':
- processes.sort(key=lambda p: p.effort.newest, reverse=True)
- elif sort_by == '-title':
- processes.sort(key=lambda p: p.title.newest, reverse=True)
- else:
- processes.sort(key=lambda p: p.title.newest)
- sort_by = 'title'
+ sort_by = Process.sort_by(processes, sort_by)
return {'processes': processes, 'sort_by': sort_by, 'pattern': pattern}
# POST handlers