taskai-cli 1.2.1__tar.gz → 1.3.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.3.0}/PKG-INFO +1 -1
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/pyproject.toml +1 -1
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/cli.py +20 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/models.py +1 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/views.py +10 -3
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/.github/workflows/publish-to-pypi.yml +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/.gitignore +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/DEVLOG.md +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/README.md +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/docs/index.md +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/mkdocs.yml +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/scripts/bump_version.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/config.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/help_menu.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/json_dir_database.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/services/ai.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/services/pomodoro.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/services/repair_database.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/taskai/services/user_setup.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/test/test_cli.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/test/test_execution.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.0}/test/test_json_dir_database.py +0 -0
- {taskai_cli-1.2.1 → taskai_cli-1.3.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]:
|
|
@@ -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
|
|
|
@@ -66,20 +66,27 @@ def view_lists(
|
|
|
66
66
|
display_string = _wrap_string(display_string, "[strike]", "[/strike]", condition=item.completed)
|
|
67
67
|
return display_string
|
|
68
68
|
|
|
69
|
-
def _print_item(item: TodoItem, level: int):
|
|
69
|
+
def _print_item(item: TodoItem, level: int, prefix=""):
|
|
70
70
|
if not show_done and item.completed:
|
|
71
71
|
return
|
|
72
72
|
|
|
73
73
|
display_string = _render_display_string(item)
|
|
74
74
|
indent = "\t" * level
|
|
75
|
-
print(indent + display_string)
|
|
75
|
+
print(indent + prefix + display_string)
|
|
76
76
|
|
|
77
77
|
def _recursive_print(item_id: int, level: int):
|
|
78
78
|
item = db.get_item(item_id)
|
|
79
79
|
_print_item(item, level)
|
|
80
|
+
for linked_id in item.linked_ids:
|
|
81
|
+
try:
|
|
82
|
+
linked_item = db.get_item(linked_id)
|
|
83
|
+
except DatabaseError:
|
|
84
|
+
continue
|
|
85
|
+
_print_item(linked_item, level+1, prefix="-->")
|
|
80
86
|
for child_id in item.child_ids:
|
|
81
87
|
_recursive_print(child_id, level+1)
|
|
82
88
|
|
|
89
|
+
|
|
83
90
|
for root in roots:
|
|
84
91
|
_recursive_print(root, 0)
|
|
85
92
|
|
|
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
|