Skip to content
Snippets Groups Projects
get_roster.py 1.52 KiB
Newer Older
  • Learn to ignore specific revisions
  • """
    Get roster of students for a Canvas course.
    """
    import csv
    import click
    
    try:
        import common
    except:
        from . import common
    
    
    @click.command(context_settings={'help_option_names': ['-h', '--help']})
    @click.argument(
        'course_id',
    )
    @click.option(
        '--output',
        '-o',
        help='Output file.',
    )
    def main(course_id, output=None):
        api_token = common.get_api_token()
        roster = get_roster(api_token, course_id)
    
    akamil's avatar
    akamil committed
        roster.sort(key=lambda item: item['login_id'])
    
    def get_user(api_token, course_id, user_id):
        url = f'{common.API_URL_BASE}/courses/{course_id}/users/{user_id}'
        return common.get_unpaginated(api_token, url)
    
    
    def get_roster(api_token, course_id):
        """Returns list of students for the given course."""
        # Request parameters
        params = {'enrollment_type': ['student']}
        url = f'{common.API_URL_BASE}/courses/{course_id}/users'
        return common.get_paginated(api_token, url, params)
    
    def write_roster(roster, output):
        if output is None:
            for item in roster:
                print(f'{item["login_id"]}@umich.edu')
            return
        filtered = ((item['sortable_name'],
                     f'{item["login_id"]}@umich.edu',
                     item['sis_user_id'])
                    for item in roster)
        with open(output, 'w') as csvfile:
            writer = csv.writer(csvfile)
            writer.writerow(('Full Name', 'Email', 'SID'))
            for item in filtered:
                writer.writerow(item)
                
    if __name__ == '__main__':
        main()