time_recorder_task_handler.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import sqlalchemy
  2. from sqlalchemy import select
  3. from sqlalchemy.orm import sessionmaker
  4. from time_recoder.time_recorder_database.create_db import ENGINE, create_root_task
  5. from time_recoder.time_recorder_database.db_models import Task
  6. Session = sessionmaker(bind=ENGINE)
  7. class TaskHandler:
  8. def __init__(self):
  9. self.session = Session()
  10. self.root_task = self.get_root_task()
  11. def get_root_task(self):
  12. task: Task
  13. try:
  14. task = self.session.query(Task).filter(Task.parent_task_id == -1).one()
  15. except:
  16. create_root_task()
  17. task = self.session.query(Task).filter(Task.parent_task_id == -1).one()
  18. return task
  19. def add_task(self, parent_task_id: int, name: str):
  20. try:
  21. new_task = Task(parent_task_id=parent_task_id, name=name)
  22. self.session.add(new_task)
  23. self.session.commit()
  24. except:
  25. print("Error: Couln't commit new Task to DB. Please close any other DB connections")
  26. """ fancy recursion tree ♥ """
  27. def get_task_tree(self, parent_task: Task):
  28. child_tasks = self.session.query(Task).filter(Task.parent_task_id == parent_task.id).all()
  29. return {'task': parent_task,
  30. 'child_tasks': [self.get_task_tree(task) for task in child_tasks]}
  31. def close_session(self):
  32. self.session.close()
  33. def task_tree_as_string_list(self, task_tree, level_offset=0):
  34. string_level_prefix = ''
  35. for _ in range(0, level_offset):
  36. string_level_prefix += ' '
  37. intended_name = string_level_prefix + task_tree['task'].name
  38. level_offset += 2
  39. child_tree_list = [self.task_tree_as_string_list(task_tree, level_offset) for task_tree in
  40. task_tree['child_tasks']]
  41. flatten_child_tree_list = [item for sublist in child_tree_list for item in sublist]
  42. return [intended_name] + flatten_child_tree_list
  43. def task_tree_as_id_list(self, task_tree):
  44. child_tree_list = [self.task_tree_as_id_list(task_tree) for task_tree in task_tree['child_tasks']]
  45. root_id = task_tree['task'].id
  46. flatten_child_tree_list = [item for sublist in child_tree_list for item in sublist]
  47. return [root_id] + flatten_child_tree_list
  48. def get_task_tree_name_strings(self, task):
  49. return self.task_tree_as_string_list(self.get_task_tree(task))
  50. def get_task_tree_ids(self, task):
  51. return self.task_tree_as_id_list(self.get_task_tree(task))
  52. def get_task_id(self, task_name: str):
  53. return self.get_task_tree_ids(self.root_task)[self.get_task_tree_name_strings(self.root_task).index(task_name)]
  54. def get_task_by_id(self, task_id: int):
  55. return self.session.query(Task).filter(Task.id == task_id).one()
  56. def get_task_branch_as_string(self, task):
  57. parent_task_id = task.parent_task_id
  58. if parent_task_id == -1:
  59. return task.name
  60. else:
  61. return self.get_task_branch_as_string(self.get_task_by_id(parent_task_id)) + '/' + task.name