diff --git a/courses.py b/courses.py index 3b7f3db..bf58036 100644 --- a/courses.py +++ b/courses.py @@ -380,7 +380,7 @@ from localcache2 import student_count, teacher_list, course_from_id, course_sche # Relevant stuff trying to see if its even being used or not def course_term_summary(term="184",term_label="FA24"): print("Summary of %s" % term_label) - get_fresh = 0 + get_fresh = 1 courses = getCoursesInTerm(term, get_fresh, 0) print("output to cache/term_summary.txt") @@ -2277,9 +2277,19 @@ def try_clustering(df): return kmeans +def unpublish_a_course(course_id=0): + if course_id == 0: + course_id = input('course id? ') + u = url + f"/api/v1/courses/{course_id}" + data = { 'course[event]':'claim' } + r = requests.put(u, data=data, headers=header) + print(r.text) + + if __name__ == "__main__": options = { 1: ['Cross check schedule with ztc responses',make_ztc_list] , 2: ['Add announcements to homepage', change_course_ann_homepage], + 3: ['Unpublish a course', unpublish_a_course], 4: ['List students who passed quiz X', get_quiz_passers], 5: ['List the terms', getTerms], 7: ['Show courses in a term', getCoursesInTerm], diff --git a/schedules.py b/schedules.py index 05b4bdb..317cffd 100644 --- a/schedules.py +++ b/schedules.py @@ -11,11 +11,18 @@ columns, rows = os.get_terminal_size() course_types = {'in-person':'IP','hybrid':'H','online':'O','online live':'OL'} def course_to_string(crs): - # crn type days start end cred code name teacher - lengths = [5, 3, 5, 6, 6, 4, 4, 13, 35, 25] - items = [ crs[x] for x in 'crn,type,days,time_start,time_end,cred,act,code,name,teacher'.split(',')] + + 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] ] - items[5] = items[5][0:3] + 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 @@ -41,16 +48,24 @@ def parse_courses(filename): with open(filename) as f: courses = json.load(f) - locations, teachers, days, now = {}, {}, {}, datetime.now() + 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) @@ -67,7 +82,7 @@ def parse_courses(filename): #if start_time.time() <= now.time() <= end_time.time(): # print(f"{course['code']} is happening now in {course['loc']}") - return locations, teachers, days + return depts,crns, codes, coursenames, locations, teachers, days def write_at(row, col, text): sys.stdout.write(f"\033[{row};{col}H{text}") @@ -108,7 +123,7 @@ if examples: -def interactive(): +def interactive(allkeys): import sys def getch(): @@ -129,7 +144,7 @@ def interactive(): import msvcrt return msvcrt.getch().decode('utf-8') - words = { x:{} for x in teacherkeys.keys() } + words = { x:{} for x in allkeys.keys() } autocomplete = AutoComplete(words=words) @@ -143,6 +158,7 @@ def interactive(): if char == '\x08': query = query[:-1] elif char == '\r': + if query == 'quit': return False break else: query += char @@ -153,23 +169,37 @@ def interactive(): write_cleared_search_results() print() print() - if results[0] in teacherkeys: - teacher = teacherkeys[results[0]] - if teacher in teachers.keys(): - print(f"\nWeekly schedule for {teacher}:") - for course in teachers[teacher]: - print(" " + course_to_string(course)) - else: - print("wasn't found.") - -# Read in schedule -locations, teachers, days = parse_courses('cache/sample_semester.json') -teacherkeys = { x.lower():x for x in teachers.keys() } + for (keyset,dataset) in [(deptkeys,depts),(teacherkeys,teachers), (locationkeys,locations),(coursenameskeys,coursenames),(codeskeys,codes),(crnskeys,crns)]: + if results[0] in keyset: + real_key = keyset[results[0]] + if real_key in dataset.keys(): + print(f"\nWeekly schedule for {real_key}:") + for course in dataset[real_key]: + print(" " + course_to_string(course)) -lname_first = [x.split() for x in teachers.keys() ] -d_lnf = { x[-1].lower() + ", " + ' '.join(x[:-1]).lower(): ' '.join(x) for x in lname_first } -teacherkeys.update(d_lnf) -print(json.dumps(teacherkeys, indent=2)) -print("\nEnter your answer") -interactive() +while True: + # Read in schedule + depts, crns, codes, coursenames, locations, teachers, days = parse_courses('cache/sample_semester.json') + + deptkeys = { x.lower():x for x in depts.keys() } + teacherkeys = { x.lower():x for x in teachers.keys() } + locationkeys = { x.lower():x for x in locations.keys() } + coursenameskeys = { x.lower():x for x in coursenames.keys() } + codeskeys = { x.lower():x for x in codes.keys() } + crnskeys = { x.lower():x for x in crns.keys() } + + lname_first = [x.split() for x in teachers.keys() ] + d_lnf = { x[-1].lower() + ", " + ' '.join(x[:-1]).lower(): ' '.join(x) for x in lname_first } + teacherkeys.update(d_lnf) + + allkeys = {} + allkeys.update(deptkeys) + allkeys.update(teacherkeys) + allkeys.update(locationkeys) + allkeys.update(coursenameskeys) + allkeys.update(codeskeys) + allkeys.update(crnskeys) + + print("\nEnter your query or 'quit': ") + if interactive(allkeys) == False: break