417 lines
10 KiB
Python
417 lines
10 KiB
Python
# Try to gather all the different formats and ways of labeling a semester, along with their associated dates.
|
|
|
|
import json, funcy, re, sys
|
|
|
|
# sem_to_short = { 'Summer 2021': 'su21', 'Fall 2021':'fa21', 'Winter 2022':'wi22', 'Spring 2022':'sp22', 'Summer 2022':'su22', 'Fall 2022':'fa22' }
|
|
|
|
season_to_number = { 'Fall': '70', 'Summer': '50', 'Spring': '30', 'Winter': '10'}
|
|
|
|
# Inverse
|
|
number_to_season = {v: k for k, v in season_to_number.items()}
|
|
|
|
s_to_n = {'sp':'30','su':'50','fa':'70'}
|
|
season_to_short = {
|
|
'Summer': 'su',
|
|
'Fall': 'fa',
|
|
'Winter': 'wi',
|
|
'Spring': 'sp'
|
|
}
|
|
|
|
|
|
# Given 'fa22' return 202270
|
|
def short_to_sis(s):
|
|
season = s[0:2]
|
|
return "20" + s[2:5] + s_to_n[season]
|
|
|
|
|
|
|
|
# go from sp20 to 2020spring
|
|
def short_to_long(s):
|
|
parts = re.search(r'(\w\w)(\d\d)', s)
|
|
yr = parts.group(2)
|
|
season = parts.group(1)
|
|
seasons = {'sp':'spring','su':'summer','fa':'fall','wi':'winter'}
|
|
return '20'+yr+seasons[season]
|
|
|
|
# from "Summer 2024" to 202450
|
|
def human_to_sis(semester):
|
|
try:
|
|
# Split the semester into its components
|
|
parts = semester.split()
|
|
|
|
# Extract the season and year
|
|
season = parts[0]
|
|
year = parts[1]
|
|
|
|
# Generate the code in the format "YYYYSS"
|
|
return f"{year}{season_to_number[season]}"
|
|
except Exception as e:
|
|
print(f"Couldn't parse semester: {semester}'")
|
|
return ''
|
|
|
|
# from 202450 to "Summer 2024"
|
|
def sis_to_human(sis_code):
|
|
try:
|
|
# Extract the year and season code
|
|
year = sis_code[:4]
|
|
season_code = sis_code[4:]
|
|
|
|
# Convert season code back to season name
|
|
season = number_to_season.get(season_code, "Unknown")
|
|
|
|
return f"{season} {year}"
|
|
except Exception as e:
|
|
print(f"Couldn't parse SIS code: {sis_code}")
|
|
return ''
|
|
|
|
# from "Summer 2024" to su24
|
|
def human_to_short(semester):
|
|
# Split the semester into its components
|
|
parts = semester.split()
|
|
|
|
# Extract the season and year
|
|
season = parts[0]
|
|
year = parts[1][2:] # Take the last two digits of the year
|
|
|
|
# Generate the short form
|
|
return f"{season_to_short[season]}{year}"
|
|
|
|
# given human readable form (Spring 2023) return that of the previous semester. Excluding winter.
|
|
def get_previous_season(season_year_str):
|
|
season_order = {"Spring": "Fall", "Summer": "Spring", "Fall": "Summer"}
|
|
|
|
try:
|
|
season, year = season_year_str.split()
|
|
year = int(year)
|
|
|
|
if season not in season_order or not (2000 <= year <= 2030):
|
|
raise ValueError("Invalid season or year")
|
|
|
|
previous_season = season_order[season]
|
|
|
|
# Decrement the year if transitioning from Spring to Fall
|
|
if season == "Spring":
|
|
year -= 1
|
|
|
|
return f"{previous_season} {year}"
|
|
|
|
except Exception as e:
|
|
return f"Error: {e}"
|
|
|
|
standard = ['Fall 2026', 'Summer 2026', 'Spring 2026', 'Winter 2026',
|
|
'Fall 2025', 'Summer 2025', 'Spring 2025', 'Winter 2025',
|
|
'Fall 2024', 'Summer 2024', 'Spring 2024', 'Winter 2024',
|
|
'Fall 2023', 'Summer 2023', 'Spring 2023', 'Winter 2023',
|
|
'Fall 2022', 'Summer 2022', 'Spring 2022', 'Winter 2022',
|
|
'Fall 2021', 'Summer 2021', 'Spring 2021',
|
|
'Fall 2020', 'Summer 2020', 'Spring 2020', 'Winter 2020',
|
|
'Fall 2019', 'Summer 2019', 'Spring 2019', 'Winter 2019',
|
|
'Fall 2018', 'Summer 2018', 'Spring 2018',
|
|
'Fall 2017', 'Summer 2017', 'Spring 2017', ]
|
|
|
|
code = 'fa26,su26,sp26,wi26,fa25,su25,sp25,wi25,fa24,su24,sp24,wi24,fa23,su23,sp23,wi23,fa22,su22,sp22,wi22,fa21,su21,sp21,fa20,su20,sp20,wi20,fa19,su19,sp19,wi19,fa18,su18,sp18,fa17,su17,sp17'.split(',')
|
|
|
|
begin = ['08/25','05/22','01/26','01/01', # not sure on fa26
|
|
'08/25','05/27','01/27','01/02',
|
|
'08/26','06/10','01/29','01/02',
|
|
'08/28','06/12','01/30','01/03',
|
|
'08/22','06/13','01/31','01/04',
|
|
'08/23','06/14','02/01',
|
|
'08/24','06/15','01/27','01/02',
|
|
'08/26','06/17','01/28','01/02',
|
|
'08/27','06/18','01/29',
|
|
'08/28','06/19','01/30']
|
|
|
|
canvas_label = []
|
|
|
|
sems_by_human_name = {}
|
|
|
|
for s in list(zip(standard,code,begin)):
|
|
season,year = s[0].split(' ')
|
|
cl = year + " " + season
|
|
sem_record = {'name': s[0], 'code': s[1], 'start': s[2] + '/' + s[1][-2:], 'number': year + season_to_number[s[0].split(' ')[0]]}
|
|
sems_by_human_name[s[0]] = sem_record
|
|
sems_by_human_name[s[1]] = sem_record
|
|
canvas_label.append(cl)
|
|
sems_by_human_name[cl] = sem_record
|
|
|
|
sems_by_short_name = funcy.project(sems_by_human_name, code)
|
|
|
|
|
|
def dump():
|
|
print("BY HUMAN READABLE NAME")
|
|
print(json.dumps(sems_by_human_name,indent=2))
|
|
|
|
print("\n\nBY SEM SHORTCODE")
|
|
print(json.dumps(sems_by_short_name,indent=2))
|
|
|
|
|
|
|
|
|
|
|
|
def weeks_from_date():
|
|
from datetime import datetime, timedelta
|
|
|
|
weeks = int( input("how many weeks ahead? "))
|
|
|
|
# Replace this with your starting date
|
|
x = datetime.strptime("2025-05-27", "%Y-%m-%d")
|
|
|
|
# Add six weeks
|
|
six_weeks_later = x + timedelta(weeks=weeks)
|
|
|
|
print("Six weeks later:", six_weeks_later.strftime("%Y-%m-%d"))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print ('')
|
|
options = { 1: ['print semester info',dump] ,
|
|
2: ['compute x weeks from date', weeks_from_date ],
|
|
}
|
|
|
|
|
|
if len(sys.argv) > 1 and re.search(r'^\d+',sys.argv[1]):
|
|
resp = int(sys.argv[1])
|
|
print("\n\nPerforming: %s\n\n" % options[resp][0])
|
|
|
|
else:
|
|
print ('')
|
|
for key in options:
|
|
print(str(key) + '.\t' + options[key][0])
|
|
|
|
print('')
|
|
resp = input('Choose: ')
|
|
|
|
# Call the function in the options dict
|
|
options[ int(resp)][1]()
|
|
|
|
"""
|
|
|
|
semester_list = {
|
|
"Fall 2022": {
|
|
"name": "Fall 2022",
|
|
"code": "fa22",
|
|
"start": "08/22/22"
|
|
},
|
|
"fa22": {
|
|
"name": "Fall 2022",
|
|
"code": "fa22",
|
|
"start": "08/22/22"
|
|
},
|
|
"2022 Fall": {
|
|
"name": "Fall 2022",
|
|
"code": "fa22",
|
|
"start": "08/22/22"
|
|
},
|
|
"Summer 2022": {
|
|
"name": "Summer 2022",
|
|
"code": "su22",
|
|
"start": "06/13/22"
|
|
},
|
|
"su22": {
|
|
"name": "Summer 2022",
|
|
"code": "su22",
|
|
"start": "06/13/22"
|
|
},
|
|
"2022 Summer": {
|
|
"name": "Summer 2022",
|
|
"code": "su22",
|
|
"start": "06/13/22"
|
|
},
|
|
"Spring 2022": {
|
|
"name": "Spring 2022",
|
|
"code": "sp22",
|
|
"start": "01/31/22"
|
|
},
|
|
"sp22": {
|
|
"name": "Spring 2022",
|
|
"code": "sp22",
|
|
"start": "01/31/22"
|
|
},
|
|
"2022 Spring": {
|
|
"name": "Spring 2022",
|
|
"code": "sp22",
|
|
"start": "01/31/22"
|
|
},
|
|
"Fall 2021": {
|
|
"name": "Fall 2021",
|
|
"code": "fa21",
|
|
"start": "08/23/21"
|
|
},
|
|
"fa21": {
|
|
"name": "Fall 2021",
|
|
"code": "fa21",
|
|
"start": "08/23/21"
|
|
},
|
|
"2021 Fall": {
|
|
"name": "Fall 2021",
|
|
"code": "fa21",
|
|
"start": "08/23/21"
|
|
},
|
|
"Summer 2021": {
|
|
"name": "Summer 2021",
|
|
"code": "su21",
|
|
"start": "06/14/21"
|
|
},
|
|
"su21": {
|
|
"name": "Summer 2021",
|
|
"code": "su21",
|
|
"start": "06/14/21"
|
|
},
|
|
"2021 Summer": {
|
|
"name": "Summer 2021",
|
|
"code": "su21",
|
|
"start": "06/14/21"
|
|
},
|
|
"Spring 2021": {
|
|
"name": "Spring 2021",
|
|
"code": "sp21",
|
|
"start": "02/01/21"
|
|
},
|
|
"sp21": {
|
|
"name": "Spring 2021",
|
|
"code": "sp21",
|
|
"start": "02/01/21"
|
|
},
|
|
"2021 Spring": {
|
|
"name": "Spring 2021",
|
|
"code": "sp21",
|
|
"start": "02/01/21"
|
|
},
|
|
"Fall 2020": {
|
|
"name": "Fall 2020",
|
|
"code": "fa20",
|
|
"start": "08/24/20"
|
|
},
|
|
"fa20": {
|
|
"name": "Fall 2020",
|
|
"code": "fa20",
|
|
"start": "08/24/20"
|
|
},
|
|
"2020 Fall": {
|
|
"name": "Fall 2020",
|
|
"code": "fa20",
|
|
"start": "08/24/20"
|
|
},
|
|
"Summer 2020": {
|
|
"name": "Summer 2020",
|
|
"code": "su20",
|
|
"start": "06/15/20"
|
|
},
|
|
"su20": {
|
|
"name": "Summer 2020",
|
|
"code": "su20",
|
|
"start": "06/15/20"
|
|
},
|
|
"2020 Summer": {
|
|
"name": "Summer 2020",
|
|
"code": "su20",
|
|
"start": "06/15/20"
|
|
},
|
|
"Spring 2020": {
|
|
"name": "Spring 2020",
|
|
"code": "sp20",
|
|
"start": "01/27/20"
|
|
},
|
|
"sp20": {
|
|
"name": "Spring 2020",
|
|
"code": "sp20",
|
|
"start": "01/27/20"
|
|
},
|
|
"2020 Spring": {
|
|
"name": "Spring 2020",
|
|
"code": "sp20",
|
|
"start": "01/27/20"
|
|
},
|
|
"Fall 2019": {
|
|
"name": "Fall 2019",
|
|
"code": "fa19",
|
|
"start": "08/26/19"
|
|
},
|
|
"fa19": {
|
|
"name": "Fall 2019",
|
|
"code": "fa19",
|
|
"start": "08/26/19"
|
|
},
|
|
"2019 Fall": {
|
|
"name": "Fall 2019",
|
|
"code": "fa19",
|
|
"start": "08/26/19"
|
|
},
|
|
"Summer 2019": {
|
|
"name": "Summer 2019",
|
|
"code": "su19",
|
|
"start": "06/17/19"
|
|
},
|
|
"su19": {
|
|
"name": "Summer 2019",
|
|
"code": "su19",
|
|
"start": "06/17/19"
|
|
},
|
|
"2019 Summer": {
|
|
"name": "Summer 2019",
|
|
"code": "su19",
|
|
"start": "06/17/19"
|
|
},
|
|
"Spring 2019": {
|
|
"name": "Spring 2019",
|
|
"code": "sp19",
|
|
"start": "01/28/19"
|
|
},
|
|
"sp19": {
|
|
"name": "Spring 2019",
|
|
"code": "sp19",
|
|
"start": "01/28/19"
|
|
},
|
|
"2019 Spring": {
|
|
"name": "Spring 2019",
|
|
"code": "sp19",
|
|
"start": "01/28/19"
|
|
},
|
|
"Fall 2018": {
|
|
"name": "Fall 2018",
|
|
"code": "fa18",
|
|
"start": "08/27/18"
|
|
},
|
|
"fa18": {
|
|
"name": "Fall 2018",
|
|
"code": "fa18",
|
|
"start": "08/27/18"
|
|
},
|
|
"2018 Fall": {
|
|
"name": "Fall 2018",
|
|
"code": "fa18",
|
|
"start": "08/27/18"
|
|
},
|
|
"Summer 2018": {
|
|
"name": "Summer 2018",
|
|
"code": "su18",
|
|
"start": "06/18/18"
|
|
},
|
|
"su18": {
|
|
"name": "Summer 2018",
|
|
"code": "su18",
|
|
"start": "06/18/18"
|
|
},
|
|
"2018 Summer": {
|
|
"name": "Summer 2018",
|
|
"code": "su18",
|
|
"start": "06/18/18"
|
|
},
|
|
"Spring 2018": {
|
|
"name": "Spring 2018",
|
|
"code": "sp18",
|
|
"start": "01/29/18"
|
|
},
|
|
"sp18": {
|
|
"name": "Spring 2018",
|
|
"code": "sp18",
|
|
"start": "01/29/18"
|
|
},
|
|
"2018 Spring": {
|
|
"name": "Spring 2018",
|
|
"code": "sp18",
|
|
"start": "01/29/18"
|
|
}
|
|
}
|
|
""" |