Found this content helpful? Log in or sign up to leave a like!

Python script to publish courses in an account

mnahmias
Community Novice

Here's a script I just wrote to publish all courses in a specific account. Hopefully someone will find this helpful.

import requestsdef chunks(source_list, chunk_size):    """    Method to split up your list into chunks    Yield successive chunk_size-sized chunks from list.    Source: https://www.datacamp.com/community/tutorials/18-most-common-python-list-questions-learn-python#question11    """    for i in range(0, len(source_list), chunk_size):        yield source_list[i:i + chunk_size]def publish_account_courses(base_url, token, sub_account_id):    account_courses_url = base_url + 'accounts/' + str(sub_account_id) + '/courses'    header = {'Authorization': 'Bearer ' + token}    all_course_ids = []    # Get the first page of courses in the sub-account    payload = {        'per_page': 100  # Per page max value appears to be 100    }    response = requests.get(url=account_courses_url, headers=header, data=payload)    courses = response.json()    # Add the course IDs to the list    for course in courses:        all_course_ids.append(course['id'])    # Get the remaining pages of courses, if any    while 'next' in response.links:        # No longer need to include params, the next link has them saved        response = requests.get(url=response.links['next']['url'], headers=header)        courses = response.json()        # Add the course IDs to the list        for course in courses:            all_course_ids.append(course['id'])    # We can only update 500 courses at a time. Need to split up list of course IDs if longer than that    # This is a new list - will contain lists of course IDs no longer than 500 each    course_id_lists = list(chunks(all_course_ids, 500))    for course_list in course_id_lists:        # Take the list of course IDs and pass them to the 'Update courses' endpoint        payload = {            'course_ids[]': course_list,            'event': 'offer'  # Offer in the API is the same as Publish in the UI        }        response = requests.put(url=account_courses_url, headers=header, data=payload)        response.raise_for_status()        # I'm not bothering to check the progress of this operation since it's just changing the state# Canvas environment infoBASE_URL = 'PUT URL HERE'TOKEN = 'PUT TOKEN HERE'publish_account_courses(base_url=BASE_URL, token=TOKEN, sub_account_id=8)‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍
Labels (2)