#!/usr/bin/env python3 """ 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) roster.sort(key=lambda item: item['login_id']) write_roster(roster, output) 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()