Skip to content

Instantly share code, notes, and snippets.

@samiyuru
Last active September 13, 2022 19:07
Show Gist options
  • Save samiyuru/20552ebb9d8773e461d2890f387a954f to your computer and use it in GitHub Desktop.
Save samiyuru/20552ebb9d8773e461d2890f387a954f to your computer and use it in GitHub Desktop.
Odin Late Penalty.
#!/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