Created
August 24, 2014 03:35
-
-
Save Bekt/f771278281a8696ddc4f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Jobs,Steve,3/3/1993,Steve Ballmer | |
Ballmer,Steve,2/2/1992,Bill Gates | |
Gates,Bill,1/1/1990, | |
Wozniak,Steve,4/4/1994,Steve Jobs | |
Bekt,Kanat,5/5/2005,Bill Gates |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment