Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 49 additions & 26 deletions scheduler.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,34 +21,46 @@ def __init__(self, name, man_day, man, status=0):
self.status = int(status)
self.start_point = None

def start_date(self, project_start_date, vacations):
return add_days(self.man, project_start_date, vacations, self.start_point)
def start_date(self, project_start_date, vacations, extras):
return add_days(self.man, project_start_date, vacations, extras, self.start_point)

def end_date(self, project_start_date, vacations):
return add_days(self.man, project_start_date, vacations, self.start_point + self.man_day, False)
def end_date(self, project_start_date, vacations, extras):
return add_days(self.man, project_start_date, vacations, extras, self.start_point + self.man_day, False)

TASK_LINE_PATTERN = "\*(.+)\-\-\s*([0-9]+\.?[0-9]?)\s*\[(.+?)\](\[([0-9]+)%\])?"
VACATION_PATTERN = "\*(.+)\-\-\s*([0-9]{4}\-[0-9]{2}\-[0-9]{2})(\s*\-\s*([0-9]{4}\-[0-9]{2}\-[0-9]{2}))?"
VACATION_PATTERN = "\*([^\-]+)\s*\-{2}\s*([0-9]{4}\-[0-9]{2}\-[0-9]{2})(\s*\-\s*([0-9]{4}\-[0-9]{2}\-[0-9]{2}))?"
EXTRAWORK_PATTERN = "\*([^\-]+)\s*\+{2}\s*([0-9]{4}\-[0-9]{2}\-[0-9]{2})(\s*\-\s*([0-9]{4}\-[0-9]{2}\-[0-9]{2}))?"
PROJECT_START_DATE_PATTERN = '项目开始时间\:\s*([0-9]{4}\-[0-9]{2}\-[0-9]{2})'

def skip_weekend(date1):
def skip_weekend(man, date1, extras):
weekday = date1.isoweekday()
if weekday > 5:
padding_days = (7 - weekday) + 1

if extras.get(man) and str(date1) in extras.get(man):
return False, date1
elif weekday == 6:
padding_days = 2
tomorrow = date1 + datetime.timedelta(1)
if(extras.get(man)):
if(str(tomorrow) in extras.get(man)):
padding_days = 1
date1 = date1 + datetime.timedelta(days=padding_days)
return True, date1
elif weekday == 7:
date1 = date1 + datetime.timedelta(days=1)
return True, date1
else:
return False, date1



def skip_vacation(man, date1, vacations):
if vacations.get(man) and vacations.get(man).count(str(date1)) > 0:
date1 = date1 + datetime.timedelta(days=1)
return True, date1
else:
return False, date1

def add_days(man, curr_day, vacations, days, is_start_date = True):
def add_days(man, curr_day, vacations, extras, days, is_start_date = True):
idx = int(ceil(days))
if idx > days:
idx -= 1
Expand All @@ -62,7 +74,7 @@ def add_days(man, curr_day, vacations, days, is_start_date = True):

# skip the weekend and vacations
while True:
skipped, ret = skip_weekend(ret)
skipped, ret = skip_weekend(man, ret, extras)
skipped, ret = skip_vacation(man, ret, vacations)

if not skipped:
Expand Down Expand Up @@ -98,18 +110,11 @@ def format_with_width(input, width):
actual_width = actual_width_str(input)

delta = width - actual_width
if delta > 0:
for i in range(delta):
target += ' '

return target
return target + ' ' * delta

def repeat(cnt):
ret = ''
for i in range(cnt):
ret += '-'

return ret
return '-' * cnt

MAN_LEN = 6
MAN_DAY_LEN = 8
Expand All @@ -132,9 +137,9 @@ def pretty_print(task_name, man, man_day, start_date, end_date, status, task_nam
print("{} | {} | {} | {} | {} | {}".format(actual_task_name, actual_man, actual_man_day,
actual_start_date, actual_end_date, actual_status))

def pretty_print_task(task, project_start_date, vacations, task_name_len):
pretty_print(task.name, task.man, task.man_day, task.start_date(project_start_date, vacations),
task.end_date(project_start_date, vacations), str(task.status) + "%", task_name_len)
def pretty_print_task(task, project_start_date, vacations, extras, task_name_len):
pretty_print(task.name, task.man, task.man_day, task.start_date(project_start_date, vacations, extras),
task.end_date(project_start_date, vacations, extras), str(task.status) + "%", task_name_len)

def find_max_length_of_tasks(tasks):
ret = 0
Expand All @@ -153,6 +158,7 @@ def parse(filepath, target_man=None):
lines = s.split('\n')
tasks = []
vacations = {}
extras = {}

project_start_date = None
for line in lines:
Expand Down Expand Up @@ -184,9 +190,26 @@ def parse(filepath, target_man=None):
vacations[man].append(str(xdate))
xdate += datetime.timedelta(days=1)
else:
m = re.search(PROJECT_START_DATE_PATTERN, line)
if m and m.group(1):
project_start_date = parse_date(m.group(1).strip())
m = re.search(EXTRAWORK_PATTERN, line)
if m:
man = m.group(1).strip()
extra_date = parse_date(m.group(2).strip())
extra_date_end = extra_date
if m.group(4):
extra_date_end = parse_date(m.group(4).strip())

if not extras.get(man):
extras[man] = []

xdate = extra_date
while xdate <= extra_date_end:
extras[man].append(str(xdate))
xdate += datetime.timedelta(days=1)
else:
m = re.search(PROJECT_START_DATE_PATTERN, line)
if m and m.group(1):
project_start_date = parse_date(m.group(1).strip())


if not project_start_date:
print("Please provide project_start_date!")
Expand All @@ -205,7 +228,7 @@ def parse(filepath, target_man=None):
if not target_man or task.man == target_man:
total_man_days += task.man_day
cost_man_days += task.man_day * task.status / 100
pretty_print_task(task, project_start_date, vacations, max_len)
pretty_print_task(task, project_start_date, vacations, extras, max_len)

project_status = cost_man_days / total_man_days
print("")
Expand Down