taskai-cli 1.2.1__tar.gz → 1.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/PKG-INFO +1 -1
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/pyproject.toml +1 -1
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/taskai/cli.py +23 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/taskai/models.py +1 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/taskai/views.py +15 -4
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/.github/workflows/publish-to-pypi.yml +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/.gitignore +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/DEVLOG.md +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/README.md +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/docs/index.md +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/mkdocs.yml +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/scripts/bump_version.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/taskai/config.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/taskai/help_menu.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/taskai/json_dir_database.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/taskai/services/ai.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/taskai/services/pomodoro.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/taskai/services/repair_database.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/taskai/services/user_setup.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/test/test_cli.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/test/test_execution.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/test/test_json_dir_database.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.4.0}/test/test_view.py +0 -0
|
@@ -52,6 +52,12 @@ class Controller:
|
|
|
52
52
|
return db.get_item(id_)
|
|
53
53
|
return None
|
|
54
54
|
|
|
55
|
+
def _find_item_by_identifier(identifier: str|int) -> TodoItem:
|
|
56
|
+
if _is_int(identifier):
|
|
57
|
+
return db.get_item(identifier)
|
|
58
|
+
else:
|
|
59
|
+
return Controller._find_model_by_stringmatch("name", identifier)
|
|
60
|
+
|
|
55
61
|
def _parse_item_kwargs(kwargs):
|
|
56
62
|
for k, v in kwargs.copy().items():
|
|
57
63
|
if v is None:
|
|
@@ -240,6 +246,15 @@ class Controller:
|
|
|
240
246
|
db.update_item(parent.id, child_ids=new_child_ids)
|
|
241
247
|
db.commit()
|
|
242
248
|
|
|
249
|
+
def add_link(parent_id: int|str, child_id: int|str):
|
|
250
|
+
parent: TodoItem = Controller._find_item_by_identifier(parent_id)
|
|
251
|
+
child: TodoItem = Controller._find_item_by_identifier(child_id)
|
|
252
|
+
|
|
253
|
+
if child.id not in parent.linked_ids:
|
|
254
|
+
parent.linked_ids.append(child_id)
|
|
255
|
+
db.update_item(parent.id, linked_ids=parent.linked_ids)
|
|
256
|
+
db.commit()
|
|
257
|
+
|
|
243
258
|
|
|
244
259
|
# utilities
|
|
245
260
|
def _parse_arg_string(arg_string: str) -> list[str]:
|
|
@@ -376,6 +391,11 @@ def execute_commands(*args, **kwargs) -> int:
|
|
|
376
391
|
parent_identifier = args[1]
|
|
377
392
|
item_name = args[2]
|
|
378
393
|
Controller.create_item(item_name, parent_identifier, **kwargs)
|
|
394
|
+
|
|
395
|
+
case "link":
|
|
396
|
+
parent_identifier = args[1]
|
|
397
|
+
item_identifier = args[2]
|
|
398
|
+
Controller.add_link(parent_identifier, item_identifier)
|
|
379
399
|
|
|
380
400
|
case "complete" | "done":
|
|
381
401
|
match args[1]:
|
|
@@ -393,6 +413,9 @@ def execute_commands(*args, **kwargs) -> int:
|
|
|
393
413
|
|
|
394
414
|
case "move":
|
|
395
415
|
Controller.move_item(args[1], args[2])
|
|
416
|
+
|
|
417
|
+
case "rename":
|
|
418
|
+
Controller.update_item(args[1], name=args[2])
|
|
396
419
|
|
|
397
420
|
case "depend":
|
|
398
421
|
src_id, dst_id = args[1:3]
|
|
@@ -39,6 +39,7 @@ class TodoItem(Base):
|
|
|
39
39
|
due_by: Optional[datetime] = None
|
|
40
40
|
comment_ids: list[int] = Field(default_factory=list)
|
|
41
41
|
dependency_ids: list[int] = Field(default_factory=list)
|
|
42
|
+
linked_ids: list[int] = Field(default_factory=list)
|
|
42
43
|
child_ids: list[int] = Field(default_factory=list)
|
|
43
44
|
priority: int = 0
|
|
44
45
|
recurs_every: Optional[list[timedelta]] = None
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# local
|
|
2
|
-
from taskai.json_dir_database import JsonDirectoryDatabase
|
|
2
|
+
from taskai.json_dir_database import JsonDirectoryDatabase, DatabaseError
|
|
3
3
|
from taskai.models import TodoItem, Comment
|
|
4
4
|
from taskai.config import config
|
|
5
5
|
|
|
@@ -39,6 +39,7 @@ def view_lists(
|
|
|
39
39
|
db: JsonDirectoryDatabase,
|
|
40
40
|
roots: list[int],
|
|
41
41
|
show_done=True,
|
|
42
|
+
max_level=1000,
|
|
42
43
|
display_str: str = "id name status",
|
|
43
44
|
display_colors: str = None
|
|
44
45
|
):
|
|
@@ -66,20 +67,29 @@ def view_lists(
|
|
|
66
67
|
display_string = _wrap_string(display_string, "[strike]", "[/strike]", condition=item.completed)
|
|
67
68
|
return display_string
|
|
68
69
|
|
|
69
|
-
def _print_item(item: TodoItem, level: int):
|
|
70
|
+
def _print_item(item: TodoItem, level: int, prefix=""):
|
|
70
71
|
if not show_done and item.completed:
|
|
71
72
|
return
|
|
72
73
|
|
|
73
74
|
display_string = _render_display_string(item)
|
|
74
75
|
indent = "\t" * level
|
|
75
|
-
print(indent + display_string)
|
|
76
|
+
print(indent + prefix + display_string)
|
|
76
77
|
|
|
77
78
|
def _recursive_print(item_id: int, level: int):
|
|
79
|
+
if level > max_level:
|
|
80
|
+
return
|
|
78
81
|
item = db.get_item(item_id)
|
|
79
82
|
_print_item(item, level)
|
|
83
|
+
for linked_id in item.linked_ids:
|
|
84
|
+
try:
|
|
85
|
+
linked_item = db.get_item(linked_id)
|
|
86
|
+
except DatabaseError:
|
|
87
|
+
continue
|
|
88
|
+
_print_item(linked_item, level+1, prefix="-->")
|
|
80
89
|
for child_id in item.child_ids:
|
|
81
90
|
_recursive_print(child_id, level+1)
|
|
82
91
|
|
|
92
|
+
|
|
83
93
|
for root in roots:
|
|
84
94
|
_recursive_print(root, 0)
|
|
85
95
|
|
|
@@ -112,9 +122,10 @@ def view_item(
|
|
|
112
122
|
comment: Comment = db.get_comment(comment_id)
|
|
113
123
|
console.print(f"{comment.created_on.strftime("%Y-%m-%d %H:%M:%S")} - {comment.content}")
|
|
114
124
|
|
|
115
|
-
if item.child_ids:
|
|
125
|
+
if item.child_ids or item.linked_ids:
|
|
116
126
|
console.print("\n[bold green]\nSubtasks:[/bold green]")
|
|
117
127
|
view_lists(db, item.child_ids, show_done=show_done)
|
|
128
|
+
view_lists(db, item.linked_ids, show_done=show_done, max_level=1, prefix="-->")
|
|
118
129
|
|
|
119
130
|
def view_items(
|
|
120
131
|
db: JsonDirectoryDatabase,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|