# schedule.py # # experimenting with manipulating and querying the schedule of courses import json, re, sys, os from datetime import datetime from fast_autocomplete import AutoComplete columns, rows = os.get_terminal_size() course_types = {'in-person':'IP','hybrid':'H','online':'O','online live':'OL'} def course_to_string(crs): if len(crs['teacher'].split()) == 3: crs['teacher'] = crs['teacher'].split()[0] + " " + crs['teacher'].split()[2] # crn type loc days start end cred num/cap code name teacher date lengths = [5, 3, 7, 5, 6, 6, 4, 9, 13, 35, 25,10] items = [ crs[x] for x in 'crn,type,loc,days,time_start,time_end,cred,act,cap,code,name,teacher,date'.split(',')] items[1] = course_types[ items[1] ] if items[2] in ["ONLINE", "ONLINE LIVE"]: items[2] = '' items[6] = items[6][0:3] items[7] = f"{items[7]}/{items[8]}" if int(crs['wl_act']) != 0: items[7] += f"+{crs['wl_act']}" items.pop(8) result = " ".join(f"{str(val):{width}}" for val, width in zip(items, lengths)) return result def parse_days(str_days): # return a list with actual day of week names days = [] if 'M' in str_days: days.append('monday') if 'T' in str_days: days.append('tuesday') if 'W' in str_days: days.append('wednesday') if 'R' in str_days: days.append('thursday') if 'F' in str_days: days.append('friday') if 'S' in str_days: days.append('saturday') return days def parse_courses(filename): with open(filename) as f: courses = json.load(f) depts, crns, codes, coursenames, locations, teachers, days, now = {}, {}, {}, {}, {}, {}, {}, datetime.now() weekdays = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'] for course in courses: #print(course) dept = course['code'].split()[0] depts.setdefault(dept, []).append(course) # Add course to teachers dict course['teacher'] = re.sub(r'\s+', ' ', course['teacher']) teachers.setdefault(course['teacher'], []).append(course) # add course to codes, crns, coursenames dict codes.setdefault(course['code'], []).append(course) crns.setdefault(course['crn'], []).append(course) coursenames.setdefault(course['name'], []).append(course) if course['type'] != 'in-person': continue # Add course to locations dict locations.setdefault(course['loc'], []).append(course) # Add course to days dict for day in parse_days(course['days']): days.setdefault(day, []).append(course) # Check if course is happening now if course['time_start'] == '': continue if course['time_end'] == '': continue start_time = datetime.strptime(course['time_start'], '%H:%M') end_time = datetime.strptime(course['time_end'], '%H:%M') #if start_time.time() <= now.time() <= end_time.time(): # print(f"{course['code']} is happening now in {course['loc']}") return depts,crns, codes, coursenames, locations, teachers, days def write_at(row, col, text): sys.stdout.write(f"\033[{row};{col}H{text}") sys.stdout.flush() def write_search_results(res,maximum=8): height = max(len(res),maximum) while len(res)