codegrade 16.1.87__tar.gz → 16.1.89__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {codegrade-16.1.87 → codegrade-16.1.89}/PKG-INFO +1 -1
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_rich_value.py +64 -60
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/__init__.py +6 -1
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/file.py +5 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/login_link.py +4 -8
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/user.py +6 -14
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/client.py +66 -2
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/__init__.py +0 -6
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/all_site_settings.py +0 -17
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/site_setting_input.py +0 -5
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/user_login_response.py +3 -3
- {codegrade-16.1.87 → codegrade-16.1.89}/pyproject.toml +1 -1
- {codegrade-16.1.87 → codegrade-16.1.89}/setup.py +1 -1
- codegrade-16.1.87/codegrade/models/lti_first_launch_content_id_enabled_setting.py +0 -57
- codegrade-16.1.87/codegrade/models/result_data_post_login_link_login.py +0 -80
- codegrade-16.1.87/codegrade/models/result_data_post_user_login.py +0 -80
- codegrade-16.1.87/codegrade/models/result_data_post_user_register.py +0 -80
- {codegrade-16.1.87 → codegrade-16.1.89}/README.md +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_dt_utils/__init__.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_maybe/__init__.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_maybe/_just.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_maybe/_maybe.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_maybe/_nothing.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_maybe/_type_helpers.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_maybe/cg_maybe_plugin.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_maybe/utils.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/__init__.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_any_value.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_base.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_convert.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_enum.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_form.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_lazy.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_list.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_literal.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_mapping.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_multipart.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_nullable.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_parse_utils.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_query.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_set.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_swagger_utils.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_swaggerize.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/_utils.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/exceptions.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/cg_request_args/request_args_plugin.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/__init__.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/about.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/assignment.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/auto_test.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/comment.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/course.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/course_price.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/git_provider.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/group.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/group_set.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/lti.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/notification.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/oauth_provider.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/oauth_token.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/permission.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/plagiarism.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/role.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/saml.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/section.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/site_settings.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/snippet.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/sso_provider.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/submission.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/task_result.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/tenant.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/transaction.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/user_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/_api/webhook.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/errors.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/_base_price.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/_saml_ui_logo_info.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/_submission_rubric_item_data_parser.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/about.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/abstract_role.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/access_token_modal_warning_time_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/access_token_toast_warning_time_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/add_users_section_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/ai_assistant_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/all_auto_test_results.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/always_update_pii_with_lti_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/analytics_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/any_auto_test_step_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/any_error.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/any_non_redacted_auto_test_step_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/any_redacted_auto_test_step_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/api_codes.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_anonymization_algo.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_default_grading_scale_points_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_default_grading_scale_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_description_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_description_on_teachers_submissions_page_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_done_type.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_export_column.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_feedback.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_grader.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_grading_scale_points_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_kind.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_login_link.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_max_points_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_peer_feedback_connection.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_peer_feedback_settings.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_percentage_decimals_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_percentage_grading_settings.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_point_decimals_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_points_grading_settings.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_section_timeframe.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_state_enum.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_submission_mode.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_template.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assignment_timeframes.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/assistant_tools_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/at_image_caching_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_capture_points_message_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_checkpoint_message_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_code_quality_message_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_fixture.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_global_setup_output.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_global_setup_script.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_heartbeat_interval_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_heartbeat_max_missed_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_io_test_message_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_io_test_sub_message_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_max_concurrent_batch_runs_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_max_global_setup_time_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_max_jobs_per_runner_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_max_per_student_setup_time_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_max_result_not_started_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_max_time_command_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_max_unit_test_metadata_length_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_quality_comment.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_result.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_result_state.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_result_with_extra_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_run.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_run_program_message_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_runner.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_runner_state.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_set.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_step_base.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_step_base_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_step_base_input_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_step_log_base.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_step_result.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_step_result_state.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_step_validation_exception.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_suite.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/auto_test_unit_test_message_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/automatic_lti1p3_assignment_import_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/automatic_lti_role_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_about.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_auto_test_quality_comment.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_comment_base.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_comment_base_with_extended_replies.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_comment_base_with_normal_replies.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_comment_reply.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_course_coupon.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_directory.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_error.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_file.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_lms_capabilities.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_lti1p1_provider.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_lti1p3_provider.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_lti_provider.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_notification.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_release_info.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_rubric_item.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/base_tenant_coupon.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/blackboard_zip_upload_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/bulk_enroll_course_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/canvas_course_id_copying_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/cg_ignore_version.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/change_user_role_course_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/check_points_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/check_points_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/check_points_extra.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/check_points_input_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/clone_result.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/code_editor_output_viewer_title_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/code_editor_start_on_assignment_description_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/code_quality_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/code_quality_base_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/code_quality_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/code_quality_extra.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/code_quality_input_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/code_quality_penalties.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/column_range.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/comment_base.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/comment_reply.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/comment_reply_edit.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/comment_reply_type.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/comment_type.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/community_library_publishing_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/community_library_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/connect_repository_git_provider_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/copy_auto_test_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/copy_rubric_assignment_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/coupon_data_parser.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/coupon_with_code.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/coupon_without_code.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_bulk_enroll_result.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_bulk_register_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_coupon.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_coupon_usage.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_gradebook_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_gradebook_render_warning_size_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_of_course_price.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_of_tenant_coupon_usage.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_perm_map.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_permission.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_price.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_register_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_registration_link.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_role.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_role_as_json_with_perms.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_section.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_section_division.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_section_division_connection.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_section_division_user.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_snippet.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_state.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/course_statistics_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_assignment_course_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_auto_test_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_comment_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_comment_reply_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_course_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_division_section_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_group_group_set_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_group_set_course_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_lti_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_output_html_proxy_auto_test_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_proxy_submission_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_repository_git_provider_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_role_course_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_section_course_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_snippet_course_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_snippet_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_sso_provider_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/create_tenant_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/csv_large_file_limit_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/csv_too_many_errors_limit_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/currency.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/custom_output_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/custom_output_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/custom_output_extra.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/custom_output_input_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/custom_output_log.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/custom_output_log_base.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/default_course_ta_role_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/default_course_teacher_role_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/default_submission_page_tab_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/deleted_comment_reply.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/deletion_type.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/directory_with_children.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/disabled_setting_exception.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/display_grades_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/editor_enabled_for_teachers_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/editor_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/email_notification_types.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/email_students_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/email_users_course_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/exam_login_max_length_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/export_assignment_csv_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/export_assignment_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/export_assignment_files_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/extended_auto_test_result.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/extended_auto_test_run.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/extended_course.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/extended_course_registration_link.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/extended_course_section.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/extended_group.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/extended_job.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/extended_non_deleted_comment_reply.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/extended_tenant.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/extended_transaction.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/extended_user.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/extended_work.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/extract_file_tree_directory.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/extract_file_tree_file.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/failed_to_send_email_exception.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/feedback_base.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/feedback_threads_initially_collapsed_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/feedback_with_replies.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/feedback_without_replies.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/file_deletion.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/file_rule.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/file_rule_input_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/file_tree.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/file_type.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/finalized_lti1p1_provider.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/finalized_lti1p3_provider.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/first_day_of_week_from_locale_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/first_phase_lti_launch_exception.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/fixed_availability.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/fixed_grade_availability.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/fixture_like.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/fraction.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/frontend_site_settings.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/general_feedback_comment_base.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/general_feedback_comment_base_with_extended_replies.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/general_feedback_extra.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/git_repositories_page.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/git_repository_like.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/git_user_info.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/github_template_repo_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/global_perm_map.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/global_permission.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/grade_history.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/grade_origin.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/grading_notifications_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/group.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/group_not_ready_for_submission_exception.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/group_set.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/groups_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/has_unread_notifcation_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/health_information.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/hide_code_editor_filetree_controls_with_only_quiz_steps_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/hide_code_editor_output_viewer_with_only_quiz_steps_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/hide_empty_rubric_row_description_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/hide_no_deadline_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/hubspot_syncing_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/ignore_handling.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/ignored_files_exception.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/import_into_assignment_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/import_into_course_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/incremental_rubric_submission_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/inline_feedback_comment_base.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/inline_feedback_comment_base_with_extended_replies.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/inline_feedback_extra.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/inline_feedback_on_quizzes_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/inline_rubric_viewer_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/invalid_group_exception.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/invalid_io_cases_exception.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/invalid_options_exception.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/io_test_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/io_test_base_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/io_test_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/io_test_extra.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/io_test_input_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/io_test_input_case.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/io_test_log.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/io_test_option.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/io_test_step_log.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/io_test_step_log_base.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/is_admin_permission_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/is_pearson_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/job.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/json_create_auto_test.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/json_create_tenant.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/json_patch_auto_test.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/json_patch_submit_types_assignment.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/junit_test_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/junit_test_base_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/junit_test_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/junit_test_extra.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/junit_test_input_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/junit_test_log.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/junit_test_log_base.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/jupyter_notebook_editor_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/jupyter_notebook_running_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/jwt_access_token_expires_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/legacy_features.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/line_range.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/linters_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/lms_capabilities.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/login_token_before_time_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/login_user_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/logout_response.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/logout_user_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/lti1p1_provider.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/lti1p1_provider_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/lti1p3_nonce_and_state_validation_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/lti1p3_parse_most_privileged_role_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/lti1p3_prevent_nonce_reuse_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/lti1p3_provider.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/lti1p3_provider_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/lti1p3_provider_presentation_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/lti1p3_system_role_from_context_role_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/lti_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/lti_launch_data_logging_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/lti_lock_date_copying_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/lti_provider_base.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/lti_unset_deadline_lock_date_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/max_document_update_size_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/max_dynamo_file_size_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/max_dynamo_submission_size_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/max_file_size_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/max_large_upload_size_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/max_lines_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/max_normal_upload_size_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/max_number_of_files_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/max_plagiarism_matches_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/max_user_setting_amount_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/min_password_score_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/mirror_file_result.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/missing_cookie_error.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/missing_file.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/name_and_email_from_nrps_only_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/new_auto_test_allowed_initial_build_ids_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/new_auto_test_build_max_command_time_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/new_auto_test_build_output_limit_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/new_auto_test_copying_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/new_auto_test_current_initial_build_ids_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/new_auto_test_diff_viewer_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/new_auto_test_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/new_auto_test_initial_build_id_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/new_auto_test_max_dynamodb_size_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/new_auto_test_max_file_size_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/new_auto_test_max_output_files_size_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/new_auto_test_max_storage_size_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/new_auto_test_old_submission_age_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/new_auto_test_test_max_command_time_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/new_auto_test_test_output_limit_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/new_auto_test_uncollapsing_step_output_delay_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/no_permissions.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/non_deleted_comment_reply.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/non_finalized_lti1p1_provider.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/non_finalized_lti1p3_provider.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/non_present_preference.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/notification.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/notification_comment_reply_notification_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/notification_general_feedback_reply_notification_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/notification_poll_time_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/notification_reasons.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/notification_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/notification_setting_option.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/notifications_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/oauth_provider.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/oauth_token.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/option.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/options_input_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/output_viewer_animation_limit_lines_count_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/output_viewer_auto_expand_failed_steps_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/parse_api_exception.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch1_p1_provider_lti_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch1_p3_provider_lti_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_all_notification_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_assignment_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_auto_test_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_comment_reply_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_course_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_grader_submission_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_notification_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_notification_setting_user_setting_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_provider_lti_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_role_course_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_role_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_role_tenant_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_rubric_category_type_assignment_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_rubric_result_submission_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_section_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_settings_tenant_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_site_settings_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_snippet_course_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_snippet_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_submission_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_submit_types_assignment_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_tenant_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_ui_preference_user_setting_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/patch_user_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/pay_with_coupon_course_price_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/pearson_templates_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/pearson_try_out_coding_question_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/peer_feedback_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/permission_exception.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/plagiarism_bulk_export_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/plagiarism_bulk_export_max_cases_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/plagiarism_case.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/plagiarism_pdf_export_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/plagiarism_run.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/plagiarism_run_plagiarism_assignment_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/plagiarism_run_plagiarism_course_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/plagiarism_state.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/post_oauth_token_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/present_preference.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/prompt_engineering_step_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/proxy.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/put_description_assignment_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/put_enroll_link_course_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/put_price_course_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/put_price_tenant_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/put_rubric_assignment_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/quality_comment_severity.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/quality_comments_in_code_editor_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/quality_test_log.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/quality_test_log_base.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/quiz_single_question_mode_hide_run_button_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/register_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/register_user_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/register_user_with_link_course_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/release_info.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/release_message_max_time_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/removed_permissions.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/rename_group_group_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/render_html_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/repository_connection_limit_reached_exception.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/reset_token_time_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/result_data_get_auto_test_get.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/result_data_get_task_result_get_all.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/result_data_post_section_create_division.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/retry_group_submission_grade_passback_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/role_as_json_with_perms.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/root_file_trees_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/rubric_description_type.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/rubric_enabled_for_teacher_on_submissions_page_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/rubric_item.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/rubric_item_input_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/rubric_lock_reason.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/rubric_row_base.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/rubric_row_base_input_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/rubric_row_base_input_base_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/rubrics_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/rule_type.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/run_program_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/run_program_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/run_program_extra.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/run_program_input_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/run_program_log.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/saml2_provider_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/saml_ui_info.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/sections_in_submission_list_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/send_registration_email_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/server_time_correction_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/server_time_diff_tolerance_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/server_time_sync_interval_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/session_restriction_context.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/session_restriction_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/setting_token_time_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/setup_oauth_result.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/simple_submission_mode_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/simple_submission_navigate_to_latest_editor_session_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/site_email_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/snippet.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/sso_infer_global_staff_role_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/sso_username_decollision_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/staged_assignment_importer_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/start_payment_course_price_close_tab_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/start_payment_course_price_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/start_payment_course_price_redirect_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/started_transaction.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/student_payment_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/student_payment_main_option_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/student_view_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/submission_validator_input_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/submissions_per_page_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/task_result_state.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/tax_behavior.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/tenant.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/tenant_coupon.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/tenant_coupon_usage.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/tenant_coupon_with_code.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/tenant_coupon_without_code.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/tenant_course_statistics.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/tenant_of_tenant_price.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/tenant_permissions.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/tenant_price.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/tenant_role_as_json_with_perms.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/tenant_statistics.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/test_submission_copying_on_import_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/timed_availability.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/timeframe_like.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/token_revoked_exception.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/transaction.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/transaction_state.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/types.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/update_peer_feedback_settings_assignment_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/update_set_auto_test_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/update_suite_auto_test_base_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/update_suite_auto_test_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/upgraded_lti_provider_exception.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/upload_submission_assignment_data.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/user.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/user_course.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/user_info_with_role.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/user_input.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/user_without_group.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/warning_for_missing_newline_enabled_setting.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/weak_password_exception.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/weak_password_feedback.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/webhook_base.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/webhook_configuration_disabled_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/webhook_configuration_enabled_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/work.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/work_origin.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/work_rubric_item.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/work_rubric_result_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/models/work_rubric_result_points_as_json.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/parsers.py +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/py.typed +0 -0
- {codegrade-16.1.87 → codegrade-16.1.89}/codegrade/utils.py +0 -0
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
This module contains parsers for values that should be transformed or
|
|
3
3
|
restricted in any way.
|
|
4
4
|
"""
|
|
5
|
+
|
|
5
6
|
import re
|
|
6
7
|
import uuid
|
|
7
8
|
import typing as t
|
|
@@ -27,15 +28,15 @@ class _GEComparable(Protocol):
|
|
|
27
28
|
...
|
|
28
29
|
|
|
29
30
|
|
|
30
|
-
_GEComparableT = t.TypeVar(
|
|
31
|
+
_GEComparableT = t.TypeVar("_GEComparableT", bound=_GEComparable)
|
|
31
32
|
|
|
32
|
-
__all__ = (
|
|
33
|
+
__all__ = ("RichValue", )
|
|
33
34
|
|
|
34
35
|
|
|
35
36
|
class _NumberAsString(_Transform[int, str]):
|
|
36
37
|
__slots__ = ()
|
|
37
38
|
|
|
38
|
-
def __init__(self, name: str =
|
|
39
|
+
def __init__(self, name: str = "_NumberAsString") -> None:
|
|
39
40
|
super().__init__(
|
|
40
41
|
SimpleValue.str,
|
|
41
42
|
self.__to_int,
|
|
@@ -56,12 +57,12 @@ class _UUID(_Transform[uuid.UUID, str]):
|
|
|
56
57
|
__slots__ = ()
|
|
57
58
|
|
|
58
59
|
def __init__(self) -> None:
|
|
59
|
-
super().__init__(SimpleValue.str, self.__transform_to_uuid,
|
|
60
|
+
super().__init__(SimpleValue.str, self.__transform_to_uuid, "UUID")
|
|
60
61
|
|
|
61
62
|
def _to_open_api(self, schema: OpenAPISchema) -> t.Mapping[str, t.Any]:
|
|
62
63
|
return {
|
|
63
64
|
**self._parser.to_open_api(schema),
|
|
64
|
-
|
|
65
|
+
"format": "uuid",
|
|
65
66
|
}
|
|
66
67
|
|
|
67
68
|
def __transform_to_uuid(self, value: str) -> uuid.UUID:
|
|
@@ -72,7 +73,7 @@ class _UUID(_Transform[uuid.UUID, str]):
|
|
|
72
73
|
self,
|
|
73
74
|
value,
|
|
74
75
|
extra={
|
|
75
|
-
|
|
76
|
+
"message": "which can't be parsed as a valid uuid",
|
|
76
77
|
},
|
|
77
78
|
) from exc
|
|
78
79
|
|
|
@@ -81,23 +82,23 @@ class _Date(_Transform[datetime.date, str]):
|
|
|
81
82
|
__slots__ = ()
|
|
82
83
|
|
|
83
84
|
_ISO8601_DATE_RE = re.compile(
|
|
84
|
-
r
|
|
85
|
+
r"^(?P<year>\d+)-(?P<month>\d\d)-(?P<day>\d\d)$"
|
|
85
86
|
)
|
|
86
87
|
|
|
87
88
|
def __init__(self) -> None:
|
|
88
|
-
super().__init__(SimpleValue.str, self.__transform_to_date,
|
|
89
|
+
super().__init__(SimpleValue.str, self.__transform_to_date, "Date")
|
|
89
90
|
|
|
90
91
|
def _to_open_api(self, schema: OpenAPISchema) -> t.Mapping[str, t.Any]:
|
|
91
92
|
return {
|
|
92
93
|
**self._parser.to_open_api(schema),
|
|
93
|
-
|
|
94
|
+
"format": "date",
|
|
94
95
|
}
|
|
95
96
|
|
|
96
97
|
def __transform_to_date(self, value: str) -> datetime.date:
|
|
97
98
|
match = self._ISO8601_DATE_RE.match(value)
|
|
98
99
|
if match is None:
|
|
99
100
|
raise SimpleParseError(self, value)
|
|
100
|
-
year, month, day = map(int, match.group(
|
|
101
|
+
year, month, day = map(int, match.group("year", "month", "day"))
|
|
101
102
|
try:
|
|
102
103
|
return datetime.date(year=year, month=month, day=day)
|
|
103
104
|
except ValueError as exc:
|
|
@@ -109,17 +110,18 @@ class _DateTime(_Transform[DatetimeWithTimezone, str]):
|
|
|
109
110
|
|
|
110
111
|
def __init__(self) -> None:
|
|
111
112
|
super().__init__(
|
|
112
|
-
SimpleValue.str, self.__transform_to_datetime,
|
|
113
|
+
SimpleValue.str, self.__transform_to_datetime, "DateTime"
|
|
113
114
|
)
|
|
114
115
|
|
|
115
116
|
def _to_open_api(self, schema: OpenAPISchema) -> t.Mapping[str, t.Any]:
|
|
116
117
|
return {
|
|
117
118
|
**self._parser.to_open_api(schema),
|
|
118
|
-
|
|
119
|
+
"format": "date-time",
|
|
119
120
|
}
|
|
120
121
|
|
|
121
122
|
def __transform_to_datetime(self, value: str) -> DatetimeWithTimezone:
|
|
122
123
|
import dateutil.parser
|
|
124
|
+
|
|
123
125
|
try:
|
|
124
126
|
parsed = dateutil.parser.isoparse(value)
|
|
125
127
|
except (ValueError, OverflowError) as exc:
|
|
@@ -127,7 +129,7 @@ class _DateTime(_Transform[DatetimeWithTimezone, str]):
|
|
|
127
129
|
self,
|
|
128
130
|
value,
|
|
129
131
|
extra={
|
|
130
|
-
|
|
132
|
+
"message": "which can't be parsed as a valid datetime",
|
|
131
133
|
},
|
|
132
134
|
) from exc
|
|
133
135
|
else:
|
|
@@ -154,7 +156,7 @@ class _EmailList(_Constraint[str]):
|
|
|
154
156
|
|
|
155
157
|
@property
|
|
156
158
|
def name(self) -> str:
|
|
157
|
-
return
|
|
159
|
+
return "as email list"
|
|
158
160
|
|
|
159
161
|
|
|
160
162
|
class _Password(SimpleValueFactory[str]):
|
|
@@ -164,12 +166,12 @@ class _Password(SimpleValueFactory[str]):
|
|
|
164
166
|
super().__init__(str)
|
|
165
167
|
|
|
166
168
|
def describe(self) -> str:
|
|
167
|
-
return f
|
|
169
|
+
return f"password as {super().describe()}"
|
|
168
170
|
|
|
169
171
|
def _to_open_api(self, schema: OpenAPISchema) -> t.Mapping[str, t.Any]:
|
|
170
172
|
return {
|
|
171
173
|
**super()._to_open_api(schema),
|
|
172
|
-
|
|
174
|
+
"format": "password",
|
|
173
175
|
}
|
|
174
176
|
|
|
175
177
|
def try_parse(self, value: object) -> str:
|
|
@@ -177,38 +179,38 @@ class _Password(SimpleValueFactory[str]):
|
|
|
177
179
|
return super().try_parse(value)
|
|
178
180
|
except ParseError:
|
|
179
181
|
# Don't raise from as that might leak the value
|
|
180
|
-
raise SimpleParseError(self, found=
|
|
182
|
+
raise SimpleParseError(self, found="REDACTED") # pylint: disable=raise-missing-from
|
|
181
183
|
|
|
182
184
|
|
|
183
185
|
class _TimeDeltaFactory(_Transform[datetime.timedelta, t.Union[str, float]]):
|
|
184
|
-
"""Factory to create a ISO timedelta parser.
|
|
185
|
-
|
|
186
|
+
"""Factory to create a ISO timedelta parser."""
|
|
187
|
+
|
|
186
188
|
__slots__ = ()
|
|
187
189
|
|
|
188
190
|
# The regex below are copied from Pydantic
|
|
189
191
|
_ISO8601_DURATION_RE = re.compile(
|
|
190
|
-
r
|
|
191
|
-
r
|
|
192
|
-
r
|
|
193
|
-
r
|
|
194
|
-
r
|
|
195
|
-
r
|
|
196
|
-
r
|
|
197
|
-
r
|
|
198
|
-
r
|
|
192
|
+
r"^(?P<sign>[-+]?)"
|
|
193
|
+
r"P"
|
|
194
|
+
r"(?:(?P<days>\d+(.\d+)?)D)?"
|
|
195
|
+
r"(?:T"
|
|
196
|
+
r"(?:(?P<hours>\d+(.\d+)?)H)?"
|
|
197
|
+
r"(?:(?P<minutes>\d+(.\d+)?)M)?"
|
|
198
|
+
r"(?:(?P<seconds>\d+(.\d+)?)S)?"
|
|
199
|
+
r")?"
|
|
200
|
+
r"$"
|
|
199
201
|
)
|
|
200
202
|
|
|
201
203
|
def __init__(self, parser: Parser[t.Union[str, float]]) -> None:
|
|
202
204
|
super().__init__(
|
|
203
205
|
parser,
|
|
204
206
|
self.__to_timedelta,
|
|
205
|
-
|
|
207
|
+
"TimeDelta",
|
|
206
208
|
)
|
|
207
209
|
|
|
208
210
|
def _to_open_api(self, schema: OpenAPISchema) -> t.Mapping[str, t.Any]:
|
|
209
211
|
return {
|
|
210
212
|
**SimpleValue.float.to_open_api(schema),
|
|
211
|
-
|
|
213
|
+
"format": "time-delta",
|
|
212
214
|
}
|
|
213
215
|
|
|
214
216
|
def __to_timedelta(self, value: t.Union[str, float]) -> datetime.timedelta:
|
|
@@ -223,14 +225,14 @@ class _TimeDeltaFactory(_Transform[datetime.timedelta, t.Union[str, float]]):
|
|
|
223
225
|
|
|
224
226
|
groupdict: t.Mapping[str, t.Optional[str]] = match.groupdict()
|
|
225
227
|
groups = {k: v for k, v in groupdict.items() if v is not None}
|
|
226
|
-
sign = -1 if groups.get(
|
|
228
|
+
sign = -1 if groups.get("sign", None) == "-" else 1
|
|
227
229
|
|
|
228
230
|
return sign * datetime.timedelta(
|
|
229
|
-
days=float(groups.get(
|
|
230
|
-
hours=float(groups.get(
|
|
231
|
-
minutes=float(groups.get(
|
|
232
|
-
seconds=float(groups.get(
|
|
233
|
-
microseconds=float(groups.get(
|
|
231
|
+
days=float(groups.get("days", 0)),
|
|
232
|
+
hours=float(groups.get("hours", 0)),
|
|
233
|
+
minutes=float(groups.get("minutes", 0)),
|
|
234
|
+
seconds=float(groups.get("seconds", 0)),
|
|
235
|
+
microseconds=float(groups.get("microseconds", 0)),
|
|
234
236
|
)
|
|
235
237
|
|
|
236
238
|
|
|
@@ -247,7 +249,7 @@ class _NonEmptyString(SimpleValueFactory[str]):
|
|
|
247
249
|
self,
|
|
248
250
|
value,
|
|
249
251
|
extra={
|
|
250
|
-
|
|
252
|
+
"message": "which is empty",
|
|
251
253
|
},
|
|
252
254
|
)
|
|
253
255
|
return nonempty
|
|
@@ -260,27 +262,29 @@ class _StringWithoutNullByte(SimpleValueFactory[str]):
|
|
|
260
262
|
super().__init__(str)
|
|
261
263
|
|
|
262
264
|
def try_parse(self, value: object) -> str:
|
|
263
|
-
return super().try_parse(value).replace(
|
|
265
|
+
return super().try_parse(value).replace("\0", "")
|
|
264
266
|
|
|
265
267
|
|
|
266
268
|
class _Fraction(Parser[fractions.Fraction]):
|
|
267
269
|
__slots__ = ()
|
|
268
270
|
|
|
269
|
-
_SUB_PARSER =
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
271
|
+
_SUB_PARSER = (
|
|
272
|
+
FixedMapping(
|
|
273
|
+
RequiredArgument(
|
|
274
|
+
"n",
|
|
275
|
+
_NumberAsString(),
|
|
276
|
+
"The numerator of the rational.",
|
|
277
|
+
),
|
|
278
|
+
RequiredArgument(
|
|
279
|
+
"d",
|
|
280
|
+
_NumberAsString(),
|
|
281
|
+
"The denominator of the rational.",
|
|
282
|
+
),
|
|
283
|
+
).as_schema("Fraction").add_open_api_metadata("x-is-fraction", True)
|
|
284
|
+
)
|
|
281
285
|
|
|
282
286
|
def describe(self) -> str:
|
|
283
|
-
return
|
|
287
|
+
return "Fraction"
|
|
284
288
|
|
|
285
289
|
def _to_open_api(self, schema: t.Any) -> t.Mapping[str, t.Any]:
|
|
286
290
|
return self._SUB_PARSER.to_open_api(schema)
|
|
@@ -293,22 +297,22 @@ class _Fraction(Parser[fractions.Fraction]):
|
|
|
293
297
|
class _Decimal(_Transform[decimal.Decimal, str]):
|
|
294
298
|
__slots__ = ()
|
|
295
299
|
|
|
296
|
-
_REGEX = r
|
|
300
|
+
_REGEX = r"^[+-]?\d+([.]\d+)?$"
|
|
297
301
|
_COMPILED_REGEX = re.compile(_REGEX)
|
|
298
302
|
|
|
299
303
|
def __init__(self) -> None:
|
|
300
304
|
super().__init__(
|
|
301
305
|
parser=SimpleValue.str,
|
|
302
306
|
transform=self._transform,
|
|
303
|
-
transform_name=
|
|
307
|
+
transform_name="Decimal",
|
|
304
308
|
)
|
|
305
309
|
|
|
306
310
|
def _to_open_api(self, schema: t.Any) -> t.Mapping[str, t.Any]:
|
|
307
311
|
base = self._parser.to_open_api(schema)
|
|
308
312
|
return {
|
|
309
313
|
**base,
|
|
310
|
-
|
|
311
|
-
|
|
314
|
+
"pattern": self._REGEX,
|
|
315
|
+
"format": "decimal",
|
|
312
316
|
}
|
|
313
317
|
|
|
314
318
|
def _transform(self, value: str) -> decimal.Decimal:
|
|
@@ -347,9 +351,9 @@ class RichValue:
|
|
|
347
351
|
Fraction = _Fraction()
|
|
348
352
|
|
|
349
353
|
class ValueGte(_Constraint[_GEComparableT], t.Generic[_GEComparableT]):
|
|
350
|
-
"""Parse a number that is gte than a given minimum.
|
|
351
|
-
|
|
352
|
-
__slots__ = (
|
|
354
|
+
"""Parse a number that is gte than a given minimum."""
|
|
355
|
+
|
|
356
|
+
__slots__ = ("__minimum", )
|
|
353
357
|
|
|
354
358
|
def __init__(
|
|
355
359
|
self, parser: Parser[_GEComparableT], minimum: _GEComparableT
|
|
@@ -359,7 +363,7 @@ class RichValue:
|
|
|
359
363
|
|
|
360
364
|
@property
|
|
361
365
|
def name(self) -> str:
|
|
362
|
-
return f
|
|
366
|
+
return f"larger than {self.__minimum}"
|
|
363
367
|
|
|
364
368
|
def ok(self, value: _GEComparableT) -> bool:
|
|
365
369
|
return value >= self.__minimum
|
|
@@ -367,5 +371,5 @@ class RichValue:
|
|
|
367
371
|
def _to_open_api(self, schema: OpenAPISchema) -> t.Mapping[str, t.Any]:
|
|
368
372
|
return {
|
|
369
373
|
**self._parser.to_open_api(schema),
|
|
370
|
-
|
|
374
|
+
"minimum": self.__minimum,
|
|
371
375
|
}
|
|
@@ -8,7 +8,7 @@ from functools import wraps
|
|
|
8
8
|
from .client import AuthenticatedClient, Client
|
|
9
9
|
|
|
10
10
|
__all__ = ("login", "AuthenticatedClient", "Client", "login_from_cli")
|
|
11
|
-
__version__ = "16.1.
|
|
11
|
+
__version__ = "16.1.89"
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
@wraps(AuthenticatedClient.get)
|
|
@@ -21,6 +21,11 @@ def login_from_cli(*args, **kwargs):
|
|
|
21
21
|
return AuthenticatedClient.get_from_cli(*args, **kwargs)
|
|
22
22
|
|
|
23
23
|
|
|
24
|
+
@wraps(AuthenticatedClient.get_from_cli_for_course)
|
|
25
|
+
def login_from_cli_for_course(*args, **kwargs):
|
|
26
|
+
return AuthenticatedClient.get_from_cli_for_course(*args, **kwargs)
|
|
27
|
+
|
|
28
|
+
|
|
24
29
|
login.__name__ = "login"
|
|
25
30
|
login.__doc__ = """Get an :class:`.AuthenticatedClient` by logging in with your
|
|
26
31
|
username and password.
|
|
@@ -94,6 +94,7 @@ class FileService(t.Generic[_ClientT]):
|
|
|
94
94
|
*,
|
|
95
95
|
max_age: Maybe["int"] = Nothing,
|
|
96
96
|
filename: "str" = "uploaded_file",
|
|
97
|
+
ephemeral: "bool" = False,
|
|
97
98
|
extra_parameters: t.Optional[
|
|
98
99
|
t.Mapping[str, t.Union[str, bool, int, float]]
|
|
99
100
|
] = None,
|
|
@@ -103,6 +104,9 @@ class FileService(t.Generic[_ClientT]):
|
|
|
103
104
|
:param max_age: The maximum amount of time (in seconds) this file will
|
|
104
105
|
stay valid and can be retrieved.
|
|
105
106
|
:param filename: The name of the uploaded file.
|
|
107
|
+
:param ephemeral: If set this file will be never saved to persistent
|
|
108
|
+
storage. The maximum size of file that can be uploaded like this is
|
|
109
|
+
1mb.
|
|
106
110
|
:param extra_parameters: The extra query parameters you might want to
|
|
107
111
|
add. By default no extra query parameters are added.
|
|
108
112
|
|
|
@@ -113,6 +117,7 @@ class FileService(t.Generic[_ClientT]):
|
|
|
113
117
|
params: t.Dict[str, t.Any] = {
|
|
114
118
|
**(extra_parameters or {}),
|
|
115
119
|
"filename": utils.to_dict(filename),
|
|
120
|
+
"ephemeral": utils.to_dict(ephemeral),
|
|
116
121
|
}
|
|
117
122
|
maybe_from_nullable(t.cast(t.Any, max_age)).if_just(
|
|
118
123
|
lambda val: params.__setitem__("max_age", val)
|
|
@@ -15,9 +15,7 @@ if t.TYPE_CHECKING or os.getenv("CG_EAGERIMPORT", False):
|
|
|
15
15
|
import codegrade
|
|
16
16
|
|
|
17
17
|
from ..models.assignment_login_link import AssignmentLoginLink
|
|
18
|
-
from ..models.
|
|
19
|
-
ResultDataPostLoginLinkLogin,
|
|
20
|
-
)
|
|
18
|
+
from ..models.user_login_response import UserLoginResponse
|
|
21
19
|
|
|
22
20
|
|
|
23
21
|
_ClientT = t.TypeVar("_ClientT", bound="codegrade.client._BaseClient")
|
|
@@ -84,7 +82,7 @@ class LoginLinkService(t.Generic[_ClientT]):
|
|
|
84
82
|
extra_parameters: t.Optional[
|
|
85
83
|
t.Mapping[str, t.Union[str, bool, int, float]]
|
|
86
84
|
] = None,
|
|
87
|
-
) -> "
|
|
85
|
+
) -> "UserLoginResponse":
|
|
88
86
|
"""Login with the given login link.
|
|
89
87
|
|
|
90
88
|
This will only work when the assignment connected to this link is
|
|
@@ -114,13 +112,11 @@ class LoginLinkService(t.Generic[_ClientT]):
|
|
|
114
112
|
|
|
115
113
|
if utils.response_code_matches(resp.status_code, 200):
|
|
116
114
|
# fmt: off
|
|
117
|
-
from ..models.
|
|
118
|
-
ResultDataPostLoginLinkLogin,
|
|
119
|
-
)
|
|
115
|
+
from ..models.user_login_response import UserLoginResponse
|
|
120
116
|
|
|
121
117
|
# fmt: on
|
|
122
118
|
return parsers.JsonResponseParser(
|
|
123
|
-
parsers.ParserFor.make(
|
|
119
|
+
parsers.ParserFor.make(UserLoginResponse)
|
|
124
120
|
).try_parse(resp)
|
|
125
121
|
|
|
126
122
|
from ..models.any_error import AnyError
|
|
@@ -23,10 +23,6 @@ if t.TYPE_CHECKING or os.getenv("CG_EAGERIMPORT", False):
|
|
|
23
23
|
from ..models.logout_user_data import LogoutUserData
|
|
24
24
|
from ..models.patch_user_data import PatchUserData
|
|
25
25
|
from ..models.register_user_data import RegisterUserData
|
|
26
|
-
from ..models.result_data_post_user_login import ResultDataPostUserLogin
|
|
27
|
-
from ..models.result_data_post_user_register import (
|
|
28
|
-
ResultDataPostUserRegister,
|
|
29
|
-
)
|
|
30
26
|
from ..models.session_restriction_data import SessionRestrictionData
|
|
31
27
|
from ..models.tenant_coupon_usage import TenantCouponUsage
|
|
32
28
|
from ..models.user import User
|
|
@@ -262,7 +258,7 @@ class UserService(t.Generic[_ClientT]):
|
|
|
262
258
|
extra_parameters: t.Optional[
|
|
263
259
|
t.Mapping[str, t.Union[str, bool, int, float]]
|
|
264
260
|
] = None,
|
|
265
|
-
) -> "
|
|
261
|
+
) -> "UserLoginResponse":
|
|
266
262
|
"""Login using your username and password.
|
|
267
263
|
|
|
268
264
|
`permissions` to the user. The value will be a mapping indicating which
|
|
@@ -293,13 +289,11 @@ class UserService(t.Generic[_ClientT]):
|
|
|
293
289
|
|
|
294
290
|
if utils.response_code_matches(resp.status_code, 200):
|
|
295
291
|
# fmt: off
|
|
296
|
-
from ..models.
|
|
297
|
-
ResultDataPostUserLogin,
|
|
298
|
-
)
|
|
292
|
+
from ..models.user_login_response import UserLoginResponse
|
|
299
293
|
|
|
300
294
|
# fmt: on
|
|
301
295
|
return parsers.JsonResponseParser(
|
|
302
|
-
parsers.ParserFor.make(
|
|
296
|
+
parsers.ParserFor.make(UserLoginResponse)
|
|
303
297
|
).try_parse(resp)
|
|
304
298
|
|
|
305
299
|
from ..models.any_error import AnyError
|
|
@@ -321,7 +315,7 @@ class UserService(t.Generic[_ClientT]):
|
|
|
321
315
|
extra_parameters: t.Optional[
|
|
322
316
|
t.Mapping[str, t.Union[str, bool, int, float]]
|
|
323
317
|
] = None,
|
|
324
|
-
) -> "
|
|
318
|
+
) -> "UserLoginResponse":
|
|
325
319
|
"""Create a new user.
|
|
326
320
|
|
|
327
321
|
:param json_body: The body of the request. See
|
|
@@ -346,13 +340,11 @@ class UserService(t.Generic[_ClientT]):
|
|
|
346
340
|
|
|
347
341
|
if utils.response_code_matches(resp.status_code, 200):
|
|
348
342
|
# fmt: off
|
|
349
|
-
from ..models.
|
|
350
|
-
ResultDataPostUserRegister,
|
|
351
|
-
)
|
|
343
|
+
from ..models.user_login_response import UserLoginResponse
|
|
352
344
|
|
|
353
345
|
# fmt: on
|
|
354
346
|
return parsers.JsonResponseParser(
|
|
355
|
-
parsers.ParserFor.make(
|
|
347
|
+
parsers.ParserFor.make(UserLoginResponse)
|
|
356
348
|
).try_parse(resp)
|
|
357
349
|
|
|
358
350
|
from ..models.any_error import AnyError
|
|
@@ -11,8 +11,12 @@ import typing as t
|
|
|
11
11
|
import uuid
|
|
12
12
|
from types import TracebackType
|
|
13
13
|
|
|
14
|
+
import cg_maybe
|
|
14
15
|
import httpx
|
|
15
16
|
|
|
17
|
+
from codegrade.models import CoursePermission as _CoursePermission
|
|
18
|
+
from codegrade.models import SessionRestrictionData as _SessionRestrictionData
|
|
19
|
+
|
|
16
20
|
from .utils import maybe_input, select_from_list
|
|
17
21
|
|
|
18
22
|
_DEFAULT_HOST = os.getenv("CG_HOST", "https://app.codegra.de")
|
|
@@ -539,7 +543,7 @@ class Client(_BaseClient):
|
|
|
539
543
|
return httpx.Client(
|
|
540
544
|
base_url=self.base_url,
|
|
541
545
|
headers={
|
|
542
|
-
"User-Agent": "CodeGradeAPI/16.1.
|
|
546
|
+
"User-Agent": "CodeGradeAPI/16.1.89",
|
|
543
547
|
},
|
|
544
548
|
follow_redirects=True,
|
|
545
549
|
)
|
|
@@ -559,7 +563,7 @@ class AuthenticatedClient(_BaseClient):
|
|
|
559
563
|
base_url=self.base_url,
|
|
560
564
|
headers={
|
|
561
565
|
"Authorization": f"Bearer {self.token}",
|
|
562
|
-
"User-Agent": "CodeGradeAPI/16.1.
|
|
566
|
+
"User-Agent": "CodeGradeAPI/16.1.89",
|
|
563
567
|
},
|
|
564
568
|
follow_redirects=True,
|
|
565
569
|
)
|
|
@@ -702,3 +706,63 @@ class AuthenticatedClient(_BaseClient):
|
|
|
702
706
|
return cls.get(
|
|
703
707
|
username=username, password=password, host=host, tenant=tenant.id
|
|
704
708
|
)
|
|
709
|
+
|
|
710
|
+
def restrict(
|
|
711
|
+
client,
|
|
712
|
+
*,
|
|
713
|
+
course_id: t.Optional[int] = None,
|
|
714
|
+
removed_permissions: t.Sequence[_CoursePermission] = (),
|
|
715
|
+
) -> None:
|
|
716
|
+
"""Restrict this authenticated client to a specific course and/or
|
|
717
|
+
reduced permissions.
|
|
718
|
+
|
|
719
|
+
:param course_id: If provided, restrict access to only this course.
|
|
720
|
+
:param removed_permissions: If provided, remove specific permissions in
|
|
721
|
+
the current session.
|
|
722
|
+
"""
|
|
723
|
+
restriction = _SessionRestrictionData(
|
|
724
|
+
for_context=cg_maybe.from_nullable(course_id).map(
|
|
725
|
+
lambda cid: {"course_id": cid}
|
|
726
|
+
),
|
|
727
|
+
removed_permissions=(
|
|
728
|
+
cg_maybe.of({"course": removed_permissions})
|
|
729
|
+
if removed_permissions
|
|
730
|
+
else cg_maybe.Nothing
|
|
731
|
+
),
|
|
732
|
+
)
|
|
733
|
+
|
|
734
|
+
restricted_login = client.user.restrict(restriction)
|
|
735
|
+
client.user.logout({"token": client.token})
|
|
736
|
+
client.token = restricted_login.access_token
|
|
737
|
+
client.http.headers["Authorization"] = f"Bearer {client.token}"
|
|
738
|
+
|
|
739
|
+
@classmethod
|
|
740
|
+
def get_from_cli_for_course(
|
|
741
|
+
cls, course_id: t.Optional[int] = None
|
|
742
|
+
) -> "AuthenticatedClient":
|
|
743
|
+
"""Get an :class:`.AuthenticatedClient` by logging in through command
|
|
744
|
+
line interface for a specific course.
|
|
745
|
+
|
|
746
|
+
:param course_id: The optional ID of the course you want to log into.
|
|
747
|
+
|
|
748
|
+
:returns: A new ``AuthenticatedClient``.
|
|
749
|
+
"""
|
|
750
|
+
client = cls.get_from_cli()
|
|
751
|
+
|
|
752
|
+
if course_id is not None:
|
|
753
|
+
client.restrict(course_id=course_id, removed_permissions=[])
|
|
754
|
+
return client
|
|
755
|
+
|
|
756
|
+
course = select_from_list(
|
|
757
|
+
"Select your course",
|
|
758
|
+
# Sort so that the newest course will be at the bottom, supporting
|
|
759
|
+
# the common case of selecting one of the latest courses.
|
|
760
|
+
sorted(
|
|
761
|
+
client.course.get_all(extended=False, limit=cg_maybe.of(200)),
|
|
762
|
+
key=lambda c: c.created_at,
|
|
763
|
+
),
|
|
764
|
+
lambda c: c.name,
|
|
765
|
+
).try_extract(sys.exit)
|
|
766
|
+
|
|
767
|
+
client.restrict(course_id=course.id, removed_permissions=[])
|
|
768
|
+
return client
|
|
@@ -446,9 +446,6 @@ from .lti1p3_system_role_from_context_role_setting import (
|
|
|
446
446
|
Lti1p3SystemRoleFromContextRoleSetting,
|
|
447
447
|
)
|
|
448
448
|
from .lti_enabled_setting import LtiEnabledSetting
|
|
449
|
-
from .lti_first_launch_content_id_enabled_setting import (
|
|
450
|
-
LtiFirstLaunchContentIdEnabledSetting,
|
|
451
|
-
)
|
|
452
449
|
from .lti_launch_data_logging_setting import LtiLaunchDataLoggingSetting
|
|
453
450
|
from .lti_lock_date_copying_enabled_setting import (
|
|
454
451
|
LtiLockDateCopyingEnabledSetting,
|
|
@@ -639,12 +636,9 @@ from .repository_connection_limit_reached_exception import (
|
|
|
639
636
|
from .reset_token_time_setting import ResetTokenTimeSetting
|
|
640
637
|
from .result_data_get_auto_test_get import ResultDataGetAutoTestGet
|
|
641
638
|
from .result_data_get_task_result_get_all import ResultDataGetTaskResultGetAll
|
|
642
|
-
from .result_data_post_login_link_login import ResultDataPostLoginLinkLogin
|
|
643
639
|
from .result_data_post_section_create_division import (
|
|
644
640
|
ResultDataPostSectionCreateDivision,
|
|
645
641
|
)
|
|
646
|
-
from .result_data_post_user_login import ResultDataPostUserLogin
|
|
647
|
-
from .result_data_post_user_register import ResultDataPostUserRegister
|
|
648
642
|
from .retry_group_submission_grade_passback_enabled_setting import (
|
|
649
643
|
RetryGroupSubmissionGradePassbackEnabledSetting,
|
|
650
644
|
)
|
|
@@ -118,10 +118,6 @@ class AllSiteSettings(FrontendSiteSettings):
|
|
|
118
118
|
#: Prefer the most privileged role in the LTI 1.3 roles claim sent by the
|
|
119
119
|
#: LMS, instead of the first role that matches any of our definitions.
|
|
120
120
|
lti_1p3_parse_most_privileged_role: Maybe["bool"] = Nothing
|
|
121
|
-
#: Whether we act upon the custom claims parameter for content id, which we
|
|
122
|
-
#: then use to import an item from the community library. This feature
|
|
123
|
-
#: enables that we check for this content id in the launch parameters.
|
|
124
|
-
lti_first_launch_content_id_enabled: Maybe["bool"] = Nothing
|
|
125
121
|
#: Enable logging of LTI launch data. NEVER ENABLE THIS SITE-WIDE, only for
|
|
126
122
|
#: a single tenant, and disable this feature after you've gotten the data
|
|
127
123
|
#: you need.
|
|
@@ -320,11 +316,6 @@ class AllSiteSettings(FrontendSiteSettings):
|
|
|
320
316
|
rqa.SimpleValue.bool,
|
|
321
317
|
doc="Prefer the most privileged role in the LTI 1.3 roles claim sent by the LMS, instead of the first role that matches any of our definitions.",
|
|
322
318
|
),
|
|
323
|
-
rqa.OptionalArgument(
|
|
324
|
-
"LTI_FIRST_LAUNCH_CONTENT_ID_ENABLED",
|
|
325
|
-
rqa.SimpleValue.bool,
|
|
326
|
-
doc="Whether we act upon the custom claims parameter for content id, which we then use to import an item from the community library. This feature enables that we check for this content id in the launch parameters.",
|
|
327
|
-
),
|
|
328
319
|
rqa.OptionalArgument(
|
|
329
320
|
"LTI_LAUNCH_DATA_LOGGING",
|
|
330
321
|
rqa.SimpleValue.bool,
|
|
@@ -468,9 +459,6 @@ class AllSiteSettings(FrontendSiteSettings):
|
|
|
468
459
|
self.lti_1p3_parse_most_privileged_role = maybe_from_nullable(
|
|
469
460
|
self.lti_1p3_parse_most_privileged_role
|
|
470
461
|
)
|
|
471
|
-
self.lti_first_launch_content_id_enabled = maybe_from_nullable(
|
|
472
|
-
self.lti_first_launch_content_id_enabled
|
|
473
|
-
)
|
|
474
462
|
self.lti_launch_data_logging = maybe_from_nullable(
|
|
475
463
|
self.lti_launch_data_logging
|
|
476
464
|
)
|
|
@@ -1028,10 +1016,6 @@ class AllSiteSettings(FrontendSiteSettings):
|
|
|
1028
1016
|
res["LTI_1P3_PARSE_MOST_PRIVILEGED_ROLE"] = to_dict(
|
|
1029
1017
|
self.lti_1p3_parse_most_privileged_role.value
|
|
1030
1018
|
)
|
|
1031
|
-
if self.lti_first_launch_content_id_enabled.is_just:
|
|
1032
|
-
res["LTI_FIRST_LAUNCH_CONTENT_ID_ENABLED"] = to_dict(
|
|
1033
|
-
self.lti_first_launch_content_id_enabled.value
|
|
1034
|
-
)
|
|
1035
1019
|
if self.lti_launch_data_logging.is_just:
|
|
1036
1020
|
res["LTI_LAUNCH_DATA_LOGGING"] = to_dict(
|
|
1037
1021
|
self.lti_launch_data_logging.value
|
|
@@ -1214,7 +1198,6 @@ class AllSiteSettings(FrontendSiteSettings):
|
|
|
1214
1198
|
lti_unset_deadline_lock_date_enabled=parsed.LTI_UNSET_DEADLINE_LOCK_DATE_ENABLED,
|
|
1215
1199
|
lti_1p3_system_role_from_context_role=parsed.LTI_1P3_SYSTEM_ROLE_FROM_CONTEXT_ROLE,
|
|
1216
1200
|
lti_1p3_parse_most_privileged_role=parsed.LTI_1P3_PARSE_MOST_PRIVILEGED_ROLE,
|
|
1217
|
-
lti_first_launch_content_id_enabled=parsed.LTI_FIRST_LAUNCH_CONTENT_ID_ENABLED,
|
|
1218
1201
|
lti_launch_data_logging=parsed.LTI_LAUNCH_DATA_LOGGING,
|
|
1219
1202
|
pearson_templates=parsed.PEARSON_TEMPLATES,
|
|
1220
1203
|
default_course_teacher_role=parsed.DEFAULT_COURSE_TEACHER_ROLE,
|
|
@@ -189,9 +189,6 @@ from .lti1p3_system_role_from_context_role_setting import (
|
|
|
189
189
|
Lti1p3SystemRoleFromContextRoleSetting,
|
|
190
190
|
)
|
|
191
191
|
from .lti_enabled_setting import LtiEnabledSetting
|
|
192
|
-
from .lti_first_launch_content_id_enabled_setting import (
|
|
193
|
-
LtiFirstLaunchContentIdEnabledSetting,
|
|
194
|
-
)
|
|
195
192
|
from .lti_launch_data_logging_setting import LtiLaunchDataLoggingSetting
|
|
196
193
|
from .lti_lock_date_copying_enabled_setting import (
|
|
197
194
|
LtiLockDateCopyingEnabledSetting,
|
|
@@ -453,7 +450,6 @@ SiteSettingInput = t.Union[
|
|
|
453
450
|
AssignmentDescriptionOnTeachersSubmissionsPageSetting,
|
|
454
451
|
SubmissionsPerPageEnabledSetting,
|
|
455
452
|
InlineRubricViewerEnabledSetting,
|
|
456
|
-
LtiFirstLaunchContentIdEnabledSetting,
|
|
457
453
|
SimpleSubmissionModeEnabledSetting,
|
|
458
454
|
LtiLaunchDataLoggingSetting,
|
|
459
455
|
HideCodeEditorOutputViewerWithOnlyQuizStepsSetting,
|
|
@@ -604,7 +600,6 @@ SiteSettingInputParser = rqa.Lazy(
|
|
|
604
600
|
ParserFor.make(AssignmentDescriptionOnTeachersSubmissionsPageSetting),
|
|
605
601
|
ParserFor.make(SubmissionsPerPageEnabledSetting),
|
|
606
602
|
ParserFor.make(InlineRubricViewerEnabledSetting),
|
|
607
|
-
ParserFor.make(LtiFirstLaunchContentIdEnabledSetting),
|
|
608
603
|
ParserFor.make(SimpleSubmissionModeEnabledSetting),
|
|
609
604
|
ParserFor.make(LtiLaunchDataLoggingSetting),
|
|
610
605
|
ParserFor.make(HideCodeEditorOutputViewerWithOnlyQuizStepsSetting),
|