PlanExe / src /wbs /create_wsb_table_csv.py
Simon Strandgaard
snapshot of PlanExe repo
6369972
import os
import json
from src.wbs.wbs_task import WBSTask, WBSProject
class CreateWBSTableCSV:
"""
Create a CSV representation of a Work Breakdown Structure (WBS).
"""
def __init__(self, wsb_project: WBSProject):
if not isinstance(wsb_project, WBSProject):
raise ValueError("wsb_project must be an instance of WBSProject")
self.wsb_project = wsb_project
self.separator = ';'
self.csv_rows = []
def max_level(self, task: WBSTask, level=0):
max_level = level
for child in task.task_children:
max_level = max(max_level, self.max_level(child, level + 1))
return max_level
def visit_task(self, task: WBSTask, number_of_levels: int, level=0):
columns = []
for i in range(number_of_levels):
s = ''
if i == level:
s = task.description
columns.append(s)
columns.append(task.id)
csv_row = self.separator.join(columns)
self.csv_rows.append(csv_row)
for child in task.task_children:
self.visit_task(child, number_of_levels, level + 1)
def execute(self):
number_of_levels = self.max_level(self.wsb_project.root_task) + 1
columns = []
for i in range(number_of_levels):
columns.append(f"Level {i+1}")
columns.append("Task ID")
csv_row = self.separator.join(columns)
self.csv_rows.append(csv_row)
self.visit_task(self.wsb_project.root_task, number_of_levels)
def to_csv_string(self):
return '\n'.join(self.csv_rows)
if __name__ == "__main__":
# TODO: Eliminate hardcoded paths
path = '/Users/neoneye/Desktop/planexe_data/011-wbs_project.json'
print(f"loading file: {path}")
with open(path, 'r', encoding='utf-8') as f:
wsb_project_json = json.load(f)
wsb_project = WBSProject.from_dict(wsb_project_json)
instance = CreateWBSTableCSV(wsb_project)
instance.execute()
print(f"Generated wbs_table.csv")
print(instance.to_csv_string())