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())
Exemplo n.º 3
0
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())