PlanExe / src /wbs /wbs_task.py
Simon Strandgaard
snapshot of PlanExe repo
6369972
from typing import Optional
class WBSTask:
def __init__(self, id: str, description: str):
if not isinstance(id, str):
raise ValueError("Invalid id.")
if not isinstance(description, str):
raise ValueError("Invalid description.")
self.id = id
self.parent_id = None
self.description = description
self.task_children = []
self.extra_fields = {}
def set_field(self, field_name: str, field_value: any):
if not isinstance(field_name, str):
raise ValueError("Invalid field_name.")
self.extra_fields[field_name] = field_value
def __str__(self, level=0):
indent = " " * level
parent_info = f" (Parent ID: {self.parent_id})" if self.parent_id else ""
task_str = f"{indent}Task ID: {self.id}{parent_info}\n{indent}Description: {self.description}\n"
if self.extra_fields:
task_str += f"{indent}Extra Fields: {self.extra_fields}\n"
for child in self.task_children:
task_str += child.__str__(level + 1)
return task_str
def find_task_by_id(self, task_id: str) -> Optional['WBSTask']:
if self.id == task_id:
return self
for child in self.task_children:
found_task = child.find_task_by_id(task_id)
if found_task:
return found_task
return None
def to_dict(self):
result = {
"id": self.id,
"description": self.description,
}
if self.parent_id is not None:
result["parent_id"] = self.parent_id
if len(self.extra_fields) > 0:
result["extra_fields"] = self.extra_fields
if len(self.task_children) > 0:
result["task_children"] = [child.to_dict() for child in self.task_children]
return result
def task_ids(self) -> list[str]:
"""uuid's of all tasks in the tree hierarchy."""
result = [self.id]
for child in self.task_children:
result.extend(child.task_ids())
return result
class WBSProject:
def __init__(self, root_task: WBSTask):
self.root_task = root_task
def __str__(self):
return f"WBS Project:\n{self.root_task}"
def find_task_by_id(self, task_id: str) -> Optional[WBSTask]:
return self.root_task.find_task_by_id(task_id)
def to_dict(self):
return {
"wbs_project": self.root_task.to_dict()
}
def from_dict(json_dict: dict) -> 'WBSProject':
root_task_dict = json_dict["wbs_project"]
root_task = WBSProject.from_dict_recursive(root_task_dict)
return WBSProject(root_task)
def from_dict_recursive(json_dict: dict) -> WBSTask:
root_task = WBSTask(json_dict["id"], json_dict["description"])
if "parent_id" in json_dict:
root_task.parent_id = json_dict["parent_id"]
if "extra_fields" in json_dict:
root_task.extra_fields = json_dict["extra_fields"]
if "task_children" in json_dict:
root_task.task_children = [WBSProject.from_dict_recursive(child_dict) for child_dict in json_dict["task_children"]]
return root_task
def to_csv_string(self) -> str:
from src.wbs.create_wsb_table_csv import CreateWBSTableCSV
instance = CreateWBSTableCSV(self)
instance.execute()
return instance.to_csv_string()