From 07e2ef901e5faf1b9e76d68772fa1488b2f51e5c Mon Sep 17 00:00:00 2001 From: Jason Lee Date: Mon, 3 Apr 2023 19:19:11 +0800 Subject: [Feat] Guest mode issue #28 --- girok/api/category.py | 115 ++++++++------ girok/api/task.py | 257 ++++++++++++++++++++----------- girok/calendar_cli/calendar_container.py | 78 +++++----- girok/calendar_cli/sidebar.py | 10 +- girok/commands/task.py | 67 +++----- girok/girok.py | 30 ++-- girok/server/src/category/router.py | 24 ++- girok/server/src/category/service.py | 2 +- girok/server/src/task/router.py | 20 +-- girok/server/src/task/schemas.py | 23 ++- girok/utils/calendar.py | 4 +- girok/utils/display.py | 4 +- girok/utils/general.py | 5 + 13 files changed, 366 insertions(+), 273 deletions(-) diff --git a/girok/api/category.py b/girok/api/category.py index 910bf8d..36dffbf 100644 --- a/girok/api/category.py +++ b/girok/api/category.py @@ -171,52 +171,79 @@ def move_category(cat_str: str, new_parent_cat_str: str): def get_last_cat_id(cats: list): - resp = requests.get( - cfg.base_url + "/categories/last-cat-id", - json={ - "cats": cats - }, - headers=auth_utils.build_jwt_header(cfg.config_path) - ) - if resp.status_code == 200: - return general_utils.bytes2dict(resp.content)['cat_id'] - elif resp.status_code == 400: - err_msg = general_utils.bytes2dict(resp.content)['detail'] - display_utils.center_print(err_msg, constants.DISPLAY_TERMINAL_COLOR_ERROR) - exit(0) - else: - display_utils.center_print(resp.content, constants.DISPLAY_TERMINAL_COLOR_ERROR) - exit(0) + mode = auth_utils.get_mode(cfg.config_path) + if mode == "user": + resp = requests.get( + cfg.base_url + "/categories/last-cat-id", + json={ + "cats": cats + }, + headers=auth_utils.build_jwt_header(cfg.config_path) + ) + if resp.status_code == 200: + return general_utils.bytes2dict(resp.content)['cat_id'] + elif resp.status_code == 400: + err_msg = general_utils.bytes2dict(resp.content)['detail'] + display_utils.center_print(err_msg, type="error") + exit(0) + else: + display_utils.center_print(resp.content, type="error") + exit(0) + elif mode == "guest": + resp = category_router.get_last_cat_id({"cats": cats}) + if resp['success']: + return resp['cat_id'] + else: + display_utils.center_print(resp['detail'], type="error") + exit(0) + def get_category_color(cat_id: int): - resp = requests.get( - cfg.base_url + f"/categories/{cat_id}/color", - headers=auth_utils.build_jwt_header(cfg.config_path) - ) - - if resp.status_code == 200: - return general_utils.bytes2dict(resp.content)['color'] - elif resp.status_code == 400: - err_msg = general_utils.bytes2dict(resp.content)['detail'] - display_utils.center_print(err_msg, constants.DISPLAY_TERMINAL_COLOR_ERROR) - exit(0) - else: - display_utils.center_print(resp.content, constants.DISPLAY_TERMINAL_COLOR_ERROR) - exit(0) - + mode = auth_utils.get_mode(cfg.config_path) + if mode == "user": + resp = requests.get( + cfg.base_url + f"/categories/{cat_id}/color", + headers=auth_utils.build_jwt_header(cfg.config_path) + ) + + if resp.status_code == 200: + return general_utils.bytes2dict(resp.content)['color'] + elif resp.status_code == 400: + err_msg = general_utils.bytes2dict(resp.content)['detail'] + display_utils.center_print(err_msg, type="error") + exit(0) + else: + display_utils.center_print(resp.content, type="error") + exit(0) + elif mode == "guest": + resp = category_router.get_category_color(cat_id) + if resp['success']: + return resp['color'] + else: + display_utils.center_print(resp.content, type="error") + exit(0) def get_color_dict(): - resp = requests.get( - cfg.base_url + "/categories/color", - headers=auth_utils.build_jwt_header(cfg.config_path) - ) - if resp.status_code == 200: - color_dict = general_utils.bytes2dict(resp.content) - return color_dict - elif resp.status_code == 400: - err_msg = general_utils.bytes2dict(resp.content)['detail'] - display_utils.center_print(err_msg, constants.DISPLAY_TERMINAL_COLOR_ERROR) - else: - display_utils.center_print("Error occurred.", constants.DISPLAY_TERMINAL_COLOR_ERROR) - \ No newline at end of file + mode = auth_utils.get_mode(cfg.config_path) + if mode == "user": + resp = requests.get( + cfg.base_url + "/categories/color", + headers=auth_utils.build_jwt_header(cfg.config_path) + ) + if resp.status_code == 200: + color_dict = general_utils.bytes2dict(resp.content) + return color_dict + elif resp.status_code == 400: + err_msg = general_utils.bytes2dict(resp.content)['detail'] + display_utils.center_print(err_msg, type="error") + else: + display_utils.center_print("Error occurred.", type="error") + elif mode == "guest": + resp = category_router.get_category_colors_dict() + if resp['success']: + return resp['colors'] + else: + display_utils.center_print("Error occurred.", type="error") + exit(0) + \ No newline at end of file diff --git a/girok/api/task.py b/girok/api/task.py index ad5813b..32d9180 100644 --- a/girok/api/task.py +++ b/girok/api/task.py @@ -42,7 +42,8 @@ def create_task(task_data: dict): else: display_utils.center_print(resp['detail'], type="error") exit(0) - + exit(0) + def get_single_task(task_id: int): mode = auth_utils.get_mode(cfg.config_path) @@ -66,7 +67,6 @@ def get_single_task(task_id: int): return task else: display_utils.center_print(resp['detail'], type="error") - exit(0) @@ -95,7 +95,15 @@ def get_tasks( headers=auth_utils.build_jwt_header(cfg.config_path), params=query_str_obj ) - return general_utils.bytes2dict(resp.content)['tasks'] + if resp.status_code == 200: + return general_utils.bytes2dict(resp.content)['tasks'] + if resp.status_code == 400: + err_msg = general_utils.bytes2dict(resp.content)['detail'] + display_utils.center_print(err_msg, type="error") + exit(0) + elif resp.status_code: + display_utils.center_print("Error occurred.", type="title") + exit(0) elif mode == "guest": resp = task_router.get_tasks(query_str_obj) if resp['success']: @@ -107,100 +115,177 @@ def get_tasks( def remove_task(task_id: int): - resp = requests.delete( - cfg.base_url + f"/tasks/{task_id}", - headers=auth_utils.build_jwt_header(cfg.config_path), - ) - return resp - + mode = auth_utils.get_mode(cfg.config_path) + if mode == "user": + resp = requests.delete( + cfg.base_url + f"/tasks/{task_id}", + headers=auth_utils.build_jwt_header(cfg.config_path), + ) + if resp.status_code == 204: + return True + elif resp.status_code == 400: + err_msg = general_utils.bytes2dict(resp.content)['detail'] + display_utils.center_print(err_msg, type="error") + else: + display_utils.center_print(resp.content, type="error") + elif mode == "guest": + resp = task_router.delete_task(task_id) + if resp['success']: + return True + else: + display_utils.center_print(resp['detail'], type="error") + exit(0) def get_tags(): - resp = requests.get( - cfg.base_url + "/tasks/tags", - headers=auth_utils.build_jwt_header(cfg.config_path) - ) - - return resp - + mode = auth_utils.get_mode(cfg.config_path) + if mode == "user": + resp = requests.get( + cfg.base_url + "/tasks/tags", + headers=auth_utils.build_jwt_header(cfg.config_path) + ) + if resp.status_code == 200: + return general_utils.bytes2dict(resp.content)['tags'] + elif resp.status_code == 400: + err_msg = general_utils.bytes2dict(resp.content)['detail'] + display_utils.center_print(err_msg, type="error") + exit(0) + else: + exit(0) + elif mode == "guest": + resp = task_router.get_tags() + if resp['success']: + return resp['tags'] + else: + display_utils.center_print(resp['detail'], type="error") + exit(0) + def change_task_tag(task_id: int, new_tag_name: str): - resp = requests.patch( - cfg.base_url + f"/tasks/{task_id}/tag", - headers=auth_utils.build_jwt_header(cfg.config_path), - json={ - "new_tag_name": new_tag_name - } - ) - - if resp.status_code == 200: - task = general_utils.bytes2dict(resp.content) - task_name = task['name'] - display_utils.center_print(f"Successfully changed [{task_name}]'s tag to {new_tag_name}.", type="success") - elif resp.status_code == 400: - err_msg = general_utils.bytes2dict(resp.content)['detail'] - display_utils.center_print(err_msg, constants.DISPLAY_TERMINAL_COLOR_ERROR) - else: - display_utils.center_print(resp.content, constants.DISPLAY_TERMINAL_COLOR_ERROR) + mode = auth_utils.get_mode(cfg.config_path) + if mode == "user": + resp = requests.patch( + cfg.base_url + f"/tasks/{task_id}/tag", + headers=auth_utils.build_jwt_header(cfg.config_path), + json={ + "new_tag_name": new_tag_name + } + ) + + if resp.status_code == 200: + task = general_utils.bytes2dict(resp.content) + task_name = task['name'] + display_utils.center_print(f"Successfully changed [{task_name}]'s tag to {new_tag_name}.", type="success") + return + elif resp.status_code == 400: + err_msg = general_utils.bytes2dict(resp.content)['detail'] + display_utils.center_print(err_msg, type="error") + else: + display_utils.center_print(resp.content, type="error") + elif mode == "guest": + resp = task_router.change_task_tag(task_id, {"new_tag_name": new_tag_name}) + if resp['success']: + task = resp['updated_task'] + task_name = task['name'] + display_utils.center_print(f"Successfully changed [{task_name}]'s tag to {new_tag_name}.", type="success") + return + else: + display_utils.center_print(resp['detail'], constants.DISPLAY_TERMINAL_COLOR_ERROR) + exit(0) def change_task_priority(task_id: int, new_priority: int): - resp = requests.patch( - cfg.base_url + f"/tasks/{task_id}/priority", - headers=auth_utils.build_jwt_header(cfg.config_path), - json={ - "new_priority": new_priority - } - ) - - if resp.status_code == 200: - task = general_utils.bytes2dict(resp.content) - task_name = task['name'] - display_utils.center_print(f"Successfully changed [{task_name}]'s priority to {new_priority}.", type="success") - elif resp.status_code == 400: - err_msg = general_utils.bytes2dict(resp.content)['detail'] - display_utils.center_print(err_msg, constants.DISPLAY_TERMINAL_COLOR_ERROR) - else: - display_utils.center_print(resp.content, constants.DISPLAY_TERMINAL_COLOR_ERROR) + mode = auth_utils.get_mode(cfg.config_path) + if mode == "user": + resp = requests.patch( + cfg.base_url + f"/tasks/{task_id}/priority", + headers=auth_utils.build_jwt_header(cfg.config_path), + json={ + "new_priority": new_priority + } + ) + + if resp.status_code == 200: + task = general_utils.bytes2dict(resp.content) + task_name = task['name'] + display_utils.center_print(f"Successfully changed [{task_name}]'s priority to {new_priority}.", type="success") + return + elif resp.status_code == 400: + err_msg = general_utils.bytes2dict(resp.content)['detail'] + display_utils.center_print(err_msg, type="error") + else: + display_utils.center_print(resp.content, type="error") + elif mode == "guest": + resp = task_router.change_task_priority(task_id, {"new_priority": new_priority}) + if resp['success']: + task = resp['updated_task'] + task_name = task['name'] + display_utils.center_print(f"Successfully changed [{task_name}]'s priority to {new_priority}.", type="success") + return + else: + display_utils.center_print(resp['detail'], type="error") + exit(0) + def change_task_name(task_id: int, new_name: str): - resp = requests.patch( - cfg.base_url + f"/tasks/{task_id}/name", - headers=auth_utils.build_jwt_header(cfg.config_path), - json={ - "new_name": new_name - } - ) - - if resp.status_code == 200: - task = general_utils.bytes2dict(resp.content) - task_name = task['name'] - display_utils.center_print(f"Successfully changed [{task_name}]'s name to {new_name}.", type="success") - elif resp.status_code == 400: - err_msg = general_utils.bytes2dict(resp.content)['detail'] - display_utils.center_print(err_msg, constants.DISPLAY_TERMINAL_COLOR_ERROR) - else: - display_utils.center_print(resp.content, constants.DISPLAY_TERMINAL_COLOR_ERROR) + mode = auth_utils.get_mode(cfg.config_path) + if mode == "user": + resp = requests.patch( + cfg.base_url + f"/tasks/{task_id}/name", + headers=auth_utils.build_jwt_header(cfg.config_path), + json={ + "new_name": new_name + } + ) + + if resp.status_code == 200: + task = general_utils.bytes2dict(resp.content) + task_name = task['name'] + display_utils.center_print(f"Successfully changed [{task_name}]'s name to {new_name}.", type="success") + return + elif resp.status_code == 400: + err_msg = general_utils.bytes2dict(resp.content)['detail'] + display_utils.center_print(err_msg, constants.DISPLAY_TERMINAL_COLOR_ERROR) + else: + display_utils.center_print(resp.content, constants.DISPLAY_TERMINAL_COLOR_ERROR) + elif mode == "guest": + resp = task_router.change_task_name(task_id, {"new_name": new_name}) + if resp['success']: + task = resp['updated_task'] + task_name = task['name'] + display_utils.center_print(f"Successfully changed [{task_name}]'s name to {new_name}.", type="success") + return + else: + display_utils.center_print(resp['detail'], constants.DISPLAY_TERMINAL_COLOR_ERROR) + exit(0) def change_task_date(task_id: int, new_date: str): - resp = requests.patch( - cfg.base_url + f"/tasks/{task_id}/date", - headers=auth_utils.build_jwt_header(cfg.config_path), - json={ - "new_date": new_date - } - ) - - if resp.status_code == 200: - task = general_utils.bytes2dict(resp.content) - task_name = task['name'] - display_utils.center_print(f"Successfully changed [{task_name}]'s date to {new_date.split()[0]}.", type="success") - elif resp.status_code == 400: - err_msg = general_utils.bytes2dict(resp.content)['detail'] - display_utils.center_print(err_msg, constants.DISPLAY_TERMINAL_COLOR_ERROR) - else: - display_utils.center_print(resp.content, constants.DISPLAY_TERMINAL_COLOR_ERROR) + mode = auth_utils.get_mode(cfg.config_path) + if mode == "user": + resp = requests.patch( + cfg.base_url + f"/tasks/{task_id}/date", + headers=auth_utils.build_jwt_header(cfg.config_path), + json={ + "new_date": new_date + } + ) - - + if resp.status_code == 200: + task = general_utils.bytes2dict(resp.content) + task_name = task['name'] + display_utils.center_print(f"Successfully changed [{task_name}]'s date to {new_date.split()[0]}.", type="success") + elif resp.status_code == 400: + err_msg = general_utils.bytes2dict(resp.content)['detail'] + display_utils.center_print(err_msg, type="error") + else: + display_utils.center_print(resp.content, type="error") + elif mode == "guest": + resp = task_router.change_task_date(task_id, {"new_date": new_date}) + if resp['success']: + task = resp['updated_task'] + task_name = task['name'] + display_utils.center_print(f"Successfully changed [{task_name}]'s date to {new_date.split()[0]}.", type="success") + else: + display_utils.center_print(resp['detail'], type="error") + exit(0) \ No newline at end of file diff --git a/girok/calendar_cli/calendar_container.py b/girok/calendar_cli/calendar_container.py index 2ece156..6003542 100644 --- a/girok/calendar_cli/calendar_container.py +++ b/girok/calendar_cli/calendar_container.py @@ -217,12 +217,9 @@ class Calendar(Container): tag = None else: tag = self.tag - - log("CATS", cat_list), - log("tag", tag) start_date, end_date = task_utils.build_time_window_by_year_and_month(self.year, self.month) - resp = task_api.get_tasks( + tasks = task_api.get_tasks( cats=cat_list, start_date=start_date, end_date=end_date, @@ -230,45 +227,40 @@ class Calendar(Container): view="list" ) - if resp.status_code == 200: - self.refresh_cell_days() - tasks = general_utils.bytes2dict(resp.content)['tasks'] - self.tasks = tasks - first_weekday, last_day = calendar.monthrange(self.year, self.month) - - if self.cur_focused_cell: - if show_arrow: - calendar_utils.remove_left_arrow(self.cur_focused_cell) - self.cur_focused_cell_cord = calendar_utils.convert_cell_num_to_coord(first_weekday) - self.cur_focused_cell = self.query_one(f"#cell{first_weekday}") # update - if show_arrow: - calendar_utils.add_left_arrow(self.cur_focused_cell) - - for idx, task in enumerate(tasks): - full_date = task['deadline'] - day = datetime.strptime(full_date, "%Y-%m-%dT%H:%M:%S").day - cell_num = calendar_utils.convert_day_to_cell_num(self.year, self.month, day) - cell = self.query_one(f"#cell{cell_num}") - color = task['color'] - name = task['name'] - # if len(name) > 13: - # name = name[:13] + ".." - task_item_name = Text() - task_item_name.append("●", style=constants.CIRCLE_COLOR[color]) - task_item_name.append(" " + name) - - task_item = Static(task_item_name, id=f"task-cell{cell_num}-{idx}", classes="task-item") - cell.mount(task_item) - - task_item = self.query_one(f"#task-cell{cell_num}-{idx}") - task_item.styles.overflow_x = "hidden" - task_item.styles.overflow_y = "hidden" - - elif resp.status_code == 400: - err_msg = general_utils.bytes2dict(resp.content)['detail'] - exit(0) - else: - exit(0) + self.refresh_cell_days() + self.tasks = tasks + first_weekday, last_day = calendar.monthrange(self.year, self.month) + + if self.cur_focused_cell: + if show_arrow: + calendar_utils.remove_left_arrow(self.cur_focused_cell) + self.cur_focused_cell_cord = calendar_utils.convert_cell_num_to_coord(first_weekday) + self.cur_focused_cell = self.query_one(f"#cell{first_weekday}") # update + if show_arrow: + calendar_utils.add_left_arrow(self.cur_focused_cell) + + for idx, task in enumerate(tasks): + full_date = str(task['deadline']) + day = calendar_utils.get_date_obj_from_str_separated_by_T(full_date).day + # day = datetime.strptime(full_date, "%Y-%m-%dT%H:%M:%S").day + cell_num = calendar_utils.convert_day_to_cell_num(self.year, self.month, day) + cell = self.query_one(f"#cell{cell_num}") + color = task['color'] + name = task['name'] + # if len(name) > 13: + # name = name[:13] + ".." + task_item_name = Text() + task_item_name.append("●", style=constants.CIRCLE_COLOR[color]) + task_item_name.append(" " + name) + + task_item = Static(task_item_name, id=f"task-cell{cell_num}-{idx}", classes="task-item") + cell.mount(task_item) + + task_item = self.query_one(f"#task-cell{cell_num}-{idx}") + task_item.styles.overflow_x = "hidden" + task_item.styles.overflow_y = "hidden" + + class CalendarContainer(Vertical): diff --git a/girok/calendar_cli/sidebar.py b/girok/calendar_cli/sidebar.py index 111448e..19a9772 100644 --- a/girok/calendar_cli/sidebar.py +++ b/girok/calendar_cli/sidebar.py @@ -112,14 +112,8 @@ class TagTree(Tree): self.highlighted_node = self.root self.selected_node = self.root - resp = task_api.get_tags() - if resp.status_code == 200: - self.tags = general_utils.bytes2dict(resp.content)['tags'] - elif resp.status_code == 400: - err_msg = general_utils.bytes2dict(resp.content)['detail'] - exit(0) - else: - exit(0) + tags = task_api.get_tags() + self.tags = tags self.root.expand() diff --git a/girok/commands/task.py b/girok/commands/task.py index 2e125d4..c96aef3 100644 --- a/girok/commands/task.py +++ b/girok/commands/task.py @@ -449,7 +449,7 @@ def show_task( priority = None if category_view: - resp = task_api.get_tasks( + tasks = task_api.get_tasks( cats=cats, start_date=start_date, end_date=end_date, @@ -459,7 +459,7 @@ def show_task( view="category" ) elif list_view: - resp = task_api.get_tasks( + tasks = task_api.get_tasks( cats=cats, start_date=start_date, end_date=end_date, @@ -469,24 +469,16 @@ def show_task( view="list" ) - if resp.status_code == 200: - tasks = general_utils.bytes2dict(resp.content)['tasks'] - print(tasks) - if category_view: - color_dict = category_api.get_color_dict() - task_tree = display_utils.display_tasks_by_category(tasks, color_dict=color_dict) - current_date = task_utils.build_date_info(datetime.now()) - display_utils.center_print(current_date, type='title') - print(task_tree) - elif list_view: - current_date = task_utils.build_date_info(datetime.now()) - display_utils.center_print(current_date, type='title') - display_utils.display_tasks_by_list(tasks) - elif resp.status_code == 400: - err_msg = general_utils.bytes2dict(resp.content)['detail'] - display_utils.center_print(err_msg, type="error") - else: - display_utils.center_print("Error occurred.", type="title") + if category_view: + color_dict = category_api.get_color_dict() + task_tree = display_utils.display_tasks_by_category(tasks, color_dict=color_dict) + current_date = task_utils.build_date_info(datetime.now()) + display_utils.center_print(current_date, type='title') + print(task_tree) + elif list_view: + current_date = task_utils.build_date_info(datetime.now()) + display_utils.center_print(current_date, type='title') + display_utils.display_tasks_by_list(tasks) @app.command("done", help="[red]Delete[/red] a task", rich_help_panel=":fire: [bold yellow1]Task Commands[/bold yellow1]") @@ -503,25 +495,17 @@ def remove_task( target_task = task_api.get_single_task(target_task_id) target_task_name = target_task['name'] - tasks_resp = task_api.get_tasks() - tasks = general_utils.bytes2dict(tasks_resp.content)['tasks'] + tasks = task_api.get_tasks() if not force: done_confirm = typer.confirm(f"Are you sure to delete task [{target_task_name}]?") if not done_confirm: exit(0) - resp = task_api.remove_task(target_task_id) - - if resp.status_code == 204: - color_dict = category_api.get_color_dict() - task_tree = display_utils.display_tasks_by_category(tasks, color_dict=color_dict, marked_task_id=target_task_id) - current_date = task_utils.build_date_info(datetime.now()) - display_utils.center_print(current_date, type="title") - print(task_tree) - elif resp.status_code == 400: - err_msg = general_utils.bytes2dict(resp.content)['detail'] - display_utils.center_print(err_msg, type="error") - else: - display_utils.center_print(resp.content, type="error") + task_api.remove_task(target_task_id) + color_dict = category_api.get_color_dict() + task_tree = display_utils.display_tasks_by_category(tasks, color_dict=color_dict, marked_task_id=target_task_id) + current_date = task_utils.build_date_info(datetime.now()) + display_utils.center_print(current_date, type="title") + print(task_tree) @app.command("chtag", help="[green]Change[/green] the tag of a task", rich_help_panel=":fire: [bold yellow1]Task Commands[/bold yellow1]") @@ -624,13 +608,6 @@ def change_date( @app.command("showtag", help="[yellow]Show[/yellow] all tags", rich_help_panel=":fire: [bold yellow1]Task Commands[/bold yellow1]") def show_tag(): - resp = task_api.get_tags() - if resp.status_code == 200: - tags = general_utils.bytes2dict(resp.content)['tags'] - for tag in tags: - print(tag) - elif resp.status_code == 400: - err_msg = general_utils.bytes2dict(resp.content)['detail'] - display_utils.center_print(err_msg, type="error") - else: - print(resp) + tags = task_api.get_tags() + for tag in tags: + print(tag) \ No newline at end of file diff --git a/girok/girok.py b/girok/girok.py index a5e3ffa..876ecee 100644 --- a/girok/girok.py +++ b/girok/girok.py @@ -23,7 +23,7 @@ app.registered_commands.extend(auth_command.app.registered_commands) app.registered_commands.extend(category_command.app.registered_commands) app.registered_commands.extend(task_command.app.registered_commands) app.registered_commands.extend(calendar_command.app.registered_commands) -# app.registered_commands.extend(info_command.app.registered_commands) + cfg = get_config() def version_callback(value: bool): @@ -31,6 +31,8 @@ def version_callback(value: bool): print(f"[yellow]{cfg.version}[/yellow]") raise typer.Exit() + +####### Major refactoring needed -> minimize code duplications for local-storage feature @app.callback() def pre_command_callback(ctx: typer.Context, version: bool = typer.Option(None, "--version", callback=version_callback, is_eager=True),): cmd = ctx.invoked_subcommand @@ -43,14 +45,14 @@ def pre_command_callback(ctx: typer.Context, version: bool = typer.Option(None, # Check if logged-out mode = auth_utils.get_mode(cfg.config_path) if mode != "off": - print(f"You're already logged in as [green]{mode}[/green]. Please log out and try again.") + print(f"You're already logged in as [yellow]{mode}[/yellow]. Please log out and try again.") exit(0) return elif cmd == "login": # Check if logged-out mode = auth_utils.get_mode(cfg.config_path) if mode != "off": - print(f"You're already logged in as [green]{mode}[/green]. Please log out and try again.") + print(f"You're already logged in as [yellow]{mode}[/yellow]. Please log out and try again.") exit(0) return elif cmd == "logout": @@ -63,7 +65,7 @@ def pre_command_callback(ctx: typer.Context, version: bool = typer.Option(None, elif cmd == "register": mode = auth_utils.get_mode(cfg.config_path) if mode != "off": - print(f"You're already logged in as [green]{mode}[/green]. Please log out and try again.") + print(f"You're already logged in as [yellow]{mode}[/yellow]. Please log out and try again.") exit(0) return elif cmd == "mode": @@ -72,28 +74,14 @@ def pre_command_callback(ctx: typer.Context, version: bool = typer.Option(None, # Check if logged-in mode = auth_utils.get_mode(cfg.config_path) if mode == "off": - print("You're not logged in. Please login with [green]girok login[/green] or [green]girok guest[/green].") + print("You're not logged in. Please login with [yellow]girok login[/yellow] or [yellow]girok guest[/yellow].") exit(0) elif mode == "guest": pass elif mode == "user": if not auth_utils.is_logged_in_as_user(cfg.config_path): - print("You're not logged in. Please login with [green]girok login[/green or [green]girok guest[/green].") + print("You're not logged in. Please login with [yellow]girok login[/yellow] or [yellow]girok guest[/yellow].") exit(0) else: raise Exception("Unexpected Authentication") - - - # if ctx.invoked_subcommand in ['login', 'logout', 'register']: - # return - - # # Check if JWT is stored in config file - # stored_access_token = auth_utils.get_access_token_from_json(cfg.config_path) - # if stored_access_token: - # resp = auth_api.validate_access_token(stored_access_token) - # if resp.status_code != 200: # invalid(or expired) JWT -> login again - # print("You're not logged in. Please login with [green]girok login[/green].") - # exit(0) - # else: - # print("You're not logged in. Please login with [green]girok login[/green].") - # exit(0) \ No newline at end of file + \ No newline at end of file diff --git a/girok/server/src/category/router.py b/girok/server/src/category/router.py index 8e756d8..8ce5285 100644 --- a/girok/server/src/category/router.py +++ b/girok/server/src/category/router.py @@ -139,19 +139,27 @@ def move_category(category: schemas.CategoryMoveIn): def get_last_cat_id(cat_data: schemas.LastCategoryIdIn): db = next(get_db()) - cat_data = cat_data.dict() - cat_id, _ = service.get_last_cat_id(db, cat_data['cats']) - return {"cat_id": cat_id} + try: + cat_id, _ = service.get_last_cat_id(db, cat_data['cats']) + return {"success": True, "cat_id": cat_id} + except Exception as e: + return {"success": False, "detail": e.detail} def get_category_color(cat_id: int): db = next(get_db()) - color = service.get_category_color_by_id(db, cat_id) - return {"color": color} + try: + color = service.get_category_color_by_id(db, cat_id) + return {"success": True, "color": color} + except Exception as e: + return {"success": False, "detail": e.detail} def get_category_colors_dict(): db = next(get_db()) - colors = service.get_all_category_colors(db) - colors['No Category'] = "grey" - return colors \ No newline at end of file + try: + colors = service.get_all_category_colors(db) + colors['No Category'] = "grey" + return {"success": True, "colors": colors} + except Exception as e: + return {"success": False, "detail": e.detail} \ No newline at end of file diff --git a/girok/server/src/category/service.py b/girok/server/src/category/service.py index c467b51..e6f78f5 100644 --- a/girok/server/src/category/service.py +++ b/girok/server/src/category/service.py @@ -119,7 +119,7 @@ def get_last_cat_id(db: Session, cats: list): cumul_path = "" if not cats: return parent_id, cumul_path - + for cat_name in cats: cat_id = get_category_id_by_name_and_parent_id(db, cat_name, parent_id) if not cat_id: diff --git a/girok/server/src/task/router.py b/girok/server/src/task/router.py index 3f2bc27..9bb3979 100644 --- a/girok/server/src/task/router.py +++ b/girok/server/src/task/router.py @@ -30,8 +30,8 @@ def create_task(task: schemas.TaskCreateIn): # status_code=status.HTTP_200_OK # # response_model=schemas.TaskOut # ) -def get_tasks(data: schemas.TaskGetIn): - print("data", data) +def get_tasks(data): + data = schemas.TaskGetIn(**data).dict() category = data['category'] start_date = data['start_date'] end_date = data['end_date'] @@ -89,7 +89,7 @@ def get_tasks(data: schemas.TaskGetIn): # "/{task_id}", # status_code=status.HTTP_204_NO_CONTENT # ) -async def delete_task( +def delete_task( task_id: int ): db = next(get_db()) @@ -104,7 +104,7 @@ async def delete_task( # '/{task_id}/tag', # status_code=status.HTTP_200_OK, # ) -async def change_task_tag( +def change_task_tag( task_id: int, tag: schemas.ChangeTaskTagIn ): @@ -121,7 +121,7 @@ async def change_task_tag( # '/{task_id}/priority', # status_code=status.HTTP_200_OK, # ) -async def change_task_priority( +def change_task_priority( task_id: int, priority: schemas.ChangeTaskPriorityIn ): @@ -138,16 +138,18 @@ async def change_task_priority( # '/{task_id}/date', # status_code=status.HTTP_200_OK # ) -async def change_task_date( +def change_task_date( task_id: int, data: schemas.ChangeTaskDateIn ): db = next(get_db()) try: new_date = data['new_date'] + new_date = datetime.strptime(new_date, "%Y-%m-%d %H:%M:%S") updated_task = service.change_task_date(db, task_id, new_date) return {"success": True, "updated_task": updated_task} except Exception as e: + print(e) return {"success": False, "detail": e.detail} @@ -155,7 +157,7 @@ async def change_task_date( # '/{task_id}/name', # status_code=status.HTTP_200_OK # ) -async def change_task_name( +def change_task_name( task_id: int, data: schemas.ChangeTaskNameIn ): @@ -173,7 +175,7 @@ async def change_task_name( # status_code=status.HTTP_200_OK, # response_model=schemas.TagOut # ) -async def get_tags(): +def get_tags(): db = next(get_db()) try: tags = service.get_tags(db) @@ -187,7 +189,7 @@ async def get_tags(): # status_code=status.HTTP_200_OK, # response_model=schemas.GetSingleTaskOut # ) -async def get_single_task(task_id: int): +def get_single_task(task_id: int): db = next(get_db()) try: task = service.get_single_task(db, task_id) diff --git a/girok/server/src/task/schemas.py b/girok/server/src/task/schemas.py index e861ded..3359636 100644 --- a/girok/server/src/task/schemas.py +++ b/girok/server/src/task/schemas.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, String, Integer, ForeignKey from sqlalchemy.sql.sqltypes import TIMESTAMP, Boolean, DateTime from typing import Union, List, Dict -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, validator from datetime import datetime, timedelta import girok.server.src.task.enums as task_enums @@ -45,24 +45,24 @@ class Task(BaseModel): class TaskGetIn(BaseModel): category: Union[List[str], None] = Field( - default_factory=None, + default=None, title="Category", description="Full category path of a category. Ex. ['HKU', 'COMP3230'].", ), start_date: Union[str, None] = Field( - default_factory="2000-01-01 00:00:00", + default="2000-01-01 00:00:00", title="Start date", description="Start date. Ex. '2023-01-23 12:00:00'", regex="^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2}$" ), end_date: Union[str, None] = Field( - default_factory=(datetime.now() + timedelta(days=365*10)).strftime("%Y-%m-%d 00:00:00"), + default=(datetime.now() + timedelta(days=365*10)).strftime("%Y-%m-%d 00:00:00"), title="End date", description="End date. Ex. '2023-03-23 12:00:00'", regex="^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2}$" ), priority: Union[int, None] = Field( - default_factory=None, + default=None, title="Priority", ge=1, le=5 @@ -76,6 +76,19 @@ class TaskGetIn(BaseModel): default_factory=None, title="View method for tasks" ) + + @validator("start_date") + def set_start_date(cls, v): + if v is None: + return "2000-01-01 00:00:00" + return v + + @validator("end_date") + def set_end_date(cls, v): + if v is None: + return (datetime.now() + timedelta(days=365*10)).strftime("%Y-%m-%d 00:00:00") + return v + class GetSingleTaskOut(BaseModel): name: str diff --git a/girok/utils/calendar.py b/girok/utils/calendar.py index dab9e7a..e2e0763 100644 --- a/girok/utils/calendar.py +++ b/girok/utils/calendar.py @@ -60,7 +60,9 @@ def convert_coord_to_cell_num(x: int, y: int): def get_date_obj_from_str_separated_by_T(s: str): - return datetime.strptime(s, "%Y-%m-%dT%H:%M:%S") + s = str(s) + delim = "T" if "T" in s else " " + return datetime.strptime(s, f"%Y-%m-%d{delim}%H:%M:%S") def remove_left_arrow(cell): diff --git a/girok/utils/display.py b/girok/utils/display.py index 94750e1..362dfa3 100644 --- a/girok/utils/display.py +++ b/girok/utils/display.py @@ -168,8 +168,8 @@ def display_category_with_tasks( # Cache task id if not(task['task_id'] == marked_task_id and marked_color == constants.TABLE_TASK_DELETED_COLOR): task_ids_cache[len(task_ids_cache) + 1] = task['task_id'] - - deadline = datetime.strptime(task['deadline'], "%Y-%m-%dT%H:%M:%S") + deadline = calendar_utils.get_date_obj_from_str_separated_by_T(str(task['deadline'])) + # deadline = datetime.strptime(task['deadline'], "%Y-%m-%dT%H:%M:%S") year, month, day = deadline.year, deadline.month, deadline.day h, m, s = str(deadline.time()).split(":") diff --git a/girok/utils/general.py b/girok/utils/general.py index da6e96a..3791897 100644 --- a/girok/utils/general.py +++ b/girok/utils/general.py @@ -7,6 +7,11 @@ def config_setup(APP_DIR, CONFIG_PATH): if not os.path.isdir(APP_DIR): os.makedirs(APP_DIR) write_json(CONFIG_PATH, {"mode": "off"}) + else: + cfg = read_json(CONFIG_PATH) + if 'mode' not in cfg: + write_json(CONFIG_PATH, {"mode": "off"}) + def read_json(fpath): -- cgit v1.2.3