diff --git a/courses.py b/courses.py index 8583511..5c9e92b 100644 --- a/courses.py +++ b/courses.py @@ -524,6 +524,9 @@ def combined_name(nic,L): # string with prettier section numbers combined if len(L) < 2: return L[0] + return "/".join(L) + + # old method of trying to shorten section numbers if nic < 2: return "/".join(L) L_mod = [ x[nic:6] for x in L] @@ -531,14 +534,26 @@ def combined_name(nic,L): new_name = "/".join(L_mod) #print(nic, " ", L_mod) return new_name - +def all_equal2(iterator): + return len(set(iterator)) <= 1 + + +""" +180 2023 Fall +179 2023 Summer +178 2023 Spring +177 2023 Winter +""" def semester_cross_lister(): + sem = "fa23" + term = 180 + xlist_filename = f"cache/{sem}_crosslist.csv" checkfile = codecs.open('cache/xlist_check.html','w','utf-8') checkfile.write('\n') - current_term = '178' - xlistfile = codecs.open('cache/sp23_crosslist.csv','r','utf-8').readlines()[1:] + current_term = 179 + xlistfile = codecs.open(xlist_filename,'r','utf-8').readlines()[1:] by_section = {} by_group = defaultdict( list ) crn_to_canvasid = {} @@ -546,11 +561,7 @@ def semester_cross_lister(): crn_to_canvascode = {} get_fresh = 0 - if get_fresh: - c = getCoursesInTerm(178,0,0) # sp23 - codecs.open('cache/courses_in_term_178.json','w','utf-8').write(json.dumps(c,indent=2)) - else: - c = json.loads( codecs.open('cache/courses_in_term_178.json','r','utf-8').read() ) + c = getCoursesInTerm(term,get_fresh,0) for C in c: if 'sis_course_id' in C and C['sis_course_id']: @@ -560,9 +571,9 @@ def semester_cross_lister(): # "Term","PrtTerm","xlstGroup","Subject","CrseNo","EffectCrseTitle","CRN","Session","SecSchdType","AttnMeth","MtgSchdType","MtgType","MaxEnroll","TotalEnroll","SeatsAvail","Bldg","Room","Units","LecHrs","LabHrs","HrsPerDay","HrsPerWk","TotalHrs","Days","D/E","Wks","BegTime","EndTime","StartDate","EndDate","LastName","FirstName","PercentResp" for xc in xlistfile: parts = xc.split(r',') - course = parts[3] + " " + parts[4] - group = parts[2] - crn = parts[6] + course = parts[2] + " " + parts[3] + group = parts[1] + crn = parts[5] if crn in crn_to_canvasid: cid = crn_to_canvasid[crn] @@ -590,15 +601,26 @@ def semester_cross_lister(): sects.sort() nic = numbers_in_common(sects) new_sec = combined_name(nic,sects) - new_name = by_group[y][0][4][0:-5] + new_sec - new_code = by_group[y][0][5][0:-5] + new_sec + + # same dept? + depts_list = [ z[1].split(' ')[0] for z in by_group[y] ] + nums_list = list(set([ z[1].split(' ')[1] for z in by_group[y] ])) + if all_equal2(depts_list): + depts = depts_list[0] + nums = '/'.join(nums_list) + else: + depts = list(set(depts_list)) + nums = by_group[y][0][1].split(' ')[1] + + new_name = depts + nums + " " + ' '.join(by_group[y][0][4].split(' ')[1:-1]) + " " + new_sec + #new_name = by_group[y][0][4][0:-5] + new_sec + new_code = depts + nums + " " + new_sec + #new_code = by_group[y][0][5][0:-5] + new_sec print(y) print("\t", sects) #print("\tThey share %i leading numbers" % nic) print("\t", by_group[y]) - print("\t", new_name) - print() - + host_id = by_group[y][0][3] sections = by_group[y][1:] @@ -609,6 +631,7 @@ def semester_cross_lister(): def xlist_ii(parasite_id,host_id,new_name,new_code): print("Parasite id: ",parasite_id," Host id: ", host_id) print("New name: ", new_name) + print("New code: ", new_code) xyz = input("Perform cross list? Enter for yes, n for no: ") if xyz != 'n': uu = url + '/api/v1/courses/%s/sections' % parasite_id @@ -1250,7 +1273,70 @@ def remove_n_analytics(section=0): print(" " + r3.text) time.sleep(0.300) """ + + + +def xlist_cwe(): + + # cwe190 and wtrm290 get put into 1 shell + + # cwe192 get put into another shell + + + this_sem_190_id = 17549 # they get 190s and 290s + this_sem_192_id = 17154 # they get 192s + this_sem_term = 180 # fa23 + get_fresh = 0 + sem_courses = getCoursesInTerm(this_sem_term, get_fresh, 0) + + for search_string in ['CWE190','WTRM290']: + for R in sem_courses: + try: + if re.search(search_string, R['name']) and str(R['id']) != str(this_sem_190_id): + + # use the course to get the section id + print ( R['name'] ) + u = url + '/api/v1/courses/%i/sections' % R['id'] + for S in fetch(u): + if (S['id']): + myanswer = input( "-> Should I crosslist: %i\t%s\tsection id: %i (y/n) " % (R['id'],R['name'],S['id'] )) + if myanswer=='y': + # cross list + v = url + "/api/v1/sections/%i/crosslist/%i" % (S['id'],this_sem_190_id) + res = requests.post(v, headers = header) + print( json.dumps( json.loads(res.text), indent=2) ) + + print() + except Exception as e: + print( "Caused a problem: " + str(e) + "\n" + str(R) + "\n" ) + + ## Now the 192s + search_string = "CWE192" + for R in sem_courses: + try: + if re.search(search_string, R['name']) and str(R['id']) != str(this_sem_192_id): + + # use the course to get the section id + print ( R['name'] ) + u = url + '/api/v1/courses/%i/sections' % R['id'] + for S in fetch(u): + if (S['id']): + myanswer = input( "-> Should I crosslist: %i\t%s\tsection id: %i (y/n) " % (R['id'],R['name'],S['id'] )) + if myanswer=='y': + # cross list + v = url + "/api/v1/sections/%i/crosslist/%i" % (S['id'],this_sem_192_id) + res = requests.post(v, headers = header) + print( json.dumps( json.loads(res.text), indent=2) ) + + print() + except Exception as e: + print( "Caused a problem: " + str(e) + "\n" + str(R) + "\n" ) + + + + + def create_sandboxes(): @@ -1304,6 +1390,11 @@ def set_ext_tools(): s = json.loads(requests.put(r, headers=header, params=data).text) print(json.dumps(s,indent=2)) +def quick_sem_course_list(term=180): + c = getCoursesInTerm(term,1,0) + c = sorted(c, key=lambda k: k['name']) + for C in c: + print(C['name']) if __name__ == "__main__": options = { 1: ['Cross check schedule with ztc responses',make_ztc_list] , @@ -1335,7 +1426,8 @@ if __name__ == "__main__": 27: ['Fine tune term dates and winter session', course_dates_terms], 28: ['Cross list a semester from file', semester_cross_lister], 29: ['Check all courses & their sections in semester', all_semester_course_sanity_check], - #30: ['List latestart classes', list_latestarts ], + 30: ['Quick course list', quick_sem_course_list ], + 31: ['Cross list CWE courses', xlist_cwe], # TODO wanted: group shell for each GP (guided pathway) as a basic student services gateway.... # } diff --git a/tasks.py b/tasks.py index 3b6e07a..89b0f34 100644 --- a/tasks.py +++ b/tasks.py @@ -620,55 +620,6 @@ def hours_calc_pulldata(course_id=''): -def xlist_cwe(): - this_sem_190_id = 15464 # they get 190s and 290s - this_sem_192_id = 15318 # they get 192s - - - this_sem_guid558 = 7592 - - #search_string = "290" - search_string = "192" - #search_string = "190" - the_course_id =this_sem_192_id # this_sem_190_id - - this_sem_term = 176 # fa22 - - sem_cache_fn = 'cache/semester_courses_%s.json' % this_sem_term - docache = input("Use cache courses? (n = fetch fresh list) y/n: ") - - # get all courses this semester. Filter to ___ sections - if docache != 'y': - t = url + \ - '/api/v1/accounts/1/courses?enrollment_term_id=%i&perpage=100' % this_sem_term - sem_courses = fetch(t,1) - out_file = codecs.open(sem_cache_fn, 'w', 'utf-8') - out_file.write( json.dumps(sem_courses,indent=2) ) - out_file.close() - else: - sem_courses = json.loads(codecs.open(sem_cache_fn,'r','utf-8').read()) - - for R in sem_courses: - try: - if re.search(search_string, R['name']) and str(R['id']) != str(the_course_id): - - # use the course to get the section id - print ( R['name'] ) - u = url + '/api/v1/courses/%i/sections' % R['id'] - for S in fetch(u): - if (S['id']): - myanswer = input( "-> Should I crosslist: %i\t%s\tsection id: %i (y/n) " % (R['id'],R['name'],S['id'] )) - if myanswer=='y': - # cross list - v = url + "/api/v1/sections/%i/crosslist/%i" % (S['id'],the_course_id) - res = requests.post(v, headers = header) - print( json.dumps( json.loads(res.text), indent=2) ) - - print() - except Exception as e: - print( "Caused a problem: " + str(e) + "\n" + str(R) + "\n" ) - - @@ -1360,7 +1311,6 @@ if __name__ == "__main__": options = { 1: ['Print answers to a single survey question',survey_answer] , 2: ['Collate survey answers',survey_organize] , - 3: ['X list CWE classes',xlist_cwe] , 4: ['parse committees survey',cmtes] , 5: ['job titles',job_titles] , 6: ['fetch calendar events to conf_sessions db',cal] ,