#!/usr/bin/env python3 class Employee(object): def __init__(self, first, last, join_date=None, manager=None): self.first = first self.last = last self.join_date = join_date self.manager = manager self.reporters = [] @property def name(self): return self.first + ' ' + self.last class OrgChart(object): def __init__(self, filename): self._read(filename) def print_chart(self): self._print_chart(self._root, 0) def _print_chart(self, employee, level): print('>' * level + employee.name) for r in self.get_reporters(employee): self._print_chart(r, level + 1) def get_manager(self, employee): return employee.manager def get_all_managers(self, employee): managers = [] while employee: m = self.get_manager(employee) managers.append(m) employee = m def get_reporters(self, employee): return employee.reporters def get_all_reporters(self, employee): reporters = [] self._get_all_reporters(employee, reporters) return reporters def _get_all_reporters(self, employee, reporters): r = self.get_reporters(employee) reporters.extend(r) for e in r: self._get_all_reporters(e, reporters) def _read(self, filename): with open(filename) as f: d = {} for line in f.read().splitlines(): l, f, j, m = line.split(',') e = d.get(f + ' ' + l) manager = d.get(m) if not manager and m: m_f, m_l = m.split() manager = Employee(m_f, m_l) d[manager.name] = manager if e: e.manager = manager e.join_date = j else: e = Employee(f, l, j, manager) d[e.name] = e if manager: manager.reporters.append(e) else: self._root = e if __name__ == '__main__': org = OrgChart('employees.txt') org.print_chart()