diff --git a/scheduler.py b/scheduler.py index ed767bc..475bfe1 100755 --- a/scheduler.py +++ b/scheduler.py @@ -21,26 +21,38 @@ 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) @@ -48,7 +60,7 @@ def skip_vacation(man, date1, vacations): 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 @@ -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: @@ -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 @@ -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 @@ -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: @@ -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!") @@ -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("")