Last active
September 13, 2022 19:07
-
-
Save samiyuru/20552ebb9d8773e461d2890f387a954f to your computer and use it in GitHub Desktop.
Odin Late Penalty.
This file contains hidden or 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 | |
# | |
# Author: Sami Menik, Fall 2022 | |
# | |
# The program parses the time stamp of the current directory and calculate the late penalty and | |
# check the validity of the submission based on the earliest possible valid submission start date. | |
# | |
# Usage: late_penalty <valid-start-date> <due-date> <max-points> | |
# | |
# Format of <valid-start-date>: yyyy/mm/dd HH:MM:SS | |
# Format of <due-date>: yyyy/mm/dd HH:MM:SS | |
# Type of <max-points> should be an int | |
import re | |
import os | |
import sys | |
from datetime import datetime | |
def cur_dir_name(): | |
directory_path = os.getcwd() | |
return os.path.basename(directory_path) | |
def extract_datetime_suffix(dir_name): | |
return dir_name[-31:-11] | |
def parse_datetime_str(datetime_str): | |
# Format: yyyy/mm/dd HH:MM:SS | |
return datetime.strptime(datetime_str, '%Y/%m/%d %H:%M:%S') | |
def parse_dir_datetime_suffix(dir_datetime_suffix): | |
datetime_parts = re.search('([a-z]+)_+([0-9]+)_+([0-9]+)_+([0-9]+)_+([0-9]+)_+([0-9]+)', dir_datetime_suffix, re.IGNORECASE) | |
month = datetime_parts.group(1) | |
date = datetime_parts.group(2) | |
hour = datetime_parts.group(3) | |
min = datetime_parts.group(4) | |
sec = datetime_parts.group(5) | |
year = datetime_parts.group(6) | |
parsable_datetime_str = '{}/{}/{} {}:{}:{}'.format(year, month, date, hour, min, sec) | |
return datetime.strptime(parsable_datetime_str, '%Y/%b/%d %H:%M:%S') | |
def parse_cur_dir_datetime_suffix(): | |
curr_dir_name = cur_dir_name() | |
dir_datetime_suffix = extract_datetime_suffix(curr_dir_name) | |
date_time = parse_dir_datetime_suffix(dir_datetime_suffix) | |
return date_time | |
def late_penalty_percent(due_datetime, submission_datetime): | |
diff_hours = (submission_datetime - due_datetime).total_seconds() / (60 * 60) | |
if diff_hours <= 0: | |
return 0 | |
elif diff_hours <= 24: | |
return 0.1 | |
elif diff_hours <= 48: | |
return 0.2 | |
else: | |
return 1 | |
def late_penalty(max_points, late_penalty_percent): | |
return max_points * late_penalty_percent | |
def late_penalty_message(late_penalty_percent): | |
if late_penalty_percent == 0: | |
print('Submission has been done on time.') | |
elif late_penalty_percent == 0.1: | |
print('Submission is late but within 24h. Please check the syllabus for more info.') | |
elif late_penalty_percent == 0.2: | |
print('Submission is late more than 24h but within 48h. Please check the syllabus for more info.') | |
else: | |
print('Submission is late more than 48h. Submission is not accepted. Please check the syllabus for more info.') | |
def is_valid_submission(curr_dir_datetime, valid_start_datetime): | |
if (curr_dir_datetime - valid_start_datetime).total_seconds() < 0: | |
# Submission is done before the valid start datetime. | |
return False | |
else: | |
return True | |
def main(): | |
if len(sys.argv) != 4: | |
print('Call the program with the following args:', file=sys.stderr) | |
print('late_penalty <due-date> <max-points>', file=sys.stderr) | |
print('Due date format: yyyy/mm/dd HH:MM:SS', file=sys.stderr) | |
sys.exit(1) | |
valid_start_datetime_str = sys.argv[1] | |
due_datetime_str = sys.argv[2] | |
try: | |
valid_start_datetime = parse_datetime_str(valid_start_datetime_str) | |
except: | |
print('Use the due date format: yyyy/mm/dd HH:MM:SS', file=sys.stderr) | |
sys.exit(1) | |
try: | |
due_datetime = parse_datetime_str(due_datetime_str) | |
except: | |
print('Use the due date format: yyyy/mm/dd HH:MM:SS', file=sys.stderr) | |
sys.exit(1) | |
try: | |
max_points = int(sys.argv[3]) | |
except: | |
print('Max points should be an integer.', file=sys.stderr) | |
sys.exit(1) | |
try: | |
curr_dir_datetime = parse_cur_dir_datetime_suffix() | |
except: | |
print('Current directory does not have a valid date time suffix.', file=sys.stderr) | |
sys.exit(1) | |
if not is_valid_submission(curr_dir_datetime, valid_start_datetime): | |
print('Submission is done before the valid submission period.', file=sys.stderr) | |
sys.exit(1) | |
late_penalty_pc = late_penalty_percent(due_datetime, curr_dir_datetime) | |
penalty = late_penalty(max_points, late_penalty_pc) | |
late_penalty_message(late_penalty_pc) | |
if penalty > 0: | |
print('Late penalty: {} point(s).'.format(penalty)) | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment