├── .gitignore ├── README.md ├── api ├── add_login_for_auth_provider │ ├── powershell │ │ ├── README.md │ │ └── create_auth_provider_login.ps1 │ └── ruby │ │ ├── Gemfile │ │ ├── README.md │ │ ├── bulk_add_user_logins.rb │ │ └── example.csv ├── add_parent_as_observer │ ├── powershell │ │ ├── README.md │ │ └── assignObservees.ps1 │ └── python │ │ ├── README.md │ │ └── update_observers.py ├── associate_courses_to_blueprint_courses │ └── ruby │ │ ├── Gemfile │ │ ├── README.md │ │ ├── associate_course.rb │ │ └── sample_csv.csv ├── bulk_assign_avatars │ ├── python │ │ ├── README.md │ │ ├── bulk_assign_avatars.py │ │ ├── bulk_upload_avatars.py │ │ ├── requirements.txt │ │ └── sample.csv │ └── ruby │ │ ├── README.md │ │ └── bulk_assign_avatars.rb ├── bulk_course_export │ ├── python │ │ ├── bulk_export.py │ │ ├── courses.in.csv │ │ └── courses.out.csv │ └── ruby │ │ ├── README.md │ │ ├── bulk_course_export.rb │ │ ├── input_example.csv │ │ └── output_example.csv ├── bulk_create_announcements_or_discussions │ ├── bulk_create_discussions_or_announcements.rb │ └── bulk_create_discussions_readme.md ├── bulk_delete_groups │ ├── README.md │ ├── bulk_delete_groups.rb │ └── groups-example.csv ├── bulk_enable_feature_flags │ ├── README.md │ ├── bulk-enable-feature-flags.rb │ └── courses.csv ├── bulk_migration │ ├── PowerShell │ │ ├── README.rst │ │ ├── csvfile.csv │ │ └── migration.ps1 │ └── python │ │ ├── README.rst │ │ ├── course_migrations.py │ │ └── csvfile.csv ├── bulk_publish_courses │ ├── README.md │ ├── bulk_publish_courses.rb │ └── example.csv ├── bulk_reset_courses │ └── python │ │ ├── README.md │ │ ├── example.csv │ │ └── reset_courses.py ├── bulk_set_course_tabs │ └── python │ │ ├── README.rst │ │ ├── csvfile.csv │ │ └── set_tabs.py ├── bulk_set_course_visibility │ └── Ruby │ │ ├── README.md │ │ └── bulk_set_course_visibility.rb ├── bulk_set_syllabus_visibility │ └── Ruby │ │ ├── README.md │ │ └── bulk_set_syllabus_visibility.rb ├── bulk_update_passwords │ ├── python │ │ ├── README.md │ │ ├── update_passwords.csv │ │ └── update_passwords.py │ └── ruby │ │ ├── README.md │ │ ├── example_csv.csv │ │ └── update_passwords.rb ├── bulk_update_user_default_emails │ ├── bulk_update_user_default_emails.rb │ └── example.csv ├── bulk_upload_migration │ ├── __init__.py │ ├── csvfile.csv │ ├── qti_2_1.zip │ ├── upload_account_level_migrations.py │ ├── upload_course_migrations.py │ └── vista_archive.zip ├── create_instructor_sandboxes │ └── Ruby │ │ ├── sandbox_create.csv │ │ └── sandbox_creator.rb ├── create_sandbox_courses_without_sisids │ ├── README.md │ └── sandbox_creation.py ├── custom_user_data │ ├── README.md │ ├── custom_data.csv │ ├── display_custom_data.js │ └── user_custom_data.rb ├── do_course_copy │ ├── powershell │ │ ├── README.rst │ │ ├── archives │ │ │ └── README.md │ │ ├── courseCopy.ps1 │ │ ├── csvfile.csv │ │ └── logs │ │ │ └── README.md │ ├── python_multiprocessing │ │ ├── README.rst │ │ ├── coursecopy.py │ │ └── csvfile.csv │ └── python_simple │ │ ├── README.rst │ │ └── do_course_copy.py ├── enroll_as_admins │ └── python │ │ ├── README.md │ │ ├── enroll_admins.py │ │ └── example_csv_file.csv ├── enroll_users_with_canvas_ids │ └── ruby │ │ ├── README.md │ │ ├── enroll_users.rb │ │ └── example.csv ├── grade_export │ └── ruby │ │ ├── README.md │ │ └── grade_export.rb ├── import_account_level_qti │ ├── Gemfile │ └── qti_importer.rb ├── import_google_calendar_into_canvas │ └── ruby │ │ ├── README.md │ │ └── google_cal_import_to_canvas.rb ├── import_outcomes │ ├── README.rst │ └── python │ │ ├── README.rst │ │ ├── outcomes_importer.py │ │ ├── test.sh │ │ ├── tests │ │ ├── __init__.py │ │ ├── act_english_calculatio_method.csv │ │ ├── ecs_grp.csv │ │ └── test_importer.py │ │ └── tmp_my_cache.db ├── import_sis_csv_line_by_line │ └── python │ │ ├── README.rst │ │ └── line_by_line.py ├── list_all_admins │ └── python │ │ ├── README.md │ │ └── list_all_admins.py ├── merge_multiple_users │ └── ruby │ │ ├── README.md │ │ ├── merge_multiple_users.rb │ │ └── merge_users.csv ├── outcomes_exporter │ ├── Gemfile │ ├── Gemfile.lock │ ├── README.md │ └── outcome_exporter.rb ├── prepopulate_modules │ └── python │ │ ├── README.md │ │ ├── modules.csv │ │ └── prepopulate_modules.py ├── pull_course_grades │ ├── README.rst │ └── python │ │ └── pull_grades.py ├── pull_course_quizzes │ └── python │ │ ├── pullexams_bycourse-README.txt │ │ └── pullexams_bycourse.py ├── run_reports │ ├── account_reports │ │ └── python │ │ │ ├── multipleReports_notifications-README.txt │ │ │ └── multipleReports_notifications.py │ ├── provisioning_report │ │ └── python │ │ │ ├── README.rst │ │ │ ├── pull_provisioning_report.py │ │ │ └── simplified_version.py │ └── sis_export │ │ └── python │ │ ├── README.rst │ │ └── pull_sis_export_report.py ├── schoology_import_cleanup │ ├── Gemfile │ └── xmlparser.rb ├── student_activity │ └── ruby │ │ ├── README.md │ │ └── student_activity_to_csv.rb ├── update_blank_course_sis_ids │ ├── elixir │ │ ├── .gitignore │ │ ├── README.md │ │ ├── config │ │ │ └── config.exs │ │ ├── lib │ │ │ └── update_blank_course_sis_ids.ex │ │ ├── mix.exs │ │ ├── mix.lock │ │ └── test │ │ │ ├── test_helper.exs │ │ │ └── update_blank_course_sis_ids_test.exs │ ├── python │ │ ├── README.md │ │ ├── courseList.csv │ │ └── updateCourseID.py │ └── ruby │ │ ├── README.md │ │ ├── example.csv │ │ └── update_blank_course_sis_ids.rb ├── update_course_quotas │ └── ruby │ │ ├── README.md │ │ ├── example.csv │ │ └── update_course_quotas.rb ├── update_course_sis_ids │ └── ruby │ │ ├── README.md │ │ ├── example.csv │ │ └── update_course_sis_ids.rb ├── update_notification_preferences │ └── python │ │ ├── README.md │ │ ├── notifications_defaults_092014.csv │ │ ├── update_notification_prefs.py │ │ └── users.csv ├── update_section_sis_ids │ └── ruby │ │ ├── README.md │ │ ├── example.csv │ │ └── update_course_sis_ids.rb ├── update_user_sis_ids │ ├── python │ │ ├── change_user_sisid.py │ │ └── example.csv │ └── ruby │ │ ├── Gemfile │ │ ├── Gemfile.lock │ │ ├── README.md │ │ ├── example.csv │ │ ├── update_user_sis_id.rb │ │ └── update_user_sis_id_concurrent.rb └── update_users_timezone │ └── ruby │ ├── README.md │ ├── example.csv │ └── update_users_timezone.rb ├── branding ├── README.md ├── css │ ├── README.md │ ├── catalog_courses_as_list │ │ ├── README │ │ ├── catalog_courses_as_list.css │ │ └── screenshot.png │ ├── hide-teacher-self-registration.css │ ├── hide_full_batch_check │ │ ├── README.md │ │ └── hide_full_batch.css │ ├── hide_help_links │ │ ├── README.md │ │ └── hide_help_links.css │ ├── hide_various_course_settings │ │ ├── README.md │ │ └── hide_copy_course.css │ ├── move_watermark │ │ ├── README.md │ │ └── move_watermark.css │ └── user_dashboard_customizations │ │ ├── README.md │ │ └── user_dashboard_customizations.css ├── discovery_page │ ├── README.md │ ├── example │ │ ├── buttons.css │ │ ├── discovery.css │ │ ├── discovery.html │ │ └── logo.png │ └── images │ │ ├── canvas.png │ │ ├── multisaml.png │ │ └── singlesaml.png └── javascript │ ├── README.md │ ├── add_additional_link │ ├── README.md │ ├── add_additional_link.js │ └── additional_link_login_page.png │ ├── add_button_users │ ├── README.md │ └── all_grades.js │ ├── add_bypass_login │ ├── README.md │ └── add_bypass_login.js │ ├── add_iframe_to_login_screen │ ├── README.md │ └── add_iframe_to_login_screen.js │ ├── add_language_selectors │ ├── README.md │ └── add_languge_selectors.js │ ├── add_link_to_footer │ ├── README.md │ └── add_link_to_footer.js │ ├── add_print_button_syllabus │ ├── README.md │ └── add_print_button.js │ ├── add_role_to_permission_hover │ ├── add_role_to_permission_hover.js │ ├── add_role_to_perms.png │ └── readme.md │ ├── add_text_to_login │ ├── README.md │ └── add_text_to_login.js │ ├── add_users_name_to_global_nav │ ├── README.md │ └── add_users_name_to_global_nav.js │ ├── always_record_conferences │ ├── README.md │ └── canvas-always-record-conferences.js │ ├── bigger_thumbnails │ ├── README.md │ └── bigger_thumbnails.js │ ├── canvas_auth_endpoint_redirect │ └── login_redirect.js │ ├── change_course_module_text │ └── change-course-module-text.js │ ├── change_enrollment_page_username │ ├── README.md │ └── change_enrollment_page_username.js │ ├── change_link_in_404 │ ├── add_404_change.js │ └── readme.md │ ├── changes_to_add_people │ ├── readme.md │ └── trigger_add_people_changes.js │ ├── checkbox_checked_external_module_items │ ├── README.md │ ├── checkbox_checked.js │ └── screenshot.png │ ├── conversations │ └── deleteconversations.js │ ├── custom_quiz_password_message │ ├── README.md │ └── custom_quiz_password_message.js │ ├── disable_avatar │ ├── disable_avatar.css │ └── disable_avatar.js │ ├── disable_notification_preferences │ ├── README.md │ └── disable_notification_preferences.js │ ├── do_for_all_but_admins_template │ └── do_for_all_but_admins.js │ ├── do_stuff_by_role │ ├── README.md │ └── do_stuff_by_role.js │ ├── download_discussion_posts │ ├── README.md │ └── download_discussion_posts.js │ ├── element_targetting │ ├── README.md │ └── course_settings │ │ └── course_settings.md │ ├── enroll_in_ta_sections_only │ ├── README.md │ └── enroll_in_ta_sections_only.js │ ├── grades_on_profile │ ├── README.md │ └── grades_on_profile.js │ ├── hide-0pt-indicator │ ├── README.md │ └── removeZeroPoints.js │ ├── hide_QRCode │ ├── README.md │ └── hide_QRCode.js │ ├── hide_conferences_course_nav │ ├── README.md │ └── hide_conferences_course_nav.js │ ├── hide_content_exports_for_teachers │ ├── README.md │ └── hide-teacher-export-content.js │ ├── hide_course_nav_items │ └── hide_course_nav_items.js │ ├── hide_course_setup_checklist │ ├── README.md │ ├── hide_course_setup_checklist.css │ └── hide_course_setup_checklist.js │ ├── hide_eportfolio_from_observers │ ├── hide_eportfolios_from_observers.css │ └── hide_eportfolios_from_observers.js │ ├── hide_reset_content │ ├── README.md │ └── hide_reset_content.js │ ├── login_slideshow │ ├── README.md │ ├── login_slideshow.css │ └── login_slideshow.js │ ├── modify-help-menu │ ├── README.md │ ├── help-menu-updates.css │ └── help-menu-updates.js │ ├── on_element_rendered │ ├── README.md │ └── on_element_rendered.js │ ├── online_users │ ├── README.md │ └── online_users.js │ ├── remote_source_loader │ ├── README.md │ └── remote_source_loader.js │ ├── removeStatusBar │ ├── README.md │ └── removeStatusBar.js │ ├── remove_collaborations │ ├── README.md │ └── remove_collaborations.js │ ├── report_discussion_post │ ├── README.md │ └── report_discussion_post.js │ ├── reset_notification_preferences │ ├── README.md │ └── reset_notification_preferences.js │ ├── speedgrader_canned_comments │ ├── README.md │ └── speedgrader_canned_comments.js │ ├── student_remove_ignore_button │ ├── README.md │ └── student_remove_ignore_button.js │ ├── style_by_domain │ ├── README.md │ ├── style_by_domain.css │ └── style_by_domain.js │ ├── terms_and_conditions │ ├── README.md │ └── terms_and_conditions.js │ ├── total_activity_student_view │ ├── README.md │ └── student_activity_time.js │ ├── url_dependent_branding │ ├── README.md │ └── url_branding.js │ └── warn_on_external_link │ ├── README.md │ └── warn_on_external_link.js ├── canvas_data └── sync_canvas_data │ └── python │ ├── canvas_data_sync-README.txt │ ├── canvas_data_sync.py │ └── canvasfuncs │ ├── candata.py │ └── hmacsig.py ├── deprecated ├── README.md ├── api │ └── PullCourseGrades │ │ ├── README.rst │ │ ├── pull_grades.php │ │ ├── pull_grades.py │ │ └── pull_grades.rb └── branding │ ├── README.md │ ├── add_global_nav_links │ ├── README.md │ └── add_global_nav_links.js │ ├── add_google_preview_links │ ├── README.md │ └── add_google_preview.js │ ├── add_html_to_http_external_link_module_warning │ ├── README.md │ └── add_html_to_http_external_link_module_warning.js │ ├── add_text_to_header_roles │ ├── README.md │ └── add_text_to_header_roles.js │ ├── add_to_main_top_nav │ ├── README.md │ └── add_to_main_top_nav.js │ ├── add_tweaks_to_canvas_ui │ ├── README.md │ └── add_tweaks_to_canvas_ui.js │ ├── change_courses_name_&_hide_grades │ ├── README.md │ └── change_courses_name_&_hide_grades.js │ ├── hide_items_in_help │ ├── show_feature_request_to_teachers_and_admins │ │ ├── README.md │ │ ├── show_feature_request_to_teachers_and_admins.css │ │ └── show_feature_request_to_teachers_and_admins.js │ └── show_report_a_problem_to_teachers_and_admins │ │ ├── README.md │ │ ├── show_report_a_problem_to_teachers_and_admins.css │ │ └── show_report_a_problem_to_teachers_and_admins.js │ └── resources_global_tray_link │ ├── README.md │ ├── resources_global_tray_link.css │ ├── resources_global_tray_link.js │ └── resources_global_tray_link_by_role.js ├── non_api └── updateCourseGradingPolicies │ ├── README.md │ └── index.js ├── other ├── homebrew-inst-api │ ├── Formula │ │ └── inst-api.rb │ └── README.md ├── inst-api │ ├── LICENSE │ ├── README.md │ ├── arc │ │ ├── README │ │ └── arc │ ├── bridge │ │ ├── README │ │ └── bridge │ ├── canvas │ │ ├── README │ │ └── canvas │ ├── catalog │ │ ├── README │ │ └── catalog │ └── commons │ │ ├── README │ │ └── commons └── instructure-unblock │ ├── LICENSE │ ├── README.md │ └── instructure-unblock.txt └── sis ├── README.md ├── banner_lmb └── canvas_mbldisetup.sh ├── canvas_synergetic_integration ├── .gitignore ├── README.md ├── docker-env.env.example ├── dockerfile ├── main.py ├── odbcinst.ini └── requirements.txt ├── change_sis_id_from_error_report ├── README.md └── fix_sis_ids.py ├── convert_to_uft8 └── powershell │ ├── README.md │ └── convertToUTF8.ps1 ├── create_ssha_passwords ├── README.md ├── ssha_password.py └── users_hashed.csv ├── create_users_from_ad └── powershell │ ├── README.md │ └── usersToCSV.ps1 ├── sis_import_diff └── powershell │ ├── README.md │ └── sis_import_diffing.ps1 ├── sis_import_errors └── python │ ├── sis_errors-README.txt │ ├── sis_errors.py │ └── sis_errors_linux.py ├── sis_import_fullbatch └── powershell │ ├── README.md │ └── sis_import_fullbatch.ps1 └── sis_import_standard ├── CSharpCanvasSISPublish ├── CanvasSISImport │ ├── CanvasSISPublish.csproj │ ├── CanvasSISPublish.csproj.user │ ├── CanvasSISPublish.pidb │ ├── Program.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── bin │ │ └── Debug │ │ │ ├── CanvasSISPublish.exe │ │ │ ├── CanvasSISPublish.exe.mdb │ │ │ └── sis_folders │ │ │ ├── courses.csv │ │ │ └── terms.csv │ ├── libs │ │ ├── CanvasSIS.cs │ │ └── JSON.cs │ └── sis_folders │ │ ├── courses.csv │ │ └── terms.csv ├── CanvasSISPublish.sln ├── CanvasSISPublish.suo ├── CanvasSISPublish.userprefs └── README.md ├── README.rst ├── VisualBasicCanvasSISClient ├── .gitignore ├── Canvas SIS Client.sln ├── Canvas SIS Client.userprefs ├── Canvas SIS Client │ ├── Canvas SIS Client.vbproj │ ├── CanvasClient.vb │ └── My Project │ │ ├── Application.Designer.vb │ │ ├── Application.myapp │ │ ├── AssemblyInfo.vb │ │ ├── Resources.Designer.vb │ │ ├── Resources.resx │ │ ├── Settings.Designer.vb │ │ └── Settings.settings └── README.md ├── bash_curl ├── README.md ├── csv │ ├── README.md │ ├── archive │ │ └── README.md │ └── new │ │ └── README.md ├── python_parser.py ├── sample_localconfig.sh └── sis_script.sh ├── java ├── README.md └── basic_example │ ├── .classpath │ ├── .project │ ├── .settings │ └── org.eclipse.jdt.core.prefs │ ├── bin │ └── com │ │ └── kajigga │ │ ├── CanvasAPIPost.class │ │ └── canvasapi │ │ ├── APIConfig.class │ │ ├── ImportResponse.class │ │ ├── ImportSIS.class │ │ └── RequestWait.class │ ├── config.js │ ├── lib │ ├── google-gson-2.2.2 │ │ ├── LICENSE │ │ ├── README │ │ ├── gson-2.2.2-javadoc.jar │ │ ├── gson-2.2.2-sources.jar │ │ └── gson-2.2.2.jar │ ├── httpcomponents-client-4.3-alpha1-bin.tar.tar.gz │ └── httpcomponents-client-4.3-alpha1 │ │ ├── LICENSE.txt │ │ ├── NOTICE.txt │ │ ├── README.txt │ │ ├── RELEASE_NOTES.txt │ │ ├── examples │ │ └── org │ │ │ └── apache │ │ │ └── http │ │ │ └── examples │ │ │ ├── client │ │ │ ├── ClientAbortMethod.java │ │ │ ├── ClientAuthentication.java │ │ │ ├── ClientChunkEncodedPost.java │ │ │ ├── ClientConfiguration.java │ │ │ ├── ClientConnectionRelease.java │ │ │ ├── ClientCustomContext.java │ │ │ ├── ClientCustomSSL.java │ │ │ ├── ClientEvictExpiredConnections.java │ │ │ ├── ClientExecuteProxy.java │ │ │ ├── ClientExecuteSOCKS.java │ │ │ ├── ClientFormLogin.java │ │ │ ├── ClientGZipContentCompression.java │ │ │ ├── ClientInteractiveAuthentication.java │ │ │ ├── ClientMultiThreadedExecution.java │ │ │ ├── ClientPreemptiveBasicAuthentication.java │ │ │ ├── ClientPreemptiveDigestAuthentication.java │ │ │ ├── ClientProxyAuthentication.java │ │ │ ├── ClientWithResponseHandler.java │ │ │ ├── ProxyTunnelDemo.java │ │ │ └── QuickStart.java │ │ │ └── entity │ │ │ └── mime │ │ │ └── ClientMultipartFormPost.java │ │ ├── javadoc │ │ ├── allclasses-frame.html │ │ ├── allclasses-noframe.html │ │ ├── constant-values.html │ │ ├── deprecated-list.html │ │ ├── help-doc.html │ │ ├── index-all.html │ │ ├── index.html │ │ ├── options │ │ ├── org │ │ │ └── apache │ │ │ │ └── http │ │ │ │ ├── auth │ │ │ │ ├── AUTH.html │ │ │ │ ├── AuthOption.html │ │ │ │ ├── AuthProtocolState.html │ │ │ │ ├── AuthScheme.html │ │ │ │ ├── AuthSchemeFactory.html │ │ │ │ ├── AuthSchemeProvider.html │ │ │ │ ├── AuthSchemeRegistry.html │ │ │ │ ├── AuthScope.html │ │ │ │ ├── AuthState.html │ │ │ │ ├── AuthenticationException.html │ │ │ │ ├── BasicUserPrincipal.html │ │ │ │ ├── ChallengeState.html │ │ │ │ ├── ContextAwareAuthScheme.html │ │ │ │ ├── Credentials.html │ │ │ │ ├── InvalidCredentialsException.html │ │ │ │ ├── MalformedChallengeException.html │ │ │ │ ├── NTCredentials.html │ │ │ │ ├── NTUserPrincipal.html │ │ │ │ ├── UsernamePasswordCredentials.html │ │ │ │ ├── class-use │ │ │ │ │ ├── AUTH.html │ │ │ │ │ ├── AuthOption.html │ │ │ │ │ ├── AuthProtocolState.html │ │ │ │ │ ├── AuthScheme.html │ │ │ │ │ ├── AuthSchemeFactory.html │ │ │ │ │ ├── AuthSchemeProvider.html │ │ │ │ │ ├── AuthSchemeRegistry.html │ │ │ │ │ ├── AuthScope.html │ │ │ │ │ ├── AuthState.html │ │ │ │ │ ├── AuthenticationException.html │ │ │ │ │ ├── BasicUserPrincipal.html │ │ │ │ │ ├── ChallengeState.html │ │ │ │ │ ├── ContextAwareAuthScheme.html │ │ │ │ │ ├── Credentials.html │ │ │ │ │ ├── InvalidCredentialsException.html │ │ │ │ │ ├── MalformedChallengeException.html │ │ │ │ │ ├── NTCredentials.html │ │ │ │ │ ├── NTUserPrincipal.html │ │ │ │ │ └── UsernamePasswordCredentials.html │ │ │ │ ├── package-frame.html │ │ │ │ ├── package-summary.html │ │ │ │ ├── package-tree.html │ │ │ │ ├── package-use.html │ │ │ │ └── params │ │ │ │ │ ├── AuthPNames.html │ │ │ │ │ ├── AuthParamBean.html │ │ │ │ │ ├── AuthParams.html │ │ │ │ │ ├── class-use │ │ │ │ │ ├── AuthPNames.html │ │ │ │ │ ├── AuthParamBean.html │ │ │ │ │ └── AuthParams.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── client │ │ │ │ ├── AuthCache.html │ │ │ │ ├── AuthenticationHandler.html │ │ │ │ ├── AuthenticationStrategy.html │ │ │ │ ├── BackoffManager.html │ │ │ │ ├── CircularRedirectException.html │ │ │ │ ├── ClientProtocolException.html │ │ │ │ ├── ConnectionBackoffStrategy.html │ │ │ │ ├── CookieStore.html │ │ │ │ ├── CredentialsProvider.html │ │ │ │ ├── HttpClient.html │ │ │ │ ├── HttpRequestRetryHandler.html │ │ │ │ ├── HttpResponseException.html │ │ │ │ ├── NonRepeatableRequestException.html │ │ │ │ ├── RedirectException.html │ │ │ │ ├── RedirectHandler.html │ │ │ │ ├── RedirectStrategy.html │ │ │ │ ├── RequestDirector.html │ │ │ │ ├── ResponseHandler.html │ │ │ │ ├── ServiceUnavailableRetryStrategy.html │ │ │ │ ├── UserTokenHandler.html │ │ │ │ ├── cache │ │ │ │ │ ├── CacheResponseStatus.html │ │ │ │ │ ├── HeaderConstants.html │ │ │ │ │ ├── HttpCacheContext.html │ │ │ │ │ ├── HttpCacheEntry.html │ │ │ │ │ ├── HttpCacheEntrySerializationException.html │ │ │ │ │ ├── HttpCacheEntrySerializer.html │ │ │ │ │ ├── HttpCacheStorage.html │ │ │ │ │ ├── HttpCacheUpdateCallback.html │ │ │ │ │ ├── HttpCacheUpdateException.html │ │ │ │ │ ├── InputLimit.html │ │ │ │ │ ├── Resource.html │ │ │ │ │ ├── ResourceFactory.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ ├── CacheResponseStatus.html │ │ │ │ │ │ ├── HeaderConstants.html │ │ │ │ │ │ ├── HttpCacheContext.html │ │ │ │ │ │ ├── HttpCacheEntry.html │ │ │ │ │ │ ├── HttpCacheEntrySerializationException.html │ │ │ │ │ │ ├── HttpCacheEntrySerializer.html │ │ │ │ │ │ ├── HttpCacheStorage.html │ │ │ │ │ │ ├── HttpCacheUpdateCallback.html │ │ │ │ │ │ ├── HttpCacheUpdateException.html │ │ │ │ │ │ ├── InputLimit.html │ │ │ │ │ │ ├── Resource.html │ │ │ │ │ │ └── ResourceFactory.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── class-use │ │ │ │ │ ├── AuthCache.html │ │ │ │ │ ├── AuthenticationHandler.html │ │ │ │ │ ├── AuthenticationStrategy.html │ │ │ │ │ ├── BackoffManager.html │ │ │ │ │ ├── CircularRedirectException.html │ │ │ │ │ ├── ClientProtocolException.html │ │ │ │ │ ├── ConnectionBackoffStrategy.html │ │ │ │ │ ├── CookieStore.html │ │ │ │ │ ├── CredentialsProvider.html │ │ │ │ │ ├── HttpClient.html │ │ │ │ │ ├── HttpRequestRetryHandler.html │ │ │ │ │ ├── HttpResponseException.html │ │ │ │ │ ├── NonRepeatableRequestException.html │ │ │ │ │ ├── RedirectException.html │ │ │ │ │ ├── RedirectHandler.html │ │ │ │ │ ├── RedirectStrategy.html │ │ │ │ │ ├── RequestDirector.html │ │ │ │ │ ├── ResponseHandler.html │ │ │ │ │ ├── ServiceUnavailableRetryStrategy.html │ │ │ │ │ └── UserTokenHandler.html │ │ │ │ ├── config │ │ │ │ │ ├── AuthSchemes.html │ │ │ │ │ ├── CookieSpecs.html │ │ │ │ │ ├── RequestConfig.Builder.html │ │ │ │ │ ├── RequestConfig.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ ├── AuthSchemes.html │ │ │ │ │ │ ├── CookieSpecs.html │ │ │ │ │ │ ├── RequestConfig.Builder.html │ │ │ │ │ │ └── RequestConfig.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── entity │ │ │ │ │ ├── DeflateDecompressingEntity.html │ │ │ │ │ ├── EntityBuilder.html │ │ │ │ │ ├── GzipCompressingEntity.html │ │ │ │ │ ├── GzipDecompressingEntity.html │ │ │ │ │ ├── UrlEncodedFormEntity.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ ├── DeflateDecompressingEntity.html │ │ │ │ │ │ ├── EntityBuilder.html │ │ │ │ │ │ ├── GzipCompressingEntity.html │ │ │ │ │ │ ├── GzipDecompressingEntity.html │ │ │ │ │ │ └── UrlEncodedFormEntity.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── fluent │ │ │ │ │ ├── Async.html │ │ │ │ │ ├── Content.html │ │ │ │ │ ├── Executor.html │ │ │ │ │ ├── Form.html │ │ │ │ │ ├── Request.html │ │ │ │ │ ├── Response.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ ├── Async.html │ │ │ │ │ │ ├── Content.html │ │ │ │ │ │ ├── Executor.html │ │ │ │ │ │ ├── Form.html │ │ │ │ │ │ ├── Request.html │ │ │ │ │ │ └── Response.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── methods │ │ │ │ │ ├── AbortableHttpRequest.html │ │ │ │ │ ├── AbstractExecutionAwareRequest.html │ │ │ │ │ ├── CloseableHttpResponse.html │ │ │ │ │ ├── Configurable.html │ │ │ │ │ ├── HttpDelete.html │ │ │ │ │ ├── HttpEntityEnclosingRequestBase.html │ │ │ │ │ ├── HttpExecutionAware.html │ │ │ │ │ ├── HttpGet.html │ │ │ │ │ ├── HttpHead.html │ │ │ │ │ ├── HttpOptions.html │ │ │ │ │ ├── HttpPatch.html │ │ │ │ │ ├── HttpPost.html │ │ │ │ │ ├── HttpPut.html │ │ │ │ │ ├── HttpRequestBase.html │ │ │ │ │ ├── HttpRequestWrapper.html │ │ │ │ │ ├── HttpTrace.html │ │ │ │ │ ├── HttpUriRequest.html │ │ │ │ │ ├── RequestBuilder.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ ├── AbortableHttpRequest.html │ │ │ │ │ │ ├── AbstractExecutionAwareRequest.html │ │ │ │ │ │ ├── CloseableHttpResponse.html │ │ │ │ │ │ ├── Configurable.html │ │ │ │ │ │ ├── HttpDelete.html │ │ │ │ │ │ ├── HttpEntityEnclosingRequestBase.html │ │ │ │ │ │ ├── HttpExecutionAware.html │ │ │ │ │ │ ├── HttpGet.html │ │ │ │ │ │ ├── HttpHead.html │ │ │ │ │ │ ├── HttpOptions.html │ │ │ │ │ │ ├── HttpPatch.html │ │ │ │ │ │ ├── HttpPost.html │ │ │ │ │ │ ├── HttpPut.html │ │ │ │ │ │ ├── HttpRequestBase.html │ │ │ │ │ │ ├── HttpRequestWrapper.html │ │ │ │ │ │ ├── HttpTrace.html │ │ │ │ │ │ ├── HttpUriRequest.html │ │ │ │ │ │ └── RequestBuilder.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── package-frame.html │ │ │ │ ├── package-summary.html │ │ │ │ ├── package-tree.html │ │ │ │ ├── package-use.html │ │ │ │ ├── params │ │ │ │ │ ├── AllClientPNames.html │ │ │ │ │ ├── AuthPolicy.html │ │ │ │ │ ├── ClientPNames.html │ │ │ │ │ ├── ClientParamBean.html │ │ │ │ │ ├── CookiePolicy.html │ │ │ │ │ ├── HttpClientParamConfig.html │ │ │ │ │ ├── HttpClientParams.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ ├── AllClientPNames.html │ │ │ │ │ │ ├── AuthPolicy.html │ │ │ │ │ │ ├── ClientPNames.html │ │ │ │ │ │ ├── ClientParamBean.html │ │ │ │ │ │ ├── CookiePolicy.html │ │ │ │ │ │ ├── HttpClientParamConfig.html │ │ │ │ │ │ └── HttpClientParams.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── protocol │ │ │ │ │ ├── ClientContext.html │ │ │ │ │ ├── ClientContextConfigurer.html │ │ │ │ │ ├── HttpClientContext.html │ │ │ │ │ ├── RequestAcceptEncoding.html │ │ │ │ │ ├── RequestAddCookies.html │ │ │ │ │ ├── RequestAuthCache.html │ │ │ │ │ ├── RequestClientConnControl.html │ │ │ │ │ ├── RequestDefaultHeaders.html │ │ │ │ │ ├── RequestExpectContinue.html │ │ │ │ │ ├── RequestProxyAuthentication.html │ │ │ │ │ ├── RequestTargetAuthentication.html │ │ │ │ │ ├── ResponseAuthCache.html │ │ │ │ │ ├── ResponseContentEncoding.html │ │ │ │ │ ├── ResponseProcessCookies.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ ├── ClientContext.html │ │ │ │ │ │ ├── ClientContextConfigurer.html │ │ │ │ │ │ ├── HttpClientContext.html │ │ │ │ │ │ ├── RequestAcceptEncoding.html │ │ │ │ │ │ ├── RequestAddCookies.html │ │ │ │ │ │ ├── RequestAuthCache.html │ │ │ │ │ │ ├── RequestClientConnControl.html │ │ │ │ │ │ ├── RequestDefaultHeaders.html │ │ │ │ │ │ ├── RequestExpectContinue.html │ │ │ │ │ │ ├── RequestProxyAuthentication.html │ │ │ │ │ │ ├── RequestTargetAuthentication.html │ │ │ │ │ │ ├── ResponseAuthCache.html │ │ │ │ │ │ ├── ResponseContentEncoding.html │ │ │ │ │ │ └── ResponseProcessCookies.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ └── utils │ │ │ │ │ ├── CloneUtils.html │ │ │ │ │ ├── HttpClientUtils.html │ │ │ │ │ ├── Idn.html │ │ │ │ │ ├── JdkIdn.html │ │ │ │ │ ├── Punycode.html │ │ │ │ │ ├── Rfc3492Idn.html │ │ │ │ │ ├── URIBuilder.html │ │ │ │ │ ├── URIUtils.html │ │ │ │ │ ├── URLEncodedUtils.html │ │ │ │ │ ├── class-use │ │ │ │ │ ├── CloneUtils.html │ │ │ │ │ ├── HttpClientUtils.html │ │ │ │ │ ├── Idn.html │ │ │ │ │ ├── JdkIdn.html │ │ │ │ │ ├── Punycode.html │ │ │ │ │ ├── Rfc3492Idn.html │ │ │ │ │ ├── URIBuilder.html │ │ │ │ │ ├── URIUtils.html │ │ │ │ │ └── URLEncodedUtils.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── conn │ │ │ │ ├── BasicEofSensorWatcher.html │ │ │ │ ├── BasicManagedEntity.html │ │ │ │ ├── ClientConnectionManager.html │ │ │ │ ├── ClientConnectionManagerFactory.html │ │ │ │ ├── ClientConnectionOperator.html │ │ │ │ ├── ClientConnectionRequest.html │ │ │ │ ├── ConnectTimeoutException.html │ │ │ │ ├── ConnectionKeepAliveStrategy.html │ │ │ │ ├── ConnectionPoolTimeoutException.html │ │ │ │ ├── ConnectionReleaseTrigger.html │ │ │ │ ├── ConnectionRequest.html │ │ │ │ ├── DnsResolver.html │ │ │ │ ├── EofSensorInputStream.html │ │ │ │ ├── EofSensorWatcher.html │ │ │ │ ├── HttpClientConnectionManager.html │ │ │ │ ├── HttpConnectionFactory.html │ │ │ │ ├── HttpHostConnectException.html │ │ │ │ ├── HttpInetSocketAddress.html │ │ │ │ ├── HttpRoutedConnection.html │ │ │ │ ├── ManagedClientConnection.html │ │ │ │ ├── MultihomePlainSocketFactory.html │ │ │ │ ├── OperatedClientConnection.html │ │ │ │ ├── SchemePortResolver.html │ │ │ │ ├── SocketClientConnection.html │ │ │ │ ├── class-use │ │ │ │ │ ├── BasicEofSensorWatcher.html │ │ │ │ │ ├── BasicManagedEntity.html │ │ │ │ │ ├── ClientConnectionManager.html │ │ │ │ │ ├── ClientConnectionManagerFactory.html │ │ │ │ │ ├── ClientConnectionOperator.html │ │ │ │ │ ├── ClientConnectionRequest.html │ │ │ │ │ ├── ConnectTimeoutException.html │ │ │ │ │ ├── ConnectionKeepAliveStrategy.html │ │ │ │ │ ├── ConnectionPoolTimeoutException.html │ │ │ │ │ ├── ConnectionReleaseTrigger.html │ │ │ │ │ ├── ConnectionRequest.html │ │ │ │ │ ├── DnsResolver.html │ │ │ │ │ ├── EofSensorInputStream.html │ │ │ │ │ ├── EofSensorWatcher.html │ │ │ │ │ ├── HttpClientConnectionManager.html │ │ │ │ │ ├── HttpConnectionFactory.html │ │ │ │ │ ├── HttpHostConnectException.html │ │ │ │ │ ├── HttpInetSocketAddress.html │ │ │ │ │ ├── HttpRoutedConnection.html │ │ │ │ │ ├── ManagedClientConnection.html │ │ │ │ │ ├── MultihomePlainSocketFactory.html │ │ │ │ │ ├── OperatedClientConnection.html │ │ │ │ │ ├── SchemePortResolver.html │ │ │ │ │ └── SocketClientConnection.html │ │ │ │ ├── package-frame.html │ │ │ │ ├── package-summary.html │ │ │ │ ├── package-tree.html │ │ │ │ ├── package-use.html │ │ │ │ ├── params │ │ │ │ │ ├── ConnConnectionPNames.html │ │ │ │ │ ├── ConnConnectionParamBean.html │ │ │ │ │ ├── ConnManagerPNames.html │ │ │ │ │ ├── ConnManagerParamBean.html │ │ │ │ │ ├── ConnManagerParams.html │ │ │ │ │ ├── ConnPerRoute.html │ │ │ │ │ ├── ConnPerRouteBean.html │ │ │ │ │ ├── ConnRoutePNames.html │ │ │ │ │ ├── ConnRouteParamBean.html │ │ │ │ │ ├── ConnRouteParams.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ ├── ConnConnectionPNames.html │ │ │ │ │ │ ├── ConnConnectionParamBean.html │ │ │ │ │ │ ├── ConnManagerPNames.html │ │ │ │ │ │ ├── ConnManagerParamBean.html │ │ │ │ │ │ ├── ConnManagerParams.html │ │ │ │ │ │ ├── ConnPerRoute.html │ │ │ │ │ │ ├── ConnPerRouteBean.html │ │ │ │ │ │ ├── ConnRoutePNames.html │ │ │ │ │ │ ├── ConnRouteParamBean.html │ │ │ │ │ │ └── ConnRouteParams.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── routing │ │ │ │ │ ├── BasicRouteDirector.html │ │ │ │ │ ├── HttpRoute.html │ │ │ │ │ ├── HttpRouteDirector.html │ │ │ │ │ ├── HttpRoutePlanner.html │ │ │ │ │ ├── RouteInfo.LayerType.html │ │ │ │ │ ├── RouteInfo.TunnelType.html │ │ │ │ │ ├── RouteInfo.html │ │ │ │ │ ├── RouteTracker.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ ├── BasicRouteDirector.html │ │ │ │ │ │ ├── HttpRoute.html │ │ │ │ │ │ ├── HttpRouteDirector.html │ │ │ │ │ │ ├── HttpRoutePlanner.html │ │ │ │ │ │ ├── RouteInfo.LayerType.html │ │ │ │ │ │ ├── RouteInfo.TunnelType.html │ │ │ │ │ │ ├── RouteInfo.html │ │ │ │ │ │ └── RouteTracker.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── scheme │ │ │ │ │ ├── HostNameResolver.html │ │ │ │ │ ├── LayeredSchemeSocketFactory.html │ │ │ │ │ ├── LayeredSocketFactory.html │ │ │ │ │ ├── PlainSocketFactory.html │ │ │ │ │ ├── Scheme.html │ │ │ │ │ ├── SchemeLayeredSocketFactory.html │ │ │ │ │ ├── SchemeRegistry.html │ │ │ │ │ ├── SchemeSocketFactory.html │ │ │ │ │ ├── SocketFactory.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ ├── HostNameResolver.html │ │ │ │ │ │ ├── LayeredSchemeSocketFactory.html │ │ │ │ │ │ ├── LayeredSocketFactory.html │ │ │ │ │ │ ├── PlainSocketFactory.html │ │ │ │ │ │ ├── Scheme.html │ │ │ │ │ │ ├── SchemeLayeredSocketFactory.html │ │ │ │ │ │ ├── SchemeRegistry.html │ │ │ │ │ │ ├── SchemeSocketFactory.html │ │ │ │ │ │ └── SocketFactory.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── socket │ │ │ │ │ ├── ConnectionSocketFactory.html │ │ │ │ │ ├── LayeredConnectionSocketFactory.html │ │ │ │ │ ├── PlainSocketFactory.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ ├── ConnectionSocketFactory.html │ │ │ │ │ │ ├── LayeredConnectionSocketFactory.html │ │ │ │ │ │ └── PlainSocketFactory.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── ssl │ │ │ │ │ ├── AbstractVerifier.html │ │ │ │ │ ├── AllowAllHostnameVerifier.html │ │ │ │ │ ├── BrowserCompatHostnameVerifier.html │ │ │ │ │ ├── SSLInitializationException.html │ │ │ │ │ ├── SSLSocketFactory.html │ │ │ │ │ ├── StrictHostnameVerifier.html │ │ │ │ │ ├── TrustSelfSignedStrategy.html │ │ │ │ │ ├── TrustStrategy.html │ │ │ │ │ ├── X509HostnameVerifier.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ ├── AbstractVerifier.html │ │ │ │ │ │ ├── AllowAllHostnameVerifier.html │ │ │ │ │ │ ├── BrowserCompatHostnameVerifier.html │ │ │ │ │ │ ├── SSLInitializationException.html │ │ │ │ │ │ ├── SSLSocketFactory.html │ │ │ │ │ │ ├── StrictHostnameVerifier.html │ │ │ │ │ │ ├── TrustSelfSignedStrategy.html │ │ │ │ │ │ ├── TrustStrategy.html │ │ │ │ │ │ └── X509HostnameVerifier.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ └── util │ │ │ │ │ ├── InetAddressUtils.html │ │ │ │ │ ├── class-use │ │ │ │ │ └── InetAddressUtils.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── cookie │ │ │ │ ├── ClientCookie.html │ │ │ │ ├── Cookie.html │ │ │ │ ├── CookieAttributeHandler.html │ │ │ │ ├── CookieIdentityComparator.html │ │ │ │ ├── CookieOrigin.html │ │ │ │ ├── CookiePathComparator.html │ │ │ │ ├── CookieRestrictionViolationException.html │ │ │ │ ├── CookieSpec.html │ │ │ │ ├── CookieSpecFactory.html │ │ │ │ ├── CookieSpecProvider.html │ │ │ │ ├── CookieSpecRegistry.html │ │ │ │ ├── MalformedCookieException.html │ │ │ │ ├── SM.html │ │ │ │ ├── SetCookie.html │ │ │ │ ├── SetCookie2.html │ │ │ │ ├── class-use │ │ │ │ │ ├── ClientCookie.html │ │ │ │ │ ├── Cookie.html │ │ │ │ │ ├── CookieAttributeHandler.html │ │ │ │ │ ├── CookieIdentityComparator.html │ │ │ │ │ ├── CookieOrigin.html │ │ │ │ │ ├── CookiePathComparator.html │ │ │ │ │ ├── CookieRestrictionViolationException.html │ │ │ │ │ ├── CookieSpec.html │ │ │ │ │ ├── CookieSpecFactory.html │ │ │ │ │ ├── CookieSpecProvider.html │ │ │ │ │ ├── CookieSpecRegistry.html │ │ │ │ │ ├── MalformedCookieException.html │ │ │ │ │ ├── SM.html │ │ │ │ │ ├── SetCookie.html │ │ │ │ │ └── SetCookie2.html │ │ │ │ ├── package-frame.html │ │ │ │ ├── package-summary.html │ │ │ │ ├── package-tree.html │ │ │ │ ├── package-use.html │ │ │ │ └── params │ │ │ │ │ ├── CookieSpecPNames.html │ │ │ │ │ ├── CookieSpecParamBean.html │ │ │ │ │ ├── class-use │ │ │ │ │ ├── CookieSpecPNames.html │ │ │ │ │ └── CookieSpecParamBean.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── entity │ │ │ │ └── mime │ │ │ │ │ ├── FormBodyPart.html │ │ │ │ │ ├── Header.html │ │ │ │ │ ├── HttpMultipart.html │ │ │ │ │ ├── HttpMultipartMode.html │ │ │ │ │ ├── MIME.html │ │ │ │ │ ├── MinimalField.html │ │ │ │ │ ├── MultipartEntity.html │ │ │ │ │ ├── MultipartEntityBuilder.html │ │ │ │ │ ├── class-use │ │ │ │ │ ├── FormBodyPart.html │ │ │ │ │ ├── Header.html │ │ │ │ │ ├── HttpMultipart.html │ │ │ │ │ ├── HttpMultipartMode.html │ │ │ │ │ ├── MIME.html │ │ │ │ │ ├── MinimalField.html │ │ │ │ │ ├── MultipartEntity.html │ │ │ │ │ └── MultipartEntityBuilder.html │ │ │ │ │ ├── content │ │ │ │ │ ├── AbstractContentBody.html │ │ │ │ │ ├── ByteArrayBody.html │ │ │ │ │ ├── ContentBody.html │ │ │ │ │ ├── ContentDescriptor.html │ │ │ │ │ ├── FileBody.html │ │ │ │ │ ├── InputStreamBody.html │ │ │ │ │ ├── StringBody.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ ├── AbstractContentBody.html │ │ │ │ │ │ ├── ByteArrayBody.html │ │ │ │ │ │ ├── ContentBody.html │ │ │ │ │ │ ├── ContentDescriptor.html │ │ │ │ │ │ ├── FileBody.html │ │ │ │ │ │ ├── InputStreamBody.html │ │ │ │ │ │ └── StringBody.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ └── impl │ │ │ │ ├── auth │ │ │ │ ├── AuthSchemeBase.html │ │ │ │ ├── BasicScheme.html │ │ │ │ ├── BasicSchemeFactory.html │ │ │ │ ├── DigestScheme.html │ │ │ │ ├── DigestSchemeFactory.html │ │ │ │ ├── GGSSchemeBase.html │ │ │ │ ├── KerberosScheme.html │ │ │ │ ├── KerberosSchemeFactory.html │ │ │ │ ├── NTLMEngine.html │ │ │ │ ├── NTLMEngineException.html │ │ │ │ ├── NTLMScheme.html │ │ │ │ ├── NTLMSchemeFactory.html │ │ │ │ ├── NegotiateScheme.html │ │ │ │ ├── NegotiateSchemeFactory.html │ │ │ │ ├── RFC2617Scheme.html │ │ │ │ ├── SPNegoScheme.html │ │ │ │ ├── SPNegoSchemeFactory.html │ │ │ │ ├── SpnegoTokenGenerator.html │ │ │ │ ├── UnsupportedDigestAlgorithmException.html │ │ │ │ ├── class-use │ │ │ │ │ ├── AuthSchemeBase.html │ │ │ │ │ ├── BasicScheme.html │ │ │ │ │ ├── BasicSchemeFactory.html │ │ │ │ │ ├── DigestScheme.html │ │ │ │ │ ├── DigestSchemeFactory.html │ │ │ │ │ ├── GGSSchemeBase.html │ │ │ │ │ ├── KerberosScheme.html │ │ │ │ │ ├── KerberosSchemeFactory.html │ │ │ │ │ ├── NTLMEngine.html │ │ │ │ │ ├── NTLMEngineException.html │ │ │ │ │ ├── NTLMScheme.html │ │ │ │ │ ├── NTLMSchemeFactory.html │ │ │ │ │ ├── NegotiateScheme.html │ │ │ │ │ ├── NegotiateSchemeFactory.html │ │ │ │ │ ├── RFC2617Scheme.html │ │ │ │ │ ├── SPNegoScheme.html │ │ │ │ │ ├── SPNegoSchemeFactory.html │ │ │ │ │ ├── SpnegoTokenGenerator.html │ │ │ │ │ └── UnsupportedDigestAlgorithmException.html │ │ │ │ ├── package-frame.html │ │ │ │ ├── package-summary.html │ │ │ │ ├── package-tree.html │ │ │ │ └── package-use.html │ │ │ │ ├── client │ │ │ │ ├── AIMDBackoffManager.html │ │ │ │ ├── AbstractAuthenticationHandler.html │ │ │ │ ├── AbstractHttpClient.html │ │ │ │ ├── AutoRetryHttpClient.html │ │ │ │ ├── BasicAuthCache.html │ │ │ │ ├── BasicCookieStore.html │ │ │ │ ├── BasicCredentialsProvider.html │ │ │ │ ├── BasicResponseHandler.html │ │ │ │ ├── ClientParamsStack.html │ │ │ │ ├── CloseableHttpClient.html │ │ │ │ ├── ContentEncodingHttpClient.html │ │ │ │ ├── DecompressingHttpClient.html │ │ │ │ ├── DefaultBackoffStrategy.html │ │ │ │ ├── DefaultConnectionKeepAliveStrategy.html │ │ │ │ ├── DefaultHttpClient.html │ │ │ │ ├── DefaultHttpRequestRetryHandler.html │ │ │ │ ├── DefaultProxyAuthenticationHandler.html │ │ │ │ ├── DefaultRedirectHandler.html │ │ │ │ ├── DefaultRedirectStrategy.html │ │ │ │ ├── DefaultRequestDirector.html │ │ │ │ ├── DefaultServiceUnavailableRetryStrategy.html │ │ │ │ ├── DefaultTargetAuthenticationHandler.html │ │ │ │ ├── DefaultUserTokenHandler.html │ │ │ │ ├── EntityEnclosingRequestWrapper.html │ │ │ │ ├── HttpAuthenticator.html │ │ │ │ ├── HttpClientBuilder.html │ │ │ │ ├── HttpClients.html │ │ │ │ ├── LaxRedirectStrategy.html │ │ │ │ ├── NoopUserTokenHandler.html │ │ │ │ ├── NullBackoffStrategy.html │ │ │ │ ├── ProxyAuthenticationStrategy.html │ │ │ │ ├── ProxyClient.html │ │ │ │ ├── RedirectLocations.html │ │ │ │ ├── RequestWrapper.html │ │ │ │ ├── RoutedRequest.html │ │ │ │ ├── StandardHttpRequestRetryHandler.html │ │ │ │ ├── SystemDefaultHttpClient.html │ │ │ │ ├── TargetAuthenticationStrategy.html │ │ │ │ ├── TunnelRefusedException.html │ │ │ │ ├── cache │ │ │ │ │ ├── BasicHttpCacheStorage.html │ │ │ │ │ ├── CacheConfig.Builder.html │ │ │ │ │ ├── CacheConfig.html │ │ │ │ │ ├── CachingExec.html │ │ │ │ │ ├── CachingHttpClient.html │ │ │ │ │ ├── CachingHttpClientBuilder.html │ │ │ │ │ ├── CachingHttpClients.html │ │ │ │ │ ├── DefaultHttpCacheEntrySerializer.html │ │ │ │ │ ├── FileResource.html │ │ │ │ │ ├── FileResourceFactory.html │ │ │ │ │ ├── HeapResource.html │ │ │ │ │ ├── HeapResourceFactory.html │ │ │ │ │ ├── ManagedHttpCacheStorage.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ ├── BasicHttpCacheStorage.html │ │ │ │ │ │ ├── CacheConfig.Builder.html │ │ │ │ │ │ ├── CacheConfig.html │ │ │ │ │ │ ├── CachingExec.html │ │ │ │ │ │ ├── CachingHttpClient.html │ │ │ │ │ │ ├── CachingHttpClientBuilder.html │ │ │ │ │ │ ├── CachingHttpClients.html │ │ │ │ │ │ ├── DefaultHttpCacheEntrySerializer.html │ │ │ │ │ │ ├── FileResource.html │ │ │ │ │ │ ├── FileResourceFactory.html │ │ │ │ │ │ ├── HeapResource.html │ │ │ │ │ │ ├── HeapResourceFactory.html │ │ │ │ │ │ └── ManagedHttpCacheStorage.html │ │ │ │ │ ├── ehcache │ │ │ │ │ │ ├── EhcacheHttpCacheStorage.html │ │ │ │ │ │ ├── class-use │ │ │ │ │ │ │ └── EhcacheHttpCacheStorage.html │ │ │ │ │ │ ├── package-frame.html │ │ │ │ │ │ ├── package-summary.html │ │ │ │ │ │ ├── package-tree.html │ │ │ │ │ │ └── package-use.html │ │ │ │ │ ├── memcached │ │ │ │ │ │ ├── KeyHashingScheme.html │ │ │ │ │ │ ├── MemcachedCacheEntry.html │ │ │ │ │ │ ├── MemcachedCacheEntryFactory.html │ │ │ │ │ │ ├── MemcachedCacheEntryFactoryImpl.html │ │ │ │ │ │ ├── MemcachedCacheEntryImpl.html │ │ │ │ │ │ ├── MemcachedHttpCacheStorage.html │ │ │ │ │ │ ├── MemcachedKeyHashingException.html │ │ │ │ │ │ ├── MemcachedSerializationException.html │ │ │ │ │ │ ├── PrefixKeyHashingScheme.html │ │ │ │ │ │ ├── SHA256KeyHashingScheme.html │ │ │ │ │ │ ├── class-use │ │ │ │ │ │ │ ├── KeyHashingScheme.html │ │ │ │ │ │ │ ├── MemcachedCacheEntry.html │ │ │ │ │ │ │ ├── MemcachedCacheEntryFactory.html │ │ │ │ │ │ │ ├── MemcachedCacheEntryFactoryImpl.html │ │ │ │ │ │ │ ├── MemcachedCacheEntryImpl.html │ │ │ │ │ │ │ ├── MemcachedHttpCacheStorage.html │ │ │ │ │ │ │ ├── MemcachedKeyHashingException.html │ │ │ │ │ │ │ ├── MemcachedSerializationException.html │ │ │ │ │ │ │ ├── PrefixKeyHashingScheme.html │ │ │ │ │ │ │ └── SHA256KeyHashingScheme.html │ │ │ │ │ │ ├── package-frame.html │ │ │ │ │ │ ├── package-summary.html │ │ │ │ │ │ ├── package-tree.html │ │ │ │ │ │ └── package-use.html │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── class-use │ │ │ │ │ ├── AIMDBackoffManager.html │ │ │ │ │ ├── AbstractAuthenticationHandler.html │ │ │ │ │ ├── AbstractHttpClient.html │ │ │ │ │ ├── AutoRetryHttpClient.html │ │ │ │ │ ├── BasicAuthCache.html │ │ │ │ │ ├── BasicCookieStore.html │ │ │ │ │ ├── BasicCredentialsProvider.html │ │ │ │ │ ├── BasicResponseHandler.html │ │ │ │ │ ├── ClientParamsStack.html │ │ │ │ │ ├── CloseableHttpClient.html │ │ │ │ │ ├── ContentEncodingHttpClient.html │ │ │ │ │ ├── DecompressingHttpClient.html │ │ │ │ │ ├── DefaultBackoffStrategy.html │ │ │ │ │ ├── DefaultConnectionKeepAliveStrategy.html │ │ │ │ │ ├── DefaultHttpClient.html │ │ │ │ │ ├── DefaultHttpRequestRetryHandler.html │ │ │ │ │ ├── DefaultProxyAuthenticationHandler.html │ │ │ │ │ ├── DefaultRedirectHandler.html │ │ │ │ │ ├── DefaultRedirectStrategy.html │ │ │ │ │ ├── DefaultRequestDirector.html │ │ │ │ │ ├── DefaultServiceUnavailableRetryStrategy.html │ │ │ │ │ ├── DefaultTargetAuthenticationHandler.html │ │ │ │ │ ├── DefaultUserTokenHandler.html │ │ │ │ │ ├── EntityEnclosingRequestWrapper.html │ │ │ │ │ ├── HttpAuthenticator.html │ │ │ │ │ ├── HttpClientBuilder.html │ │ │ │ │ ├── HttpClients.html │ │ │ │ │ ├── LaxRedirectStrategy.html │ │ │ │ │ ├── NoopUserTokenHandler.html │ │ │ │ │ ├── NullBackoffStrategy.html │ │ │ │ │ ├── ProxyAuthenticationStrategy.html │ │ │ │ │ ├── ProxyClient.html │ │ │ │ │ ├── RedirectLocations.html │ │ │ │ │ ├── RequestWrapper.html │ │ │ │ │ ├── RoutedRequest.html │ │ │ │ │ ├── StandardHttpRequestRetryHandler.html │ │ │ │ │ ├── SystemDefaultHttpClient.html │ │ │ │ │ ├── TargetAuthenticationStrategy.html │ │ │ │ │ └── TunnelRefusedException.html │ │ │ │ ├── package-frame.html │ │ │ │ ├── package-summary.html │ │ │ │ ├── package-tree.html │ │ │ │ └── package-use.html │ │ │ │ ├── conn │ │ │ │ ├── AbstractClientConnAdapter.html │ │ │ │ ├── AbstractPoolEntry.html │ │ │ │ ├── AbstractPooledConnAdapter.html │ │ │ │ ├── BasicClientConnectionManager.html │ │ │ │ ├── BasicHttpClientConnectionManager.html │ │ │ │ ├── ConnectionShutdownException.html │ │ │ │ ├── DefaultClientConnection.html │ │ │ │ ├── DefaultClientConnectionFactory.html │ │ │ │ ├── DefaultClientConnectionOperator.html │ │ │ │ ├── DefaultHttpResponseParser.html │ │ │ │ ├── DefaultHttpResponseParserFactory.html │ │ │ │ ├── DefaultHttpRoutePlanner.html │ │ │ │ ├── DefaultProxyRoutePlanner.html │ │ │ │ ├── DefaultResponseParser.html │ │ │ │ ├── DefaultRoutePlanner.html │ │ │ │ ├── DefaultSchemePortResolver.html │ │ │ │ ├── IdleConnectionHandler.html │ │ │ │ ├── InMemoryDnsResolver.html │ │ │ │ ├── LoggingInputStream.html │ │ │ │ ├── LoggingOutputStream.html │ │ │ │ ├── LoggingSessionInputBuffer.html │ │ │ │ ├── LoggingSessionOutputBuffer.html │ │ │ │ ├── PoolingClientConnectionManager.html │ │ │ │ ├── PoolingHttpClientConnectionManager.html │ │ │ │ ├── ProxySelectorRoutePlanner.html │ │ │ │ ├── SchemeRegistryFactory.html │ │ │ │ ├── SingleClientConnManager.ConnAdapter.html │ │ │ │ ├── SingleClientConnManager.PoolEntry.html │ │ │ │ ├── SingleClientConnManager.html │ │ │ │ ├── SystemDefaultDnsResolver.html │ │ │ │ ├── SystemDefaultRoutePlanner.html │ │ │ │ ├── Wire.html │ │ │ │ ├── class-use │ │ │ │ │ ├── AbstractClientConnAdapter.html │ │ │ │ │ ├── AbstractPoolEntry.html │ │ │ │ │ ├── AbstractPooledConnAdapter.html │ │ │ │ │ ├── BasicClientConnectionManager.html │ │ │ │ │ ├── BasicHttpClientConnectionManager.html │ │ │ │ │ ├── ConnectionShutdownException.html │ │ │ │ │ ├── DefaultClientConnection.html │ │ │ │ │ ├── DefaultClientConnectionFactory.html │ │ │ │ │ ├── DefaultClientConnectionOperator.html │ │ │ │ │ ├── DefaultHttpResponseParser.html │ │ │ │ │ ├── DefaultHttpResponseParserFactory.html │ │ │ │ │ ├── DefaultHttpRoutePlanner.html │ │ │ │ │ ├── DefaultProxyRoutePlanner.html │ │ │ │ │ ├── DefaultResponseParser.html │ │ │ │ │ ├── DefaultRoutePlanner.html │ │ │ │ │ ├── DefaultSchemePortResolver.html │ │ │ │ │ ├── IdleConnectionHandler.html │ │ │ │ │ ├── InMemoryDnsResolver.html │ │ │ │ │ ├── LoggingInputStream.html │ │ │ │ │ ├── LoggingOutputStream.html │ │ │ │ │ ├── LoggingSessionInputBuffer.html │ │ │ │ │ ├── LoggingSessionOutputBuffer.html │ │ │ │ │ ├── PoolingClientConnectionManager.html │ │ │ │ │ ├── PoolingHttpClientConnectionManager.html │ │ │ │ │ ├── ProxySelectorRoutePlanner.html │ │ │ │ │ ├── SchemeRegistryFactory.html │ │ │ │ │ ├── SingleClientConnManager.ConnAdapter.html │ │ │ │ │ ├── SingleClientConnManager.PoolEntry.html │ │ │ │ │ ├── SingleClientConnManager.html │ │ │ │ │ ├── SystemDefaultDnsResolver.html │ │ │ │ │ ├── SystemDefaultRoutePlanner.html │ │ │ │ │ └── Wire.html │ │ │ │ ├── package-frame.html │ │ │ │ ├── package-summary.html │ │ │ │ ├── package-tree.html │ │ │ │ ├── package-use.html │ │ │ │ └── tsccm │ │ │ │ │ ├── AbstractConnPool.html │ │ │ │ │ ├── BasicPoolEntry.html │ │ │ │ │ ├── BasicPoolEntryRef.html │ │ │ │ │ ├── BasicPooledConnAdapter.html │ │ │ │ │ ├── ConnPoolByRoute.html │ │ │ │ │ ├── PoolEntryRequest.html │ │ │ │ │ ├── RouteSpecificPool.html │ │ │ │ │ ├── ThreadSafeClientConnManager.html │ │ │ │ │ ├── WaitingThread.html │ │ │ │ │ ├── WaitingThreadAborter.html │ │ │ │ │ ├── class-use │ │ │ │ │ ├── AbstractConnPool.html │ │ │ │ │ ├── BasicPoolEntry.html │ │ │ │ │ ├── BasicPoolEntryRef.html │ │ │ │ │ ├── BasicPooledConnAdapter.html │ │ │ │ │ ├── ConnPoolByRoute.html │ │ │ │ │ ├── PoolEntryRequest.html │ │ │ │ │ ├── RouteSpecificPool.html │ │ │ │ │ ├── ThreadSafeClientConnManager.html │ │ │ │ │ ├── WaitingThread.html │ │ │ │ │ └── WaitingThreadAborter.html │ │ │ │ │ ├── doc-files │ │ │ │ │ └── tsccm-structure.png │ │ │ │ │ ├── package-frame.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── cookie │ │ │ │ ├── AbstractCookieAttributeHandler.html │ │ │ │ ├── AbstractCookieSpec.html │ │ │ │ ├── BasicClientCookie.html │ │ │ │ ├── BasicClientCookie2.html │ │ │ │ ├── BasicCommentHandler.html │ │ │ │ ├── BasicDomainHandler.html │ │ │ │ ├── BasicExpiresHandler.html │ │ │ │ ├── BasicMaxAgeHandler.html │ │ │ │ ├── BasicPathHandler.html │ │ │ │ ├── BasicSecureHandler.html │ │ │ │ ├── BestMatchSpec.html │ │ │ │ ├── BestMatchSpecFactory.html │ │ │ │ ├── BrowserCompatSpec.html │ │ │ │ ├── BrowserCompatSpecFactory.html │ │ │ │ ├── BrowserCompatVersionAttributeHandler.html │ │ │ │ ├── CookieSpecBase.html │ │ │ │ ├── DateParseException.html │ │ │ │ ├── DateUtils.html │ │ │ │ ├── IgnoreSpec.html │ │ │ │ ├── IgnoreSpecFactory.html │ │ │ │ ├── NetscapeDomainHandler.html │ │ │ │ ├── NetscapeDraftHeaderParser.html │ │ │ │ ├── NetscapeDraftSpec.html │ │ │ │ ├── NetscapeDraftSpecFactory.html │ │ │ │ ├── PublicSuffixFilter.html │ │ │ │ ├── PublicSuffixListParser.html │ │ │ │ ├── RFC2109DomainHandler.html │ │ │ │ ├── RFC2109Spec.html │ │ │ │ ├── RFC2109SpecFactory.html │ │ │ │ ├── RFC2109VersionHandler.html │ │ │ │ ├── RFC2965CommentUrlAttributeHandler.html │ │ │ │ ├── RFC2965DiscardAttributeHandler.html │ │ │ │ ├── RFC2965DomainAttributeHandler.html │ │ │ │ ├── RFC2965PortAttributeHandler.html │ │ │ │ ├── RFC2965Spec.html │ │ │ │ ├── RFC2965SpecFactory.html │ │ │ │ ├── RFC2965VersionAttributeHandler.html │ │ │ │ ├── class-use │ │ │ │ │ ├── AbstractCookieAttributeHandler.html │ │ │ │ │ ├── AbstractCookieSpec.html │ │ │ │ │ ├── BasicClientCookie.html │ │ │ │ │ ├── BasicClientCookie2.html │ │ │ │ │ ├── BasicCommentHandler.html │ │ │ │ │ ├── BasicDomainHandler.html │ │ │ │ │ ├── BasicExpiresHandler.html │ │ │ │ │ ├── BasicMaxAgeHandler.html │ │ │ │ │ ├── BasicPathHandler.html │ │ │ │ │ ├── BasicSecureHandler.html │ │ │ │ │ ├── BestMatchSpec.html │ │ │ │ │ ├── BestMatchSpecFactory.html │ │ │ │ │ ├── BrowserCompatSpec.html │ │ │ │ │ ├── BrowserCompatSpecFactory.html │ │ │ │ │ ├── BrowserCompatVersionAttributeHandler.html │ │ │ │ │ ├── CookieSpecBase.html │ │ │ │ │ ├── DateParseException.html │ │ │ │ │ ├── DateUtils.html │ │ │ │ │ ├── IgnoreSpec.html │ │ │ │ │ ├── IgnoreSpecFactory.html │ │ │ │ │ ├── NetscapeDomainHandler.html │ │ │ │ │ ├── NetscapeDraftHeaderParser.html │ │ │ │ │ ├── NetscapeDraftSpec.html │ │ │ │ │ ├── NetscapeDraftSpecFactory.html │ │ │ │ │ ├── PublicSuffixFilter.html │ │ │ │ │ ├── PublicSuffixListParser.html │ │ │ │ │ ├── RFC2109DomainHandler.html │ │ │ │ │ ├── RFC2109Spec.html │ │ │ │ │ ├── RFC2109SpecFactory.html │ │ │ │ │ ├── RFC2109VersionHandler.html │ │ │ │ │ ├── RFC2965CommentUrlAttributeHandler.html │ │ │ │ │ ├── RFC2965DiscardAttributeHandler.html │ │ │ │ │ ├── RFC2965DomainAttributeHandler.html │ │ │ │ │ ├── RFC2965PortAttributeHandler.html │ │ │ │ │ ├── RFC2965Spec.html │ │ │ │ │ ├── RFC2965SpecFactory.html │ │ │ │ │ └── RFC2965VersionAttributeHandler.html │ │ │ │ ├── package-frame.html │ │ │ │ ├── package-summary.html │ │ │ │ ├── package-tree.html │ │ │ │ └── package-use.html │ │ │ │ └── execchain │ │ │ │ ├── BackoffStrategyExec.html │ │ │ │ ├── ClientExecChain.html │ │ │ │ ├── HttpAuthenticator.html │ │ │ │ ├── MainClientExec.html │ │ │ │ ├── MinimalClientExec.html │ │ │ │ ├── ProtocolExec.html │ │ │ │ ├── RedirectExec.html │ │ │ │ ├── RequestAbortedException.html │ │ │ │ ├── RetryExec.html │ │ │ │ ├── ServiceUnavailableRetryExec.html │ │ │ │ ├── TunnelRefusedException.html │ │ │ │ ├── class-use │ │ │ │ ├── BackoffStrategyExec.html │ │ │ │ ├── ClientExecChain.html │ │ │ │ ├── HttpAuthenticator.html │ │ │ │ ├── MainClientExec.html │ │ │ │ ├── MinimalClientExec.html │ │ │ │ ├── ProtocolExec.html │ │ │ │ ├── RedirectExec.html │ │ │ │ ├── RequestAbortedException.html │ │ │ │ ├── RetryExec.html │ │ │ │ ├── ServiceUnavailableRetryExec.html │ │ │ │ └── TunnelRefusedException.html │ │ │ │ ├── package-frame.html │ │ │ │ ├── package-summary.html │ │ │ │ ├── package-tree.html │ │ │ │ └── package-use.html │ │ ├── overview-frame.html │ │ ├── overview-summary.html │ │ ├── overview-tree.html │ │ ├── package-list │ │ ├── packages │ │ ├── resources │ │ │ └── inherit.gif │ │ ├── serialized-form.html │ │ └── stylesheet.css │ │ ├── lib │ │ ├── commons-codec-1.6.jar │ │ ├── commons-logging-1.1.1.jar │ │ ├── fluent-hc-4.3-alpha1.jar │ │ ├── httpclient-4.3-alpha1.jar │ │ ├── httpclient-cache-4.3-alpha1.jar │ │ ├── httpcore-4.3-alpha1.jar │ │ └── httpmime-4.3-alpha1.jar │ │ └── tutorial │ │ ├── html │ │ ├── advanced.html │ │ ├── authentication.html │ │ ├── caching.html │ │ ├── connmgmt.html │ │ ├── css │ │ │ └── hc-tutorial.css │ │ ├── fluent.html │ │ ├── fundamentals.html │ │ ├── httpagent.html │ │ ├── images │ │ │ ├── asf_logo_wide.gif │ │ │ └── hc_logo.png │ │ ├── index.html │ │ ├── preface.html │ │ └── statemgmt.html │ │ └── pdf │ │ └── httpclient-tutorial.pdf │ └── src │ └── com │ └── kajigga │ ├── CanvasAPIPost.java │ └── canvasapi │ ├── APIConfig.java │ ├── ImportResponse.java │ ├── ImportSIS.java │ └── RequestWait.java ├── nodejs ├── README.md └── node_import_script.js ├── powershell ├── README.md └── standard_import_standard.ps1 ├── powershell_integration ├── FullBatch.ps1 ├── README.rst ├── convertToUTF8.ps1 ├── powershell-sis-import-diffing.ps1 ├── powershell-sis-import.ps1 └── standard_import_limit_checks.ps1 ├── python_basic ├── README.md ├── account_id.jpg ├── courses.csv └── settings.py ├── python_requestlib ├── README.md └── import_csv.py ├── ruby ├── Gemfile ├── README.md └── sis_script.rb └── vb.net ├── README.md └── VB_dotnet_sendfile.vb /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.gitignore.io/api/ruby,osx,rubymine 2 | 3 | ### Ruby ### 4 | *.gem 5 | *.rbc 6 | 7 | 8 | ### OSX ### 9 | .DS_Store 10 | .AppleDouble 11 | .LSOverride 12 | 13 | # Icon must end with two \r 14 | Icon 15 | 16 | 17 | # Thumbnails 18 | ._* 19 | 20 | # Files that might appear in the root of a volume 21 | .DocumentRevisions-V100 22 | .fseventsd 23 | .Spotlight-V100 24 | .TemporaryItems 25 | .Trashes 26 | .VolumeIcon.icns 27 | 28 | # Directories potentially created on remote AFP share 29 | .AppleDB 30 | .AppleDesktop 31 | Network Trash Folder 32 | Temporary Items 33 | .apdisk 34 | 35 | # Python 36 | *.pyc 37 | *.pyo 38 | api/update_user_sis_ids/ruby/vendor 39 | env 40 | 41 | 42 | #NodeJS 43 | node_modules/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Canvas 2 | Canvas is a new, open-source LMS by Instructure Inc. It is released under the AGPLv3 license for use by anyone interested in learning more about, or using learning management systems. 3 | 4 | This repo is a collection of community-produced plugins and software that others using Canvas might find useful. All software, code, and information contained herein is provided as-is with no warranty. This repository is community produced and managed. Therefore, Instructure, Inc. is in no way responsible for the contents or functionality of this collection, or for providing support for said contents. 5 | 6 | For more information about the Canvas LMS project, please visit the main wiki page: 7 | 8 | [Canvas Github](http://github.com/instructure/canvas-lms/wiki) 9 | 10 | # Important Notes 11 | 12 | All examples and contributions will have a `Working as of XX/XX/XXXX` date that will let you know when the last time it was ran and confirmed working. All pull requests with new scripts or modified scripts are required to have a `Working as of XX/XX/XXXX` date. 13 | 14 | 15 | # Support 16 | As always, all the files are provided AS-IS, without warranty, and without any support beyond this 17 | document and anyone kind enough to help from the community. 18 | 19 | This is an unsupported, community-created project. Keep that in mind. Instructure won't be 20 | able to help you fix or debug this. That said, the community will hopefully help support 21 | and keep both the script and this documentation up-to-date. 22 | 23 | Good luck! 24 | -------------------------------------------------------------------------------- /api/add_login_for_auth_provider/powershell/README.md: -------------------------------------------------------------------------------- 1 | #Add additional login for a specific authentication provider 2 | 3 | This script can be used to add an additional login to a Canvas user for a specific authentication provider. The authentication provider must already be configured in Canvas BEFORE running this script. Please see [Configuring Authentication Providers](https://community.canvaslms.com/docs/DOC-4284). More information on the API used to add authentication provider specific logins is available at [Create User Login](https://canvas.instructure.com/doc/api/logins.html#method.pseudonyms.create). 4 | 5 | The input CSV has 2 required columns and one optional column. An example is provided below: 6 | ``` 7 | user_id,new_login_id,new_sis_id 8 | student_1234,sample_username,new_sis_id 9 | ``` 10 | 11 | * `user_id:` The Canvas or SIS ID for the user on which you would like to add the new login_id 12 | * `new_login_id:` The new login_id for the user. This can be the same as an existing login_id for the user as long as the authentication provider is different. 13 | * `new_sis_id:` (optional field) This column contains the value that will be used as the SIS ID for the new login on the user. The SIS ID must NOT already be in use on any active or deleted login in your Canvas instance. If this column is not included or the value is blank an SIS ID will be auto generated based on the authentication provider ID and the provided user_id. 14 | -------------------------------------------------------------------------------- /api/add_login_for_auth_provider/ruby/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | gem 'typhoeus' 3 | -------------------------------------------------------------------------------- /api/add_login_for_auth_provider/ruby/example.csv: -------------------------------------------------------------------------------- 1 | canvas_user_id,login_id,authentication_provider_id,sis_user_id 2 | 12345,userLogin1234,some_auth_name_or_auth_id,userSis1234 -------------------------------------------------------------------------------- /api/add_parent_as_observer/powershell/README.md: -------------------------------------------------------------------------------- 1 | #Bulk add parents as observers 2 | 3 | This script can be used to add parents as observers en masse. It does this by reading a 4 | CSV file with two columns, _parent_id_ and _student_id_. Here is a sample. 5 | 6 | parent_id,student_id 7 | sis_user_id:rickybobby,sis_user_id:bobby 8 | 9 | 10 | 11 | ## Support 12 | As always, this is provided AS-IS, without warranty, and without any support beyond this 13 | document and anyone kind enough to help from the community. 14 | 15 | This is an unsupported, community-created project. Keep that in mind. Instructure won't be 16 | able to help you fix or debug this. That said, the community will hopefully help support 17 | and keep both the script and this documentation up-to-date. 18 | 19 | Good luck! 20 | -------------------------------------------------------------------------------- /api/add_parent_as_observer/python/README.md: -------------------------------------------------------------------------------- 1 | #Bulk add parents as observers 2 | 3 | This script can be used to add parents as observers en masse. It does this by reading a 4 | CSV file with two columns, _parent_id_ and _student_id_. Here is a sample. 5 | 6 | parent_id,student_id 7 | sis_user_id:rickybobby,sis_user_id:bobby 8 | 9 | 10 | 11 | ## Support 12 | As always, this is provided AS-IS, without warranty, and without any support beyond this 13 | document and anyone kind enough to help from the community. 14 | 15 | This is an unsupported, community-created project. Keep that in mind. Instructure won't be 16 | able to help you fix or debug this. That said, the community will hopefully help support 17 | and keep both the script and this documentation up-to-date. 18 | 19 | Good luck! 20 | -------------------------------------------------------------------------------- /api/add_parent_as_observer/python/update_observers.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # working as of 4/19/2016 3 | 4 | ''' 5 | For reference column headers must be 6 | parent_id,student_id 7 | ''' 8 | 9 | myCsvFile = '/full/path/to/csv/file.csv' # Example: 'API_Testing/users_provisioning.csv' 10 | domain = '.instructure.com' 11 | token = '' 12 | action='add' # Change this to delete if you want to delete observees instead 13 | # of add them 14 | 15 | 16 | #### Don't edit past this unless you know what you're doing 17 | import csv, requests 18 | header = {'Authorization' : 'Bearer {}'.format(token)} 19 | 20 | with open(myCsvFile, 'rb') as csvFile: 21 | csvReader = csv.DictReader(csvFile) 22 | if action == 'add': 23 | rest_action = requests.put 24 | elif action == 'delete': 25 | rest_action = requests.delete 26 | else: 27 | rest_action = requests.get 28 | 29 | for row in csvReader: 30 | baseUrl = 'https://{0}/api/v1/users/{1[parent_id]}/observees/{1[student_id]}'.format(domain,row) 31 | 32 | r = rest_action(baseUrl, headers = header) 33 | # Output progress to the console 34 | print r.json() 35 | -------------------------------------------------------------------------------- /api/associate_courses_to_blueprint_courses/ruby/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'typhoeus' 4 | gem 'byebug' 5 | gem 'colorize' 6 | -------------------------------------------------------------------------------- /api/associate_courses_to_blueprint_courses/ruby/README.md: -------------------------------------------------------------------------------- 1 | # Associate Courses to Blueprint Courses 2 | 3 | Create a 2-column CSV with headers course_id and blueprint_course_id, see sample CSV. 4 | 5 | If you don't have the bundler gem installed, run `gem install bundler` 6 | 7 | Install dependencies with `bundle install`, run script with `ruby associate_course.rb`. 8 | The script will then prompt you to set the Canvas domain, prod/test/beta env, your 9 | api token, and the path to your mapping csv. 10 | 11 | If your csv was formatted properly, you should see the http response codes for each batch of courses 12 | being added to each blueprint course. Keep in mind these are added in batches; so the number of status codes 13 | you see returned in your terminal could be substantially less than the total number of lines in your csv. 14 | -------------------------------------------------------------------------------- /api/associate_courses_to_blueprint_courses/ruby/sample_csv.csv: -------------------------------------------------------------------------------- 1 | course_id,blueprint_course_id 2 | numerical course id, numerical blueprint course id 3 | -------------------------------------------------------------------------------- /api/bulk_assign_avatars/python/requirements.txt: -------------------------------------------------------------------------------- 1 | certifi==2019.9.11 2 | chardet==3.0.4 3 | idna==2.8 4 | requests==2.22.0 5 | urllib3==1.25.6 -------------------------------------------------------------------------------- /api/bulk_assign_avatars/python/sample.csv: -------------------------------------------------------------------------------- 1 | user_id,image_filename,image_filetype 2 | 4098275,DogHouse1.jpg,jpeg 3 | -------------------------------------------------------------------------------- /api/bulk_assign_avatars/ruby/README.md: -------------------------------------------------------------------------------- 1 | 2 | # Bulk Assign avatars 3 | 4 | This script will handle the automation of avatar uploads in bulk. You must provide a csv file with the headers 5 | `user_id_column` and `user_image_column`. Edit the information specified in the script and then run it through the terminal using `ruby bulk_assign_avatars.rb`. 6 | -------------------------------------------------------------------------------- /api/bulk_assign_avatars/ruby/bulk_assign_avatars.rb: -------------------------------------------------------------------------------- 1 | #Working as of 04/12/2016 2 | # Change these 3 | access_token = '' 4 | domain = '' 5 | env = '' 6 | csv_file = '' 7 | 8 | #================ 9 | # Don't edit from here down unless you know what you're doing. 10 | require 'unirest' 11 | require 'csv' 12 | 13 | unless access_token 14 | puts "What is your access token?" 15 | access_token = gets.chomp 16 | end 17 | 18 | unless domain 19 | puts "What is your Canvas domain?" 20 | domain = gets.chomp 21 | end 22 | 23 | unless csv_file 24 | puts "Where is your avatar update CSV located?" 25 | csv_file = gets.chomp 26 | end 27 | 28 | raise "Error: can't locate the update CSV" unless File.exist?(csv_file) 29 | 30 | env != '' ? env << '.' : env 31 | base_url = "https://#{domain}.#{env}instructure.com/api/v1" 32 | test_url = "#{base_url}/accounts/self" 33 | 34 | Unirest.default_header("Authorization", "Bearer #{access_token}") 35 | 36 | # Make generic API call to test token, domain, and env. 37 | test = Unirest.get(test_url) 38 | 39 | raise "Error: The token, domain, or env variables are not set correctly" unless test.code == 200 40 | 41 | CSV.foreach(csv_file, {:headers => true}) do |row| 42 | url = "#{base_url}/users/#{row['user_id_column']}.json" 43 | update = Unirest.put(url, parameters: { "user[avatar][url]" => row['user_image_column'] }) 44 | if update.code == 200 45 | puts "User #{row['user_id_column']}'s avatar updated." 46 | else 47 | puts "User #{row['user_id_column']}'s avatar failed to update." 48 | puts "Moving right along." 49 | end 50 | end 51 | puts "Finished updating avatars." 52 | -------------------------------------------------------------------------------- /api/bulk_course_export/python/courses.in.csv: -------------------------------------------------------------------------------- 1 | course_id 2 | "sis_course_id:c.1371540964.NURS 240" 3 | -------------------------------------------------------------------------------- /api/bulk_course_export/python/courses.out.csv: -------------------------------------------------------------------------------- 1 | course_id,export_url 2 | -------------------------------------------------------------------------------- /api/bulk_course_export/ruby/README.md: -------------------------------------------------------------------------------- 1 | # Bulk Course Export 2 | 3 | When creating the `input_example.csv` there needs to be a column need to be named `course_id` for the courses that need an export package created. 4 | This value is going to be the Canvas course ID shown in the URL when in the course. 5 | 6 | Create a blank CSV file for the output file. It will create two columns, the first being `course_id` which is going to be the Canvas course ID the URL. 7 | The second column is going to be the `export_url` and this will be a direct download URL for the export package. 8 | 9 | Please look at the example CSV files named `input_example.csv` & `output_example.csv` for samples. 10 | -------------------------------------------------------------------------------- /api/bulk_course_export/ruby/input_example.csv: -------------------------------------------------------------------------------- 1 | course_id 2 | 101 3 | -------------------------------------------------------------------------------- /api/bulk_course_export/ruby/output_example.csv: -------------------------------------------------------------------------------- 1 | course_id,export_url 2 | 101,https://school.instructure.com/files/7252/download?download_frd=1&verifier=tWLGz8uT50D46RIqe9ZgM9fwh1JBQieuyUcuJ7QY 3 | -------------------------------------------------------------------------------- /api/bulk_create_announcements_or_discussions/bulk_create_discussions_readme.md: -------------------------------------------------------------------------------- 1 | Bulk Create Discussions/Announcements.readme 2 | 3 | This script will create a discussion or announcement in multiple courses. 4 | 5 | To use the script, generate a CSV that contains a column for canvas_course_id 6 | - This column should be populated with the numeric Canvas course IDs (not SIS IDs) of the targeted courses 7 | 8 | Fill in the User Editable Area in the script to populate what you would like the discussion or announcement to contain, and which type you'd like to create. 9 | 10 | Code notes next to #'s will walk you through the rest. 11 | -------------------------------------------------------------------------------- /api/bulk_delete_groups/README.md: -------------------------------------------------------------------------------- 1 | # Bulk Delete Groups 2 | 3 | This script is for deleting groups that were created through migrated content in course shells. As there is no 4 | SIS ID tied to each group, you will need to create a CSV mapping file (see example) with one column containing the `canvas_group_id` (you can find this from a provisioning report). 5 | 6 | To run the script, first you will need to plug in the variables (see script file). Once that is populated, 7 | run the command `ruby bulk_delete_groups.rb`. Each response will be outputted to the console. 8 | -------------------------------------------------------------------------------- /api/bulk_delete_groups/groups-example.csv: -------------------------------------------------------------------------------- 1 | canvas_group_id 2 | 1 3 | 2 4 | 3 5 | 4 6 | 5 7 | -------------------------------------------------------------------------------- /api/bulk_enable_feature_flags/README.md: -------------------------------------------------------------------------------- 1 | # Bulk Enable Course Feature Flags 2 | 3 | ## Summary 4 | 5 | This script utilizes a CSV file to update the state of course feature flags in bulk. 6 | 7 | ## Setup 8 | 9 | **[bulk-enable-feature-flags.rb](bulk-enable-feature-flags.rb)** 10 | 11 | - `feature` 12 | - The actual feature flag to toggle 13 | - EX: `student_outcome_gradebook` 14 | - Use this API request to GET available feature flags => 15 | 16 | **[courses.csv](courses.csv)** 17 | 18 | Your CSV file should contain the following headers: 19 | 20 | - `course_id` 21 | - value expected - integer 22 | - The ID will be the ID from the course's Canvas URL 23 | - EX: `https://.instructure.com/courses/` 24 | - `status` 25 | - value expected - "off" or "on" 26 | 27 | ## NOTE 28 | 29 | **Features may be locked on the Account level!** 30 | 31 | > Depending on the local settings for feature flags on the account level, your Canvas admins may have "locked" the status of feature flags within a course. If this is the case, you'll see an italicized status for a feature flag instead of a toggle switch. 32 | -------------------------------------------------------------------------------- /api/bulk_enable_feature_flags/courses.csv: -------------------------------------------------------------------------------- 1 | course_id,state 2 | -------------------------------------------------------------------------------- /api/bulk_migration/PowerShell/README.rst: -------------------------------------------------------------------------------- 1 | This PowerShell script will programatically do course migration. It 2 | requires: 3 | 4 | - Powershell version 3 or above 5 | 6 | Setup 7 | ====== 8 | 9 | Step 1: Copy the `course_migration.ps1` file to your sytem. 10 | 11 | Step 2: Edit `course_migration.ps1` to change $token, $outputPath, $migration_base_url, 12 | ,$migration_type, $CSVFile, and $canvas_domain. You could also change the 13 | $source_archive_filename_column and $destination_course_id_column variables. This will 14 | allow you to customize the script to read the columns you add to the CSV file. 15 | 16 | Step 3: Create a CSV file to match the format of the example 17 | `csvfile.csv`. The format is simple, actually, with only two columns: 18 | 19 | source_filename,destination_id 20 | some_archive_filename,somecanvasid 21 | 22 | 23 | -------------------------------------------------------------------------------- /api/bulk_migration/PowerShell/csvfile.csv: -------------------------------------------------------------------------------- 1 | source_filename,destination_id 2 | applied-nuclear-physics-export.imscc,sis_course_id:1013184 3 | -------------------------------------------------------------------------------- /api/bulk_migration/python/csvfile.csv: -------------------------------------------------------------------------------- 1 | source_filename,destination_id 2 | applied-nuclear-physics-export.imscc,sis_course_id:1013184 3 | -------------------------------------------------------------------------------- /api/bulk_publish_courses/README.md: -------------------------------------------------------------------------------- 1 | # Bulk Publish Courses 2 | 3 | This script takes a csv file with one header `sis_course_id` that contains the course id to be published. 4 | 5 | Please see the `example.csv` as a template to structure your CSV file. 6 | -------------------------------------------------------------------------------- /api/bulk_publish_courses/bulk_publish_courses.rb: -------------------------------------------------------------------------------- 1 | #Working as of 04/25/2016 2 | require 'typhoeus' 3 | require 'csv' 4 | require 'json' 5 | 6 | ################################# CHANGE THESE VALUES ########################### 7 | @access_token = '' #your API token that was generated from your account user 8 | @domain = '' #domain.instructure.com, use domain only 9 | @env = '' # leave empty for production, or use beta or test 10 | @csv_file = '' #Use the full path /Users/XXXXX/Path/To/File.csv 11 | ############################## DO NOT CHANGE THESE VALUES ####################### 12 | 13 | @env != '' ? @env << '.' : @env 14 | @base_url = "https://#{@domain}.#{@env}instructure.com/" 15 | 16 | 17 | CSV.foreach(@csv_file, {headers: true}) do |row| 18 | if row['sis_course_id'].nil? 19 | puts 'No data in course SIS id field' 20 | raise 'Valid CSV headers not found (Expecting sis_course_id)' 21 | else 22 | sis_course_id = row['sis_course_id'] 23 | response = Typhoeus.put( 24 | @base_url + "api/v1/accounts/1/courses", 25 | headers: {:authorization => 'Bearer ' + @access_token}, 26 | params: { 27 | 'course_ids[]' => "sis_course_id:#{sis_course_id}", 28 | :event => "offer" 29 | } 30 | ) 31 | 32 | #parse JSON data to save in readable array 33 | data = JSON.parse(response.body) 34 | puts data 35 | end 36 | end 37 | -------------------------------------------------------------------------------- /api/bulk_publish_courses/example.csv: -------------------------------------------------------------------------------- 1 | sis_course_id 2 | Math-101-Fall-16 3 | Engl-250-Fall-16 4 | Hist-495-Spg-17 5 | -------------------------------------------------------------------------------- /api/bulk_reset_courses/python/README.md: -------------------------------------------------------------------------------- 1 | # Bulk Reset Courses 2 | ##Last Working as of 3/5/2019 3 | 4 | This script takes a csv file with one header `course_id`. The id's in this column refer to courses that should be reset via the API. 5 | 6 | Please see the `example.csv` as a template to structure your CSV file. 7 | -------------------------------------------------------------------------------- /api/bulk_reset_courses/python/example.csv: -------------------------------------------------------------------------------- 1 | course_id 2 | 234 3 | 299 4 | sis_course_id:math100-Fall2017 5 | -------------------------------------------------------------------------------- /api/bulk_reset_courses/python/reset_courses.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # working as of 1/19/2016 3 | 4 | import json,csv,os 5 | import requests 6 | 7 | """ 8 | You will need to edit several variables here at the top of this script. 9 | token = the access token from Canvas 10 | CSVFileName = the full path of CSV file 11 | domain = the full domain name you use to access canvas. (i.e. something.instructure.com) 12 | """ 13 | 14 | headers = { 15 | 'Authorization': 'Bearer ' 16 | } 17 | 18 | CSVFileName = "csvfile.csv" # The name of the course copy CSV file. Not the full path 19 | domain = ".instructure.com" 20 | 21 | ####################################################################################### 22 | ####################################################################################### 23 | ################ Don't edit anything past here unless you know what you are doing. 24 | ################ NOTE: No offense, you probably do know what you're doing. This is for 25 | ################ those that do not. 26 | 27 | if __name__ == '__main__': 28 | with open(CSVFileName, 'r') as _f: 29 | course_csv = csv.DictReader(_f) 30 | for course in course_csv: 31 | course_id = course['course_id'] 32 | uri = "https://{0}/api/v1/courses/{1}/reset_content".format(domain, course_id) 33 | result = requests.post(uri, headers=headers) 34 | print(result.json()) 35 | -------------------------------------------------------------------------------- /api/bulk_set_course_tabs/python/README.rst: -------------------------------------------------------------------------------- 1 | This Python script will programatically set the tab sequence (course navigation) for a 2 | list of courses. 3 | 4 | This script requires: 5 | 6 | - Python version 2 or above 7 | - Requests Library (http://docs.python-requests.org/en/latest/) 8 | 9 | This script also multiprocessing to send multiple tab update API requests at a time. 10 | This will make it run faster when there are hundred or thousands of tabs to set. 11 | 12 | Setup 13 | ====== 14 | 15 | Step 1: Copy the `set_tabs.py` file to your system. 16 | 17 | Step 2: Edit `set_tabs.py` to change the variables at the top of the file. 18 | You could also change the source_course_id_column. This will allow you to 19 | customize the script to read the column you add to the CSV file. 20 | 21 | Step 3: Create a CSV file to match the format of the example `csvfile.csv`. Save this as 22 | whatever you set the `template_filename` to. The format is simple, actually, with only one 23 | column: 24 | 25 | 26 | .. csv-table:: Course List 27 | :header: "course_id" 28 | somecanvasid 29 | 30 | 31 | This example uses SIS id's to reference the courses 32 | 33 | .. csv-table:: Course List 34 | :header: "course_id" 35 | 36 | sis_course_id:somesisid 37 | sis_course_id:anothersisid 38 | 39 | This one uses one canvas id and one sis id 40 | 41 | .. csv-table:: Course List 42 | :header: "course_id" 43 | 44 | somecanvasid 45 | sis_course_id:someothersisid 46 | -------------------------------------------------------------------------------- /api/bulk_set_course_tabs/python/csvfile.csv: -------------------------------------------------------------------------------- 1 | course_id 2 | 1277075 3 | 1097657 4 | 1015869 5 | 601026 6 | -------------------------------------------------------------------------------- /api/bulk_set_course_visibility/Ruby/README.md: -------------------------------------------------------------------------------- 1 | This script is designed to bulk-modify the Visibility setting of multiple courses in Canvas. 2 | 3 | Steps: 4 | 1. 5 | Users of this script should navigate to the Settings page of the account/sub-account containing the courses being targeted for visibility changes. 6 | 2. 7 | a. From there, run a Provisioning Report (for Courses) to get a CSV containing the intended course IDs. No additional changes to this CSV will be required so long as it only contains data for courses intended to have their visibility adjusted. Otherwise, remove any lines with extraneous course data from the CSV. 8 | b. Alternatively, a CSV can be generated by hand with one header, "canvas_course_id" (without quotations). Include the numeric course IDs (which appear in a course's URL) for each pertinent course in the column below that header. 9 | 3. 10 | Once a CSV has been generated, simply fill in the blanks indicated in the script file with the proper data, then run the script; it should take a second or so for each course that needs an update. 11 | 12 | Note: This script uses the Typhoeus gem, which it requires in order to run (https://github.com/typhoeus/typhoeus) 13 | -------------------------------------------------------------------------------- /api/bulk_set_syllabus_visibility/Ruby/README.md: -------------------------------------------------------------------------------- 1 | This script is designed to bulk-modify the Visibility setting of multiple courses' syllabi in Canvas. 2 | 3 | Steps: 4 | 1. 5 | Users of this script should navigate to the Settings page of the account/sub-account containing the courses whose syllabi are being targeted for visibility changes. 6 | 2. 7 | a. From there, run a Provisioning Report (for Courses) to get a CSV containing the intended course IDs. No additional changes to this CSV will be required so long as it only contains data for courses containing the syllabi for which you want to adjust the visibility. Otherwise, remove any lines with extraneous course data from the CSV. 8 | b. Alternatively, a CSV can be generated by hand with one header, "canvas_course_id" (without quotations). Include the numeric course IDs (which appear in a course's URL) for each pertinent course in the column below that header. 9 | 3. 10 | Once a CSV has been generated, simply fill in the blanks indicated in the script file with the proper data, then run the script; it should take a second or so for each course that needs an update. 11 | 12 | Note: This script uses the Typhoeus gem, which it requires in order to run (https://github.com/typhoeus/typhoeus) 13 | -------------------------------------------------------------------------------- /api/bulk_update_passwords/python/update_passwords.csv: -------------------------------------------------------------------------------- 1 | sis_user_id,password 2 | wwhite,canvas123 3 | swhite,canvas123 4 | jpinkman,canvas123 5 | sgoodman,canvas123 6 | gfring,canvas123 7 | tsalamanca,canvas123 8 | mehrmantraut,canvas123 -------------------------------------------------------------------------------- /api/bulk_update_passwords/ruby/example_csv.csv: -------------------------------------------------------------------------------- 1 | sis_user_id,sis_login_id,new_password 2 | 12345,example1@email.com,P@ssword 3 | 23456,example2@email.com,P@ssword 4 | -------------------------------------------------------------------------------- /api/bulk_update_user_default_emails/example.csv: -------------------------------------------------------------------------------- 1 | user_id,email 2 | A-1234,test@school.edu -------------------------------------------------------------------------------- /api/bulk_upload_migration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/api/bulk_upload_migration/__init__.py -------------------------------------------------------------------------------- /api/bulk_upload_migration/csvfile.csv: -------------------------------------------------------------------------------- 1 | source 2 | qti_2_1.zip 3 | vista_archive.zip 4 | -------------------------------------------------------------------------------- /api/bulk_upload_migration/qti_2_1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/api/bulk_upload_migration/qti_2_1.zip -------------------------------------------------------------------------------- /api/bulk_upload_migration/vista_archive.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/api/bulk_upload_migration/vista_archive.zip -------------------------------------------------------------------------------- /api/create_instructor_sandboxes/Ruby/sandbox_create.csv: -------------------------------------------------------------------------------- 1 | first_name,last_name,email,sis_id 2 | John,Smith,john@myschool.edu,jsmith123 3 | -------------------------------------------------------------------------------- /api/create_sandbox_courses_without_sisids/README.md: -------------------------------------------------------------------------------- 1 | LAST WORKING AS OF 07/30/2018 2 |

Sandbox Course Creation Script

3 | ============================== 4 | 5 |

General Info

6 | This script can be used to create sandbox courses for teachers. This script will not assign a sis_id for users. The goal is to set the email as the login_id so that if/when an integration happens the sis_id's will be assigned based on login_id. 7 | 8 |

CSV Sample

9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
first_namelast_namelogin_id
JohnJacobjj@example.com
21 | 22 | 23 |

How to run

24 | 1. Run PIP install requests, PIP install csv, and PIP install os (if setting api key to environmental variable) 25 | 2. Set variables required to run 26 | 3. Enjoy 27 | -------------------------------------------------------------------------------- /api/custom_user_data/custom_data.csv: -------------------------------------------------------------------------------- 1 | canvas_user_id,data_id,ns,data 2 | 1,test_data,testing,data -------------------------------------------------------------------------------- /api/custom_user_data/display_custom_data.js: -------------------------------------------------------------------------------- 1 | /* 2 | Community developed script, unsupported by Canvas 3 | Functional as of May 3, 2016 4 | */ 5 | 6 | //Change "test_data" to whatever data id you're using 7 | //Modify the ns parameter to your namespace parameter 8 | //Finally, remove the alert and do whatever you need with data.data 9 | 10 | (function() { 11 | var canvasAPI = "https://example.test.instructure.com/api/v1/users/self/custom_data/test_data?ns=testing"; 12 | $.getJSON( canvasAPI, { 13 | format: "json", 14 | 15 | }) 16 | .done(function(data) { 17 | alert(data.data); 18 | return; 19 | }); 20 | })(); -------------------------------------------------------------------------------- /api/do_course_copy/powershell/README.rst: -------------------------------------------------------------------------------- 1 | This PowerShell script will programatically do course copies. It 2 | requires: 3 | 4 | - Powershell version 3 or above 5 | 6 | Setup 7 | ====== 8 | 9 | Step 1: Copy the `coursecopy.ps1` file to your sytem. 10 | 11 | Step 2: Edit `coursecopy.ps1` to change $canvasURL, $token, $inputFile, $useSISIDs. 12 | 13 | Step 3: Create a CSV file to match the format of the example 14 | `csvfile.csv`. The format is simple, actually, with only two columns: 15 | 16 | source_id,destination_id 17 | somecanvasid,someothercanvasid 18 | 19 | 20 | -------------------------------------------------------------------------------- /api/do_course_copy/powershell/archives/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/api/do_course_copy/powershell/archives/README.md -------------------------------------------------------------------------------- /api/do_course_copy/powershell/csvfile.csv: -------------------------------------------------------------------------------- 1 | source_id,destination_id 2 | 972705,1013184 3 | 972705,1013190 4 | -------------------------------------------------------------------------------- /api/do_course_copy/powershell/logs/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/api/do_course_copy/powershell/logs/README.md -------------------------------------------------------------------------------- /api/do_course_copy/python_multiprocessing/README.rst: -------------------------------------------------------------------------------- 1 | This Python script will programatically do course copies. It 2 | requires: 3 | 4 | - Python version 2 or above 5 | - Requests Library (http://docs.python-requests.org/en/latest/) 6 | 7 | This script also multiprocessing to send multiple course copy API requests at a time. 8 | This will make it run faster when there are hundred or thousands of copies to trigger. 9 | 10 | Setup 11 | ====== 12 | 13 | Step 1: Copy the `coursecopy.py` file to your system. 14 | 15 | Step 2: Edit `coursecopy.py` to change the variables at the top of the file. 16 | You could also change the source_course_id_column and 17 | destination_course_id_column variables. This will allow you to 18 | customize the script to read the columns you add to the CSV file. 19 | 20 | Step 3: Create a CSV file to match the format of the example `csvfile.csv`. Save this as 21 | whatever you set the `template_filename` to. The format is simple, actually, with only two 22 | columns: 23 | 24 | source_id,destination_id 25 | somecanvasid,someothercanvasid 26 | 27 | 28 | This example uses SIS id's to reference the courses 29 | 30 | source_id,destination_id 31 | sis_course_id:somesisid,sis_course_id:someothersisid 32 | 33 | This one uses one canvas id and one sis id 34 | 35 | source_id,destination_id 36 | somecanvasid,sis_course_id:someothersisid 37 | -------------------------------------------------------------------------------- /api/do_course_copy/python_multiprocessing/csvfile.csv: -------------------------------------------------------------------------------- 1 | source_id,destination_id 2 | 8723,4543 3 | -------------------------------------------------------------------------------- /api/do_course_copy/python_simple/README.rst: -------------------------------------------------------------------------------- 1 | This Python script will programatically do course copies. It 2 | requires: 3 | 4 | - Python version 2 or above 5 | - Requests Library (http://docs.python-requests.org/en/latest/) 6 | 7 | Setup 8 | ====== 9 | 10 | Step 1: Copy the `do_course_copy.py` file to your system. 11 | 12 | Step 2: Edit `do_course_copy.py` to change the variables at the top of the file. 13 | You could also change the source_column_name and 14 | destination_column_name variables. This will allow you to 15 | customize the script to read the columns you add to the CSV file. 16 | 17 | Step 3: Create a CSV file to match the format of the example `csvfile.csv`. Save this as 18 | whatever you set the `template_filename` to. The format is simple, actually, with only two 19 | columns: 20 | 21 | source_id,destination_id 22 | somecanvasid,someothercanvasid 23 | 24 | 25 | This example uses SIS id's to reference the courses 26 | 27 | source_id,destination_id 28 | sis_course_id:somesisid,sis_course_id:someothersisid 29 | 30 | This one uses one canvas id and one sis id 31 | 32 | source_id,destination_id 33 | somecanvasid,sis_course_id:someothersisid 34 | -------------------------------------------------------------------------------- /api/do_course_copy/python_simple/do_course_copy.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import sys,csv,json 3 | import requests 4 | 5 | cache_filename = './course_copy_cache.json' 6 | template_filename = './course_copy_template.csv' 7 | source_column_name = 'source_course_id' 8 | destination_column_name = 'destination_course_id' 9 | 10 | user = { 11 | 'domain':'cwt.test.instructure.com', # Change this 12 | 'account_id':'', # Change this 13 | 'access_token':'' # Change this 14 | } 15 | 16 | 17 | #### 18 | ## Stop Editing after this 19 | #### 20 | try: 21 | course_list_done = json.load(open(cache_filename,'r+')) 22 | except ValueError, err: 23 | course_list_done = [] 24 | course_list = csv.DictReader(open(template_filename,'U')) 25 | 26 | # CHANGE THIS 27 | if __name__ == '__main__': 28 | auth_headers = {"Authorization":"Bearer %s" % user['access_token']} 29 | 30 | for _copy in course_list: 31 | key = '::'.join(_copy.values()) 32 | if key in course_list_done: 33 | # Ignore the copy if it has already been done before 34 | print key,'already done' 35 | else: 36 | #destination,source = course 37 | params = {"source_course":_copy[source_column_name]} 38 | copy_url = 'https://%s/api/v1/courses/%s/course_copy' % (user['domain'],_copy[destination_column_name]) 39 | res = requests.post(copy_url,headers=auth_headers,params=params) 40 | if res.status_code==200: 41 | course_list_done.append(key) 42 | 43 | with open(cache_filename,'r+') as outfile: 44 | json.dump(course_list_done, outfile) 45 | #json.dump(course_list_done,open(cache_filename,'w+')) 46 | -------------------------------------------------------------------------------- /api/enroll_as_admins/python/README.md: -------------------------------------------------------------------------------- 1 | #Bulk Enroll Admins 2 | 3 | 4 | ##General Information 5 | 6 | Documentation on the "Create Account Admin" API itself: 7 | 8 | ##Requests Library 9 | 10 | This example makes use of the [Requests](http://docs.python-requests.org/) library, a Python HTTP library "written for human beings". As of this writing, Requests is supported in Python versions 2.6 to 3.3. 11 | 12 | Instructions for installing Requests can be found [here](http://docs.python-requests.org/en/latest/user/install/). If you'd like to learn more about how to use the library itself, take a look at the [Quickstart Guide](http://docs.python-requests.org/en/latest/user/quickstart/). 13 | 14 | 15 | ##Using the Script 16 | 17 | Use this script to assign a large number of Canvas users as admins to their respective account/sub-accounts. Simply update the `` fields with your own information. 18 | 19 | Note that you should use the **SIS ID**, not the Canvas ID, of each user and the account/sub-account you would like to assign them to. See the `example_csv_file.csv` for an idea of what the file should look like. -------------------------------------------------------------------------------- /api/enroll_as_admins/python/enroll_admins.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # works as of 1/15/2016 3 | import csv, json, requests 4 | 5 | log_filename = '' # File to write log to. Example: my_log.txt 6 | csv_filename = '', # Your domain. Example: https://myschool.instructure.com 9 | 'access_token':'' # Example: 1~13eoncw39f32080234hnv230850KLJ823n8H 10 | } 11 | 12 | #################################################### 13 | ### no need to change anything beyond this point ### 14 | #################################################### 15 | 16 | api_path = ['/api/v1/accounts/', '/admins'] 17 | header = {"Authorization" : "Bearer " + user['access_token']} 18 | 19 | if __name__ == '__main__': 20 | with open(csv_filename, 'U') as csv_file: 21 | reader = csv.reader(csv_file) 22 | for rows in reader: 23 | account = 'sis_account_id:' + rows[0] 24 | adminId = 'sis_user_id:' + rows[1] 25 | role = rows[2] 26 | print adminId + ", " + account 27 | print api_path[0] + account + api_path[1] 28 | payload = {'user_id' : adminId, 'send_confirmation' : 0, 'role' : role} 29 | r = requests.post(user['domain'] + api_path[0] + account + api_path[1], headers=header, params=payload) 30 | rjson = json.loads(r.text) 31 | print rjson 32 | print "Added " + rjson['user']['name'] 33 | log = open(log_filename, 'a') 34 | log.write('Added ' + rjson['user']['name'] + ' (' + adminId + ')\n' ) 35 | log.close() 36 | -------------------------------------------------------------------------------- /api/enroll_as_admins/python/example_csv_file.csv: -------------------------------------------------------------------------------- 1 | sgoodman,160122,AccountAdmin 2 | cwhite,1939607,AccountAdmin 3 | wwhite,1935031,AccountAdmin 4 | wwhite2,209201,Principal 5 | swhite,235242,Accountant 6 | jpinkman,985544,Guidance Counselor 7 | gfring,1132870,Guidance Counselor 8 | talquist,266750,Principal 9 | hschrader,513497,AccountAdmin -------------------------------------------------------------------------------- /api/enroll_users_with_canvas_ids/ruby/README.md: -------------------------------------------------------------------------------- 1 | # Enroll users using Canvas IDs for users and sections 2 | 3 | This script allows users to be enrolled into Canvas sections without the need for the user nor the section to have an SIS ID. The script uses the [enrollments API](https://canvas.instructure.com/doc/api/enrollments.html#method.enrollments_api.create) and requires that both Canvas User IDs and Canvas Section IDs be used. 4 | 5 | The input CSV has 3 required columns: 6 | ``` 7 | canvas_user_id,canvas_section_id,role 8 | 123,456,student 9 | ``` 10 | 11 | Please reference `example.csv` 12 | 13 | * canvas_user_id: The Canvas ID (NOT SIS ID) for the user that should be enrolled. 14 | * canvas_section_id: The Canvas ID (NOT SIS ID) for the section into which the user should be enrolled. 15 | * role: The name of the role to be used for the enrollment (See Notes) 16 | 17 | ## Notes 18 | 19 | * Default Canvas roles (student, teacher, ta and designer) are not valid for the enrollment API. As a result, the script will alter these role to the appropriate values at run time if they are detected as input. Custom roles are also supported. 20 | * This script is only designed to add enrollments. It will not delete existing enrollments. 21 | * This script enrolls the user as an active user in the course and does not send a notification about the enrollment to the user. 22 | -------------------------------------------------------------------------------- /api/enroll_users_with_canvas_ids/ruby/example.csv: -------------------------------------------------------------------------------- 1 | canvas_user_id,canvas_section_id,role 2 | 123,456,student 3 | -------------------------------------------------------------------------------- /api/import_account_level_qti/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'bearcat', '>=1.3.3' 4 | -------------------------------------------------------------------------------- /api/import_google_calendar_into_canvas/ruby/README.md: -------------------------------------------------------------------------------- 1 | # Import Google Calendar (.ics) into Canvas 2 | 3 | This script will take all the calendar events in a .ics file and upload them into Canvas. 4 | 5 | # Setup 6 | 7 | You will need to download the .ics file from the Google Calendar. 8 | This will only upload the events into Canvas, it will not automatically keep the events updated. 9 | 10 | In the file, make sure to install the required gems and populate the required fields to run the script. 11 | -------------------------------------------------------------------------------- /api/import_outcomes/README.rst: -------------------------------------------------------------------------------- 1 | Import Outcomes 2 | --------------- 3 | 4 | This folder includes scripts that can import outcomes into Canvas. There are 5 | implementations of this process in the following languages: 6 | 7 | * python. 8 | -------------------------------------------------------------------------------- /api/import_outcomes/python/test.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | #nosetests --cover-html tests# 3 | nosetests tests.test_importer:OutcomeImporterTests --with-coverage --cover-html --cover-html-dir=coverage_output 4 | -------------------------------------------------------------------------------- /api/import_outcomes/python/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/api/import_outcomes/python/tests/__init__.py -------------------------------------------------------------------------------- /api/import_outcomes/python/tests/act_english_calculatio_method.csv: -------------------------------------------------------------------------------- 1 | vendor_guid,outcome_group_vendor_guid,parent_outcome_group_vendor_guid,title,description,calculation_method,calculation_int,mastery_points,1,2,3,4 2015.CS.APPS.1001,2015.CS.write,,2015 Software Apps 1001,This is a descriptions,latest,,3,no competency,some competency,mastery competency,excellent competency -------------------------------------------------------------------------------- /api/import_outcomes/python/tmp_my_cache.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/api/import_outcomes/python/tmp_my_cache.db -------------------------------------------------------------------------------- /api/import_sis_csv_line_by_line/python/README.rst: -------------------------------------------------------------------------------- 1 | Line by Line CSV Importer 2 | -------------------------- 3 | 4 | If you ever need to import a Canvas CSV file one line at a time this script could be useful. 5 | 6 | NOTE: This script uses two 3rd party python modules: requests and clintui 7 | Use pip to install them like this 8 | 9 | pip install requests clint 10 | 11 | Edit the file, setting the DOMAIN and ACCESS_TOKEN. 12 | 13 | Run the script like this: 14 | 15 | ./import_sis_csv_line_by_line.py path/to/csv/file.csv 16 | -------------------------------------------------------------------------------- /api/list_all_admins/python/README.md: -------------------------------------------------------------------------------- 1 | List All Admins 2 | =============================== 3 | 4 | This script demonstrates a proof of concept of fetching and outputting a list 5 | of all admins in a Canvas account. It uses the provisioning report API and 6 | Account Admins API to do it. 7 | 8 | Required Setup 9 | ============== 10 | This python script uses 2 non-default modules, requests and canvas_api. You can 11 | install them both like this. 12 | 13 | .. code:: sh 14 | 15 | pip install requests py_canvas_api 16 | 17 | 18 | Support 19 | ======== 20 | 21 | This is an unsupported, community-created project. Keep that in 22 | mind. Instructure won't be able to help you fix or debug this. 23 | That said, the community will hopefully help support and keep 24 | both the script and this documentation up-to-date. 25 | 26 | Good luck! 27 | 28 | 29 | -------------------------------------------------------------------------------- /api/merge_multiple_users/ruby/README.md: -------------------------------------------------------------------------------- 1 | # Merge Multiple Users 2 | 3 | This script will merge duplicate accounts into a single account using the Canvas API. 4 | 5 | # Setup 6 | When creating the CSV file, there needs to be a column named `merged`, this is going to be the user account you want to become the primary account once merged. 7 | 8 | Another column will need to be named `to_be_merged`, this is going to be the account that is merged into the primary account. 9 | 10 | Please reference the `merge_users.csv` CSV file for an example of how to setup the CSV file. 11 | 12 | *Note:* Headers are required & both columns need to be the SIS ID of the user. 13 | -------------------------------------------------------------------------------- /api/merge_multiple_users/ruby/merge_multiple_users.rb: -------------------------------------------------------------------------------- 1 | # Working as of 12/15/2017 2 | 3 | require 'csv' 4 | require 'typhoeus' 5 | require 'json' 6 | #------------------Replace these values-----------------------------# 7 | 8 | access_token = '' # API token 9 | url = 'https://canvas.instructure.com' # Enter the full URL to the domain you want to merge files. Must begin with https:// 10 | csv_file = 'full/path/to/the/file.csv' # Enter the full path to the file. /Users/XXXXXX/Path/To/File.csv 11 | 12 | #-------------------Do not edit below this line---------------------# 13 | # First column is user account that will be merged into second column. # 14 | raise 'Unable to run script, please check token, and/or URL.' unless Typhoeus.get(url).code == 200 || 302 15 | 16 | raise "Can't locate the CSV file." unless File.exist?(csv_file) 17 | 18 | hydra = Typhoeus::Hydra.new(max_concurrency: 10) 19 | 20 | CSV.foreach(csv_file, { headers: true }) do |row| 21 | 22 | api_call = "#{url}/api/v1/users/sis_user_id:#{row['to_be_merged']}/merge_into/sis_user_id:#{row['merged']}" 23 | merge_api = Typhoeus::Request.new(api_call, method: :put, headers: { Authorization: "Bearer #{access_token}" }) 24 | merge_api.on_complete do |response| 25 | if response.code.eql?(200) 26 | puts "Merged user #{row['to_be_merged']} into #{row['merged']}" 27 | else 28 | puts "Unable to merge #{row['to_be_merged']} into #{row['merged']}, check to verify users exist with correct SIS ID values." 29 | end 30 | end 31 | hydra.queue(merge_api) 32 | end 33 | hydra.run 34 | 35 | puts 'Successfully merged users.' 36 | -------------------------------------------------------------------------------- /api/merge_multiple_users/ruby/merge_users.csv: -------------------------------------------------------------------------------- 1 | merged,to_be_merged 2 | SIS001,SIS002 3 | -------------------------------------------------------------------------------- /api/outcomes_exporter/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'typhoeus' 4 | gem "ffi", ">= 1.9.24" 5 | gem 'byebug' 6 | gem 'ruby-progressbar' 7 | -------------------------------------------------------------------------------- /api/outcomes_exporter/Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | byebug (10.0.2) 5 | ethon (0.11.0) 6 | ffi (>= 1.3.0) 7 | ffi (1.9.25) 8 | ruby-progressbar (1.10.0) 9 | typhoeus (1.3.0) 10 | ethon (>= 0.9.0) 11 | 12 | PLATFORMS 13 | ruby 14 | 15 | DEPENDENCIES 16 | byebug 17 | ffi (>= 1.9.24) 18 | ruby-progressbar 19 | typhoeus 20 | 21 | BUNDLED WITH 22 | 1.17.1 23 | -------------------------------------------------------------------------------- /api/outcomes_exporter/README.md: -------------------------------------------------------------------------------- 1 | # Outcomes exporter 2 | 3 | Running this script will fetch all account-level outcomes and print their attributes to a 4 | CSV file that can then be processed through the existing outcomes importer script. 5 | 6 | If you don't already have the bundler gem, run `gem install bundler`, then navigate to this script directory 7 | and run `bundle install`. Set the values in the script as outlined. 8 | 9 | One funny caveat regarding this script is that there isn't really an API endpoint to fetch all outcomes for a given account. 10 | Because of this, I'm generically setting the id's to be an array of numbers 1-2500. You may need to feel out how many outcomes 11 | live at the account-level, then adjust that array as necessary. You can do this with a little Chrome DevTools/Network tab searching while making an edit to an outcome. This should give you a pretty good idea of the range of ID's you're working with. 12 | 13 | You can then run the script by running `ruby outcome_exporter.rb` 14 | -------------------------------------------------------------------------------- /api/prepopulate_modules/python/README.md: -------------------------------------------------------------------------------- 1 | #Prepopulate Modules 2 | 3 | 4 | ##General Information 5 | This script can be used to prepopulate the Canvas Modules list with Module headings. Preopoulating modules can give instructors a "starting point" and students a consistent experience across courses. 6 | 7 | More importantly, this is a riff on the update_notification_preferences to show the flexibility of this handy script. 8 | 9 | ##Using this script 10 | To run this script, you will need a list of course IDs in the desired term (eg: use the "Unpublished Courses" report before the term begins to generate a list). Additionally, you may want data to prepopulate into modules (eg: number of sessions, course dates). Note: some characters may cause problems (# or ,) and quotes are not necessary -------------------------------------------------------------------------------- /api/prepopulate_modules/python/modules.csv: -------------------------------------------------------------------------------- 1 | course_id,title 2 | 123,"Your module name" -------------------------------------------------------------------------------- /api/pull_course_quizzes/python/pullexams_bycourse-README.txt: -------------------------------------------------------------------------------- 1 | # pullexams_bycourse.py 2 | # 3 | # Usage: python3 pullexams_bycourse.py 4 | # 5 | # Outputs: CSV of exam info with course info to cross-reference 6 | # 7 | # Args: Requires a target (test or prod) and any amount of terms 8 | # Note that terms must match the SIS ID for term in Canvas 9 | # See: https://canvas.instructure.com/doc/api/enrollment_terms.html 10 | # 11 | # Outline: 1. Request and document all courses matching criteria specified 12 | # 2. Request and document all quiz info for courses from 1 13 | # 3. Check quiz due dates against current date to filter further 14 | # 4. Write remaining available quizzes to file 15 | # 16 | # General advice: * Most replacement should happen between <> 17 | # * When you see {} do not remove w/o removing matching .format 18 | # * Careful changing things, infinite loops are possible 19 | # 20 | # Author: Brandon Poulliot 21 | # 22 | # Works as of 9/20/19 23 | -------------------------------------------------------------------------------- /api/run_reports/provisioning_report/python/README.rst: -------------------------------------------------------------------------------- 1 | Pull the Provisioning Report programmatically 2 | =========================================== 3 | This file will start a report, track the status of the report, then save the file to 4 | the local system. 5 | 6 | These are the steps the script follows:: 7 | 8 | Step 1: Start the report 9 | Step 2: Wait for the report to be finished 10 | Step 3: Pull out the file number 11 | Step 4: Pull out the Canvas file info from the files API 12 | Step 5: Finally fetch the file and save it to the output directory 13 | 14 | The requests library is the only non-standard python libary used. It just makes things so 15 | much easier. 16 | 17 | Setup/Usage 18 | =========== 19 | First, edit the following variables:: 20 | - token 21 | - ACCOUNT_ID 22 | - CANVAS_DOMAIN 23 | - OUTPUT_FOLDER 24 | - ENROLLMENT_TERM 25 | - include_deleted_items 26 | - do_accounts 27 | - do_courses 28 | - do_enrollments 29 | - do_sections 30 | - do_terms 31 | - do_users 32 | - do_xlist 33 | - do_group_membership 34 | - do_groups 35 | 36 | Then run the script. 37 | -------------------------------------------------------------------------------- /api/run_reports/sis_export/python/README.rst: -------------------------------------------------------------------------------- 1 | Pull the SIS Export Report programmatically 2 | =========================================== 3 | This file will start a report, track the status of the report, then save the file to 4 | the local system. 5 | 6 | These are the steps the script follows:: 7 | 8 | Step 1: Start the report 9 | Step 2: Wait for the report to be finished 10 | Step 3: Pull out the file number 11 | Step 4: Pull out the Canvas file info from the files API 12 | Step 5: Finally fetch the file and save it to the output directory 13 | 14 | The requests library is the only non-standard python libary used. It just makes things so 15 | much easier. 16 | 17 | Setup/Usage 18 | =========== 19 | First, edit the following variables:: 20 | - token 21 | - ACCOUNT_ID 22 | - CANVAS_DOMAIN 23 | - OUTPUT_FOLDER 24 | - ENROLLMENT_TERM 25 | - include_deleted_items 26 | - do_accounts 27 | - do_courses 28 | - do_enrollments 29 | - do_sections 30 | - do_terms 31 | - do_users 32 | - do_xlist 33 | - do_group_membership 34 | - do_groups 35 | 36 | Then run the script. 37 | -------------------------------------------------------------------------------- /api/schoology_import_cleanup/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'bearcat', '>=1.3.3' 4 | gem 'byebug' 5 | gem 'colorize' 6 | gem 'nokogiri' 7 | gem 'typhoeus' 8 | gem 'activesupport' 9 | -------------------------------------------------------------------------------- /api/update_blank_course_sis_ids/elixir/.gitignore: -------------------------------------------------------------------------------- 1 | # The directory Mix will write compiled artifacts to. 2 | /_build/ 3 | 4 | # If you run "mix test --cover", coverage assets end up here. 5 | /cover/ 6 | 7 | # The directory Mix downloads your dependencies sources to. 8 | /deps/ 9 | 10 | # Where 3rd-party dependencies like ExDoc output generated docs. 11 | /doc/ 12 | 13 | # Ignore .fetch files in case you like to edit your project deps locally. 14 | /.fetch 15 | 16 | # If the VM crashes, it generates a dump, let's ignore it too. 17 | erl_crash.dump 18 | 19 | # Also ignore archive artifacts (built via "mix archive.build"). 20 | *.ez 21 | 22 | -------------------------------------------------------------------------------- /api/update_blank_course_sis_ids/elixir/README.md: -------------------------------------------------------------------------------- 1 | # Update Blank Course SIS Ids 2 | 3 | Last working as of 3/18/2018 4 | 5 | ## Installation 6 | 7 | Ensure the Elixir programming language is installed on your machine 8 | 9 | Create a new CSV file with the headers `sis_id` and `course_id` - 10 | See the sample CSV for details 11 | 12 | Install all dependencies by running `mix deps.get` 13 | 14 | Compile the project by running `mix compile` 15 | 16 | Open the interactive Elixir console by running `iex -S mix`, then to run the 17 | script, `UpdateBlankCourseSisIds.update_courses()` 18 | 19 | The script will then ask you to enter your api token, domain (the name of your 20 | institution as it appears just before `.instructure.com` in your Canvas URL) and 21 | the full filepath to your CSV file. 22 | 23 | To exit the interactive Elixir console, hit ctrl c and select `a` for abort 24 | -------------------------------------------------------------------------------- /api/update_blank_course_sis_ids/elixir/config/config.exs: -------------------------------------------------------------------------------- 1 | # This file is responsible for configuring your application 2 | # and its dependencies with the aid of the Mix.Config module. 3 | use Mix.Config 4 | 5 | # This configuration is loaded before any dependency and is restricted 6 | # to this project. If another project depends on this project, this 7 | # file won't be loaded nor affect the parent project. For this reason, 8 | # if you want to provide default values for your application for 9 | # 3rd-party users, it should be done in your "mix.exs" file. 10 | 11 | # You can configure your application as: 12 | # 13 | # config :update_blank_course_sis_ids, key: :value 14 | # 15 | # and access this configuration in your application as: 16 | # 17 | # Application.get_env(:update_blank_course_sis_ids, :key) 18 | # 19 | # You can also configure a 3rd-party app: 20 | # 21 | # config :logger, level: :info 22 | # 23 | 24 | # It is also possible to import configuration files, relative to this 25 | # directory. For example, you can emulate configuration per environment 26 | # by uncommenting the line below and defining dev.exs, test.exs and such. 27 | # Configuration from the imported file will override the ones defined 28 | # here (which is why it is important to import them last). 29 | # 30 | # import_config "#{Mix.env}.exs" 31 | -------------------------------------------------------------------------------- /api/update_blank_course_sis_ids/elixir/lib/update_blank_course_sis_ids.ex: -------------------------------------------------------------------------------- 1 | defmodule UpdateBlankCourseSisIds do 2 | def update_courses do 3 | token = "enter your api token " |> IO.gets() |> String.trim() 4 | domain = "enter your Canvas domain " |> IO.gets() |> String.trim() 5 | csv = "enter the path to csv " |> IO.gets() |> String.trim() 6 | 7 | item_list = CSV.decode!(File.stream!(csv), headers: true) |> Enum.to_list 8 | 9 | Enum.each item_list, fn course -> 10 | url = "https://#{domain}.instructure.com/api/v1/courses/#{course["course_id"]}" 11 | body = %{course: %{sis_course_id: course["sis_id"]}} |> Poison.encode!() 12 | headers = ["Authorization": "Bearer " <> token, "Content-Type": "application/json"] 13 | response = HTTPoison.put!(url, body, headers, []) 14 | 15 | if response.status_code == 200 do 16 | IO.puts("#{course["course_id"]} successfully updated") 17 | else 18 | IO.puts("#{course["course_id"]} failed") 19 | end 20 | end 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /api/update_blank_course_sis_ids/elixir/mix.exs: -------------------------------------------------------------------------------- 1 | defmodule CanvasScript.Mixfile do 2 | use Mix.Project 3 | 4 | def project do 5 | [ 6 | app: :canvas_script, 7 | version: "0.1.0", 8 | elixir: "~> 1.5", 9 | start_permanent: Mix.env == :prod, 10 | deps: deps() 11 | ] 12 | end 13 | 14 | # Run "mix help compile.app" to learn about applications. 15 | def application do 16 | [ 17 | extra_applications: [:logger] 18 | ] 19 | end 20 | 21 | # Run "mix help deps" to learn about dependencies. 22 | defp deps do 23 | [ 24 | {:csv, "~> 2.0.0"}, 25 | {:httpoison, "~> 1.0"}, 26 | {:poison, "~> 1.0"}, 27 | {:dogma, "~> 0.1", only: :dev} 28 | ] 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /api/update_blank_course_sis_ids/elixir/test/test_helper.exs: -------------------------------------------------------------------------------- 1 | ExUnit.start() 2 | -------------------------------------------------------------------------------- /api/update_blank_course_sis_ids/elixir/test/update_blank_course_sis_ids_test.exs: -------------------------------------------------------------------------------- 1 | defmodule UpdateBlankCourseSisIdsTest do 2 | use ExUnit.Case 3 | doctest UpdateBlankCourseSisIds 4 | 5 | test "greets the world" do 6 | assert UpdateBlankCourseSisIds.hello() == :world 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /api/update_blank_course_sis_ids/python/README.md: -------------------------------------------------------------------------------- 1 | # Update Blank Course SIS ID Values 2 | 3 | Working as of 2021-28-01 4 | 5 | The first column needs to be named `canvas_id`, this will be the Canvas ID that is displayed in the URL of the course. 6 | 7 | The second column need to be named `sis_id`, this will be the new SIS ID for the course. 8 | 9 | Please see the `courseList.csv` as a template to structure your CSV file. 10 | -------------------------------------------------------------------------------- /api/update_blank_course_sis_ids/python/courseList.csv: -------------------------------------------------------------------------------- 1 | canvas_id,sis_id 2 | , -------------------------------------------------------------------------------- /api/update_blank_course_sis_ids/python/updateCourseID.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # Working as of 2021-28-01 3 | 4 | import json,csv,os 5 | import requests 6 | 7 | """ 8 | You will need to edit several variables here at the top of this script. 9 | token = the access token from Canvas 10 | CSVFileName = the full path of CSV file 11 | domain = the full domain name you use to access canvas. (i.e. something.instructure.com) 12 | """ 13 | 14 | headers = { 15 | 'Authorization': 'Bearer ' 16 | } 17 | 18 | CSVFileName = "courseList.csv" # The name of the course copy CSV file. Not the full path 19 | domain = ".instructure.com" 20 | 21 | ####################################################################################### 22 | ####################################################################################### 23 | ################ Don't edit anything past here unless you know what you are doing. 24 | 25 | if __name__ == '__main__': 26 | with open(CSVFileName, 'r') as _f: 27 | course_csv = csv.DictReader(_f) 28 | for course in course_csv: 29 | canvas_id = course['canvas_id'] 30 | sis_id = course['sis_id'] 31 | uri = "https://{0}/api/v1/courses/{1}?course[sis_course_id]={2}".format(domain, canvas_id, sis_id) 32 | result = requests.put(uri, headers=headers) 33 | print(result.json()) 34 | -------------------------------------------------------------------------------- /api/update_blank_course_sis_ids/ruby/README.md: -------------------------------------------------------------------------------- 1 | # Update Blank Course SIS ID Values 2 | 3 | The first column needs to be named `canvas_course_id`, this will be the Canvas ID that is displayed in the URL of the course. 4 | 5 | The second column need to be named `new_course_id`, this will be the new SIS ID for the course. 6 | 7 | Please see the `example.csv` as a template to structure your CSV file. 8 | 9 | *Note:* Both column ID values must be the SIS ID of the course. 10 | -------------------------------------------------------------------------------- /api/update_blank_course_sis_ids/ruby/example.csv: -------------------------------------------------------------------------------- 1 | canvas_course_id,new_course_id 2 | 777,NEWSIS002 3 | -------------------------------------------------------------------------------- /api/update_course_quotas/ruby/README.md: -------------------------------------------------------------------------------- 1 | # Update Course Quotas 2 | 3 | There needs to be a column named `course_id`, this is going to be the SIS ID of the course you want to update the quota for. 4 | 5 | There needs to be a column named `quota`. This column needs to be an integer, and will be converted into MB, so 500 will become 500MB. 6 | 7 | Please see the `example.csv` as a template. 8 | 9 | *Note:* The course_id should be the SIS ID value. 10 | -------------------------------------------------------------------------------- /api/update_course_quotas/ruby/example.csv: -------------------------------------------------------------------------------- 1 | course_id,quota 2 | SIS001,500 3 | -------------------------------------------------------------------------------- /api/update_course_sis_ids/ruby/README.md: -------------------------------------------------------------------------------- 1 | # Update Course SIS ID Values 2 | 3 | The first column needs to be named `old_course_id`. 4 | 5 | The second column need to be named `new_course_id`. 6 | 7 | Please see the `example.csv` as a template to structure your CSV file. 8 | 9 | *Note:* Both column ID values must be the SIS ID of the course. 10 | -------------------------------------------------------------------------------- /api/update_course_sis_ids/ruby/example.csv: -------------------------------------------------------------------------------- 1 | old_course_id,new_course_id 2 | OLDSIS001,NEWSIS002 3 | -------------------------------------------------------------------------------- /api/update_notification_preferences/python/README.md: -------------------------------------------------------------------------------- 1 | #Update Notification Preferences 2 | 3 | 4 | ##General Information 5 | 6 | This script takes a list of users and updates their Canvas notification preferences as you like. Note that the notification preferences you can update through the API are more granular than what you see in the Canvas interface. New notification preferences are also being added regularly, so the "defaults" CSV file in this folder may be (probably is) out of date. They were current as of 9/18/2014. 7 | 8 | ##Using the Script 9 | 10 | Before running this script, you'll need to create two CSV files. The first file will be for your users and have two columns: 11 | 12 | * **user_id**: SIS ID of your user(s) 13 | * **email**: email address of the respective user(s) you would like to update notifications for 14 | 15 | The second file will indicate what notification preferences you want changed and to what frequency. It has three columns: 16 | 17 | * **notification**: name of the notification 18 | * **frequency**: options are 'immediately', 'daily', 'weekly', and 'never' 19 | * **category**: category that the notification belongs to 20 | 21 | In the .py file iteself, you'll also want to update the values assigned in the first few lines of code, as indicated by the inline comments. -------------------------------------------------------------------------------- /api/update_notification_preferences/python/users.csv: -------------------------------------------------------------------------------- 1 | user_id,email 2 | 123456789,test_user@example.com -------------------------------------------------------------------------------- /api/update_section_sis_ids/ruby/README.md: -------------------------------------------------------------------------------- 1 | # Update Section SIS ID Values 2 | 3 | The first column needs to be named `old_section_id`. 4 | 5 | The second column need to be named `new_section_id`. 6 | 7 | Please see the `example.csv` as a template. 8 | 9 | *Note:* Both column ID values must be the SIS ID of the section. 10 | -------------------------------------------------------------------------------- /api/update_section_sis_ids/ruby/example.csv: -------------------------------------------------------------------------------- 1 | old_section_id,new_section_id 2 | OLDSIS001,NEWSIS002 3 | -------------------------------------------------------------------------------- /api/update_user_sis_ids/python/example.csv: -------------------------------------------------------------------------------- 1 | old_user_id,new_user_id 2 | bobbybom-updated,bobbybom-updated 3 | bobbyhash8-updated,bobbyhash8-updated 4 | -------------------------------------------------------------------------------- /api/update_user_sis_ids/ruby/Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | ruby "2.3.7" 4 | gem "typhoeus" 5 | -------------------------------------------------------------------------------- /api/update_user_sis_ids/ruby/Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | ethon (0.11.0) 5 | ffi (>= 1.3.0) 6 | ffi (1.9.25) 7 | typhoeus (1.3.0) 8 | ethon (>= 0.9.0) 9 | 10 | PLATFORMS 11 | ruby 12 | 13 | DEPENDENCIES 14 | typhoeus 15 | 16 | RUBY VERSION 17 | ruby 2.3.7p456 18 | 19 | BUNDLED WITH 20 | 1.17.1 21 | -------------------------------------------------------------------------------- /api/update_user_sis_ids/ruby/example.csv: -------------------------------------------------------------------------------- 1 | old_sis_user_id,new_sis_user_id 2 | 001,002 3 | -------------------------------------------------------------------------------- /api/update_users_timezone/ruby/README.md: -------------------------------------------------------------------------------- 1 | # Update Users Timezones 2 | 3 | Allows you to update users time zones in bulk for a set of users. 4 | 5 | ## Setup 6 | 7 | - Please see the [example CSV](./example.csv) as an example of the required CSV headers. 8 | - Required Headers: 9 | - `user_sis_id` - The user's SIS ID as it appears in Canvas 10 | - `timezone` - The desired timezone formatted either as a [IANA time zone](http://www.iana.org/time-zones) or [Rails](http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html) timezone. 11 | - `America/Denver` is an example a timezone equivalent to `Mountain Time (US & Canada)` 12 | - `America/New_York` is an example a timezone equivalent to `Eastern Time (US & Canada)` 13 | 14 | ## Run 15 | 16 | 1. Ensure your CSV file has the required `user_sis_id` and `timezone` headers. 17 | 2. In a terminal window: `ruby update_users_timezone.rb`. 18 | 3. Prompts will ask you to separately enter a `token` (valid for domain and environment for which the script will run), `domain`, `environment`, and `source file` in order to set variables within the script. 19 | 4. Terminal output should show `Updated user with new time zone settings` for each user in your CSV file. 20 | 5. Last output line should read `Completely Done`. 21 | -------------------------------------------------------------------------------- /api/update_users_timezone/ruby/example.csv: -------------------------------------------------------------------------------- 1 | user_sis_id,timezone 2 | -------------------------------------------------------------------------------- /branding/css/catalog_courses_as_list/README: -------------------------------------------------------------------------------- 1 | # Catalog Courses as List 2 | Adding this CSS to a Catalog Instance will make it display courses in a list format instead of in a tile grid. The list should scale down on mobile devices. 3 | Note: As with any part of Catalog, the links that these CSS Selectors target could change at any time. Be sure to check your beta environment before each production release to be sure that none of your JS/CSS has broken due to an upcoming code change. 4 | 5 | ![Canvas Catalog courses displayed in a list format](screenshot.png) 6 | 7 | ## Support 8 | This is an unsupported, community-created project. Keep that in mind. Instructure won't be able to help you fix or debug this. That said, the community will hopefully help support and keep both the script and this documentation up-to-date. 9 | 10 | Good luck! 11 | -------------------------------------------------------------------------------- /branding/css/catalog_courses_as_list/catalog_courses_as_list.css: -------------------------------------------------------------------------------- 1 | /* Working as of 6/21/19 2 | * Displays Catalog Courses in a list view 3 | * Version 0.1 4 | */ 5 | 6 | #listings .col-md-3, 7 | #listings .col-sm-6, 8 | #listings .col-xs-12 { 9 | width: 100%; 10 | float: none; 11 | } 12 | 13 | #listings .product-tile { 14 | padding: 1%; 15 | } 16 | 17 | #listings .product-image, 18 | #listings .product-account-image-wrapper { 19 | display: none; 20 | } 21 | 22 | #listings .product-heading, 23 | #listings .product-description, 24 | #listings .product-footer { 25 | display: inline-block; 26 | width: auto; 27 | border: 0 none; 28 | margin: 0 1em; 29 | padding: 0; 30 | vertical-align: top; 31 | height: auto; 32 | 33 | } 34 | #listings .product-heading, 35 | #listings .product-footer { 36 | width: 20%; 37 | } 38 | #listings .product-description { 39 | width: calc(60% - 2% - 6em) 40 | } 41 | #listings .product-footer { 42 | width: 20%; 43 | } 44 | -------------------------------------------------------------------------------- /branding/css/catalog_courses_as_list/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/branding/css/catalog_courses_as_list/screenshot.png -------------------------------------------------------------------------------- /branding/css/hide-teacher-self-registration.css: -------------------------------------------------------------------------------- 1 | #signup_student { 2 | position: absolute; 3 | left: 50%; 4 | margin-right: -50%; 5 | transform: translate(-50%, 0); 6 | } 7 | 8 | #signup_teacher { 9 | display: none !important; 10 | } -------------------------------------------------------------------------------- /branding/css/hide_full_batch_check/README.md: -------------------------------------------------------------------------------- 1 | # Hide full batch mode check box 2 | 3 | Adding this CSS to Canvas will hide the full batch mode checkbox in a Canvas instance along with it's corresponding text. 4 | 5 | **Note**: As with any part of Canvas, the links that these CSS Selectors target could change at any time. Be sure to check your beta environment before each production release to be sure that none of your JS/CSS has broken due to an upcoming code change. 6 | 7 | Support 8 | ====== 9 | 10 | This is an unsupported, community-created project. Keep that in mind. 11 | Instructure won't be able to help you fix or debug this. That said, the 12 | community will hopefully help support and keep both the script and this 13 | documentation up-to-date. 14 | 15 | Good luck! 16 | -------------------------------------------------------------------------------- /branding/css/hide_full_batch_check/hide_full_batch.css: -------------------------------------------------------------------------------- 1 | /* This hides the full batch checkbox and text ont he sis import page in Canvas */ 2 | div#batch_check { 3 | display: none; 4 | } -------------------------------------------------------------------------------- /branding/css/hide_help_links/README.md: -------------------------------------------------------------------------------- 1 | # Hide Default Canvas Help Links 2 | 3 | Some institutions don't need one or more of the help links that Canvas displays in the Help menu by default (e.g. institutions with their own help desk may want to remove the "Report a Problem" link and add their own). Use any one of the CSS rules in this file to hide the indicated help link. 4 | 5 | **Note**: As with any part of Canvas, the links that these CSS rules target could change at any time. Be sure to check your beta environment before each production release to be sure that none of your CSS has broken due to an upcoming code change. 6 | 7 | Support 8 | ====== 9 | 10 | This is an unsupported, community-created project. Keep that in mind. 11 | Instructure won't be able to help you fix or debug this. That said, the 12 | community will hopefully help support and keep both the script and this 13 | documentation up-to-date. 14 | 15 | Good luck! 16 | -------------------------------------------------------------------------------- /branding/css/hide_help_links/hide_help_links.css: -------------------------------------------------------------------------------- 1 | /*Working as of 04/12/2016*/ 2 | /* Hide "Ask Your Instructor a Question" */ 3 | #help-dialog-options a[href="#teacher_feedback"] { 4 | display:none !important; 5 | } 6 | 7 | /* Hide "Search the Canvas Guides" */ 8 | #help-dialog-options a[href="https://community.canvaslms.com/community/answers/guides/"] { 9 | display:none !important; 10 | } 11 | 12 | /* Hide "Report a Problem" */ 13 | #help-dialog-options a[href="#create_ticket"] { 14 | display:none !important; 15 | } 16 | 17 | /* Hide "Ask the Community" */ 18 | #help-dialog-options a[href="https://community.canvaslms.com/community/answers"] { 19 | display:none !important; 20 | } 21 | 22 | /* Hide "Request a Feature" */ 23 | #help-dialog-options a[href="https://community.canvaslms.com/community/ideas/feature-ideas"] { 24 | display:none !important; 25 | } 26 | -------------------------------------------------------------------------------- /branding/css/hide_various_course_settings/README.md: -------------------------------------------------------------------------------- 1 | # Hide Various Course Settings 2 | 3 | Some institutions don't need one or more of the course settings options and buttons that Canvas displays in the course settings area. This CSS contains various CSS to hide certian options. Please review the comments in the CSS to see which CSS hides which options. 4 | 5 | **Note**: As with any part of Canvas, the links that these CSS rules target could change at any time. Be sure to check your beta environment before each production release to be sure that none of your CSS has broken due to an upcoming code change. 6 | 7 | Support 8 | ====== 9 | 10 | This is an unsupported, community-created project. Keep that in mind. 11 | Instructure won't be able to help you fix or debug this. That said, the 12 | community will hopefully help support and keep both the script and this 13 | documentation up-to-date. 14 | 15 | Good luck! 16 | -------------------------------------------------------------------------------- /branding/css/hide_various_course_settings/hide_copy_course.css: -------------------------------------------------------------------------------- 1 | /* Hide Copy Course from Course Settings */ 2 | /* Works as of 5/16/2016 */ 3 | 4 | #right-side .copy_course_link { 5 | display: none; 6 | } -------------------------------------------------------------------------------- /branding/css/move_watermark/README.md: -------------------------------------------------------------------------------- 1 | # Move the watermark on a Canvas page 2 | 3 | This is a very simple CSS script that allows the watermark to be moved by it's margins. Feel free to edit and use as you'd like. The watermark can be difficult to target and future UI changes may cause this to fail. 4 | 5 | Support 6 | ====== 7 | 8 | This is an unsupported, community-created project. Keep that in mind. 9 | Instructure won't be able to help you fix or debug this. That said, the 10 | community will hopefully help support and keep both the script and this 11 | documentation up-to-date. 12 | 13 | Good luck! 14 | -------------------------------------------------------------------------------- /branding/css/move_watermark/move_watermark.css: -------------------------------------------------------------------------------- 1 | /* Moves the watermark on a Canvas page */ 2 | 3 | 4 | /* Works as of June 28, 2017 */ 5 | 6 | body:not(.no-headers) .ic-Layout-columns:before { 7 | position: absolute; 8 | margin-bottom: 20%; 9 | margin-left: 5%; 10 | } 11 | -------------------------------------------------------------------------------- /branding/css/user_dashboard_customizations/README.md: -------------------------------------------------------------------------------- 1 | # Canvas User Dashboard Customizations 2 | A simple CSS template to facilitate the most common dashboard style requests in the New UI. 3 | 4 | ## Usage 5 | Change the included values as desired and upload to the Theme Editor (or concatenate to another style sheet). 6 | -------------------------------------------------------------------------------- /branding/discovery_page/README.md: -------------------------------------------------------------------------------- 1 | # Discover Page 2 | 3 | ## What is this? 4 | 5 | You can find more information about Discovery Pages in the Canvas Community: 6 | 7 | "[What is a Discovery Page?](https://community.canvaslms.com/docs/DOC-14067)" 8 | 9 | ## I think I get it, but do you have an example? 10 | 11 | Here is an example of a very basic Discovery Page. In this example we are assuming that your Canvas URL is "canvas.instructure.com". So...if you want to use a copy of this page to use for your Discovery Page then you will need to change your URL at a minimum. Oh...I should also mention that the links on the page are unlikely to work, so don't click them. It is just an example. 12 | 13 | ### [Example Page](example/) 14 | -------------------------------------------------------------------------------- /branding/discovery_page/example/discovery.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #CCE9F3; 3 | font-family: Arial; 4 | } 5 | 6 | .content { 7 | width: 100%; 8 | text-align: center; 9 | margin-top: 30px; 10 | } 11 | 12 | .boxbox { 13 | margin: auto!important; 14 | border: 3px solid #0078E2; 15 | border-radius: 20px; 16 | padding: 10px 40px; 17 | display: inline-block; 18 | background-color: white; 19 | } 20 | 21 | .buttonbox { 22 | margin: auto; 23 | width: 250px; 24 | } 25 | 26 | .pure-button { 27 | border-radius: 5px; 28 | min-width: 250px; 29 | } -------------------------------------------------------------------------------- /branding/discovery_page/example/discovery.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Select your user type to login to Canvas 6 | 7 | 8 | 9 | 10 |
11 |
12 | 13 |

Please select your user type:

14 | 19 |
20 |
21 | 22 | -------------------------------------------------------------------------------- /branding/discovery_page/example/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/branding/discovery_page/example/logo.png -------------------------------------------------------------------------------- /branding/discovery_page/images/canvas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/branding/discovery_page/images/canvas.png -------------------------------------------------------------------------------- /branding/discovery_page/images/multisaml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/branding/discovery_page/images/multisaml.png -------------------------------------------------------------------------------- /branding/discovery_page/images/singlesaml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/branding/discovery_page/images/singlesaml.png -------------------------------------------------------------------------------- /branding/javascript/add_additional_link/add_additional_link.js: -------------------------------------------------------------------------------- 1 | /* 2 | Working as of 03/5/19 3 | 4 | - Adds an additional link to the login screen. 5 | - Replace the "href", "title", and "Custom Display Title" text below 6 | 7 | */ 8 | 9 | $(document).ready(function () { 10 | if (window.location.pathname.search('login')) { 11 | var new_link = $('

Custom Display Title'); 12 | $('#login_forgot_password').parent().parent().append(new_link); 13 | } 14 | }); -------------------------------------------------------------------------------- /branding/javascript/add_additional_link/additional_link_login_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/branding/javascript/add_additional_link/additional_link_login_page.png -------------------------------------------------------------------------------- /branding/javascript/add_button_users/README.md: -------------------------------------------------------------------------------- 1 | Add a button to all pages with /users in the URL 2 | ====== 3 | 4 | Adds an extra link that takes the user to the page with all their grades 5 | 6 | 7 | Support 8 | ====== 9 | 10 | This is an unsupported, community-created project. Keep that in mind. 11 | Instructure won't be able to help you fix or debug this. That said, the 12 | community will hopefully help support and keep both the script and this 13 | documentation up-to-date. 14 | 15 | Good luck! 16 | -------------------------------------------------------------------------------- /branding/javascript/add_button_users/all_grades.js: -------------------------------------------------------------------------------- 1 | ///This will target any page that includes /users in the URL and then adds a button to the right margin and adds a button to display the grades of all classes for the current user 2 | $(document).ready(function() { 3 | if (window.location.pathname.indexOf('/users') > -1) { 4 | var address = '/users/' + window.location.pathname.split('/')[4] + '/grades'; 5 | $('.rs-margin-lr:first-of-type').append(' Text for Button'); 6 | } 7 | }); 8 | -------------------------------------------------------------------------------- /branding/javascript/add_bypass_login/README.md: -------------------------------------------------------------------------------- 1 | Bypass login 2 | ====== 3 | 4 | Adds an extra link that allows users to bypass the login and be directed to the canvas login page (?canvas_login=1). 5 | 6 | 7 | Support 8 | ====== 9 | 10 | This is an unsupported, community-created project. Keep that in mind. 11 | Instructure won't be able to help you fix or debug this. That said, the 12 | community will hopefully help support and keep both the script and this 13 | documentation up-to-date. 14 | 15 | Good luck! 16 | -------------------------------------------------------------------------------- /branding/javascript/add_bypass_login/add_bypass_login.js: -------------------------------------------------------------------------------- 1 | //Working as of 04/19/2016 2 | $(document).ready(function(){ 3 | if(window.location.pathname.search('login')){ 4 | //$('#login_forgot_password').text(internal_link_text); 5 | var new_link = $('
Canvas Login

'); 6 | //$('#login_forgot_password').parent().parent().prepend(new_link); 7 | //$('label[for=pseudonym_session_remember_me]').after(new_link); 8 | $('label[for=pseudonym_session_remember_me]').after("

"); 9 | $('#login_forgot_password').after(new_link); 10 | } 11 | }); 12 | -------------------------------------------------------------------------------- /branding/javascript/add_iframe_to_login_screen/README.md: -------------------------------------------------------------------------------- 1 | iFrame Login Page 2 | ====== 3 | 4 | To add an iFrame under the login page box, add this to your JS. 5 | - Replace "https://www.instructure.com" with the desired site you with to display 6 | - Configure height by replacing '400px' with desired height of iFrame. 7 | - Configure width by replacing '647px' with desired width of iFrame. 8 | - Configure margin by replacing '75px' with desired margin size. 9 | 10 | Support 11 | ====== 12 | 13 | This is an unsupported, community-created project. Keep that in mind. 14 | Instructure won't be able to help you fix or debug this. That said, the 15 | community will hopefully help support and keep both the script and this 16 | documentation up-to-date. 17 | 18 | Good luck! 19 | -------------------------------------------------------------------------------- /branding/javascript/add_iframe_to_login_screen/add_iframe_to_login_screen.js: -------------------------------------------------------------------------------- 1 | //Working as of 04/19/2016 2 | $(document).ready(function(){ 3 | if(window.location.pathname.indexOf('/login') >= 0){ 4 | var c = $('#content'); 5 | var iframe = ''; 6 | $(iframe).appendTo(c); 7 | } 8 | }); 9 | -------------------------------------------------------------------------------- /branding/javascript/add_language_selectors/README.md: -------------------------------------------------------------------------------- 1 | # Canvas Add Language Selectors 2 | This JavaScript adds language switchers to the global navigation and to the right side. 3 | Currently it's configured to switch back and forth between English (EN) and French (FR). 4 | -------------------------------------------------------------------------------- /branding/javascript/add_link_to_footer/README.md: -------------------------------------------------------------------------------- 1 | Additional Footer Links 2 | ====== 3 | Adds a link to the end of the footer on the Canvas login screen. 4 | 5 | Support 6 | ====== 7 | 8 | This is an unsupported, community-created project. Keep that in mind. 9 | Instructure won't be able to help you fix or debug this. That said, the 10 | community will hopefully help support and keep both the script and this 11 | documentation up-to-date. 12 | 13 | Good luck! 14 | -------------------------------------------------------------------------------- /branding/javascript/add_link_to_footer/add_link_to_footer.js: -------------------------------------------------------------------------------- 1 | //Works as of 4/27/2016 2 | 3 | $(document).ready(function(){ 4 | $('#footer-links').append("Google"); 5 | }); 6 | -------------------------------------------------------------------------------- /branding/javascript/add_print_button_syllabus/README.md: -------------------------------------------------------------------------------- 1 | To use this JavaScript, simply add lines 5-8 to your current *.js file that you upload to Canvas through the theme editor. 2 | If you currently don't have a *.js file, upload "add_print_button.js" directly to your theme editor upload. 3 | -------------------------------------------------------------------------------- /branding/javascript/add_print_button_syllabus/add_print_button.js: -------------------------------------------------------------------------------- 1 | //This is unsupported by Canvas 2 | //Working 4/4/2017 3 | 4 | $(document).ready(function() { 5 | if (window.location.href.indexOf("syllabus") > -1) { 6 | var new_link = $(''); 7 | $('#content').prepend(new_link); 8 | $('head').append(''); 9 | } 10 | }); 11 | -------------------------------------------------------------------------------- /branding/javascript/add_role_to_permission_hover/add_role_to_permission_hover.js: -------------------------------------------------------------------------------- 1 | // This js adds the role to the permission hover 2 | $(document).ready(function(){ 3 | 4 | $('#course-roles-tab table.roles_table a.dropdown-toggle i').each(function(x, el){ 5 | el = $(el); 6 | var cellIndex = $(el).closest('td').index(); 7 | var new_title = (el.attr('title') ? el.attr('title') : '' ) + ' [' + $($('#course-roles-tab table thead th em')[cellIndex-1]).text() + ']'; 8 | el.attr('title', new_title); 9 | }); 10 | $('#account-roles-tab table.roles_table a.dropdown-toggle i').each(function(x, el){ 11 | el = $(el); 12 | var cellIndex = $(el).closest('td').index(); 13 | var new_title = (el.attr('title') ? el.attr('title') : '' ) + ' [' + $($('#account-roles-tab table thead th em')[cellIndex-1]).text() + ']'; 14 | el.attr('title', new_title); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /branding/javascript/add_role_to_permission_hover/add_role_to_perms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/branding/javascript/add_role_to_permission_hover/add_role_to_perms.png -------------------------------------------------------------------------------- /branding/javascript/add_role_to_permission_hover/readme.md: -------------------------------------------------------------------------------- 1 | # Adding the Role name to the Permission Hover 2 | The script in add_role_to_permission_hover.js will lookup the column header(role name) for each permission hover on the permissions page. 3 | 4 | ![add role to permission hover](./add_role_to_perms.png) 5 | -------------------------------------------------------------------------------- /branding/javascript/add_text_to_login/README.md: -------------------------------------------------------------------------------- 1 | Login Text 2 | ====== 3 | 4 | You can use this script to add some text to the login screen just below the login button and other items on the screen. You can add multiple lines of text that will wrap and make the modal taller. 5 | 6 | - Edit the variable added_text to contain the text you want to display on screen below the "Log In" button. 7 | 8 | Support 9 | ====== 10 | 11 | This is an unsupported, community-created project. Keep that in mind. 12 | Instructure won't be able to help you fix or debug this. That said, the 13 | community will hopefully help support and keep both the script and this 14 | documentation up-to-date. 15 | 16 | Good luck! 17 | -------------------------------------------------------------------------------- /branding/javascript/add_text_to_login/add_text_to_login.js: -------------------------------------------------------------------------------- 1 | //Works as of 04/27/2016 2 | /* 3 | * You can use this script to add some text to the login screen just below the 4 | * login button and other items on the screen. There appears to be room for about 5 | * 3 lines of text, or so. 6 | * 7 | * Edit the variable added_text to contain the text you want to add to the screen. 8 | */ 9 | 10 | $(document).ready(function(){ 11 | 12 | var added_text = 'Hello, this is some text. I really need this text to be long so I can see what it does when it gets to the end of the line and wraps. Also, what happens when the text is really long? Does it make the modal box taller?'; 13 | var added_html_and_text = '

' + added_text + '

'; 14 | 15 | $('#login_form').append(added_html_and_text); 16 | 17 | 18 | }); 19 | -------------------------------------------------------------------------------- /branding/javascript/add_users_name_to_global_nav/README.md: -------------------------------------------------------------------------------- 1 | # Add the user's full name to the Global Navigation Menu 2 | 3 | This JS adds the user's full name in place of the "account" text under the user avatar on the Canvas Global Navigation Menu. 4 | 5 | **Note**: As with any part of Canvas, the values that this code target could change at any time. Be sure to check your beta environment before each production release to be sure that this code is still functional as Canvas changes. 6 | 7 | Support 8 | ====== 9 | 10 | This is an unsupported, community-created project. Keep that in mind. 11 | Instructure won't be able to help you fix or debug this. That said, the 12 | community will hopefully help support and keep both the script and this 13 | documentation up-to-date. 14 | 15 | Good luck! 16 | -------------------------------------------------------------------------------- /branding/javascript/add_users_name_to_global_nav/add_users_name_to_global_nav.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Adds the user's display name in place of the word "Account" on the Canvas Global Navigation Menu. 3 | * 4 | * This script is provided AS-IS with no support nor warranty. 5 | * Confirmed working Aug 25, 2016 6 | * 7 | */ 8 | $('window').ready(function(){$('#global_nav_profile_link div.menu-item__text').text(ENV.current_user.display_name);}); 9 | -------------------------------------------------------------------------------- /branding/javascript/always_record_conferences/README.md: -------------------------------------------------------------------------------- 1 | # Canvas Always Record Conferences 2 | This JavaScript hides the 'enable recording' button from the New Conference dialog and sets the value to 'true'. 3 | 4 | ## Usage 5 | * Upload always_record_conferences.js to the Theme Editor. 6 | -------------------------------------------------------------------------------- /branding/javascript/always_record_conferences/canvas-always-record-conferences.js: -------------------------------------------------------------------------------- 1 | /* always_record_conferences.js 2 | * by: Danny Wahl danny@instructure.com 3 | * Working as of 06/16/2016 4 | * automatically checks the "enable recording" 5 | * setting when creating a new conference 6 | * and hides the setting from the user so they 7 | * can't uncheck it. 8 | */ 9 | 10 | $(function(){ 11 | 12 | console.log("always_record_conferences.js"); 13 | 14 | console.log(" Checking current path..."); 15 | var path = window.location.pathname.split( '/' ); 16 | 17 | if((path[1] == "courses") && (path[3] == "conferences")) { 18 | 19 | console.log(" User is on conferences page."); 20 | console.log(" Waiting for 'New Conference' to be pressed..."); 21 | 22 | $("button[title='New Conference']").click(function(){ 23 | 24 | console.log(" 'New Conference' pressed, hiding recording option."); 25 | $(".web_conference_user_settings").hide(); 26 | console.log(" Recording option hidden from user."); 27 | 28 | console.log(" Setting recording to 'true'"). 29 | $("#web_conference_user_settings_record").attr("checked", true); 30 | console.log(" Recording is enabled for this new conference."); 31 | 32 | }); 33 | 34 | } else { 35 | console.log(" Not on a 'Conferences' page, won't set recording preferences."); 36 | } 37 | 38 | }); 39 | -------------------------------------------------------------------------------- /branding/javascript/bigger_thumbnails/README.md: -------------------------------------------------------------------------------- 1 | Bigger Thumbnails 2 | ====== 3 | 4 | This script will resize the thumbnails used for Kaltura and YouTube. 5 | 6 | In this script you have the ability to edit the sizing; 7 | - In the 'replace' fields, enter in the dimensions you wish to have the thumbnail resized from/to. 8 | 9 | Support 10 | ====== 11 | 12 | This is an unsupported, community-created project. Keep that in mind. 13 | Instructure won't be able to help you fix or debug this. That said, the 14 | community will hopefully help support and keep both the script and this 15 | documentation up-to-date. 16 | 17 | Good luck! 18 | -------------------------------------------------------------------------------- /branding/javascript/canvas_auth_endpoint_redirect/login_redirect.js: -------------------------------------------------------------------------------- 1 | // Working as of 2/28/2019 2 | 3 | /* 4 | 5 | **INSTRUCTIONS** 6 | 7 | This can be used to allow your users to be redirected to a specific URL by 8 | replacing the "YOUR REDIRECT URL HERE" below with a URL of your choice. 9 | 10 | To simply redirect users back to the base .instructure.com URL for 11 | your domain, replace the YOUR REDIRECT URL HERE with: 12 | 13 | `window.location.origin` 14 | 15 | Make sure to remove the backticks so as to appear like a typical variable 16 | */ 17 | 18 | $(function () { 19 | if (window.location.pathname == "/login/canvas") { 20 | window.location.href = // YOUR REDIRECT URL HERE; 21 | } else { 22 | console.log("All good. We're in the right place."); 23 | } 24 | }); 25 | -------------------------------------------------------------------------------- /branding/javascript/change_course_module_text/change-course-module-text.js: -------------------------------------------------------------------------------- 1 | //Functional as of 5/2/18 2 | //THIS IS NOT SUPPORTED BY INSTRUCTURE 3 | 4 | $(document).ready(function () { 5 | $('#section-tabs a[title="Modules"]').html('New Text'); 6 | }) -------------------------------------------------------------------------------- /branding/javascript/change_enrollment_page_username/README.md: -------------------------------------------------------------------------------- 1 | Change Enrollment Text 2 | ====== 3 | 4 | Changes the text on the self-enrollment page from "Please enter your email address:" to anything you specify. 5 | 6 | - Replace 'Variable1' with what you wish to title the field (Email Address, Username, Student ID). 7 | - Replace 'Variable2' with the sentence you wish to display to to the user. 8 | 9 | - Example: 10 | if (window.location.pathname.search('enroll')) { 11 | $('label[for="student_email"]').text("Username"); 12 | $('p:contains("Please enter your email address:")').text("Please enter your Username:"); 13 | } 14 | 15 | Support 16 | ====== 17 | 18 | This is an unsupported, community-created project. Keep that in mind. 19 | Instructure won't be able to help you fix or debug this. That said, the 20 | community will hopefully help support and keep both the script and this 21 | documentation up-to-date. 22 | 23 | Good luck! 24 | -------------------------------------------------------------------------------- /branding/javascript/change_enrollment_page_username/change_enrollment_page_username.js: -------------------------------------------------------------------------------- 1 | //WORKING AS OF 04/29/21016 2 | // Only works on the self enrollment screen 3 | if (window.location.pathname.search('enroll')) { 4 | $('label[for="student_email"]').text("Variable1"); 5 | $('p:contains("Please enter your Email:")').text("Variable2:"); 6 | } 7 | -------------------------------------------------------------------------------- /branding/javascript/change_link_in_404/add_404_change.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function() { 2 | function onElementRendered(selector, cb, _attempts) { 3 | var el = $(selector); 4 | _attempts = ++_attempts || 1; 5 | if (el.length) return cb(el); 6 | if (_attempts == 60) return; 7 | setTimeout(function() { 8 | onElementRendered(selector, cb, _attempts); 9 | }, 250); 10 | } 11 | 12 | //This will check to see that an h2 tag has loaded, then it will check the text 13 | //inside the h2 tag to make sure it has "Not Found". Then it will hide the submit_error_link 14 | //and add a link that you can edit on line 19 to your liking. 15 | onElementRendered('h2', function(e) { 16 | //code goes here to wait for all elements to load 17 | if ($('h2').text().indexOf('Not Found') > -1) { 18 | $('.submit_error_link').hide(); 19 | $('p').append('

Text for link goes here

'); 20 | console.log('Did it!'); 21 | } 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /branding/javascript/change_link_in_404/readme.md: -------------------------------------------------------------------------------- 1 | #Changing the 404 Page 2 | The JS in the associated file will look for the "Page Not Found" text within an h2 tag. 3 | If it finds it, it will make sure the link has loaded, then it will hide it. 4 | It will then append a link in it's place that will go where designated by the user. 5 | 6 | On line 19 of the JS, you'll need to change the href and the text between the 'a' tags. 7 | -------------------------------------------------------------------------------- /branding/javascript/changes_to_add_people/readme.md: -------------------------------------------------------------------------------- 1 | #Add People Window 2 | 3 | You can use this script to modify the add people window on the course level. You can modify the placeholder text, hide an option, and hide choices in the roles dropdown. This script is a base starting point. It is highly recommended that you have someone who is capable of editing JavaScript files. 4 | 5 | Variable 6 | - Edit the onlyAdmin variable to false if you want the changes to apply to everyone and true if you want the changes to apply to everyone except admins. 7 | 8 | 9 | Support 10 | 11 | This is an unsupported, community-created project. Keep that in mind. Instructure won't be able to help you fix or debug this. That said, the community will hopefully help support and keep both the script and this documentation up-to-date. 12 | 13 | Good luck! 14 | -------------------------------------------------------------------------------- /branding/javascript/checkbox_checked_external_module_items/README.md: -------------------------------------------------------------------------------- 1 | Default "load in a new tab" checkbox is checked 2 | ====== 3 | 4 | This script will automatically select "load in a new tab" to a new a new module item. It can still be unselected by the user, but it starts out checked. 5 | 6 | The included screenshot shows the external URL option selected and the "Load in a new tab" checkbox selected. 7 | 8 | No need to set variable on this script. 9 | 10 | Support 11 | ====== 12 | 13 | This is an unsupported, community-created project. Keep that in mind. Instructure won't be able to help you fix or debug this. That said, the community will hopefully help support and keep both the script and this documentation up-to-date. 14 | 15 | Good luck! 16 | -------------------------------------------------------------------------------- /branding/javascript/checkbox_checked_external_module_items/checkbox_checked.js: -------------------------------------------------------------------------------- 1 | //working as of August 4th, 2017 2 | /*This script automatically selects the "open in new tab" checkbox 3 | on a new module item if it is an external url or external tool*/ 4 | 5 | //Don't edit past here unless you know JS and are comfortable 6 | //making changes on your own. 7 | $(document).ready(() => { 8 | //adds a function on the #add_module_item_select when it's value changes 9 | $('#add_module_item_select').change(() => { 10 | if ($('#add_module_item_select').val().indexOf('external') > -1) { 11 | $('#external_url_create_new_tab').prop("checked", true); 12 | $('#external_tool_create_new_tab').prop("checked", true); 13 | } 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /branding/javascript/checkbox_checked_external_module_items/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/branding/javascript/checkbox_checked_external_module_items/screenshot.png -------------------------------------------------------------------------------- /branding/javascript/conversations/deleteconversations.js: -------------------------------------------------------------------------------- 1 | // Warning!!! This javascript will delete as many conversations as possible on every page load. Use it 2 | // with extreme caution. It does 3 | // not discriminate between any user role, enrollment, or user type. It loads a 4 | // list of conversations (on every page load) and attempts 5 | // to delete them. Over time, it will delete all 6 | // conversations for every user as long as the users are in actively in Canvas. 7 | // This should only be used when you are sure that you want to get rid of all conversations. 8 | // Needless to say, you should probably only have this if you do not want conversations functionality in Canvas. 9 | $(document).ready(function(){ 10 | $.get('/api/v1/conversations?per_page=100').done( 11 | function(list){ 12 | list.map(function(c){ 13 | $.ajax('/api/v1/conversations/'+c.id, {type:'DELETE'}); 14 | }); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /branding/javascript/custom_quiz_password_message/README.md: -------------------------------------------------------------------------------- 1 | # Canvas Custom Quiz Password Message 2 | Add a custom message to the text above the password field on a Canvas quiz. 3 | 4 | ## Usage 5 | Change the message as desired and upload to the Theme Editor. 6 | -------------------------------------------------------------------------------- /branding/javascript/disable_avatar/disable_avatar.css: -------------------------------------------------------------------------------- 1 | a.avatar.profile_pic_link.approved { 2 | pointer-events: none !important; 3 | cursor: default !important; 4 | } 5 | 6 | a.avatar.profile-link { 7 | pointer-events: none !important; 8 | cursor: default !important; 9 | } -------------------------------------------------------------------------------- /branding/javascript/disable_avatar/disable_avatar.js: -------------------------------------------------------------------------------- 1 | if (window.location.pathname == "/profile") { 2 | $('i.icon-edit').hide(); 3 | } -------------------------------------------------------------------------------- /branding/javascript/disable_notification_preferences/README.md: -------------------------------------------------------------------------------- 1 | # Canvas Disable Notification Preferences 2 | A script that disables the editing of notification preferences in the New UI. 3 | 4 | ## Usage 5 | Upload to the Theme Editor, prepare for complaints. 6 | -------------------------------------------------------------------------------- /branding/javascript/do_for_all_but_admins_template/do_for_all_but_admins.js: -------------------------------------------------------------------------------- 1 | //Perform some action for everyone but admins 2 | if ($.inArray("admin", ENV.current_user_roles) == -1) { 3 | //do stuff 4 | }‍‍‍‍‍‍‍‍ 5 | -------------------------------------------------------------------------------- /branding/javascript/do_stuff_by_role/README.md: -------------------------------------------------------------------------------- 1 | # Canvas Do Stuff By Role 2 | This is a helper JavaScript to get the current enrollment types for the current user, and compare them to a whitelist, then execute custom functionality if the user has the whitelisted role. 3 | 4 | ## Usage 5 | * Define whitelisted role types in the `supportedRoles[]` array. See the [Enrollments API](https://canvas.instructure.com/doc/api/enrollments.html#method.enrollments_api.index) for more info on role types. 6 | * Add desired functionality for users with supported roles in the `doStuff()` function. 7 | * Upload this script to the theme editor. 8 | -------------------------------------------------------------------------------- /branding/javascript/download_discussion_posts/README.md: -------------------------------------------------------------------------------- 1 | # Canvas Download Discussion posts 2 | This script adds an "export" button to the top of a discussion, providing a generated CSV file with all replies in the following format: 3 | 4 | ``` 5 | id, author, time, likes, text 6 | ``` 7 | 8 | ## Example 9 | 10 | ``` 11 | id,author,time,likes,text 12 | 104,"Amy Leung","2019-01-16T15:27:11.000Z",3,"Thanks for sharing, Alex.  I'm adding the Orwell piece to my (rather long) list." 13 | 105,"Alex McMullin","2019-01-16T16:28:05.000Z",0,"Come on class, let's see some more participation.  Surely you have some thoughts :)" 14 | ``` 15 | -------------------------------------------------------------------------------- /branding/javascript/element_targetting/README.md: -------------------------------------------------------------------------------- 1 | # element_targeting 2 | 3 | ## Summary 4 | Each view in Canvas has been whittled down to include the necessary `unique classes` or `IDs` that will enable you to target elements in the UI with JavaScript. Where applicable, instructions have been added for both **disabling** items in the UI and **hiding** items completely. -------------------------------------------------------------------------------- /branding/javascript/enroll_in_ta_sections_only/README.md: -------------------------------------------------------------------------------- 1 | # Canvas Enroll in TA Sections Only 2 | A script that removes sections from the "Add People" dialog where the current user is not enrolled as a TA. By default TAs can enroll students into sections that they are not a TA in. 3 | 4 | **This may prevent it for teachers too, it's untested...** 5 | 6 | ## Usage 7 | Upload to the Theme Editor. 8 | -------------------------------------------------------------------------------- /branding/javascript/grades_on_profile/README.md: -------------------------------------------------------------------------------- 1 | # Canvas Grades on Profile 2 | This JavaScript adds a link to the users' grades page from their 3 | profile page (`/profile`) and the accounts profile page (`/accounts/n/users/id`). 4 | 5 | ## Usage 6 | * Upload `grades_on_profile.js` to the Theme Editor in the New UI. 7 | -------------------------------------------------------------------------------- /branding/javascript/hide-0pt-indicator/README.md: -------------------------------------------------------------------------------- 1 | Hide 0 pt module indicators 2 | ====== 3 | 4 | Hides any module item points indicators that are set to 0 pts. 5 | 6 | Working as of: 2020-04-27 7 | 8 | Support 9 | ====== 10 | 11 | This is an unsupported, community-created project. Keep that in mind. 12 | Instructure won't be able to help you fix or debug this. That said, the 13 | community will hopefully help support and keep both the script and this 14 | documentation up-to-date. 15 | 16 | Good luck! 17 | -------------------------------------------------------------------------------- /branding/javascript/hide-0pt-indicator/removeZeroPoints.js: -------------------------------------------------------------------------------- 1 | // Written by A. Carey, Instructure Inc 2 | // 2020.04.27 3 | // If you put this in your Theme's JS - 4 | // It will hide any module point indicators with '0 pts' 5 | 6 | 7 | 8 | function onElementRendered(selector, cb, _attempts) { 9 | var el = $(selector); 10 | _attempts = ++_attempts || 1; 11 | if (el.length) return cb(el); 12 | if (_attempts == 60) return; 13 | setTimeout(function() { 14 | onElementRendered(selector, cb, _attempts); 15 | }, 250); 16 | }; 17 | 18 | function removeZeroPoints(){ 19 | 20 | let zeropoints = $('.points_possible_display:contains("0 pts")'); // select all points indicators that have 0 pts 21 | zeropoints.parent('div').remove(); // remove the parent divs of selected points indicators 22 | 23 | } 24 | 25 | onElementRendered(".points_possible_display:contains('0 pts')", function(e) { 26 | // code goes here to wait for all elements to load 27 | // function will run if currently on modules page 28 | 29 | if(window.location.href.indexOf("/modules") > -1){ 30 | removeZeroPoints(); //run removeZeroPoints function 31 | } 32 | 33 | }); 34 | 35 | 36 | -------------------------------------------------------------------------------- /branding/javascript/hide_QRCode/README.md: -------------------------------------------------------------------------------- 1 | Hide QR Code link 2 | ====== 3 | 4 | Hides the "QR for Mobile Login" link when user opens Profile tray. 5 | 6 | Support 7 | ====== 8 | 9 | This is an unsupported, community-created project. Keep that in mind. 10 | Instructure won't be able to help you fix or debug this. That said, the 11 | community will hopefully help support and keep both the script and this 12 | documentation up-to-date. 13 | 14 | Good luck! 15 | -------------------------------------------------------------------------------- /branding/javascript/hide_QRCode/hide_QRCode.js: -------------------------------------------------------------------------------- 1 | function onElementRendered(selector, cb, _attempts) { 2 | var el = $(selector); 3 | _attempts = ++_attempts || 1; 4 | if (el.length) return cb(el); 5 | if (_attempts == 60) return; 6 | setTimeout(function() { 7 | onElementRendered(selector, cb, _attempts); 8 | }, 250); 9 | }; 10 | 11 | onElementRendered("#global_nav_profile_link", function(e) { 12 | //code goes here to wait for all elements to load 13 | 14 | $('#global_nav_profile_link').click(hideQR); //run hideQR function when user clicks on Account link 15 | 16 | }); 17 | 18 | function hideQR() { 19 | onElementRendered("button:contains('QR for Mobile Login')", function(e) { 20 | // Wait for slide out tray to fully load 21 | let btnparents = $( "button:contains('QR for Mobile Login')" ).parents('li'); // select list item based on button with QR text 22 | btnparents.remove(); // remove selected list item 23 | }); 24 | 25 | 26 | } 27 | -------------------------------------------------------------------------------- /branding/javascript/hide_conferences_course_nav/README.md: -------------------------------------------------------------------------------- 1 | # Hide Conferences Course Navigation Link 2 | 3 | This option hides the "Conferences" course navigation link in all courses for all users, as well as the "Conferences" navigation item in the course navigation configuration interface. 4 | 5 | **Note**: As with any part of Canvas, the links that these CSS rules target could change at any time. Be sure to check your beta environment before each production release to be sure that none of your CSS has broken due to an upcoming code change. 6 | 7 | ## Support 8 | 9 | This is an unsupported, community-created project. Keep that in mind. 10 | Instructure won't be able to help you fix or debug this. That said, the 11 | community will hopefully help support and keep both the script and this 12 | documentation up-to-date. 13 | 14 | Good luck! 15 | -------------------------------------------------------------------------------- /branding/javascript/hide_conferences_course_nav/hide_conferences_course_nav.js: -------------------------------------------------------------------------------- 1 | // Working as of 7/28/2020 2 | 3 | function onElementRendered(selector, cb, _attempts) { 4 | var el = $(selector); 5 | _attempts = ++_attempts || 1; 6 | if (el.length) return cb(el); 7 | if (_attempts == 60) return; 8 | setTimeout(function () { 9 | onElementRendered(selector, cb, _attempts); 10 | }, 250); 11 | } 12 | 13 | // When element is rendered, the targeted element will be hidden 14 | onElementRendered(".conferences", function (e) { 15 | $(".conferences").hide(); 16 | }); 17 | 18 | onElementRendered("[aria-label='Conferences']", function (e) { 19 | $("[aria-label='Conferences']").hide(); 20 | }); 21 | -------------------------------------------------------------------------------- /branding/javascript/hide_content_exports_for_teachers/README.md: -------------------------------------------------------------------------------- 1 | # Hide Content Exports Page for Teachers 2 | 3 | This snippet will replace the contents of the content export page with a message that the page is only available to administrators. This will remove the form to export content and the historic course content. It will not prevent teachers from using the API or other methods to export course content. 4 | 5 | ## Support 6 | This is an unsupported, community-created project. Keep that in mind. Instructure won't be able to help you fix or debug this. That said, the community will hopefully help support and keep both the script and this documentation up-to-date. 7 | 8 | Functional as of 8/13/18 -------------------------------------------------------------------------------- /branding/javascript/hide_content_exports_for_teachers/hide-teacher-export-content.js: -------------------------------------------------------------------------------- 1 | if (window.location.href.indexOf("/content_exports") > -1) { 2 | if(ENV.current_user_roles.indexOf('admin') < 0) { 3 | $('#content').html('

Unauthorized

This page is only available to adminstrators.
'); 4 | } 5 | } -------------------------------------------------------------------------------- /branding/javascript/hide_course_nav_items/hide_course_nav_items.js: -------------------------------------------------------------------------------- 1 | // When the below code is added to a Canvas theme, the uncommented lines will remove navigation items from a course view for teachers. The main purpose here is to hide elements that a teacher would never use. 2 | 3 | // Uncomment the items you want to remove from the UI 4 | 5 | if (ENV.current_user_roles.indexOf("teacher") != -1){ 6 | // $("a.announcements").parent().hide(); 7 | // $("a.collaborations").parent().hide(); 8 | // $("a.files").parent().hide(); 9 | // $("a.grades").parent().hide(); 10 | // $("a.discussions").parent().hide(); 11 | // $("a.files").parent().hide(); 12 | // $("a.rubrics").parent().hide(); 13 | // $("a.outcomes").parent().hide(); 14 | // $("a.syllabus").parent().hide(); 15 | // $("a.quizzes").parent().hide(); 16 | // $("a.modules").parent().hide(); 17 | // $("a.people").parent().hide(); 18 | // $("a.pages").parent().hide(); 19 | // $("a.conferences").parent().hide(); 20 | } 21 | -------------------------------------------------------------------------------- /branding/javascript/hide_course_setup_checklist/README.md: -------------------------------------------------------------------------------- 1 | # Hide Course Setup Checklist 2 | 3 | Important: Both the javascript and CSS are needed for this to function. 4 | 5 | This option hides the "Need help setting up your course?" block and "Course Setup Checklist" button from the homepage of a course for all users. 6 | 7 | **Note**: As with any part of Canvas, the links that these CSS rules target could change at any time. Be sure to check your beta environment before each production release to be sure that none of your CSS has broken due to an upcoming code change. 8 | 9 | Support 10 | ====== 11 | 12 | This is an unsupported, community-created project. Keep that in mind. 13 | Instructure won't be able to help you fix or debug this. That said, the 14 | community will hopefully help support and keep both the script and this 15 | documentation up-to-date. 16 | 17 | Good luck! 18 | -------------------------------------------------------------------------------- /branding/javascript/hide_course_setup_checklist/hide_course_setup_checklist.css: -------------------------------------------------------------------------------- 1 | /* Working as of June 17, 2016 */ 2 | 3 | /* Hide "Need help setting up your course?" block */ 4 | .Reminder__course-setup-body { 5 | display: none; 6 | } 7 | -------------------------------------------------------------------------------- /branding/javascript/hide_course_setup_checklist/hide_course_setup_checklist.js: -------------------------------------------------------------------------------- 1 | // Working as of June 17, 2016 2 | // Hides the Course Setup Checklist Button 3 | 4 | $(document).ready(function(){ 5 | if(location.pathname.match(/^\/courses\/\d+\/?$/i)){ 6 | $('a:contains("Course Setup Checklist")').remove(); 7 | } 8 | }); 9 | -------------------------------------------------------------------------------- /branding/javascript/hide_eportfolio_from_observers/hide_eportfolios_from_observers.css: -------------------------------------------------------------------------------- 1 | /* THIS IS NOT SUPPORTED BY INSTRUCTURE. 2 | WORKS AS OF 3.9.17 3 | Hide eportfolios from observers. 4 | This CSS snippet in conjection with the corresponding JS snippet will hide the eportfolios from observers. 5 | Staff/students must access eportfolios from their profile. 6 | Use at your own risk. 7 | */ 8 | li.ic-NavMenu-list-item a[href="/dashboard/eportfolios"] { 9 | display: none; 10 | } -------------------------------------------------------------------------------- /branding/javascript/hide_eportfolio_from_observers/hide_eportfolios_from_observers.js: -------------------------------------------------------------------------------- 1 | // THIS IS NOT SUPPORTED BY INSTRUCTURE. 2 | // WORKS AS OF 3.9.17 3 | // Hide eportfolios from observers. 4 | // Use at your own risk. 5 | 6 | $(document).ready(function(){ 7 | if($.inArray('observer',ENV['current_user_roles']) > 0) { 8 | $('.eportfolios').hide(); 9 | /* Hide eportfolios from observers */ 10 | }; 11 | }) -------------------------------------------------------------------------------- /branding/javascript/hide_reset_content/README.md: -------------------------------------------------------------------------------- 1 | # Hide Reset Content Button 2 | 3 | Important: The javascript needed for this to function. 4 | 5 | This option hides the "Reset Course Content" button from the course settings page (/courses/:courseID/settings) of all courses for all users. 6 | 7 | **Note**: As with any part of Canvas, the links that these CSS rules target could change at any time. Be sure to check your beta environment before each production release to be sure that none of your CSS has broken due to an upcoming code change. 8 | 9 | Support 10 | ====== 11 | 12 | This is an unsupported, community-created project. Keep that in mind. 13 | Instructure won't be able to help you fix or debug this. That said, the 14 | community will hopefully help support and keep both the script and this 15 | documentation up-to-date. 16 | 17 | Good luck! 18 | -------------------------------------------------------------------------------- /branding/javascript/hide_reset_content/hide_reset_content.js: -------------------------------------------------------------------------------- 1 | //This will wait until the element is rendered before running our code 2 | function onElementRendered(selector, cb, _attempts) { 3 | var el = $(selector); 4 | _attempts = ++_attempts || 1; 5 | if (el.length) return cb(el); 6 | if (_attempts == 60) return; 7 | setTimeout(function() { 8 | onElementRendered(selector, cb, _attempts); 9 | }, 250); 10 | }; 11 | 12 | 13 | //This code will pull the Canvas IDs for users and courses and change the link for the survey 14 | // onElementRendered('a[href*="showSurvey.aspx', function(e) { 15 | // var userSISID = ENV.current_user_id; 16 | // var courseID = window.location.pathname.split('/')[2]; 17 | // $('a[href*="showSurvey.aspx"]').attr('href', 'http://enterprise.principals.ca/Survey/showSurvey.aspx' + '?evalID=232&userID=' + userSISID + "&eelD=" + courseID); 18 | // }); 19 | 20 | //When element is rendered it will run api call to fill the necessary variables so the survey link changes 21 | onElementRendered('.reset_course_content_button', function(e) { 22 | $('.reset_course_content_button').hide(); 23 | }); 24 | -------------------------------------------------------------------------------- /branding/javascript/login_slideshow/README.md: -------------------------------------------------------------------------------- 1 | # Canvas Login Slideshow 2 | Allows you to add up to 3 background images on `/login/canvas` that rotate in a slideshow 3 | 4 | ## Usage 5 | In `login_slideshow.css` specify the URLS of the images that you want to include. Then upload the JS and the CSS to Theme Editor in the New UI. 6 | -------------------------------------------------------------------------------- /branding/javascript/login_slideshow/login_slideshow.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Canvas Login Slideshow 3 | * by: Danny Wahl (dwahl@instructure.com) 4 | * Working as of 10/28/2015 5 | * Allows you to specify up to 3 images 6 | * to rotate on the background of the login page 7 | * independently of the new theme editor 8 | * REQUIRES: login_slideshow.css 9 | */ 10 | 11 | $(function(){ 12 | 13 | // Check if path is /login/canvas 14 | if(window.location.pathname == "/login/canvas") { 15 | 16 | console.log("login_slideshow.js") 17 | console.log(" WARNING: Requires login_slideshow.css to function"); 18 | 19 | console.log(" Creating unordered list."); 20 | var $slideshow = $(document.createElement("ul")); 21 | $slideshow.addClass("slideshow"); 22 | var $slide = ""; 23 | for (var i = 0; i < 3; i++) { 24 | $slide = $(document.createElement("li")); 25 | $slide.addClass("slide"); 26 | $slideshow.append($slide); 27 | } 28 | 29 | console.log(" Adding list to page."); 30 | $(".ic-Login-Body").append($slideshow); 31 | 32 | console.log(" Slideshow has been added to page."); 33 | } 34 | }); 35 | -------------------------------------------------------------------------------- /branding/javascript/modify-help-menu/README.md: -------------------------------------------------------------------------------- 1 | ## Help Menu Tray Modifications 2 | 3 | To edit the help menu tray in Canvas you need to set an event listener on the menu click. This JS snippet sets this listener and waits for the element to render to make changes to the element. 4 | 5 | The elements in the tray are rendered on click. This snippet sets the listener for the help menu click, but it does not set a listener for the "cancel" button on the report a problem form. To reduce complexity I've just opted to remove this button via CSS, users can still exit the menu by clicking on the overlay or closing X. -------------------------------------------------------------------------------- /branding/javascript/modify-help-menu/help-menu-updates.css: -------------------------------------------------------------------------------- 1 | /* This is not supported by Instructure */ 2 | /* Functional as of October 10, 2016 */ 3 | 4 | form[action="/error_reports"] .ic-HelpDialog__form-actions .Button[type="button"] { 5 | display: none; 6 | } -------------------------------------------------------------------------------- /branding/javascript/modify-help-menu/help-menu-updates.js: -------------------------------------------------------------------------------- 1 | //This is not supported by Instructure 2 | //Functional as of October 10, 2016 3 | 4 | $(document).ready(function () { 5 | $('#menu a[href="http://help.instructure.com/"]').on('click', function() { 6 | function onElementRendered(selector, cb, _attempts) { 7 | var el = $(selector); 8 | _attempts = ++_attempts || 1; 9 | if (el.length) return cb(el); 10 | if (_attempts == 60) return; 11 | setTimeout(function() { 12 | onElementRendered(selector, cb, _attempts); 13 | }, 250); 14 | } 15 | 16 | onElementRendered('a[href="#create_ticket"]', function(el) { 17 | //Change text for "Report a Problem" 18 | //$('a[href="#create_ticket"]').html('Some New Text'); 19 | 20 | /* 21 | //Hide if user isn't an admin or teacher 22 | if($.inArray('admin',ENV['current_user_roles']) == -1 && $.inArray('teacher',ENV['current_user_roles']) == -1) { 23 | $('a[href="#create_ticket"]').parent().hide(); 24 | } 25 | */ 26 | }); 27 | }); 28 | }); -------------------------------------------------------------------------------- /branding/javascript/on_element_rendered/README.md: -------------------------------------------------------------------------------- 1 | # On Element Rendered 2 | 3 | This JS tweak will allow you to load some JS that is dependent on elements that are potentially loaded after the page is loaded. This would want to be used when the document ready function doesn't work. 4 | ```javascript 5 | $(document).ready(function() {/*code*/}); 6 | ``` 7 | 8 | You will want to add your code in the block below within the `on_element_rendered.js` file. 9 | ```javascript 10 | onElementRendered('#element_id_or_.class', function(e) { 11 | //code goes here to wait for all elements to load 12 | }); 13 | ``` 14 | This would change this JS that loads after the DOM from 15 | ```javascript 16 | $("select#grading_period_selector option:contains('All Grading Periods')").text('Semester 2'); 17 | ``` 18 | to this code snippet with the function included. 19 | ```javascript 20 | onElementRendered("select#grading_period_selector option:contains('All Grading Periods')", function(e) { 21 | e.text('Semester 2'); 22 | }); 23 | ``` 24 | 25 | Support 26 | ====== 27 | 28 | This is an unsupported, community-created project. Keep that in mind. 29 | Instructure won't be able to help you fix or debug this. That said, the 30 | community will hopefully help support and keep both the script and this 31 | documentation up-to-date. 32 | 33 | Good luck! 34 | -------------------------------------------------------------------------------- /branding/javascript/on_element_rendered/on_element_rendered.js: -------------------------------------------------------------------------------- 1 | //working as of 04/25/2016 2 | function onElementRendered(selector, cb, _attempts) { 3 | var el = $(selector); 4 | _attempts = ++_attempts || 1; 5 | if (el.length) return cb(el); 6 | if (_attempts == 60) return; 7 | setTimeout(function() { 8 | onElementRendered(selector, cb, _attempts); 9 | }, 250); 10 | }; 11 | 12 | onElementRendered('#element_id_or_.class', function(e) { 13 | //code goes here to wait for all elements to load 14 | }); 15 | -------------------------------------------------------------------------------- /branding/javascript/online_users/README.md: -------------------------------------------------------------------------------- 1 | # Canvas Online Users 2 | This JavaScript adds an indicator on the People page within a course 3 | for users that have been active in the course within a specified time range (default 5 minutes). 4 | 5 | ## Usage 6 | * set `timeout` variable to desired time in MS. The default is 5 minutes, e.g. `300000` (1000ms * 60 seconds * 5 minutes). 7 | * Upload `online_users.js` to the Theme Editor in the New UI. 8 | -------------------------------------------------------------------------------- /branding/javascript/remote_source_loader/README.md: -------------------------------------------------------------------------------- 1 | # Canvas Remote Source Loader 2 | This JavaScript allows you to include a remote JS and/or CSS file 3 | in your canvas instance to allow rapid prototyping in the New UI. 4 | 5 | ## Usage 6 | * Add the full path to your remote js/css in `remote_source_loader.js`. 7 | * Upload `remote_source_loader.js` to the Theme Editor in the New UI. 8 | * Apply changes and edit remote source to your liking. 9 | * When finished... 10 | * **REPLACE** `remote_source_loader.js` with your final JS in Theme Editor. 11 | * **ADD** your final CSS in the Theme Editor. 12 | 13 | ## FAQ 14 | **Q:** Why do I want to use this? 15 | 16 | **A:** The New UI removed the ability to load remote scripts/styles making development more difficult. 17 | 18 | **Q:** Why do I need to replace this script when I'm done developing? 19 | 20 | **A:** The New UI uploads your scripts/styles to AWS making your customizations faster and more secure. 21 | -------------------------------------------------------------------------------- /branding/javascript/removeStatusBar/README.md: -------------------------------------------------------------------------------- 1 | Remove Rich Content Editor Status Bar 2 | ====== 3 | 4 | Hides the status bar underneath the Rich Content Editor that displays the HTML element identifier thread. 5 | 6 | Support 7 | ====== 8 | 9 | This is an unsupported, community-created project. Keep that in mind. 10 | Instructure won't be able to help you fix or debug this. That said, the 11 | community will hopefully help support and keep both the script and this 12 | documentation up-to-date. 13 | 14 | Good luck! 15 | -------------------------------------------------------------------------------- /branding/javascript/removeStatusBar/removeStatusBar.js: -------------------------------------------------------------------------------- 1 | function onElementRendered(selector, cb, _attempts) { 2 | var el = $(selector); 3 | _attempts = ++_attempts || 1; 4 | if (el.length) return cb(el); 5 | if (_attempts == 60) return; 6 | setTimeout(function() { 7 | onElementRendered(selector, cb, _attempts); 8 | }, 250); 9 | }; 10 | 11 | // function to target the RCE status bar and remove HTML snippet 12 | function removeStatusBar(){ 13 | let statusBar = $('span[data-testid="whole-status-bar-path"]') 14 | statusBar.hide(); 15 | }; 16 | 17 | // function will wait for targetted element to load before attempting to hide 18 | $(document).ready(function() { 19 | onElementRendered('span[data-testid="whole-status-bar-path"]', function(e) { 20 | console.log('Removing status bar....') 21 | removeStatusBar(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /branding/javascript/remove_collaborations/README.md: -------------------------------------------------------------------------------- 1 | # Remove Collaboration item from Course Navigation 2 | 3 | Hides the Collaboration menu item from course navigation 4 | 5 | # Support 6 | 7 | This is an unsupported, community-created project. Keep that in mind. Instructure won't be able to help you fix or debug this. That said, the community will hopefully help support and keep both the script and this documentation up-to-date. 8 | 9 | Good luck! 10 | -------------------------------------------------------------------------------- /branding/javascript/remove_collaborations/remove_collaborations.js: -------------------------------------------------------------------------------- 1 | // Working as of 18/03/2022 2 | 3 | function onElementRendered(selector, cb, _attempts) { 4 | var el = $(selector); 5 | _attempts = ++_attempts || 1; 6 | if (el.length) return cb(el); 7 | if (_attempts == 60) return; 8 | setTimeout(function () { 9 | onElementRendered(selector, cb, _attempts); 10 | }, 250); 11 | } 12 | 13 | // When element is rendered, the targeted element will be hidden 14 | onElementRendered(".collaborations", function (e) { 15 | $(".collaborations").hide(); 16 | }); 17 | -------------------------------------------------------------------------------- /branding/javascript/report_discussion_post/README.md: -------------------------------------------------------------------------------- 1 | # Canvas Report Discussion Post 2 | This script adds "report" buttons to each entry in a discussion. When a user clicks 'report' it will do 2 things: 3 | * send an inbox message to the Discussion author notifying them an entry has been reported (with a link to the entry) 4 | * hide the entry content from the reporter 5 | 6 | If the inbox message fails to be delivered, the content is still hidden from the reporter, and they are notified that 7 | the report failed. 8 | 9 | ## Usage 10 | * Upload `report_discussion_post.js` to the theme editor. 11 | 12 | ## Note 13 | This is JavaScript. If a user refreshes or navigates away and back to a discussion with a reported entry, 14 | the content of said entry will be displayed. 15 | -------------------------------------------------------------------------------- /branding/javascript/reset_notification_preferences/README.md: -------------------------------------------------------------------------------- 1 | # Canvas Reset Notification Preferences 2 | This JavaScript adds three indicators to individual notification preferences 3 | * Adds `(default)` to default notification label text. 4 | * Adds `(default)` to screen reader text for notification defaults. 5 | * Adds a yellow indicator to default settings when a non-default setting is selected. 6 | 7 | ## Usage 8 | Upload to the Theme Editor in the New UI 9 | 10 | ## FAQ 11 | 12 | **Q:** Does this work on all communication channels? 13 | 14 | **A:** Kinda. Try it out. 15 | -------------------------------------------------------------------------------- /branding/javascript/speedgrader_canned_comments/README.md: -------------------------------------------------------------------------------- 1 | # Canvas SpeedGrader Canned Comments 2 | Add a dropdown of pre-populated canned feedback to SpeedGrader. 3 | 4 | ## Usage 5 | Change the included feedback titles and values as desired and upload to the Theme Editor (or concatenate to another style sheet). 6 | 7 | ## Note 8 | Don't forget [The Power of Feedback](http://education.qld.gov.au/staff/development/performance/resources/readings/power-feedback.pdf)! 9 | -------------------------------------------------------------------------------- /branding/javascript/student_remove_ignore_button/README.md: -------------------------------------------------------------------------------- 1 | # Canvas Student Remove Ignore Button 2 | A script that removes the ignore button (X) on the To Do List for Students on the User Dashboard in the New UI. This will disable the Ignore Button on all To Do List items if the user has the role Student in **any** course in Canvas. 3 | 4 | ## Usage 5 | Upload to the Theme Editor. 6 | -------------------------------------------------------------------------------- /branding/javascript/student_remove_ignore_button/student_remove_ignore_button.js: -------------------------------------------------------------------------------- 1 | /* 2 | * student_remove_ignore_button.js 3 | * by: Danny Wahl dwahl@instructure.com 4 | * Working as of 10/25/2015 5 | * Removes the ignore (X) button on the 6 | * TO-DO list on the User Dashboard for 7 | * Students in the New UI. 8 | */ 9 | 10 | $(function(){ 11 | 12 | // Verify that the path is / 13 | if(window.location.pathname == "/") { 14 | 15 | console.log("student_remove_ignore_button.js"); 16 | 17 | // Check if the user has role "Student" in ANY course 18 | if($.inArray("student", ENV.current_user_roles) !== -1) { 19 | 20 | console.log(" User " + ENV.current_user_id + " has the role \"Student\"."); 21 | console.log(" Ignore Buttons will be removed."); 22 | 23 | $(".to-do-list .IgnoreButton").remove(); 24 | 25 | } else { 26 | 27 | console.log(" User " + ENV.current_user_id + " does not have the role \"Student\"."); 28 | console.log(" Ignore Buttons will not be removed."); 29 | 30 | } 31 | } 32 | }); 33 | -------------------------------------------------------------------------------- /branding/javascript/style_by_domain/README.md: -------------------------------------------------------------------------------- 1 | # Canvas Style by Domain 2 | This JavaScript and CSS allow you to detect the domain used to access Canvas and then apply CSS based on the domain. 3 | 4 | ## Usage 5 | * Add list of domains used to access Canvas (usually DNS CNAME records) to the switch in style_by_domain.js 6 | * Set preferred class to be appended to body when a domain is detected 7 | * Add CSS rules using the added domain class selector to canvas-style-by-domain.css 8 | * Upload style_by_domain.js and style_by_domain.css to the Theme Editor. 9 | -------------------------------------------------------------------------------- /branding/javascript/style_by_domain/style_by_domain.css: -------------------------------------------------------------------------------- 1 | /* 2 | * style_by_domain.css 3 | * by: Danny Wahl danny@instructure.com 4 | * Style a Canvas instance based on the 5 | * domain it's being accessed from. 6 | */ 7 | 8 | /* Example for styling the login page of 9 | * domaina.instructure.com 10 | * differently than 11 | * domainb.instructure.com 12 | * the classes are added dynamically on every 13 | * page by style_by_domain.js 14 | */ 15 | 16 | .ic-Login-Body.domain-a { 17 | /* Login styles for domaina.instructure.com */ 18 | } 19 | 20 | .ic-Login-Body.domain-b { 21 | /* Login styles for domainb.instructure.com */ 22 | } 23 | -------------------------------------------------------------------------------- /branding/javascript/style_by_domain/style_by_domain.js: -------------------------------------------------------------------------------- 1 | /* 2 | * style_by_domain.js 3 | * by: Danny Wahl danny@instructure.com 4 | * Working as of 05/26/2016 5 | * Style a Canvas instance based on the 6 | * domain it's being accessed from. 7 | * Add your desired domains to the switch 8 | * below, and designate a CSS class to added 9 | * to the body when that domain is detected. 10 | */ 11 | 12 | $(function(){ 13 | 14 | console.log("style_by_domain.js"); 15 | 16 | var class = ""; 17 | 18 | console.log(" Checking domain..."); 19 | switch(window.location.hostname) { 20 | 21 | case "a.instructure.com": 22 | class = "domain-a"; 23 | console.log(" Domain " + window.location.hostname + " found, using class " + class); 24 | break; 25 | 26 | case "b.instructure.com": 27 | class = "domain-b"; 28 | console.log(" Domain " + window.location.hostname + " found, using class " + class); 29 | break; 30 | 31 | default: 32 | class = "default"; 33 | console.log(" Domain " + window.location.hostname + " not found in list of options, using class " + class); 34 | } 35 | 36 | // Append the appropriate class to the body element 37 | console.log(" Adding Class " + class " to body element."); 38 | $("body").addClass(class); 39 | 40 | }); 41 | -------------------------------------------------------------------------------- /branding/javascript/terms_and_conditions/README.md: -------------------------------------------------------------------------------- 1 | Adding a second checkbox to the terms and conditions 2 | ====== 3 | 4 | This script will add another checkbox to the terms and conditions. 5 | 6 | In this script you will need to include the URL for your organizations terms and privacy policy 7 | - These changes should occur on two variables marked in the script as "terms" and "privacy". 8 | 9 | Currently the second checkbox is not collected, stored or processed in any way, but it does prevent the user from getting past the agree to terms and conditions screen to get into Canvas. 10 | 11 | Support 12 | ====== 13 | 14 | This is an unsupported, community-created project. Keep that in mind. Instructure won't be able to help you fix or debug this. That said, the community will hopefully help support and keep both the script and this documentation up-to-date. 15 | 16 | Good luck! 17 | -------------------------------------------------------------------------------- /branding/javascript/total_activity_student_view/README.md: -------------------------------------------------------------------------------- 1 | # Show student total course activity time 2 | 3 | By adding the JS in this folder to your Canvas instance, it will run an API call on behalf of the student to get their activity time when they are in a course. 4 | 5 | **Note**: As with any part of Canvas, the links that these CSS Selectors target could change at any time. Be sure to check your beta environment before each production release to be sure that none of your JS/CSS has broken due to an upcoming code change. 6 | 7 | Support 8 | ====== 9 | 10 | This is an unsupported, community-created project. Keep that in mind. 11 | Instructure won't be able to help you fix or debug this. That said, the 12 | community will hopefully help support and keep both the script and this 13 | documentation up-to-date. 14 | 15 | Good luck! 16 | -------------------------------------------------------------------------------- /branding/javascript/total_activity_student_view/student_activity_time.js: -------------------------------------------------------------------------------- 1 | /*working as of July 26th, 2017*/ 2 | //Script to add the total activity time for the course a student is on 3 | 4 | $(document).ready(function() { 5 | function convertSeconds(totalSeconds) { 6 | totalSeconds = Number(totalSeconds); 7 | 8 | let d = Math.floor(totalSeconds / 86400); 9 | let h = Math.floor(totalSeconds % 86400 / 3600); 10 | let m = Math.floor(totalSeconds % 86400 % 3600 / 60); 11 | let s = Math.floor(totalSeconds % 86400 % 3600 % 60); 12 | 13 | return (' ' + d).slice(d.length) + ' day(s) ' + ('0' + h).slice(-2) + ":" + ('0' + m).slice(-2) + ":" + ('0' + s).slice(-2); 14 | } 15 | 16 | if (window.location.pathname.indexOf('courses') > -1 && $.inArray('student', ENV.current_user_roles) > -1) { 17 | let userId = ENV.current_user_id; 18 | let courseId = ENV.context_asset_string.split('_')[1]; 19 | let jsonUrl = `https://${window.location.hostname}/api/v1/users/${userId}/enrollments`; 20 | let time = ""; 21 | 22 | $.getJSON(jsonUrl, (data) => { 23 | let currentCourse = data.filter((course) => { 24 | return course.course_id == courseId; 25 | }); 26 | time = currentCourse[0].total_activity_time; 27 | time = convertSeconds(time); 28 | $('#right-side').prepend("

Time Activity

"); 29 | $(".events_list.time_active").append(time + " (hrs/mins/secs)"); 30 | }); 31 | 32 | } 33 | 34 | }); 35 | -------------------------------------------------------------------------------- /branding/javascript/url_dependent_branding/README.md: -------------------------------------------------------------------------------- 1 | # Loading Specific Branding Dependent on Canvas URL 2 | 3 | This folder is used to load styling dependent on the `window.location.hostname`, which can be useful if you have multiple domains for a single Canvas instance, or you're utilizing a vanity URL. 4 | 5 | # Edits to Make Prior to Using 6 | 7 | 1. Each `case` will need a single URL, either .instructure.com or your vanity URL. 8 | ```javascript 9 | case "YOUR_DOMAIN.instructure.com OR yourVanity_URL": 10 | ``` 11 | 2. Add your styling to this line, replacing the REPLACE_ME as your placeholder 12 | ```javascript 13 | sheet.innerHTML = "{REPLACE_ME}"; 14 | ``` 15 | *Working as of 10/11/2017* 16 | -------------------------------------------------------------------------------- /branding/javascript/url_dependent_branding/url_branding.js: -------------------------------------------------------------------------------- 1 | // Loads styling dependent on the URL used to access Canvas. Each URL will need its own "case". 2 | $(document).ready(function() { 3 | var URL = window.location.hostname; 4 | switch(URL) { 5 | case "YOUR_DOMAIN.instructure.com OR yourVanity_URL": // Only add one URL for each 'case' 6 | var sheet = document.createElement('style'); 7 | sheet.innerHTML = "{}"; // Add your styling here 8 | document.body.appendChild(sheet); 9 | break; 10 | 11 | case "YOUR_ADDITIONAL_DOMAIN.instructure.com OR yourVanity_URL": // Only add one URL for each 'case' 12 | var sheet = document.createElement('style'); 13 | sheet.innerHTML = "{}"; // Add your styling here 14 | document.body.appendChild(sheet); 15 | break; 16 | } 17 | }); -------------------------------------------------------------------------------- /branding/javascript/warn_on_external_link/README.md: -------------------------------------------------------------------------------- 1 | # Canvas Warn on External Link 2 | This JavaScript makes the user confirm that they want to follow a link to an external site. 3 | 4 | ## Usage 5 | Upload to the Theme Editor in the New UI 6 | -------------------------------------------------------------------------------- /branding/javascript/warn_on_external_link/warn_on_external_link.js: -------------------------------------------------------------------------------- 1 | /* canvas-warn-on-external-link.js 2 | * by: Danny Wahl dwahl@instructure.com 3 | * Working as of 11/12/2015 4 | * Adds an interstitial forcing the user 5 | * to confirm that they want to follow 6 | * an external link 7 | */ 8 | 9 | 10 | $(function(){ 11 | 12 | console.log("warn_on_external_link.js"); 13 | 14 | // Bind to anchors with the "external" class selector 15 | $(".external").click(function(e){ 16 | 17 | // Check with the user if they want to leave 18 | console.log(" 'external' link clicked."); 19 | console.log(" Confirming if the user wants to leave."); 20 | 21 | var goExternal = confirm("Are you sure you want to leave " + window.location.host + "?"); 22 | 23 | console.log(" User selected: " + goExternal); 24 | 25 | if(!goExternal) { 26 | console.log(" Action cancelled."); 27 | e.preventDefault(); 28 | } 29 | 30 | }); 31 | }); 32 | -------------------------------------------------------------------------------- /deprecated/README.md: -------------------------------------------------------------------------------- 1 | # Graveyard of Canvas tweaks & scripts 2 | 3 | This folder contains old scripts, branding, etc that have not been tested and are no longer working, or have been replaced by another script. Please feel free to update these scripts and make changes and submit a pull request. 4 | -------------------------------------------------------------------------------- /deprecated/api/PullCourseGrades/pull_grades.rb: -------------------------------------------------------------------------------- 1 | require 'net/http' 2 | 3 | 4 | http = Net::HTTP.new('cwt.instructure.com',443); 5 | #http.use_ssl = true 6 | path = '/api/v1/courses/?access_token=token_here' 7 | 8 | resp, data = http.get(path,nil) 9 | 10 | puts resp 11 | -------------------------------------------------------------------------------- /deprecated/branding/README.md: -------------------------------------------------------------------------------- 1 | # Legacy UI Branding tweaks 2 | -------------------------------------------------------------------------------- /deprecated/branding/add_global_nav_links/README.md: -------------------------------------------------------------------------------- 1 | Global Navigation Links 2 | ===== 3 | - DEPRECATED as of 4/19/2016 4 | 5 | Adds multiple global navigation links to Canvas that contain items when hovering over, can be stripped to use a single link as well. 6 | 7 | Support 8 | ====== 9 | 10 | This is an unsupported, community-created project. Keep that in mind. 11 | Instructure won't be able to help you fix or debug this. That said, the 12 | community will hopefully help support and keep both the script and this 13 | documentation up-to-date. 14 | 15 | Good luck! 16 | -------------------------------------------------------------------------------- /deprecated/branding/add_google_preview_links/README.md: -------------------------------------------------------------------------------- 1 | Add Google Preview Links if missing 2 | ========================================= 3 | - DEPRECATED AS OF 04/19/2016 4 | 5 | If you disable Scribd and are unfortunate enough to have missing document preview links 6 | after the change, this script may come in handy. It scans the page for Canvas file 7 | links and adds the preview button to those files that are previewable. 8 | 9 | Use at your own risk. 10 | 11 | 12 | Support 13 | ====== 14 | 15 | This is an unsupported, community-created project. Keep that in 16 | mind. Instructure won't be able to help you fix or debug this. 17 | That said, the community will hopefully help support and keep 18 | both the script and this documentation up-to-date. 19 | 20 | Good luck! 21 | -------------------------------------------------------------------------------- /deprecated/branding/add_html_to_http_external_link_module_warning/README.md: -------------------------------------------------------------------------------- 1 | HTML Module Warnings 2 | ====== 3 | - DEPRECATED AS OF 04/19/2016 4 | 5 | This script appends information to the warning box displayed when an HTTP:// external link is used for a module item in Canvas. 6 | 7 | *Note:* To replace the content instead of appending change the .append to .html 8 | 9 | 10 | Support 11 | ====== 12 | 13 | This is an unsupported, community-created project. Keep that in mind. 14 | Instructure won't be able to help you fix or debug this. That said, the 15 | community will hopefully help support and keep both the script and this 16 | documentation up-to-date. 17 | 18 | Good luck! 19 | -------------------------------------------------------------------------------- /deprecated/branding/add_html_to_http_external_link_module_warning/add_html_to_http_external_link_module_warning.js: -------------------------------------------------------------------------------- 1 | //DEPRECATED AS OF 04/19/2016 2 | 3 | /* 4 | * This script appends information to the warning box displayed 5 | * when an HTTP:// external link is used for a module item in Canvas. 6 | * 7 | * Note: To replace the content instead of appending change the .append to .html 8 | */ 9 | $(document).ready(function(){ 10 | $('#insecure_content_msg.alert.alert-error').append('

Put your html here

') 11 | }); 12 | -------------------------------------------------------------------------------- /deprecated/branding/add_text_to_header_roles/README.md: -------------------------------------------------------------------------------- 1 | - DEPRECATED AS OF 04/27/2016 2 | 3 | Support 4 | ====== 5 | 6 | This is an unsupported, community-created project. Keep that in mind. 7 | Instructure won't be able to help you fix or debug this. That said, the 8 | community will hopefully help support and keep both the script and this 9 | documentation up-to-date. 10 | 11 | Good luck! 12 | -------------------------------------------------------------------------------- /deprecated/branding/add_text_to_header_roles/add_text_to_header_roles.js: -------------------------------------------------------------------------------- 1 | //DEPRECATED AS OF 04/27/2016 2 | if (ENV.current_user_roles.indexOf("admin") >= 1 || ENV.current_user_roles.indexOf("teacher") >= 1){ 3 | 4 | $(document).ready(function(){ 5 | $('#header-logo-secondary').before(" Support #: 855-781-8579"); 6 | }); 7 | } 8 | -------------------------------------------------------------------------------- /deprecated/branding/add_to_main_top_nav/README.md: -------------------------------------------------------------------------------- 1 | Global Navigation Link 2 | ====== 3 | - DEPRECATED AS OF 04/27/2016 4 | 5 | Adds a single clickable link at the global navigation, with no dropdown options. 6 | 7 | Support 8 | ====== 9 | 10 | This is an unsupported, community-created project. Keep that in mind. 11 | Instructure won't be able to help you fix or debug this. That said, the 12 | community will hopefully help support and keep both the script and this 13 | documentation up-to-date. 14 | 15 | Good luck! 16 | -------------------------------------------------------------------------------- /deprecated/branding/add_to_main_top_nav/add_to_main_top_nav.js: -------------------------------------------------------------------------------- 1 | //DEPRECATED AS OF 04/27/2016 2 | $(document).ready(function(){ 3 | var url = "https://google.com"; 4 | var label = "Google"; 5 | $('#menu').append(""); 6 | }); 7 | -------------------------------------------------------------------------------- /deprecated/branding/add_tweaks_to_canvas_ui/README.md: -------------------------------------------------------------------------------- 1 | - DEPRECATED AS OF 04/29/2016 2 | 3 | # Add Tweaks to Canvas UI 4 | 5 | **Author:** Developed by David Keiser-Clark (dwk2@williams.edu) for the Office for Information Technology at Williams College 6 | 7 | **Follow:** If you have collaborative ideas or want to be notified of changes, please email me. 8 | 9 | **GitHub:** [Williams College: canvas_williams_mods](https://github.com/williamscollege/canvas_williams_mods) 10 | 11 | ## FEATURES 12 | 13 | - Login Page: Add tabindex attributes to the primary input fields so users may proceed directly from 'email' to 'password' to 'login' button 14 | - Login Page: Add 'type=text' attribute to username input field (so that on mobile version the default Canvas css styles apply to it the same as to password field) 15 | -------------------------------------------------------------------------------- /deprecated/branding/add_tweaks_to_canvas_ui/add_tweaks_to_canvas_ui.js: -------------------------------------------------------------------------------- 1 | //DEPRECATED AS OF 04/29/2016 2 | $(document).ready(function () { 3 | 4 | /*********************************************** 5 | ** Customize UI: LOGIN PAGE 6 | ***********************************************/ 7 | if (window.location.href.match(/\/login/ig)) { 8 | 9 | // add tabindex attributes 10 | $("#login_form INPUT#pseudonym_session_unique_id").prop('tabindex', '1'); 11 | $("#login_form INPUT#pseudonym_session_password").prop('tabindex', '2'); 12 | $("#login_form BUTTON.btn-primary").prop('tabindex', '3'); 13 | 14 | // MOBILE HACKS 15 | // Add type=text to username input field (so that default styles apply to it same as to password field) 16 | $("#login_form.front.face INPUT.input-block-level[name='pseudonym_session[unique_id]']").prop('type','text'); 17 | } 18 | 19 | 20 | }); // END OF: (document).ready 21 | -------------------------------------------------------------------------------- /deprecated/branding/change_courses_name_&_hide_grades/README.md: -------------------------------------------------------------------------------- 1 | - DEPRECATED AS OF 04/29/2016 2 | 3 | Support 4 | ====== 5 | 6 | This is an unsupported, community-created project. Keep that in mind. 7 | Instructure won't be able to help you fix or debug this. That said, the 8 | community will hopefully help support and keep both the script and this 9 | documentation up-to-date. 10 | 11 | Good luck! 12 | -------------------------------------------------------------------------------- /deprecated/branding/change_courses_name_&_hide_grades/change_courses_name_&_hide_grades.js: -------------------------------------------------------------------------------- 1 | //DEPRECATED AS OF 04/29/2016 2 | ///////////////////////////////////////////////////// 3 | // Hide Global Navigation & Change name on courses // 4 | ///////////////////////////////////////////////////// 5 | 6 | $("#grades_menu_item .menu-item-no-drop").hide(); 7 | $("#courses_menu_item.menu-item .menu-item-title").text("Learning Space"); 8 | -------------------------------------------------------------------------------- /deprecated/branding/hide_items_in_help/show_feature_request_to_teachers_and_admins/README.md: -------------------------------------------------------------------------------- 1 | # Show Feature Request Help Link To Only Teachers and Admins 2 | Confirmed working as of Sept 19, 2016 in Google Chrome on OSX. 3 | 4 | Important: Both the javascript and CSS are needed for this to function if you want the option to appears for teachers and admins. 5 | 6 | This script/CSS shows the "Submit a Feature Idea" option on the global navigation Help menu only to teachers and admins. If you would like to hide this option for everyone then you only need the CSS file. 7 | 8 | **Note**: As with any part of Canvas, the links that the CSS rules and Javascript code target could change at any time. Be sure to check your beta environment before each production release to be sure that this code has not broken due to changes in Canvas with each production release or other release. 9 | 10 | Support 11 | ====== 12 | 13 | This is an unsupported, community-created project. Keep that in mind. 14 | Instructure won't be able to help you fix or debug this. That said, the 15 | community will hopefully help support and keep both the script and this 16 | documentation up-to-date. 17 | 18 | Good luck! 19 | -------------------------------------------------------------------------------- /deprecated/branding/hide_items_in_help/show_feature_request_to_teachers_and_admins/show_feature_request_to_teachers_and_admins.css: -------------------------------------------------------------------------------- 1 | /* 2 | Show Feature Request Help Link To Teachers and Admins 3 | Provided AS-IS with out support. Use at your own risk. 4 | Confirmed working as of Sept 19,2016 5 | */ 6 | li.ic-NavMenu-list-item a[href="https://community.canvaslms.com/community/ideas/feature-ideas"] + div 7 | { display: none !important; } 8 | li.ic-NavMenu-list-item a[href="https://community.canvaslms.com/community/ideas/feature-ideas"] 9 | { display: none !important; } 10 | -------------------------------------------------------------------------------- /deprecated/branding/hide_items_in_help/show_feature_request_to_teachers_and_admins/show_feature_request_to_teachers_and_admins.js: -------------------------------------------------------------------------------- 1 | //Show Feature Request Help Link To Teachers and Admins 2 | //Provided AS-IS with out support. Use at your own risk. 3 | //Confirmed working as of Sept 19,2016 4 | 5 | if($.inArray('admin',ENV['current_user_roles']) > -1 || $.inArray('teacher',ENV['current_user_roles']) > -1) { 6 | $("head").append(''); 11 | } 12 | -------------------------------------------------------------------------------- /deprecated/branding/hide_items_in_help/show_report_a_problem_to_teachers_and_admins/README.md: -------------------------------------------------------------------------------- 1 | # Show Report a Problem Help Link To Only Teachers and Admins 2 | Confirmed working as of Sept 22, 2016 in Google Chrome on OSX. 3 | 4 | Important: Both the javascript and CSS are needed for this to function if you want the option to appears for teachers and admins. 5 | 6 | This script/CSS shows the "Report a Problem" option on the global navigation Help menu only to teachers and admins in the web UI. The option si NOT hidden in the app. If you would like to hide this option for everyone then you should use the Help links feature in Canvas to remove the Report a Problem link (https://community.canvaslms.com/docs/DOC-7280). 7 | 8 | **Note**: As with any part of Canvas, the links that the CSS rules and Javascript code target could change at any time. Be sure to check your beta environment before each production release to be sure that this code has not broken due to changes in Canvas with each production release or other release. 9 | 10 | Support 11 | ====== 12 | 13 | This is an unsupported, community-created project. Keep that in mind. 14 | Instructure won't be able to help you fix or debug this. That said, the 15 | community will hopefully help support and keep both the script and this 16 | documentation up-to-date. 17 | 18 | Good luck! 19 | -------------------------------------------------------------------------------- /deprecated/branding/hide_items_in_help/show_report_a_problem_to_teachers_and_admins/show_report_a_problem_to_teachers_and_admins.css: -------------------------------------------------------------------------------- 1 | /* 2 | Show Feature Request Help Link To Teachers and Admins 3 | Provided AS-IS with out support. Use at your own risk. 4 | Confirmed working as of Sept 19,2016 5 | */ 6 | li.ic-NavMenu-list-item a[href="#create_ticket"] + div 7 | { display: none !important; } 8 | li.ic-NavMenu-list-item a[href="#create_ticket"] 9 | { display: none !important; } 10 | -------------------------------------------------------------------------------- /deprecated/branding/hide_items_in_help/show_report_a_problem_to_teachers_and_admins/show_report_a_problem_to_teachers_and_admins.js: -------------------------------------------------------------------------------- 1 | //Show Report a Problem Help Link To Teachers and Admins 2 | //Provided AS-IS with out support. Use at your own risk. 3 | //Confirmed working as of Sept 22,2016 4 | 5 | if($.inArray('admin',ENV['current_user_roles']) > -1 || $.inArray('teacher',ENV['current_user_roles']) > -1) { 6 | $("head").append(''); 11 | } 12 | -------------------------------------------------------------------------------- /deprecated/branding/resources_global_tray_link/README.md: -------------------------------------------------------------------------------- 1 | This script uses JavaScript to modify react tray components to add an additional "resources" option to the left navigation. 2 | 3 | Modify the trayLinks variable to add or remove links on the popup tray. You can also modify the footerContent to add additional information at the bottom of the tray. 4 | 5 | Each object in the array will represent a link on the tray. Use the line below to add a new link. Val is the text value that the user will see and key is the link. 6 | 7 | ```{key: 'http://www.example.com/your-library', val: 'Library'},``` 8 | 9 | Only edit the following variables. Do not edit anything after line 13 or line 30 for the role based version. 10 | 11 | ``` 12 | var trayLinks = [ 13 | {key: 'http://www.example.com/your-library', val: 'Library'}, 14 | {key: 'http://www.google.com', val: 'Google'}, 15 | {key: 'http://www.example.com/help-desk', val: 'Help Desk'} 16 | ]; 17 | 18 | 19 | var slide_out_title = "Resources" //Changes the title on the slide out menu 20 | var global_nav_name = "Resources" //Change the title on the global navigation menu 21 | 22 | var footerContent = 'Footer text area. Put whatever you want here.'; 23 | ``` 24 | -------------------------------------------------------------------------------- /deprecated/branding/resources_global_tray_link/resources_global_tray_link.css: -------------------------------------------------------------------------------- 1 | #custom_nav .menu-item-icon-container { 2 | position: relative; 3 | left: -4px; 4 | } 5 | 6 | #custom_nav .menu-item__text { 7 | margin-top: 15px; 8 | } 9 | 10 | .icon-resources { 11 | position: relative; 12 | left: -2px; 13 | } 14 | 15 | .icon-resources:before { 16 | content: "\f13c"; 17 | } 18 | 19 | .icon-resources[class*=icon-]:before, .icon-resources[class^=icon-]:before { 20 | font-size: 30px; 21 | } 22 | -------------------------------------------------------------------------------- /non_api/updateCourseGradingPolicies/README.md: -------------------------------------------------------------------------------- 1 | # Bulk update all course grading policies to manual 2 | This script was made to use a headless browser to crawl through a canvas site and update all course grading policies manually based on a list of course SIS IDs. 3 | 4 | The headless browser approach was used because there was no way to do this through the api at the point of this script being written (hopefully there is something in the future). 5 | 6 | Make sure you have installed NodeJS and the script dependencies before running the script otherwise you will get errors! 7 | 8 | 9 | ## Support 10 | This script is provided AS-IS, without warranty, and without any support beyond this 11 | document and anyone kind enough to help from the community. 12 | 13 | This is an unsupported, community-created project. Keep that in mind. Instructure won't be 14 | able to help you fix or debug this. That said, the community will hopefully help support 15 | and keep both the script and this documentation up-to-date. 16 | 17 | Good luck! 18 | -------------------------------------------------------------------------------- /other/homebrew-inst-api/Formula/inst-api.rb: -------------------------------------------------------------------------------- 1 | # Working as of 02/21/2019 2 | class InstApi < Formula 3 | desc "A collection of wrappers for Instructure APIs" 4 | homepage "https://github.com/unsupported/canvas/other/inst-api" 5 | url "https://github.com/thedannywahl/inst-api/archive/v0.3.1.zip" 6 | sha256 "9b8135aa0871df7d5fba0d28a5a1fcc1187632c02c765d6f41ba33ed5e1ec3fc" 7 | 8 | def install 9 | bin.install Dir["arc/arc"], Dir["bridge/bridge"], Dir["canvas/canvas"], Dir["catalog/catalog"], Dir["commons/commons"] 10 | end 11 | 12 | def caveats; <<~EOS 13 | Installed binaries are: arc, bridge, canvas, catalog, commons 14 | User pref file is stored in ~/.inst 15 | EOS 16 | end 17 | 18 | test do 19 | system "#{bin}/arc -v" 20 | system "#{bin}/bridge -v" 21 | system "#{bin}/canvas -v" 22 | system "#{bin}/catalog -v" 23 | system "#{bin}/commons -v" 24 | end 25 | 26 | end 27 | -------------------------------------------------------------------------------- /other/homebrew-inst-api/README.md: -------------------------------------------------------------------------------- 1 | Formula to install [inst-api](https://github.com/thedannywahl/inst-api) 2 | 3 | ``` 4 | brew tap thedannywahl/inst-api 5 | brew install inst-api 6 | ``` 7 | -------------------------------------------------------------------------------- /other/instructure-unblock/LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to -------------------------------------------------------------------------------- /other/instructure-unblock/README.md: -------------------------------------------------------------------------------- 1 | Instructure unblock is an exceptions list (whitelist) for adblock software which allows Instructure software to function properly without having to disable your adblocker or create your own filters. Simply install the list below and that's it! 2 | 3 | [Install Instructure Unblock](abp:subscribe?location=https%3A%2F%2Fraw.githubusercontent.com%2Funsupported%2Fcanvas%2Fmaster%2F%2Fother%2Finstructure-unblock%2Finstructure-unblock.txt&title=Instructure%20Unblock) 4 | -------------------------------------------------------------------------------- /sis/README.md: -------------------------------------------------------------------------------- 1 | # SIS Automation Examples 2 | 3 | This folder contains different scripts that will allow you to automate pushing data into Canvas. 4 | -------------------------------------------------------------------------------- /sis/canvas_synergetic_integration/.gitignore: -------------------------------------------------------------------------------- 1 | /canvas 2 | docker-env.env 3 | results.zip 4 | -------------------------------------------------------------------------------- /sis/canvas_synergetic_integration/README.md: -------------------------------------------------------------------------------- 1 | # canvas-synergetic 2 | Synergetic sync with Canvas. 3 | 4 | # Environment File 5 | 1. Copy the docker-env.env.example file and rename to docker-env.env 6 | 2. Fill out necessary details in the docker-env.env file. 7 | 3. Build the container using "docker build -t canvas-upload ." 8 | 4. Run the container using "docker run -it --rm --env-file docker-env.env --name canvas-upload canvas-upload" 9 | -------------------------------------------------------------------------------- /sis/canvas_synergetic_integration/docker-env.env.example: -------------------------------------------------------------------------------- 1 | TOKEN=#token 2 | DB_URL=#database url 3 | DB=#database 4 | DB_USER=#service user 5 | DB_PASSWORD=#db password 6 | DRIVER=#driver (FreeTDS) -------------------------------------------------------------------------------- /sis/canvas_synergetic_integration/dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3 2 | 3 | WORKDIR /usr/src/app 4 | 5 | ADD odbcinst.ini /etc/odbcinst.ini 6 | 7 | RUN apt-get update && apt-get -y install gcc 8 | 9 | RUN apt-get install -y tdsodbc unixodbc-dev 10 | 11 | RUN apt install unixodbc-bin -y 12 | 13 | RUN apt-get clean -y 14 | 15 | COPY . . 16 | 17 | RUN pip install -r requirements.txt 18 | 19 | CMD [ "python", "./main.py" ] -------------------------------------------------------------------------------- /sis/canvas_synergetic_integration/odbcinst.ini: -------------------------------------------------------------------------------- 1 | [FreeTDS] 2 | Description=FreeTDS unixODBC Driver 3 | Driver=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so 4 | Setup=/usr/lib/x86_64-linux-gnu/odbc/libtdsS.so 5 | UsageCount=1 6 | -------------------------------------------------------------------------------- /sis/canvas_synergetic_integration/requirements.txt: -------------------------------------------------------------------------------- 1 | requests>=2.20.0 2 | pyodbc==4.0.21 3 | -------------------------------------------------------------------------------- /sis/change_sis_id_from_error_report/README.md: -------------------------------------------------------------------------------- 1 | LAST WORKING AS OF 08/30/2019 2 | 3 | 4 |

Change_sis_id.csv Generator

5 |

This script will read an error report for users that already have sis_id's in Canvas and generate a change_sis_id.csv that can be used to fix the errors.

6 | 7 |

To run this script

8 | 9 | 1. Move error report into working directory 10 | 2. In terminal, run - python fix_csv.py 11 | 12 |

Sample of Error CSV

13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
sis_import_idfilemessagerow
39users.csvAn existing Canvas user with the SIS ID XXXXXX has already claimed YYYYYYY's user_id requested login information, skipping
26 | 27 |

Important Disclaimers

28 | 29 | 1. This script is unsupported. Please validate functionality. 30 | 2. This script assumes that you do not have spaces in your SIS_ID's. 31 | 3. This script is assuming that you do not have integration id's 32 | -------------------------------------------------------------------------------- /sis/convert_to_uft8/powershell/README.md: -------------------------------------------------------------------------------- 1 | #PowerShell Example To Convert CSV Files to UTF8 Encoding 2 | 3 | This directory contains an example of a script that converts CSV files into UTF8 encoded text files. UTF8 is the required encoding method for CSV to be imported. 4 | 5 | You can get additional information on the Canvas CSV import format and sis_import API at the links below. 6 | 7 | * [How do I format CSV text files for uploading data into Canvas?](https://guides.instructure.com/m/4214/l/164118-how-do-i-format-csv-text-files-for-uploading-data-into-canvas) 8 | * [SIS Import CSV Format Documentation](https://canvas.instructure.com/doc/api/file.sis_csv.html) 9 | * [SIS Imports API](https://canvas.instructure.com/doc/api/sis_imports.html) 10 | 11 | ###Pre-reqs to run this script: 12 | 13 | * PowerShell 14 | 15 | ###You will need to alter the following variables during the setup process: 16 | 17 | * $path_to_csv_input_folder: Full path to the location of the CSV files that need to be converted to UTF8 encoding. (Must end in \\) 18 | * $path_to_csv_output_folder: Full path to the location UTF8 encoded files should be saved. (Must end in \\) 19 | -------------------------------------------------------------------------------- /sis/convert_to_uft8/powershell/convertToUTF8.ps1: -------------------------------------------------------------------------------- 1 | # adjust this path 2 | 3 | $path_to_csv_input_folder = "C:\path\to\csv\folder\"; 4 | $path_to_csv_output_folder = "C:\path\to\csv\folder\"; # Change this to something different 5 | # if you don't want to overwrite the existing files 6 | foreach($i in ls -name "$path_to_csv_input_folder*.csv") 7 | { 8 | $file = get-content "$path_to_csv_input_folder$i" 9 | $encoding = New-Object System.Text.UTF8Encoding($False) 10 | [System.IO.File]::WriteAllLines("$path_to_csv_output_folder$i", $file, $encoding) 11 | } 12 | -------------------------------------------------------------------------------- /sis/create_ssha_passwords/README.md: -------------------------------------------------------------------------------- 1 | #SSHA Password Hashing 2 | 3 | This directory contains an example of hashing passwords in SSHA format. Some schools may 4 | prefer doing this rather than sending plaintext passwords in the users.CSV file. 5 | 6 | The password is generated following the following process: 7 | 8 | 1. calculate the sha1 hex digest of the password with the salt and the salt 9 | 2. append the salt to the end 10 | 3. calculate the base64 string 11 | 4. prepend "{SSHA}" 12 | 5. return the result 13 | 14 | The result will end up looking like the following (which is the sha version of the 15 | password `password` and the salt `asdf`. 16 | 17 | ```{SSHA}NjViMjRhYmZjODc2MTA1YzFiYTg4ZDQ4MThiMDNkMmUyN2RlOTQ5M2FzZGY=``` 18 | 19 | A CSV file with this information would look like the file `users_hashed.csv`. -------------------------------------------------------------------------------- /sis/create_ssha_passwords/users_hashed.csv: -------------------------------------------------------------------------------- 1 | user_id,login_id,ssha_password,status 2 | shauser_v10,shauser_v10,"{SSHA}NjViMjRhYmZjODc2MTA1YzFiYTg4ZDQ4MThiMDNkMmUyN2RlOTQ5M2FzZGY=",active 3 | -------------------------------------------------------------------------------- /sis/sis_import_errors/python/sis_errors-README.txt: -------------------------------------------------------------------------------- 1 | SIS Import Errors Notification 2 | 3 | PURPOSE: This script is configured to provide an error list from the most 4 | recent Canvas SIS import in both CSV and email format (when configured 5 | properly) to a specified location and list of recipients, respectively. 6 | 7 | USE CASE: Run this script shortly after or as part of your SIS imports *every* 8 | time in order to get timely notifications of errors. 9 | 10 | Edit the following: 11 | 12 | sis_errors_token 13 | CANVAS_DOMAIN 14 | output_path 15 | 16 | Everything related to email or CSV output should be labeled as such. Comment 17 | out anything undesired to avoid errors (e.g., you do not want to use email, 18 | comment out all email sections). 19 | 20 | NOTES: 21 | * Email formatting slightly wonky, use CSV for best results 22 | * Can alter or supply a value for recent_imp to examine a specific import -------------------------------------------------------------------------------- /sis/sis_import_standard/CSharpCanvasSISPublish/CanvasSISImport/CanvasSISPublish.csproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | publish\ 5 | 6 | 7 | 8 | 9 | 10 | en-US 11 | false 12 | 13 | -------------------------------------------------------------------------------- /sis/sis_import_standard/CSharpCanvasSISPublish/CanvasSISImport/CanvasSISPublish.pidb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/CSharpCanvasSISPublish/CanvasSISImport/CanvasSISPublish.pidb -------------------------------------------------------------------------------- /sis/sis_import_standard/CSharpCanvasSISPublish/CanvasSISImport/bin/Debug/CanvasSISPublish.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/CSharpCanvasSISPublish/CanvasSISImport/bin/Debug/CanvasSISPublish.exe -------------------------------------------------------------------------------- /sis/sis_import_standard/CSharpCanvasSISPublish/CanvasSISImport/bin/Debug/CanvasSISPublish.exe.mdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/CSharpCanvasSISPublish/CanvasSISImport/bin/Debug/CanvasSISPublish.exe.mdb -------------------------------------------------------------------------------- /sis/sis_import_standard/CSharpCanvasSISPublish/CanvasSISImport/bin/Debug/sis_folders/courses.csv: -------------------------------------------------------------------------------- 1 | course_id,short_name,long_name,account_id,term_id,status,start_date,end_date 2 | AdCourse_31,MA109,Hematology,,,active,2012-04-08 00:00:00,2012-05-31 00:00:00 3 | -------------------------------------------------------------------------------- /sis/sis_import_standard/CSharpCanvasSISPublish/CanvasSISImport/bin/Debug/sis_folders/terms.csv: -------------------------------------------------------------------------------- 1 | term_id,name,status,start_date,end_date 2 | t:fall_2011,Fall 2011,active,2011-08-11,2011-12-20 3 | -------------------------------------------------------------------------------- /sis/sis_import_standard/CSharpCanvasSISPublish/CanvasSISImport/sis_folders/courses.csv: -------------------------------------------------------------------------------- 1 | course_id,short_name,long_name,account_id,term_id,status,start_date,end_date 2 | AdCourse_31,MA109,Hematology,,,active,2012-04-08 00:00:00,2012-05-31 00:00:00 3 | -------------------------------------------------------------------------------- /sis/sis_import_standard/CSharpCanvasSISPublish/CanvasSISImport/sis_folders/terms.csv: -------------------------------------------------------------------------------- 1 | term_id,name,status,start_date,end_date 2 | t:fall_2011,Fall 2011,active,2011-08-11,2011-12-20 3 | -------------------------------------------------------------------------------- /sis/sis_import_standard/CSharpCanvasSISPublish/CanvasSISPublish.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 11.00 3 | # Visual C# Express 2010 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CanvasSISImport", "CanvasSISImport\CanvasSISPublish.csproj", "{67073950-1C1B-4878-96DA-B9D419EABA1D}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|x86 = Debug|x86 9 | Release|x86 = Release|x86 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {67073950-1C1B-4878-96DA-B9D419EABA1D}.Debug|x86.ActiveCfg = Debug|x86 13 | {67073950-1C1B-4878-96DA-B9D419EABA1D}.Debug|x86.Build.0 = Debug|x86 14 | {67073950-1C1B-4878-96DA-B9D419EABA1D}.Release|x86.ActiveCfg = Release|x86 15 | {67073950-1C1B-4878-96DA-B9D419EABA1D}.Release|x86.Build.0 = Release|x86 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /sis/sis_import_standard/CSharpCanvasSISPublish/CanvasSISPublish.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/CSharpCanvasSISPublish/CanvasSISPublish.suo -------------------------------------------------------------------------------- /sis/sis_import_standard/CSharpCanvasSISPublish/CanvasSISPublish.userprefs: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /sis/sis_import_standard/README.rst: -------------------------------------------------------------------------------- 1 | Automation Examples 2 | =================== 3 | 4 | This directory contains several examples of automating SIS integrations. It is organized 5 | by programming language for the moment but ultimately we will re-organize the whole 6 | project to be organized by task type then programming language. 7 | -------------------------------------------------------------------------------- /sis/sis_import_standard/VisualBasicCanvasSISClient/.gitignore: -------------------------------------------------------------------------------- 1 | Canvas SIS Client/bin 2 | Canvas SIS Client/obj 3 | *.vbproj.user 4 | -------------------------------------------------------------------------------- /sis/sis_import_standard/VisualBasicCanvasSISClient/Canvas SIS Client.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 11.00 3 | # Visual Studio 2010 4 | Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Canvas SIS Client", "Canvas SIS Client\Canvas SIS Client.vbproj", "{10E3D4DC-5DE4-40D9-97C3-A75D34AD216F}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|x86 = Debug|x86 9 | Release|x86 = Release|x86 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {10E3D4DC-5DE4-40D9-97C3-A75D34AD216F}.Debug|x86.ActiveCfg = Debug|x86 13 | {10E3D4DC-5DE4-40D9-97C3-A75D34AD216F}.Debug|x86.Build.0 = Debug|x86 14 | {10E3D4DC-5DE4-40D9-97C3-A75D34AD216F}.Release|x86.ActiveCfg = Release|x86 15 | {10E3D4DC-5DE4-40D9-97C3-A75D34AD216F}.Release|x86.Build.0 = Release|x86 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /sis/sis_import_standard/VisualBasicCanvasSISClient/Canvas SIS Client.userprefs: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /sis/sis_import_standard/VisualBasicCanvasSISClient/Canvas SIS Client/My Project/Application.Designer.vb: -------------------------------------------------------------------------------- 1 | '------------------------------------------------------------------------------ 2 | ' 3 | ' This code was generated by a tool. 4 | ' Runtime Version:4.0.30319.239 5 | ' 6 | ' Changes to this file may cause incorrect behavior and will be lost if 7 | ' the code is regenerated. 8 | ' 9 | '------------------------------------------------------------------------------ 10 | 11 | Option Strict On 12 | Option Explicit On 13 | 14 | -------------------------------------------------------------------------------- /sis/sis_import_standard/VisualBasicCanvasSISClient/Canvas SIS Client/My Project/Application.myapp: -------------------------------------------------------------------------------- 1 |  2 | 3 | false 4 | false 5 | 0 6 | true 7 | 0 8 | 2 9 | true 10 | 11 | -------------------------------------------------------------------------------- /sis/sis_import_standard/VisualBasicCanvasSISClient/Canvas SIS Client/My Project/AssemblyInfo.vb: -------------------------------------------------------------------------------- 1 | Imports System 2 | Imports System.Reflection 3 | Imports System.Runtime.InteropServices 4 | 5 | ' General Information about an assembly is controlled through the following 6 | ' set of attributes. Change these attribute values to modify the information 7 | ' associated with an assembly. 8 | 9 | ' Review the values of the assembly attributes 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 'The following GUID is for the ID of the typelib if this project is exposed to COM 21 | 22 | 23 | ' Version information for an assembly consists of the following four values: 24 | ' 25 | ' Major Version 26 | ' Minor Version 27 | ' Build Number 28 | ' Revision 29 | ' 30 | ' You can specify all the values or you can default the Build and Revision Numbers 31 | ' by using the '*' as shown below: 32 | ' 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /sis/sis_import_standard/VisualBasicCanvasSISClient/Canvas SIS Client/My Project/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /sis/sis_import_standard/bash_curl/csv/README.md: -------------------------------------------------------------------------------- 1 | This folder should contain two sub-folders, named "new" and "archive" respectively. 2 | -------------------------------------------------------------------------------- /sis/sis_import_standard/bash_curl/csv/archive/README.md: -------------------------------------------------------------------------------- 1 | Completed imports will end up being moved into this folder. 2 | -------------------------------------------------------------------------------- /sis/sis_import_standard/bash_curl/csv/new/README.md: -------------------------------------------------------------------------------- 1 | This folder should be the destination of all CSV files generated from your SIS system. It 2 | is recommended that the file names be randomized, timestamped, or something like that 3 | rather than naming them users.csv, terms.csv, enrollments.csv, courses,csv, etc. 4 | -------------------------------------------------------------------------------- /sis/sis_import_standard/bash_curl/python_parser.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # NOTE: You may need to adjust the python path on your system 3 | import json, sys 4 | 5 | key_to_pull = sys.argv[1] 6 | r_input=sys.stdin.read() 7 | try: 8 | json_obj = json.loads(r_input) 9 | print json_obj.get(key_to_pull,key_to_pull+' missing, there might be errors') 10 | except Exception,e: 11 | print e,r_input 12 | -------------------------------------------------------------------------------- /sis/sis_import_standard/bash_curl/sample_localconfig.sh: -------------------------------------------------------------------------------- 1 | ACCESS_TOKEN="" # Change 2 | DOMAIN="kevin" # Change this to your account subdomain (i.e. cwt for cwt.instructure.com) 3 | BASE_DIRECTORY="/path/to/sis_integration/folder" 4 | CSV_FOLDER_NAME="new" 5 | 6 | -------------------------------------------------------------------------------- /sis/sis_import_standard/java/README.md: -------------------------------------------------------------------------------- 1 | This project is a simple JAVA client for submitting SIS files to the Canvas API. The file 2 | src/com/kajigga/CanvasAPIPost.java is an example of how this library might be 3 | used. 4 | 5 | There are some requirements to making this all work. These include the 6 | following: 7 | 8 | - Google's JSON reading library, GSON (info: https://code.google.com/p/google-gson/) 9 | - Apache's HTTPS Component libary for Java (info: http://hc.apache.org/httpcomponents-client-ga/quickstart.html) 10 | 11 | For convenience sake, these libraries have been included in the lib folder of this 12 | project. 13 | -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | CanvasAPI 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.jdt.core.javanature 16 | 17 | 18 | -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled 3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 4 | org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve 5 | org.eclipse.jdt.core.compiler.compliance=1.6 6 | org.eclipse.jdt.core.compiler.debug.lineNumber=generate 7 | org.eclipse.jdt.core.compiler.debug.localVariable=generate 8 | org.eclipse.jdt.core.compiler.debug.sourceFile=generate 9 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 10 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error 11 | org.eclipse.jdt.core.compiler.source=1.6 12 | -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/bin/com/kajigga/CanvasAPIPost.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/bin/com/kajigga/CanvasAPIPost.class -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/bin/com/kajigga/canvasapi/APIConfig.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/bin/com/kajigga/canvasapi/APIConfig.class -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/bin/com/kajigga/canvasapi/ImportResponse.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/bin/com/kajigga/canvasapi/ImportResponse.class -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/bin/com/kajigga/canvasapi/ImportSIS.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/bin/com/kajigga/canvasapi/ImportSIS.class -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/bin/com/kajigga/canvasapi/RequestWait.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/bin/com/kajigga/canvasapi/RequestWait.class -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/config.js: -------------------------------------------------------------------------------- 1 | { access_token:"", 2 | account_id:"", 3 | domain:"cwt.test", 4 | import_file:"/path/to/file.zip", 5 | filetype:"zip" 6 | } 7 | -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/google-gson-2.2.2/README: -------------------------------------------------------------------------------- 1 | Gson is a Java library that can be used to convert a Java object into its 2 | JSON representation. It can also be used to convert a JSON string into an 3 | equivalent Java object. Gson can work with arbitrary Java objects including 4 | pre-existing objects that you do not have source-code of. 5 | 6 | Complete Gson documentation is available at its project page 7 | http://code.google.com/p/google-gson 8 | -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/google-gson-2.2.2/gson-2.2.2-javadoc.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/lib/google-gson-2.2.2/gson-2.2.2-javadoc.jar -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/google-gson-2.2.2/gson-2.2.2-sources.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/lib/google-gson-2.2.2/gson-2.2.2-sources.jar -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/google-gson-2.2.2/gson-2.2.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/lib/google-gson-2.2.2/gson-2.2.2.jar -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1-bin.tar.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1-bin.tar.tar.gz -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/NOTICE.txt: -------------------------------------------------------------------------------- 1 | Apache HttpComponents Client 2 | Copyright 1999-2012 The Apache Software Foundation 3 | 4 | This product includes software developed by 5 | The Apache Software Foundation (http://www.apache.org/). 6 | 7 | -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/javadoc/org/apache/http/conn/util/package-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | org.apache.http.conn.util (HttpComponents Client 4.3-alpha1 API) 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | org.apache.http.conn.util 21 | 22 | 23 | 28 | 29 |
24 | Classes  25 | 26 |
27 | InetAddressUtils
30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/javadoc/org/apache/http/impl/client/cache/ehcache/package-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | org.apache.http.impl.client.cache.ehcache (HttpComponents Client 4.3-alpha1 API) 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | org.apache.http.impl.client.cache.ehcache 21 | 22 | 23 | 28 | 29 |
24 | Classes  25 | 26 |
27 | EhcacheHttpCacheStorage
30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/javadoc/org/apache/http/impl/conn/tsccm/doc-files/tsccm-structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/javadoc/org/apache/http/impl/conn/tsccm/doc-files/tsccm-structure.png -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/javadoc/package-list: -------------------------------------------------------------------------------- 1 | org.apache.http.auth 2 | org.apache.http.auth.params 3 | org.apache.http.client 4 | org.apache.http.client.cache 5 | org.apache.http.client.config 6 | org.apache.http.client.entity 7 | org.apache.http.client.fluent 8 | org.apache.http.client.methods 9 | org.apache.http.client.params 10 | org.apache.http.client.protocol 11 | org.apache.http.client.utils 12 | org.apache.http.conn 13 | org.apache.http.conn.params 14 | org.apache.http.conn.routing 15 | org.apache.http.conn.scheme 16 | org.apache.http.conn.socket 17 | org.apache.http.conn.ssl 18 | org.apache.http.conn.util 19 | org.apache.http.cookie 20 | org.apache.http.cookie.params 21 | org.apache.http.entity.mime 22 | org.apache.http.entity.mime.content 23 | org.apache.http.impl.auth 24 | org.apache.http.impl.client 25 | org.apache.http.impl.client.cache 26 | org.apache.http.impl.client.cache.ehcache 27 | org.apache.http.impl.client.cache.memcached 28 | org.apache.http.impl.conn 29 | org.apache.http.impl.conn.tsccm 30 | org.apache.http.impl.cookie 31 | org.apache.http.impl.execchain 32 | -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/javadoc/packages: -------------------------------------------------------------------------------- 1 | org.apache.http.impl.cookie 2 | org.apache.http.impl.conn 3 | org.apache.http.impl.conn.tsccm 4 | org.apache.http.impl.auth 5 | org.apache.http.impl.client 6 | org.apache.http.impl.execchain 7 | org.apache.http.cookie 8 | org.apache.http.cookie.params 9 | org.apache.http.conn 10 | org.apache.http.conn.params 11 | org.apache.http.conn.ssl 12 | org.apache.http.conn.socket 13 | org.apache.http.conn.scheme 14 | org.apache.http.conn.util 15 | org.apache.http.conn.routing 16 | org.apache.http.auth 17 | org.apache.http.auth.params 18 | org.apache.http.client 19 | org.apache.http.client.entity 20 | org.apache.http.client.methods 21 | org.apache.http.client.params 22 | org.apache.http.client.utils 23 | org.apache.http.client.config 24 | org.apache.http.client.protocol 25 | org.apache.http.entity.mime 26 | org.apache.http.entity.mime.content 27 | org.apache.http.impl.client.cache 28 | org.apache.http.impl.client.cache.memcached 29 | org.apache.http.impl.client.cache.ehcache 30 | org.apache.http.client.cache 31 | org.apache.http.client.fluent -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/javadoc/resources/inherit.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/javadoc/resources/inherit.gif -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/javadoc/stylesheet.css: -------------------------------------------------------------------------------- 1 | /* Javadoc style sheet */ 2 | 3 | /* Define colors, fonts and other style attributes here to override the defaults */ 4 | 5 | /* Page background color */ 6 | body { background-color: #FFFFFF } 7 | 8 | /* Headings */ 9 | h1 { font-size: 145% } 10 | 11 | /* Table colors */ 12 | .TableHeadingColor { background: #CCCCFF } /* Dark mauve */ 13 | .TableSubHeadingColor { background: #EEEEFF } /* Light mauve */ 14 | .TableRowColor { background: #FFFFFF } /* White */ 15 | 16 | /* Font used in left-hand frame lists */ 17 | .FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif } 18 | .FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif } 19 | .FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif } 20 | 21 | /* Navigation bar fonts and colors */ 22 | .NavBarCell1 { background-color:#EEEEFF;} /* Light mauve */ 23 | .NavBarCell1Rev { background-color:#00008B;} /* Dark Blue */ 24 | .NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;} 25 | .NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;} 26 | 27 | .NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;} 28 | .NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;} 29 | 30 | -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/lib/commons-codec-1.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/lib/commons-codec-1.6.jar -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/lib/commons-logging-1.1.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/lib/commons-logging-1.1.1.jar -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/lib/fluent-hc-4.3-alpha1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/lib/fluent-hc-4.3-alpha1.jar -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/lib/httpclient-4.3-alpha1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/lib/httpclient-4.3-alpha1.jar -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/lib/httpclient-cache-4.3-alpha1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/lib/httpclient-cache-4.3-alpha1.jar -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/lib/httpcore-4.3-alpha1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/lib/httpcore-4.3-alpha1.jar -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/lib/httpmime-4.3-alpha1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/lib/httpmime-4.3-alpha1.jar -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/tutorial/html/images/asf_logo_wide.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/tutorial/html/images/asf_logo_wide.gif -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/tutorial/html/images/hc_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/tutorial/html/images/hc_logo.png -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/tutorial/pdf/httpclient-tutorial.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/java/basic_example/lib/httpcomponents-client-4.3-alpha1/tutorial/pdf/httpclient-tutorial.pdf -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/src/com/kajigga/CanvasAPIPost.java: -------------------------------------------------------------------------------- 1 | package com.kajigga; 2 | 3 | import com.kajigga.canvasapi.ImportSIS; 4 | 5 | public class CanvasAPIPost { 6 | 7 | 8 | public static void main(String[] args) { 9 | 10 | ImportSIS importer = new ImportSIS(); 11 | 12 | // Figure out what folder this file is running in. 13 | String path = System.getProperty("user.dir"); 14 | String config_path = path + "/config.js"; 15 | // Load the config file (JSON) from the local director 16 | importer.readConfigFromFile(config_path); 17 | 18 | importer.log("Config file has been read, now importing"); 19 | 20 | // Send the import 21 | int sis_import_id = importer.doImport(); 22 | 23 | importer.log("File uploaded, id: " + sis_import_id); 24 | 25 | // Wait for the import to complete and save the response 26 | String completion = importer.WaitForCompletion(sis_import_id,10); 27 | 28 | importer.log(completion); 29 | 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/src/com/kajigga/canvasapi/APIConfig.java: -------------------------------------------------------------------------------- 1 | package com.kajigga.canvasapi; 2 | 3 | public class APIConfig { 4 | 5 | public String access_token; 6 | public String domain; 7 | public String account_id; 8 | public String import_file; 9 | public String filetype = "zip"; 10 | public String logfile; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/src/com/kajigga/canvasapi/ImportResponse.java: -------------------------------------------------------------------------------- 1 | package com.kajigga.canvasapi; 2 | 3 | public class ImportResponse { 4 | public String created_at; 5 | public String ended_at; 6 | public String updated_at; 7 | public int progress; 8 | public int id; 9 | public String workflow_state; 10 | public String created; 11 | } 12 | -------------------------------------------------------------------------------- /sis/sis_import_standard/java/basic_example/src/com/kajigga/canvasapi/RequestWait.java: -------------------------------------------------------------------------------- 1 | package com.kajigga.canvasapi; 2 | 3 | public class RequestWait { 4 | 5 | public static void waitABit(int waitTime) { 6 | 7 | System.out.println("Waiting: " + waitTime); 8 | try { 9 | Thread.sleep(waitTime * 1000); 10 | } catch (InterruptedException e) { 11 | } 12 | System.out.println("Done waiting"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /sis/sis_import_standard/nodejs/README.md: -------------------------------------------------------------------------------- 1 | # node.js v8+ SIS Integration Example 2 | This folder includes examples of code that can be used to integrate SIS systems with Canvas. These are relatively simple but can serve as a framework on which you can build. 3 | 4 | This script requires the following to be true: 5 | 6 | * node 8.0.0+ installed. 7 | * You know how to schedule tasks to run regularly with crontab if you want automation 8 | 9 | ## Setup/Installation 10 | * Copy the scripts to the desired location 11 | * Edit the script 12 | * Change the `importFile` variable 13 | * Change the `subdomain` variable 14 | * Change the `apiToken` variable 15 | * Change the `env` variable 16 | * Change the `archive_folder` variable 17 | 18 | ## Usage 19 | Create the cron job or scheduled task to run regularly. For example to run this hourly you could create a job like this: 20 | 21 | 0 * * * * /path/to/node_import_script.js -e 22 | 23 | ## Support 24 | As always, this is provided AS-IS, without warranty, and without any support beyond this document and anyone kind enough to help from the community. 25 | 26 | This is an unsupported, community-created project. Keep that in mind. Instructure won't be able to help you fix or debug this. That said, the community will hopefully help support and keep both the script and this documentation up-to-date. 27 | 28 | Good luck! 29 | -------------------------------------------------------------------------------- /sis/sis_import_standard/powershell/README.md: -------------------------------------------------------------------------------- 1 | #Standard SIS Imports PowerShell Example 2 | 3 | This directory contains an example of using the sis_imports Canvas API to import a collection of Canvas formatted CSVs as a standard import into Canvas. 4 | 5 | You can get additional information on the Canvas CSV import format and sis_import API at the links below. 6 | 7 | * [How do I format CSV text files for uploading data into Canvas?](https://guides.instructure.com/m/4214/l/164118-how-do-i-format-csv-text-files-for-uploading-data-into-canvas) 8 | * [SIS Import CSV Format Documentation](https://canvas.instructure.com/doc/api/file.sis_csv.html) 9 | * [SIS Imports API](https://canvas.instructure.com/doc/api/sis_imports.html) 10 | 11 | ###Pre-reqs to run this script: 12 | 13 | * PowerShell 3 or higher 14 | * [PowerShell Community Extensions](https://github.com/Pscx/Pscx) 15 | 16 | ###You will need to alter the following variables during the setup process: 17 | 18 | * $sourcePath: Source path containing the CSV files to import. (Must end in a \\) 19 | * $outputPath: Output path for the zip file that will be imported into Canvas. (Must end in a \\) 20 | * $account_id: Root account ID of Canvas, usually the number 1. This can also be set to "self". 21 | * $token: [Canvas API access token](https://community.canvaslms.com/docs/DOC-3013) for a user with permission to import SIS CSV files into Canvas. 22 | * $domain: Full Canvas URL to your Canvas instance (without https://). Should look something like "school.instructure.com" 23 | * $outputZip: Name of the .zip file to create. For example "output.zip". 24 | -------------------------------------------------------------------------------- /sis/sis_import_standard/powershell_integration/README.rst: -------------------------------------------------------------------------------- 1 | This script makes use of the invoke-RestMethod which is only present in PowerShell v3. If 2 | you do not have PowerShell v3, you can get it from 3 | http://www.microsoft.com/en-us/download/details.aspx?id=34595. 4 | 5 | Also it uses a added powershell cmdlet called "Powershell Community Extensions" PSCX 6 | 3.0.0.0. You will need to download the msi file from 7 | https://github.com/Pscx/Pscx Then run the msi installer. You may need to 8 | reboot the machine in order for the environment variable paths to take. 9 | -------------------------------------------------------------------------------- /sis/sis_import_standard/powershell_integration/convertToUTF8.ps1: -------------------------------------------------------------------------------- 1 | # adjust this path 2 | 3 | $path_to_csv_folder = "C:\path\to\csv\folder"; 4 | $path_to_csv_output_folder = "C:\path\to\csv\folder"; # Change this to something different 5 | # if you don't want to overwrite the existing files 6 | foreach($i in ls -name "$path_to_csv_folder\*.csv") 7 | { 8 | $file = get-content "$path_to_csv_folder\$i" 9 | $encoding = New-Object System.Text.UTF8Encoding($False) 10 | [System.IO.File]::WriteAllLines("$path_to_csv_output_folder\$i", $file, $encoding) 11 | } 12 | -------------------------------------------------------------------------------- /sis/sis_import_standard/python_basic/account_id.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsupported/canvas/deb4452e5ae933aafa3894bd0d4efa03b7bc5e3b/sis/sis_import_standard/python_basic/account_id.jpg -------------------------------------------------------------------------------- /sis/sis_import_standard/python_basic/courses.csv: -------------------------------------------------------------------------------- 1 | course_id,short_name,long_name,account_id,term_id,status,start_date,end_date 2 | 2011-2012-Spring-007B-X,007B-X,007B-X - Tom VanKeulen's Test Course,84777,2011-2012-Spring,deleted,2012-01-30 00:00:00,2012-05-11 00:00:00 3 | -------------------------------------------------------------------------------- /sis/sis_import_standard/python_basic/settings.py: -------------------------------------------------------------------------------- 1 | 2 | ACCESS_TOKEN = 'iUYAJ94u3b42AeemfcwMxbZMZ8LZ3W27TTCzLGsWV6jzyQGiQyhhTDjs8kPYVo3A' 3 | ACCOUNT_ID = 82726 4 | BASE_URL = "https://cwt.instructure.com/api/v1/%s" 5 | 6 | -------------------------------------------------------------------------------- /sis/sis_import_standard/python_requestlib/import_csv.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | import requests 4 | import json 5 | from pprint import pprint 6 | 7 | 8 | # 1. Define inputs for the POST/GET request 9 | base_url = 'https://school.instructure.com/api/v1/accounts/self/' # Example: https://ian.test.instructure.com/api/v1/accounts/' 10 | header = {'Authorization' : 'Bearer '} 11 | 12 | # Parameters specific to the initial POST request 13 | myfile = '' # Example: 'SIS_Testing/users.csv' 14 | payload = {'import_type' : 'instructure_csv', 'extension' : 'csv'} 15 | data = open(myfile, 'rb').read() 16 | 17 | # If you're checking the status of an import, include the sis_import_id here in quotes. For submitting an import leave at None. 18 | import_id = None 19 | 20 | 21 | # 2. Create a response object from the POST request 22 | def myrequest(base_url, header, payload, data): 23 | if not import_id: 24 | r = requests.post(base_url + "/sis_imports/", headers=header, params=payload, data=data) 25 | else: 26 | r = requests.get(base_url + "/sis_imports/" + import_id, headers=header) 27 | return r 28 | 29 | # 3. Pull JSON content from the response into a new JSON object 30 | # 4. Place key elements into a dictionary for later reference 31 | def parsejson(r): 32 | rjson = json.loads(r.text) 33 | return rjson 34 | 35 | # 0. Main method 36 | def main(): 37 | # Create a response object from the POST/GET request 38 | r = myrequest(base_url,header,payload,data) 39 | # Parse JSON response 40 | rjson = parsejson(r) 41 | # Print JSON response 42 | pprint(rjson) 43 | 44 | if __name__ == "__main__": main() 45 | -------------------------------------------------------------------------------- /sis/sis_import_standard/ruby/Gemfile: -------------------------------------------------------------------------------- 1 | source 'http://rubygems.org' 2 | 3 | gem 'rubyzip' 4 | gem 'typhoeus' 5 | -------------------------------------------------------------------------------- /sis/sis_import_standard/ruby/README.md: -------------------------------------------------------------------------------- 1 | # Ruby 2+ SIS Integration Example 2 | 3 | This folder includes examples of code that can be used to integrate SIS systems with Canvas. These are relatively simple but can serve as a framework on which you can build. 4 | 5 | This script requires the following to be true: 6 | 7 | - Ruby 2.0.0+ installed. 8 | - You know how to schedule tasks to run regularly with crontab (\*nix). 9 | 10 | ## Setup/Installation 11 | 12 | - Copy the scripts to the desired location 13 | - Edit the script 14 | - Change the `access_token` variable 15 | - Change the `domain` variable 16 | - Change the `env` variable 17 | - Change the `source_folder` variable 18 | - Change the `archive_folder` variable 19 | 20 | ## Usage 21 | 22 | Create the cron job or scheduled task to run regularly. For example to run this hourly you could create a job like this: 23 | 24 | 0 * * * * /path/to/sis_script.rb -e 25 | 26 | ## Support 27 | 28 | As always, this is provided AS-IS, without warranty, and without any support beyond this document and anyone kind enough to help from the community. 29 | 30 | This is an unsupported, community-created project. Keep that in mind. Instructure won't be able to help you fix or debug this. That said, the community will hopefully help support and keep both the script and this documentation up-to-date. 31 | 32 | Good luck! 33 | -------------------------------------------------------------------------------- /sis/sis_import_standard/vb.net/README.md: -------------------------------------------------------------------------------- 1 | Windows-based SIS Integration Automation 2 | ====== 3 | 4 | NOTE: This method is not the most reliable method of doing the integration. Installing 5 | CURL on Windows proves to be fairly problematic and error prone. I recommend you look 6 | into using the Powershell scripts instead at https://github.com/kajigga/canvas-contrib/tree/master/SIS%20Integration/powershell_integration. 7 | 8 | This folder includes a VB.net script useful for sending once CSV at a time via the 9 | Canvas API. 10 | 11 | License 12 | ====== 13 | 14 | Use at your own risk. Please understand this code and modify it to fit your processes. 15 | --------------------------------------------------------------------------------