def main(argv): target_url = '' COMMAND = '' ALL = False AUTH = False DATASOURCE = False TERM = False COURSE = False USER = False MEMBERSHIP = False CLEANUP = False datasource_PK1 = None datasource_session = None usageStr = "\nrestdemo.py -t|--target <target root URL> -c|--command <command>\n" usageStr += "e.g restdemo.py -t www.myschool.edu -c create_course\n" usageStr += "command: <command>_<object> where <command> is one of the following:\n" usageStr += "\tcreate, read, read_all_, read_all_course_memberships, read_all_user_memberships, update, delete\n" usageStr += "and <object> is one of the following:\n" usageStr += "\tdatasource, term, course, user\n" usageStr += "-t is required; No -c args will run demo in predetermined order.\n" usageStr += "'-c authorize' demomonstrates the authorization process and does not create objects." usageStr += "-c commands require a valid datasource PK1 - \n" usageStr += "\ta datasource get will be run in these cases, defaulting to create\n" usageStr += "\tif the demo datasource does not exist." if len(sys.argv) > 1: #there are command line arguments try: opts, args = getopt.getopt(argv, "ht:c:", ["target=", "command="]) except getopt.GetoptError: print(usageStr) sys.exit(2) for opt, arg in opts: if opt == '-h': print(usageStr) sys.exit() elif opt == '-d': print("Deleting at end of run.") CLEANUP = True elif opt in ("-t", "--target"): target_url = arg.lstrip() elif opt in ("-c", "--command"): COMMAND = arg else: COMMAND = "Run All" print('[main] Target is:', target_url) print('[main] Command is:', COMMAND) else: print(usageStr) sys.exit(2) #Set up some booleans for processing flags and order of processing if "course" in COMMAND: print("[main] Run course command") COURSE = True elif "membership" in COMMAND: print("[main] Run membership command") MEMBERSHIP = True elif "user" in COMMAND: print("[main] Run user command") USER = True elif "term" in COMMAND: print("[main] Run term command") TERM = True elif "datasource" in COMMAND: print("[main] Run datasource command") DATASOURCE = True elif "authorize" in COMMAND: print("[main] Run authorization command") AUTH = True else: print("[main] Empty Command: Run All\n") ALL = True print('\n[main] Acquiring auth token...\n') authorized_session = AuthToken(target_url) authorized_session.setToken() print('\n[main] Returned token: ' + authorized_session.getToken() + '\n') if not AUTH: #run commands in required order if running ALL if DATASOURCE or ALL: #process Datasource command print("\n[main] Run datasource command: " + ('ALL' if ALL else COMMAND) + '...') datasource_session = DataSource(target_url, authorized_session.getToken()) if 'datasource' in COMMAND: datasource_session.execute(COMMAND, authorized_session.getToken()) else: if not datasource_PK1 or datasource_PK1 is None: datasource_session.createDataSource( authorized_session.getToken()) datasource_session.getDataSource( authorized_session.getToken()) datasource_session.getDataSources( authorized_session.getToken()) datasource_session.updateDataSource( authorized_session.getToken()) if TERM or ALL: term_session = Term(target_url, authorized_session.getToken()) #process term command print("\n[main] Run term command: " + ('ALL' if ALL else COMMAND) + '...') if 'term' in COMMAND: if (('delete' in COMMAND) or ('read' in COMMAND)): print( "[main] Deleting or getting does not require a datasource." ) else: if not datasource_PK1: print("[main] confirm datasource.") datasource_session = DataSource( target_url, authorized_session.getToken()) datasource_session.checkDataSource( authorized_session.getToken()) term_session.execute(COMMAND, "externalId:" + TERMEXTERNALID, authorized_session.getToken()) else: term_session.getTerms(authorized_session.getToken()) term_session.createTerm("externalId:" + DSKEXTERNALID, authorized_session.getToken()) term_session.getTerm(authorized_session.getToken()) term_session.updateTerm("externalId:" + DSKEXTERNALID, authorized_session.getToken()) if COURSE or ALL: course_session = Course(target_url, authorized_session.getToken()) #process course command print("\n[main] Run course command: " + ('ALL' if ALL else COMMAND) + '...') if 'course' in COMMAND: if (('delete' in COMMAND) or ('read' in COMMAND)): print( "[main] Deleting or getting does not require a datasource." ) else: if not datasource_PK1: print("[main] confirm datasource.") datasource_session = DataSource( target_url, authorized_session.getToken()) datasource_session.checkDataSource( authorized_session.getToken()) course_session.execute(COMMAND, "externalId:" + DSKEXTERNALID, authorized_session.getToken()) else: course_session.getCourses(authorized_session.getToken()) course_session.createCourse("externalId:" + DSKEXTERNALID, authorized_session.getToken()) course_session.getCourse(authorized_session.getToken()) course_session.updateCourse("externalId:" + DSKEXTERNALID, authorized_session.getToken()) if USER or ALL: user_session = User(target_url, authorized_session.getToken()) #process user command print("\n[main] Run user command: " + ('ALL' if ALL else COMMAND) + '...') if 'user' in COMMAND: if (('delete' in COMMAND) or ('read' in COMMAND)): print( "[main] Deleting or getting does not require a datasource." ) else: if not datasource_PK1: print("[main] confirm datasource.") datasource_session = DataSource( target_url, authorized_session.getToken()) datasource_session.checkDataSource( authorized_session.getToken()) user_session.execute(COMMAND, "externalId:" + DSKEXTERNALID, authorized_session.getToken()) else: user_session.getUsers(authorized_session.getToken()) user_session.createUser("externalId:" + DSKEXTERNALID, authorized_session.getToken()) user_session.getUser(authorized_session.getToken()) user_session.updateUser("externalId:" + DSKEXTERNALID, authorized_session.getToken()) if MEMBERSHIP or ALL: membership_session = Membership(target_url, authorized_session.getToken()) #process membership command print("\n[main] Run membership command: " + ('ALL' if ALL else COMMAND) + '...') if 'membership' in COMMAND: if (('delete' in COMMAND) or ('read' in COMMAND)): print( "[main] Deleting or getting does not require a datasource." ) else: if not datasource_PK1: print("[main] confirm datasource.") datasource_session = DataSource( target_url, authorized_session.getToken()) datasource_session.checkDataSource( authorized_session.getToken()) membership_session.execute(COMMAND, "externalId:" + DSKEXTERNALID, authorized_session.getToken()) else: membership_session.getCourseMemberships( authorized_session.getToken()) membership_session.createMembership( "externalId:" + DSKEXTERNALID, authorized_session.getToken()) membership_session.getUserMemberships( authorized_session.getToken()) membership_session.updateMembership( "externalId:" + DSKEXTERNALID, authorized_session.getToken()) membership_session.readUserMemberships( authorized_session.getToken()) #clean up if not using individual commands if ALL: print('\n[main] Completing Demo and deleting created objects...') print("[main] Deleting membership") membership_session.deleteMembership(authorized_session.getToken()) print("[main] Deleting Course") user_session.deleteUser(authorized_session.getToken()) print("[main] Deleting Course") course_session.deleteCourse(authorized_session.getToken()) print("[main] Deleting Term") term_session.deleteTerm(authorized_session.getToken()) print("[main] Deleting DataSource") datasource_session.deleteDataSource(authorized_session.getToken()) else: print("\nRemember to delete created demo objects!") print("[main] Processing Complete")
def process_memberships(req_number_memberships, index, output_file, rest): # randomizing n memberships for n users into n courses can be tricky - # if you have a better way of doing this let me know - [email protected] print("PROCESSING MEMBERSHIPS...") indx = int(index) #starting index for courses and users memberships_count = 0 full = set() course_memberships = {} courses = set() users = set() courses_with_members = set() users_in_courses = set() #req_number is the required number of memberships - user entered or constant max of 1000 if int(req_number_memberships) == 1000: req_number_users = 150 req_number_courses = 100 else: req_number_users = req_number_memberships req_number_courses = req_number_memberships print("number memberships in: %d" % req_number_memberships) print("number users in: %d" % req_number_users) print("number courses in: %d" % req_number_courses) #build membership lists for courses #create arrays containing memberships randomly associated with courses until #req_number_memberships is met. #Since membership count is the control: # all courses may not have memberships # all users may not have memberships while memberships_count < req_number_memberships: user_set = set() userID = USEREXTERNALIDSTEM + "_" + str( random.randint(int(index), int(index) + int(req_number_users) - 1)) #print ("userID %d" % userID) courseID = COURSEEXTERNALIDSTEM + "_" + str( random.randint(int(index), int(index) + int(req_number_courses) - 1)) #print ("courseID %d" % courseID) if courseID in course_memberships and courseID not in full: user_set = set(course_memberships[courseID]) #print ("%s is not full - adding membership" % courseID) user_set.add(userID) course_memberships[courseID] = list(user_set) courses_with_members.add("%s_%s" % (COURSEEXTERNALIDSTEM, courseID)) users_in_courses.add("%s_%s" % (USEREXTERNALIDSTEM, userID)) memberships_count += 1 #check if full add to full set. if len(user_set) >= MAX_PER_COURSE_MEMBERSHIPS: #print ("%s is full." % courseID) full.add(courseID) #what courses did not get members? all_courses = [] for num in range(indx, indx + int(req_number_courses) - 1): all_courses.append("%s_%d" % (COURSEEXTERNALIDSTEM, num)) with open( output_file + "Courses_with_no_enrollments-" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S") + ".txt", "w") as text_file: text_file.write( "\n##### This file contains the list of courses not given enrollments #####\n" ) text_file.write(str(set(all_courses) - courses_with_members)) print("COURSES WITH NO ENROLLMENTS FILE WRITTEN") #what users did not get into courses? all_users = [] for num in range(indx, indx + int(req_number_users) - 1): all_users.append("%s_%d" % (USEREXTERNALIDSTEM, num)) #print (all_courses) with open( output_file + "Users_with_no_enrollments-" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S") + ".txt", "w") as text_file: text_file.write( "\n##### This file contains the list of users not enrolled in a course #####\n" ) text_file.write(str(set(all_users) - users_in_courses)) print("USERS WITH NO ENROLLMENTS FILE WRITTEN") #print (set(all_users) - users_in_courses) if rest: print( "WRITING DATA FILE and PROCESSING via REST, this will take a minute or so..." ) else: print("WRITING DATA FILE ONLY - you must process via SIS Framework...") with open( output_file + "_MEMBERSHIPS-" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S") + ".txt", "w") as text_file: text_file.write( "\n##### DELETE THIS LINE....THE FOLLOWING IS A MEMBERSHIP SNAPSHOT FLAT FILE FOR STORE OR DELETE #####\n" ) text_file.write("##### DELETE THIS LINE.... DATASOURCEKEY %s #####\n" % DSKEXTERNALID) text_file.write("EXTERNAL_COURSE_KEY|EXTERNAL_PERSON_KEY|ROLE\n") if rest: print( "WRITING DATA FILE and PROCESSING via REST, this will take a minute or so..." ) extId = "externalId:%s" % DSKEXTERNALID #same payload used for all membership requests json_payload = { "dataSourceId": extId, "availability": { "available": "Yes" }, "courseRoleId": "Student" } else: print( "WRITING DATA FILE ONLY - you must process via SIS Framework..." ) counter = 0 # take the above course_memberships dictionary, # iterate through the keys, # the values are the list of userIDs by index # write the snapshot file and # if REST send the request payload for key in course_memberships: courseID = key userID_list = course_memberships[key] for user in userID_list: text_file.write("%s|%s|Student\n" % (key, user)) if rest: global authorized_session membership_session = Membership( rest, authorized_session.getToken()) membership_session.createMembership( courseID, user, json.dumps(json_payload), authorized_session.getToken())
def main(argv): target_url = '' COMMAND = '' ALL = False AUTH = False DATASOURCE = False TERM = False COURSE = False USER = False MEMBERSHIP = False CLEANUP = False datasource_PK1 = None usageStr = "\nrestdemo.py -t|--target <target root URL> -c|--command <command>\n" usageStr += "e.g restdemo.py -t www.myschool.edu -c create_course\n" usageStr += "command: <command>_<object> where <command> is one of the following:\n" usageStr += "\tcreate, read, read_all, update, delete\n" usageStr += "and <object> is one of the following:\n" usageStr += "\tdatasource, term, course, user, membership\n" usageStr += "-t is required; No -c args will run demo in predetermined order.\n" usageStr += "'-c authorize' demomonstrates the authorization process and does not create objects." usageStr += "-c commands require a valid datasource PK1 - \n" usageStr += "\ta datasource get will be run in these cases, defaulting to create\n" usageStr += "\tif the demo datasource does not exist." if len(sys.argv) > 1: #there are command line arguments try: opts, args = getopt.getopt(argv,"ht:c:",["target=","command="]) except getopt.GetoptError: print (usageStr) sys.exit(2) for opt, arg in opts: if opt == '-h': print (usageStr) sys.exit() elif opt == '-d': print ("Deleting at end of run.") CLEANUP = True elif opt in ("-t", "--target"): target_url = arg.lstrip() elif opt in ("-c", "--command"): COMMAND = arg else: COMMAND = "Run All" print ('[main] Target is:', target_url) print ('[main] Command is:', COMMAND) else: print(usageStr) sys.exit(2) #Set up some booleans for processing flags and order of processing if "course" in COMMAND: print("[main] Run course command") COURSE = True elif "user" in COMMAND: print("[main] Run user command") USER = True elif "membership" in COMMAND: print("[main] Run membership command") MEMBERSHIP = True elif "term" in COMMAND: print("[main] Run term command") TERM = True elif "datasource" in COMMAND: print("[main] Run datasource command") DATASOURCE = True elif "authorize" in COMMAND: print("[main] Run authorization command") AUTH = True else: print("[main] Empty Command: Run All\n") ALL = True print ('\n[main] Acquiring auth token...\n') authorized_session = AuthToken(target_url) authorized_session.setToken() print ('\n[main] Returned token: ' + authorized_session.getToken() + '\n') if not AUTH: #run commands in required order if running ALL if DATASOURCE or ALL: #process Datasource command print("\n[main] Run datasource command: " + ('ALL' if ALL else COMMAND) + '...') datasource_session = DataSource(target_url, authorized_session.getToken()) if 'datasource' in COMMAND: datasource_session.execute(COMMAND, authorized_session.getToken()) else: #datasource_session.getDataSources(authorized_session.getToken()) datasource_session.createDataSource(authorized_session.getToken()) datasource_PK1 = datasource_session.datasource_PK1 print("[main] datasource_PK1: " + datasource_PK1) datasource_session.getDataSource(authorized_session.getToken()) datasource_session.updateDataSource(authorized_session.getToken()) if TERM or ALL: term_session = Term(target_url, authorized_session.getToken()) #process term command print("\n[main] Run term command: " + ('ALL' if ALL else COMMAND) + '...') if 'term' in COMMAND: if (('delete' in COMMAND) or ('read' in COMMAND)): print ("[main] Deleting or getting does not require a datasource.") else: print("[main] datasource_PK1: not known... searching...") datasource_session = DataSource(target_url, authorized_session.getToken()) datasource_session.getDataSource(authorized_session.getToken()) datasource_PK1 = datasource_session.datasource_PK1 print("[main] datasource_PK1: " + datasource_PK1) if (datasource_PK1 is None): print ("[main] data source not found, creating for demo...") datasource_session.createDataSource(authorized_session.getToken()) datasource_PK1 = datasource_session.datasource_PK1 term_session.execute(COMMAND, datasource_PK1, authorized_session.getToken()) else: #term_session.getTerms(authorized_session.getToken()) term_session.createTerm(datasource_PK1, authorized_session.getToken()) term_session.getTerm(authorized_session.getToken()) term_session.updateTerm(datasource_PK1, authorized_session.getToken()) if COURSE or ALL: course_session = Course(target_url, authorized_session.getToken()) #process course command print("\n[main] Run course command: " + ('ALL' if ALL else COMMAND) + '...') if 'course' in COMMAND: if (('delete' in COMMAND) or ('read' in COMMAND)): print ("[main] Deleting or getting does not require a datasource.") else: print("[main] datasource_PK1: not known... searching...") datasource_session = DataSource(target_url, authorized_session.getToken()) datasource_session.getDataSource(authorized_session.getToken()) datasource_PK1 = datasource_session.datasource_PK1 print("[main] datasource_PK1: " + datasource_PK1) if (datasource_PK1 is None): print ("[main] data source not found, creating for demo...") datasource_session.createDataSource(authorized_session.getToken()) datasource_PK1 = datasource_session.datasource_PK1 course_session.execute(COMMAND, datasource_PK1, authorized_session.getToken()) else: #course_session.getCourses(authorized_session.getToken()) course_session.createCourse(datasource_PK1, authorized_session.getToken()) course_session.getCourse(authorized_session.getToken()) course_session.updateCourse(datasource_PK1, authorized_session.getToken()) if USER or ALL: user_session = User(target_url, authorized_session.getToken()) #process user command print("\n[main] Run user command: " + ('ALL' if ALL else COMMAND) + '...') if 'user' in COMMAND: if (('delete' in COMMAND) or ('read' in COMMAND)): print ("[main] Deleting or getting does not require a datasource.") else: print("[main] datasource_PK1: not known... searching...") datasource_session = DataSource(target_url, authorized_session.getToken()) datasource_session.getDataSource(authorized_session.getToken()) datasource_PK1 = datasource_session.datasource_PK1 print("[main] datasource_PK1: " + datasource_PK1) if (datasource_PK1 is None): print ("[main] data source not found, creating for demo...") datasource_session.createDataSource(authorized_session.getToken()) datasource_PK1 = datasource_session.datasource_PK1 user_session.execute(COMMAND, datasource_PK1, authorized_session.getToken()) else: #user_session.getUsers(authorized_session.getToken()) user_session.createUser(datasource_PK1, authorized_session.getToken()) user_session.getUser(authorized_session.getToken()) user_session.updateUser(datasource_PK1, authorized_session.getToken()) if MEMBERSHIP or ALL: membership_session = Membership(target_url, authorized_session.getToken()) #process membership command print("\n[main] Run membership command: " + ('ALL' if ALL else COMMAND) + '...') if 'membership' in COMMAND: if (('delete' in COMMAND) or ('read' in COMMAND)): print ("[main] Deleting or getting does not require a datasource.") else: print("[main] datasource_PK1: not known... searching...") datasource_session = DataSource(target_url, authorized_session.getToken()) datasource_session.getDataSource(authorized_session.getToken()) datasource_PK1 = datasource_session.datasource_PK1 print("[main] datasource_PK1: " + datasource_PK1) if (datasource_PK1 is None): print ("[main] data source not found, creating for demo...") datasource_session.createDataSource(authorized_session.getToken()) datasource_PK1 = datasource_session.datasource_PK1 membership_session.execute(COMMAND, datasource_PK1, authorized_session.getToken()) else: #membership_session.getMemberships(authorized_session.getToken()) membership_session.createMembership(datasource_PK1, authorized_session.getToken()) membership_session.getMembership(authorized_session.getToken()) membership_session.updateMembership(datasource_PK1, authorized_session.getToken()) membership_session.readUserMemberships(authorized_session.getToken()) #clean up if not using individual commands if ALL: print('\n[main] Completing Demo and deleting created objects...') print ("[main] Deleting membership") membership_session.deleteMembership(authorized_session.getToken()) print ("[main] Deleting Course") user_session.deleteUser(authorized_session.getToken()) print ("[main] Deleting Course") course_session.deleteCourse(authorized_session.getToken()) print ("[main] Deleting Term") term_session.deleteTerm(authorized_session.getToken()) print ("[main] Deleting DataSource") datasource_session.deleteDataSource(authorized_session.getToken()) else: print("Remember to delete created demo objects!") print("[main] Processing Complete")
def process_memberships(req_number_memberships, index, output_file, rest): # randomizing n memberships for n users into n courses can be tricky - # if you have a better way of doing this let me know - [email protected] print ("PROCESSING MEMBERSHIPS...") indx = int(index) #starting index for courses and users memberships_count = 0 full = set() course_memberships = {} courses = set() users = set() courses_with_members = set() users_in_courses = set() #req_number is the required number of memberships - user entered or constant max of 1000 if int(req_number_memberships) == 1000: req_number_users = 150 req_number_courses = 100 else: req_number_users = req_number_memberships req_number_courses = req_number_memberships print ("number memberships in: %d" % req_number_memberships) print ("number users in: %d" % req_number_users) print ("number courses in: %d" % req_number_courses) #build membership lists for courses #create arrays containing memberships randomly associated with courses until #req_number_memberships is met. #Since membership count is the control: # all courses may not have memberships # all users may not have memberships while memberships_count < req_number_memberships: user_set = set() userID = USEREXTERNALIDSTEM + "_" + str(random.randint(int(index), int(index)+int(req_number_users)-1)) #print ("userID %d" % userID) courseID = COURSEEXTERNALIDSTEM + "_" + str(random.randint(int(index), int(index)+int(req_number_courses)-1)) #print ("courseID %d" % courseID) if courseID in course_memberships and courseID not in full: user_set = set(course_memberships[courseID]) #print ("%s is not full - adding membership" % courseID) user_set.add(userID) course_memberships[courseID] = list(user_set) courses_with_members.add("%s_%s" % (COURSEEXTERNALIDSTEM, courseID)) users_in_courses.add("%s_%s" % (USEREXTERNALIDSTEM, userID)) memberships_count += 1 #check if full add to full set. if len(user_set) >= MAX_PER_COURSE_MEMBERSHIPS: #print ("%s is full." % courseID) full.add(courseID) #what courses did not get members? all_courses = [] for num in range( indx, indx+int(req_number_courses)-1): all_courses.append("%s_%d" % (COURSEEXTERNALIDSTEM, num)) with open(output_file + "Courses_with_no_enrollments-" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")+".txt", "w") as text_file: text_file.write("\n##### This file contains the list of courses not given enrollments #####\n") text_file.write(str(set(all_courses) - courses_with_members)) print ("COURSES WITH NO ENROLLMENTS FILE WRITTEN") #what users did not get into courses? all_users = [] for num in range( indx, indx+int(req_number_users)-1): all_users.append("%s_%d" % (USEREXTERNALIDSTEM, num)) #print (all_courses) with open(output_file + "Users_with_no_enrollments-" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")+".txt", "w") as text_file: text_file.write("\n##### This file contains the list of users not enrolled in a course #####\n") text_file.write(str(set(all_users) - users_in_courses)) print ("USERS WITH NO ENROLLMENTS FILE WRITTEN") #print (set(all_users) - users_in_courses) if rest: print("WRITING DATA FILE and PROCESSING via REST, this will take a minute or so...") else: print("WRITING DATA FILE ONLY - you must process via SIS Framework...") with open(output_file+"_MEMBERSHIPS-"+datetime.datetime.now().strftime("%Y%m%d-%H%M%S")+".txt", "w") as text_file: text_file.write("\n##### DELETE THIS LINE....THE FOLLOWING IS A MEMBERSHIP SNAPSHOT FLAT FILE FOR STORE OR DELETE #####\n") text_file.write("##### DELETE THIS LINE.... DATASOURCEKEY %s #####\n" % DSKEXTERNALID) text_file.write("EXTERNAL_COURSE_KEY|EXTERNAL_PERSON_KEY|ROLE\n") if rest: print("WRITING DATA FILE and PROCESSING via REST, this will take a minute or so...") extId = "externalId:%s" % DSKEXTERNALID #same payload used for all membership requests json_payload = { "dataSourceId": extId, "availability": { "available":"Yes" }, "courseRoleId":"Student" } else: print("WRITING DATA FILE ONLY - you must process via SIS Framework...") counter = 0 # take the above course_memberships dictionary, # iterate through the keys, # the values are the list of userIDs by index # write the snapshot file and # if REST send the request payload for key in course_memberships: courseID = key userID_list = course_memberships[key] for user in userID_list: text_file.write("%s|%s|Student\n" % (key, user)) if rest: global authorized_session membership_session = Membership(rest, authorized_session.getToken()) membership_session.createMembership(courseID, user, json.dumps(json_payload), authorized_session.getToken())