From 625273d77861413dc7c29c284cf18ecc4082327d Mon Sep 17 00:00:00 2001 From: Fillipe Goulart Date: Sat, 8 Nov 2025 10:38:09 -0300 Subject: [PATCH 01/11] Add possible default priorities --- settings.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/settings.toml b/settings.toml index de4127d..1a6e8b3 100644 --- a/settings.toml +++ b/settings.toml @@ -2,3 +2,4 @@ default_db_name = "kanban.db" task__title_max_length = 50 category__name_max_length = 50 statuses = ["To-do", "In progress", "Review", "Done"] +priorities = ["Lowest", "Low", "Normal", "High", "Highest"] From bc9593426a767d2808d470fa6d7d9147964a052f Mon Sep 17 00:00:00 2001 From: Fillipe Goulart Date: Sat, 8 Nov 2025 10:38:56 -0300 Subject: [PATCH 02/11] Add priority as a field of a task --- src/tasks/models/task.py | 13 +++++++++++++ tests/tasks/models/test_task.py | 20 ++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/tasks/models/task.py b/src/tasks/models/task.py index 41a3b4a..10378be 100644 --- a/src/tasks/models/task.py +++ b/src/tasks/models/task.py @@ -14,6 +14,8 @@ class Task(BaseModel): NO_CATEGORY_STR = "" STATUS_CHOICES = [(i, val) for i, val in enumerate(settings.statuses)] _allowed_statuses = ", ".join(str(i) for i, _ in STATUS_CHOICES) + PRIORITY_CHOICES = [(i, val) for i, val in enumerate(settings.priorities)] + _allowed_priorities = ", ".join(str(i) for i, _ in PRIORITY_CHOICES) title = pw.CharField( max_length=settings.task__title_max_length, @@ -26,6 +28,11 @@ class Task(BaseModel): default=0, # first status by default constraints=[pw.Check(f"status IN ({_allowed_statuses})")], ) + priority = pw.IntegerField( + choices=PRIORITY_CHOICES, + default=len(PRIORITY_CHOICES) // 2, # average priority by default + constraints=[pw.Check(f"priority IN ({_allowed_priorities})")], + ) category = pw.ForeignKeyField(Category, backref="tasks", null=True) created_at = pw.DateTimeField(default=datetime.now()) details = pw.TextField(null=True) @@ -34,6 +41,7 @@ def __str__(self) -> str: return ( f"Title: {self.title}; " f"Status: {self.status_str}; " + f"Priority: {self.priority_str}; " f"Category: {self.category}; " f"Created at: {self.created_at_str}" ) @@ -43,6 +51,11 @@ def status_str(self) -> str: """Human-readable visualization of status""" return settings.statuses[self.status] + @property + def priority_str(self) -> str: + """Human-readable visualization of priority""" + return settings.priorities[self.priority] + @property def created_at_str(self) -> str: """Human-readable visualization of creation date""" diff --git a/tests/tasks/models/test_task.py b/tests/tasks/models/test_task.py index a90d8a0..aeac557 100644 --- a/tests/tasks/models/test_task.py +++ b/tests/tasks/models/test_task.py @@ -49,6 +49,26 @@ def test_can_create_task_with_status(tmp_db): assert task2.status_str == settings.statuses[2], "Status is the third" +def test_can_create_task_with_priority(tmp_db): + task1 = Task.create(title="buy milk", priority=0) + assert task1.priority_str == settings.priorities[0], ( + "Priority is the first" + ) + + task2 = Task.create(title="buy milk", priority=2) + assert task2.priority_str == settings.priorities[2], ( + "Priority is the third" + ) + + +def test_can_create_task_with_priority__default(tmp_db): + task = Task.create(title="buy milk") + + assert task.priority_str == settings.priorities[2], ( + "normal priority by default" + ) + + def test_cannot_create_task_with_invalid_status(tmp_db): """Status must be a number within the possible statuses""" invalid_status = len(settings.statuses) + 1 From c2e862776a054cf57e327392009aa10d2de165b7 Mon Sep 17 00:00:00 2001 From: Fillipe Goulart Date: Sat, 8 Nov 2025 10:55:50 -0300 Subject: [PATCH 03/11] Sort tasks by group with priority --- src/tasks/models/task.py | 7 +++++-- tests/tasks/models/test_task.py | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/tasks/models/task.py b/src/tasks/models/task.py index 10378be..f4586af 100644 --- a/src/tasks/models/task.py +++ b/src/tasks/models/task.py @@ -78,7 +78,10 @@ def iter_status_indices() -> Iterator[int]: @staticmethod def group_by_status() -> dict[int, list[Task]]: - """List all existing tasks by status and sorted by creation date""" + """ + List all existing tasks by status and sorted by priority (descending) + and creation date (ascending) + """ tasks = ( Task.select() .join( @@ -86,7 +89,7 @@ def group_by_status() -> dict[int, list[Task]]: on=(Task.category == Category.id), join_type=pw.JOIN.LEFT_OUTER, ) - .order_by(Task.created_at) + .order_by(Task.priority.desc(), Task.created_at) ) tasks_by_status = {i: [] for i, _ in enumerate(settings.statuses)} diff --git a/tests/tasks/models/test_task.py b/tests/tasks/models/test_task.py index aeac557..44df356 100644 --- a/tests/tasks/models/test_task.py +++ b/tests/tasks/models/test_task.py @@ -150,6 +150,29 @@ def test_group_by_status__no_todos(tmp_db): assert tasks_by_status == expected_tasks_by_status +def test_group_by_status__sort_by_priority(tmp_db): + """ + Tasks are also sorted by priority first, with the highest coming before + """ + task1 = Task.create(title="t1", status=0, priority=0) + task2 = Task.create(title="t2", status=0, priority=1) + task3 = Task.create(title="t3", status=2, priority=0) + task4 = Task.create(title="t4", status=3, priority=3) + task5 = Task.create(title="t5", status=3, priority=0) + task6 = Task.create(title="t6", status=1, priority=0) + + expected_tasks_by_status = { + 0: [task2, task1], # task2 has higher priority (1) than task1 (0) + 1: [task6], + 2: [task3], + 3: [task4, task5], # task4 has higher priority (3) than task5 (0) + } + + tasks_by_status = Task.group_by_status() + + assert tasks_by_status == expected_tasks_by_status + + def test_add_from_prompt(tmp_db): title = "buy milk" status = 0 From aeb7e0bbd46828b26c078c4f63edfabae49e8d02 Mon Sep 17 00:00:00 2001 From: Fillipe Goulart Date: Sat, 8 Nov 2025 10:57:15 -0300 Subject: [PATCH 04/11] Add priority to view-all presenter --- src/tasks/presenters/view_all_presenter.py | 10 ++++++++-- tests/tasks/presenters/test_view_all_presenter.py | 9 ++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/tasks/presenters/view_all_presenter.py b/src/tasks/presenters/view_all_presenter.py index 2508e31..1e19fd8 100644 --- a/src/tasks/presenters/view_all_presenter.py +++ b/src/tasks/presenters/view_all_presenter.py @@ -122,9 +122,15 @@ def _present_task(self, task: Task) -> str: Writes a task in the format: - # [] + # [] [] """ category_str = f"[{task.category_name}]" + priority_str = f"[{task.priority_str}]" - return f"#{task.id} [bold]{escape(category_str)}[/bold]\n{task.title}" + return ( + f"#{task.id} " + f"[underline]{escape(priority_str)}[/underline] " + f"[bold]{escape(category_str)}[/bold]\n" + f"{task.title}" + ) diff --git a/tests/tasks/presenters/test_view_all_presenter.py b/tests/tasks/presenters/test_view_all_presenter.py index 31a8f67..5ddbade 100644 --- a/tests/tasks/presenters/test_view_all_presenter.py +++ b/tests/tasks/presenters/test_view_all_presenter.py @@ -52,17 +52,20 @@ def test_present(tmp_db): console_output = console.file.getvalue() # ty: ignore[unresolved-attribute] - # For tasks with category, the id, category name and title are shown + # For tasks with category, the id, category name, priority and title are + # shown for task in (task1, task6): assert str(task.id) in console_output assert task.category.name in console_output + assert task.priority_str in console_output assert task.title in console_output - # For tasks without category, the id and title are shown, plus a generic - # "No category" message + # For tasks without category, the id, priority and title are shown, plus a + # generic "No category" message for task in (task2, task3, task4, task5): assert str(task.id) in console_output assert ViewAllPresenter.NO_CATEGORY_STR in console_output + assert task.priority_str in console_output assert task.title in console_output From bc4ed2583ec1a3eede16c9a48f7c783d1b09707b Mon Sep 17 00:00:00 2001 From: Fillipe Goulart Date: Sat, 8 Nov 2025 11:00:47 -0300 Subject: [PATCH 05/11] Show priority in detailed presentation --- src/tasks/presenters/view_presenter.py | 1 + tests/tasks/presenters/test_view_presenter.py | 3 +++ 2 files changed, 4 insertions(+) diff --git a/src/tasks/presenters/view_presenter.py b/src/tasks/presenters/view_presenter.py index d00304f..c98e903 100644 --- a/src/tasks/presenters/view_presenter.py +++ b/src/tasks/presenters/view_presenter.py @@ -29,6 +29,7 @@ def present(self, task: Task) -> None: table.add_row("Id", str(task.id)) table.add_row("Title", task.title) table.add_row("Status", task.status_str) + table.add_row("Priority", task.priority_str) table.add_row("Category", task.category_name) table.add_row("Created at", str(task.created_at_str)) table.add_row( diff --git a/tests/tasks/presenters/test_view_presenter.py b/tests/tasks/presenters/test_view_presenter.py index 658127d..e96b7c9 100644 --- a/tests/tasks/presenters/test_view_presenter.py +++ b/tests/tasks/presenters/test_view_presenter.py @@ -21,6 +21,7 @@ def test_present(tmp_db): assert str(task.id) in console_output assert task.title in console_output assert settings.statuses[task.status] in console_output + assert settings.priorities[task.priority] in console_output assert task.category.name in console_output @@ -36,6 +37,7 @@ def test_present__no_category(tmp_db): assert str(task.id) in console_output assert task.title in console_output assert settings.statuses[task.status] in console_output + assert settings.priorities[task.priority] in console_output assert task.NO_CATEGORY_STR in console_output @@ -52,5 +54,6 @@ def test_present__with_details(tmp_db): assert str(task.id) in console_output assert task.title in console_output assert settings.statuses[task.status] in console_output + assert settings.priorities[task.priority] in console_output assert task.NO_CATEGORY_STR in console_output assert task.details in console_output From c7fa68348a43c092a225d7639b2cc11320f1833f Mon Sep 17 00:00:00 2001 From: Fillipe Goulart Date: Sat, 8 Nov 2025 11:08:46 -0300 Subject: [PATCH 06/11] Add priority prompt One should be able to pick a priority out of the given list --- src/tasks/prompts/priority_prompt.py | 18 ++++++++ tests/tasks/prompts/test_priority_prompt.py | 47 +++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/tasks/prompts/priority_prompt.py create mode 100644 tests/tasks/prompts/test_priority_prompt.py diff --git a/src/tasks/prompts/priority_prompt.py b/src/tasks/prompts/priority_prompt.py new file mode 100644 index 0000000..5eba938 --- /dev/null +++ b/src/tasks/prompts/priority_prompt.py @@ -0,0 +1,18 @@ +from prompt_toolkit.shortcuts import choice + +from config import settings + + +class PriorityPrompt: + """Select among possible priorities""" + + def __init__( + self, default_value: int = len(settings.priorities) // 2 + ) -> None: + self._default_value = default_value + + def prompt(self) -> int: + options = [(i, status) for i, status in enumerate(settings.priorities)] + return choice( + message="Priority: ", options=options, default=self._default_value + ) diff --git a/tests/tasks/prompts/test_priority_prompt.py b/tests/tasks/prompts/test_priority_prompt.py new file mode 100644 index 0000000..f2b4796 --- /dev/null +++ b/tests/tasks/prompts/test_priority_prompt.py @@ -0,0 +1,47 @@ +from src.tasks.prompts.priority_prompt import PriorityPrompt +from tests.tasks.prompts.key_mappings import KEY_MAPPINGS + + +def test_prompt_priority__middle_option_by_defaut( + mocked_prompt_input, mock_app_session +): + prompt = PriorityPrompt() + + # Just press without selecting anything + mocked_prompt_input.send_text(KEY_MAPPINGS[""]) + + with mock_app_session: + priority = prompt.prompt() + + assert priority == 2, "It selects middle priority by default" + + +def test_prompt_priority__can_change_priority( + mocked_prompt_input, mock_app_session +): + prompt = PriorityPrompt() + + # Press below arrow twice and then enter + mocked_prompt_input.send_text(KEY_MAPPINGS[""]) + mocked_prompt_input.send_text(KEY_MAPPINGS[""]) + mocked_prompt_input.send_text(KEY_MAPPINGS[""]) + + with mock_app_session: + priority = prompt.prompt() + + assert priority == 4, "Picks fifth priority option" + + +def test_prompt_priority__existing_value( + mocked_prompt_input, mock_app_session +): + current_priority = 0 + prompt = PriorityPrompt(default_value=current_priority) + + # Just press without selecting anything + mocked_prompt_input.send_text(KEY_MAPPINGS[""]) + + with mock_app_session: + priority = prompt.prompt() + + assert priority == current_priority, "priority has been unchanged" From ede80012264026ecda63d0c90179ec45d4d78198 Mon Sep 17 00:00:00 2001 From: Fillipe Goulart Date: Sat, 8 Nov 2025 11:12:07 -0300 Subject: [PATCH 07/11] Adapt task creation from prompt with priority --- src/tasks/models/task.py | 12 ++++++++++-- tests/tasks/models/test_task.py | 18 +++++++++++++++--- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/tasks/models/task.py b/src/tasks/models/task.py index f4586af..6254708 100644 --- a/src/tasks/models/task.py +++ b/src/tasks/models/task.py @@ -100,7 +100,11 @@ def group_by_status() -> dict[int, list[Task]]: @staticmethod def add_from_prompt( - title: str, status: int, category_name: str, details: str + title: str, + status: int, + priority: int, + category_name: str, + details: str, ) -> Task: category, _ = ( Category.get_or_create(name=category_name) @@ -108,7 +112,11 @@ def add_from_prompt( else (None, False) ) return Task.create( - title=title, status=status, category=category, details=details + title=title, + status=status, + priority=priority, + category=category, + details=details, ) def edit_from_prompt( diff --git a/tests/tasks/models/test_task.py b/tests/tasks/models/test_task.py index 44df356..54d4890 100644 --- a/tests/tasks/models/test_task.py +++ b/tests/tasks/models/test_task.py @@ -176,15 +176,19 @@ def test_group_by_status__sort_by_priority(tmp_db): def test_add_from_prompt(tmp_db): title = "buy milk" status = 0 + priority = 2 category_name = "category" details = "Buy a lot of milk" - task = Task.add_from_prompt(title, status, category_name, details) + task = Task.add_from_prompt( + title, status, priority, category_name, details + ) assert Task.select().count() == 1, "A task has been created" assert Category.select().count() == 1, "A new category has been created" assert task.title == title assert task.status == status + assert task.priority == priority assert task.category.name == category_name assert task.details == details @@ -192,15 +196,19 @@ def test_add_from_prompt(tmp_db): def test_add_from_prompt__empty_category(tmp_db): title = "buy milk" status = 0 + priority = 2 category_name = "" details = "Buy a lot of milk" - task = Task.add_from_prompt(title, status, category_name, details) + task = Task.add_from_prompt( + title, status, priority, category_name, details + ) assert Task.select().count() == 1, "A task has been created" assert Category.select().count() == 0, "No category has been created" assert task.title == title assert task.status == status + assert task.priority == priority assert task.category is None assert task.details == details @@ -211,15 +219,19 @@ def test_add_from_prompt__does_not_recreate_existing_categories(tmp_db): title = "buy milk" status = 0 + priority = 2 category_name = "category" details = "Buy a lot of milk" - task = Task.add_from_prompt(title, status, category_name, details) + task = Task.add_from_prompt( + title, status, priority, category_name, details + ) assert Task.select().count() == 1, "A task has been created" assert Category.select().count() == 1, "No new category is created" assert task.title == title assert task.status == status + assert task.priority == priority assert task.category.name == category_name assert task.details == details From 54f67b0a4a54500d3d6a61a0bf64ffc6a855310d Mon Sep 17 00:00:00 2001 From: Fillipe Goulart Date: Sat, 8 Nov 2025 11:15:39 -0300 Subject: [PATCH 08/11] Adapt task edition from prompt with priority --- src/tasks/models/task.py | 8 +++++++- tests/tasks/models/test_task.py | 25 ++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/tasks/models/task.py b/src/tasks/models/task.py index 6254708..8a4faaf 100644 --- a/src/tasks/models/task.py +++ b/src/tasks/models/task.py @@ -120,7 +120,12 @@ def add_from_prompt( ) def edit_from_prompt( - self, title: str, status: int, category_name: str, details: str + self, + title: str, + status: int, + priority: int, + category_name: str, + details: str, ) -> None: category, _ = ( Category.get_or_create(name=category_name) @@ -131,6 +136,7 @@ def edit_from_prompt( { Task.title: title, Task.status: status, + Task.priority: priority, Task.category: category, Task.details: details, } diff --git a/tests/tasks/models/test_task.py b/tests/tasks/models/test_task.py index 54d4890..bc120a6 100644 --- a/tests/tasks/models/test_task.py +++ b/tests/tasks/models/test_task.py @@ -239,13 +239,18 @@ def test_add_from_prompt__does_not_recreate_existing_categories(tmp_db): def test_edit_from_prompt__no_changes(tmp_db): category = Category.create(name="category") task = Task.create( - title="Buy milk", status=1, category=category, details="More stuff" + title="Buy milk", + status=1, + priority=1, + category=category, + details="More stuff", ) assert Category.select().count() == 1, "Sanity check: one category exists" task.edit_from_prompt( title=task.title, status=task.status, + priority=task.priority, category_name=task.category_name, details=task.details, ) @@ -255,6 +260,7 @@ def test_edit_from_prompt__no_changes(tmp_db): assert edited_task.title == task.title assert edited_task.category == task.category assert edited_task.status == task.status + assert edited_task.priority == task.priority assert edited_task.details == task.details assert Category.select().count() == 1, "No new category was created" @@ -262,16 +268,22 @@ def test_edit_from_prompt__no_changes(tmp_db): def test_edit_from_prompt__can_change_properties(tmp_db): category = Category.create(name="category") task = Task.create( - title="Buy milk", status=1, category=category, details="More stuff" + title="Buy milk", + status=1, + priority=1, + category=category, + details="More stuff", ) assert Category.select().count() == 1, "Sanity check: one category exists" new_title = "Buy milk edited" new_status = 2 + new_priority = 2 new_details = "More stuff edited" task.edit_from_prompt( title=new_title, status=new_status, + priority=new_priority, category_name=task.category_name, # unchanged details=new_details, ) @@ -281,6 +293,7 @@ def test_edit_from_prompt__can_change_properties(tmp_db): assert edited_task.title == new_title assert edited_task.category == task.category, "Category was unchanged" assert edited_task.status == new_status + assert edited_task.priority == new_priority assert edited_task.details == new_details assert Category.select().count() == 1, "No new category was created" @@ -288,7 +301,11 @@ def test_edit_from_prompt__can_change_properties(tmp_db): def test_edit_from_prompt__can_change_category(tmp_db): category = Category.create(name="category") task = Task.create( - title="Buy milk", status=1, category=category, details="More stuff" + title="Buy milk", + status=1, + priority=1, + category=category, + details="More stuff", ) assert Category.select().count() == 1, "Sanity check: one category exists" @@ -296,6 +313,7 @@ def test_edit_from_prompt__can_change_category(tmp_db): task.edit_from_prompt( title=task.title, status=task.status, + priority=task.priority, category_name=new_category_name, details=task.details, ) @@ -304,6 +322,7 @@ def test_edit_from_prompt__can_change_category(tmp_db): assert edited_task.title == task.title, "title is unchaged" assert edited_task.status == task.status, "status is unchanged" + assert edited_task.priority == task.priority, "priority is unchanged" assert edited_task.details == task.details, "details is unchanged" assert edited_task.category_name == new_category_name, ( "category was changed" From 8a791cbfc57bf3ea524135edc03cff5b32a929d7 Mon Sep 17 00:00:00 2001 From: Fillipe Goulart Date: Sat, 8 Nov 2025 11:20:24 -0300 Subject: [PATCH 09/11] Add priority in controller Now it is possible to add priority when creating a task from scratch --- src/tasks/controllers/add_controller.py | 4 +++- tests/tasks/controllers/test_add_controller.py | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/tasks/controllers/add_controller.py b/src/tasks/controllers/add_controller.py index c8b0c09..902d413 100644 --- a/src/tasks/controllers/add_controller.py +++ b/src/tasks/controllers/add_controller.py @@ -3,6 +3,7 @@ from src.tasks.models.task import Task from src.tasks.prompts.category_prompt import CategoryPrompt from src.tasks.prompts.details_prompt import DetailsPrompt +from src.tasks.prompts.priority_prompt import PriorityPrompt from src.tasks.prompts.status_prompt import StatusPrompt from src.tasks.prompts.title_prompt import TitlePrompt @@ -11,11 +12,12 @@ def add_controller() -> None: """Run a sequence of prompts to add a new task""" title = TitlePrompt().prompt() status = StatusPrompt().prompt() + priority = PriorityPrompt().prompt() category_names = Category.category_names() category_name = CategoryPrompt(category_names=category_names).prompt() details = DetailsPrompt().prompt() - Task.add_from_prompt(title, status, category_name, details) + Task.add_from_prompt(title, status, priority, category_name, details) # Print all tasks back view_all_controller() diff --git a/tests/tasks/controllers/test_add_controller.py b/tests/tasks/controllers/test_add_controller.py index 93590a6..7a5a664 100644 --- a/tests/tasks/controllers/test_add_controller.py +++ b/tests/tasks/controllers/test_add_controller.py @@ -29,6 +29,11 @@ def test_add_controller( mocked_prompt_input.send_text(KEY_MAPPINGS[""]) mocked_prompt_input.send_text(KEY_MAPPINGS[""]) + # Fill priority by pressing up once + priority = 1 + mocked_prompt_input.send_text(KEY_MAPPINGS[""]) + mocked_prompt_input.send_text(KEY_MAPPINGS[""]) + # Fill category name category_name = "personal" mocked_prompt_input.send_text(category_name) @@ -53,6 +58,7 @@ def test_add_controller( assert task.title == title assert task.status == status + assert task.priority == priority assert task.category.name == category_name assert task.details == details @@ -73,6 +79,11 @@ def test_add_controller__no_category( mocked_prompt_input.send_text(KEY_MAPPINGS[""]) mocked_prompt_input.send_text(KEY_MAPPINGS[""]) + # Fill priority by pressing up once + priority = 1 + mocked_prompt_input.send_text(KEY_MAPPINGS[""]) + mocked_prompt_input.send_text(KEY_MAPPINGS[""]) + # Fill no category name by just pressing ENTER mocked_prompt_input.send_text(KEY_MAPPINGS[""]) @@ -95,6 +106,7 @@ def test_add_controller__no_category( assert task.title == title assert task.status == status + assert task.priority == priority assert task.category is None assert task.details == details From 3fed3a7949071b83de48cc80be5ab4ea0afa574c Mon Sep 17 00:00:00 2001 From: Fillipe Goulart Date: Sat, 8 Nov 2025 12:08:24 -0300 Subject: [PATCH 10/11] Fix wrong comment The previous comment was a copy-paste from category, and it makes no sense in the details section --- tests/tasks/controllers/test_edit_controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tasks/controllers/test_edit_controller.py b/tests/tasks/controllers/test_edit_controller.py index 5671b5b..a4668ad 100644 --- a/tests/tasks/controllers/test_edit_controller.py +++ b/tests/tasks/controllers/test_edit_controller.py @@ -91,7 +91,7 @@ def test_edit_defaults__can_update_attribute( mocked_prompt_input.send_text(KEY_MAPPINGS[""]) # accept category # For details: press "Down" to select "yes" - mocked_prompt_input.send_text(KEY_MAPPINGS[""]) # accept category + mocked_prompt_input.send_text(KEY_MAPPINGS[""]) mocked_prompt_input.send_text(KEY_MAPPINGS[""]) # Press backspace to fix the typo and add a couple more characters From f5b539cd92ebf58897d03c03acb7675fc387056c Mon Sep 17 00:00:00 2001 From: Fillipe Goulart Date: Sat, 8 Nov 2025 12:08:48 -0300 Subject: [PATCH 11/11] Allow user to edit priority in controller --- src/tasks/controllers/edit_controller.py | 3 +++ tests/tasks/controllers/test_edit_controller.py | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/src/tasks/controllers/edit_controller.py b/src/tasks/controllers/edit_controller.py index 5191fe2..8a7668c 100644 --- a/src/tasks/controllers/edit_controller.py +++ b/src/tasks/controllers/edit_controller.py @@ -4,6 +4,7 @@ from src.tasks.presenters.no_task_presenter import NoTaskPresenter from src.tasks.prompts.category_prompt import CategoryPrompt from src.tasks.prompts.details_prompt import DetailsPrompt +from src.tasks.prompts.priority_prompt import PriorityPrompt from src.tasks.prompts.status_prompt import StatusPrompt from src.tasks.prompts.title_prompt import TitlePrompt @@ -17,6 +18,7 @@ def edit_controller(task_id: int) -> None: title = TitlePrompt(default_value=task.title).prompt() status = StatusPrompt(default_value=task.status).prompt() + priority = PriorityPrompt(default_value=task.priority).prompt() category_names = Category.category_names() category_name = CategoryPrompt( default_value=task.category_name, category_names=category_names @@ -28,6 +30,7 @@ def edit_controller(task_id: int) -> None: task.edit_from_prompt( title=title, status=status, + priority=priority, category_name=category_name, details=details, ) diff --git a/tests/tasks/controllers/test_edit_controller.py b/tests/tasks/controllers/test_edit_controller.py index a4668ad..e311cad 100644 --- a/tests/tasks/controllers/test_edit_controller.py +++ b/tests/tasks/controllers/test_edit_controller.py @@ -43,6 +43,7 @@ def test_edit_defaults( task = Task.create( title="Buy milk", status=1, + priority=1, category=category, details="Buy milk because...", ) @@ -50,6 +51,7 @@ def test_edit_defaults( mocked_prompt_input.send_text(KEY_MAPPINGS[""]) # accept title mocked_prompt_input.send_text(KEY_MAPPINGS[""]) # accept status + mocked_prompt_input.send_text(KEY_MAPPINGS[""]) # accept priority mocked_prompt_input.send_text(KEY_MAPPINGS[""]) # accept category mocked_prompt_input.send_text( KEY_MAPPINGS[""] @@ -63,6 +65,7 @@ def test_edit_defaults( # Sanity check: no property got changed assert edited_task.title == task.title assert edited_task.status == task.status + assert edited_task.priority == task.priority assert edited_task.category == task.category assert edited_task.details == task.details assert Category.select().count() == 1, ( @@ -81,6 +84,7 @@ def test_edit_defaults__can_update_attribute( task = Task.create( title="Buy milk", status=1, + priority=1, category=category, details="Buy milk becausi", # with a typo at the last character ) @@ -88,6 +92,7 @@ def test_edit_defaults__can_update_attribute( mocked_prompt_input.send_text(KEY_MAPPINGS[""]) # accept title mocked_prompt_input.send_text(KEY_MAPPINGS[""]) # accept status + mocked_prompt_input.send_text(KEY_MAPPINGS[""]) # accept priority mocked_prompt_input.send_text(KEY_MAPPINGS[""]) # accept category # For details: press "Down" to select "yes" @@ -109,6 +114,7 @@ def test_edit_defaults__can_update_attribute( # Sanity check: no property but the details got changed assert edited_task.title == task.title assert edited_task.status == task.status + assert edited_task.priority == task.priority assert edited_task.category == task.category assert edited_task.details == "Buy milk because...", "details got updated" assert Category.select().count() == 1, ( @@ -127,12 +133,14 @@ def test_edit_defaults__can_update_category( task = Task.create( title="Buy milk", status=1, + priority=1, category=category, ) assert Category.select().count() == 1, "sanity check: one category exists" mocked_prompt_input.send_text(KEY_MAPPINGS[""]) # accept title mocked_prompt_input.send_text(KEY_MAPPINGS[""]) # accept status + mocked_prompt_input.send_text(KEY_MAPPINGS[""]) # accept priority # Edit category name mocked_prompt_input.send_text(KEY_MAPPINGS[""]) @@ -154,4 +162,5 @@ def test_edit_defaults__can_update_category( # Sanity check: no property but the category got changed assert edited_task.title == task.title assert edited_task.status == task.status + assert edited_task.priority == task.priority assert edited_task.details == task.details