├── .dockerignore ├── .editorconfig ├── .github ├── FUNDING.yml └── workflows │ └── check-formats.yml ├── .gitignore ├── .perltidyrc ├── .prettierrc ├── .tx └── config ├── DATA └── uploads │ └── README ├── Dockerfile ├── DockerfileStage1 ├── DockerfileStage2 ├── LICENSE ├── README.md ├── VERSION ├── assets ├── hardcopyThemes │ ├── README.md │ ├── basic.xml │ ├── basicTwoCol.xml │ ├── boxed.xml │ ├── boxedRows.xml │ ├── boxedTwoCol.xml │ ├── classic.xml │ ├── classicTwoCol.xml │ ├── empty.xml │ ├── hebrew.xml │ ├── hebrewTwoCol.xml │ ├── oneColumn.xml │ └── twoColumn.xml ├── pg │ ├── PGMLLab │ │ └── PGML-lab.pg │ ├── Student_Orientation │ │ ├── decimals.pg │ │ ├── emailInstructor.pg │ │ ├── enteringMath.pg │ │ ├── explorerfull.png │ │ ├── explorerpiece.png │ │ ├── feedback.pg │ │ ├── hardcopy.pg │ │ ├── mathInteraction.pg │ │ ├── mathjaxmenu.png │ │ ├── miscellaneous.pg │ │ ├── navigating.pg │ │ ├── setStudent_Orientation.def │ │ └── welcome.pg │ ├── blankProblem.pg │ ├── blankProblem2.pg │ ├── defaultSetHeader.pg │ └── newProblem.pg └── tex │ ├── webwork2.sty │ └── webwork_logo.png ├── bin ├── Helper.pm ├── OPL-update ├── OPL-update-legacy ├── OPLUtils.pm ├── addadmin ├── addcourse ├── addprofa ├── change_user_id ├── check_database_charsets.pl ├── check_latex ├── check_latex_article.tex ├── check_latex_exam.tex ├── check_modules.pl ├── convert-functions.pl ├── convert_fun_in_dir.sh ├── crypt_passwords_in_classlist.pl ├── delcourse ├── dev_scripts │ ├── PODtoHTML.pm │ ├── README.md │ ├── generate-ww-pg-pod.pl │ ├── pod-templates │ │ ├── category-index.mt │ │ ├── main-index.mt │ │ └── pod.mt │ ├── run-perltidy.pl │ ├── update-copyright │ ├── update-localization-files │ └── webwork2-morbo ├── download-OPL-metadata-release.pl ├── dump-OPL-tables.pl ├── dump-past-answers.pl ├── generate-OPL-set-def-lists.pl ├── importClassList.pl ├── load-OPL-global-statistics.pl ├── newpassword ├── old_scripts │ ├── timing │ ├── ww-update-config │ ├── wwaddindexing │ ├── wwdb_addgw │ ├── wwdb_check │ ├── wwdb_init │ └── wwdb_upgrade ├── putadmin ├── remove_stale_images ├── reset2fa ├── restore-OPL-tables.pl ├── setfilepermissions ├── test_library_build.pl ├── timing_log_check.pl ├── update-OPL-statistics.pl ├── updateOPLextras.pl ├── upgrade-database-to-utf8mb4.pl ├── upgrade_admin_db.pl ├── upload-OPL-statistics.pl ├── webwork2 ├── ww_purge_old_nonces ├── wwdb └── wwsh ├── conf ├── README.md ├── authen_CAS.conf.dist ├── authen_LTI.conf.dist ├── authen_LTI_1_1.conf.dist ├── authen_LTI_1_3.conf.dist ├── authen_ldap.conf.dist ├── authen_shibboleth.conf.dist ├── database.conf.dist ├── defaults.config ├── localOverrides.conf.dist ├── site.conf.dist ├── webwork2-job-queue.dist.service ├── webwork2.apache2.4.dist.conf ├── webwork2.dist.service ├── webwork2.mojolicious.dist.yml └── webwork2.nginx.dist.conf ├── courses.dist ├── adminClasslist.lst ├── defaultClasslist.lst └── modelCourse │ ├── course.conf │ ├── hide_directory │ ├── html │ └── achievements │ │ ├── 2nd_order_ode.png │ │ ├── Fractal-Cornucopia.svg │ │ ├── add_anything.png │ │ ├── back_for_more.png │ │ ├── bug_sqush.png │ │ ├── by_definition.png │ │ ├── calendar.png │ │ ├── challenge_eight.png │ │ ├── challenge_five.png │ │ ├── challenge_four.png │ │ ├── challenge_nine.png │ │ ├── challenge_one.png │ │ ├── challenge_seven.png │ │ ├── challenge_six.png │ │ ├── challenge_ten.png │ │ ├── challenge_three.png │ │ ├── challenge_two.png │ │ ├── challenger.png │ │ ├── change_of_variables.png │ │ ├── chipping_away.png │ │ ├── complete_100_problems.png │ │ ├── complete_10_problems.png │ │ ├── complete_150_problems.png │ │ ├── complete_25_problems.png │ │ ├── complete_50_problems.png │ │ ├── complete_all_sets.png │ │ ├── complete_five_sets.png │ │ ├── complete_one_problem.png │ │ ├── complete_one_set.png │ │ ├── complete_ten_sets.png │ │ ├── complete_thirty_sets.png │ │ ├── complete_twenty_sets.png │ │ ├── crack_o_dawn.png │ │ ├── curvature.png │ │ ├── curvy_geometry.png │ │ ├── defaulticon.png │ │ ├── derivative_master.png │ │ ├── doing_it_backwards.png │ │ ├── double_integral.png │ │ ├── early_bird.png │ │ ├── earn_10_achievements.png │ │ ├── earn_20_achievements.png │ │ ├── earn_30_achievements.png │ │ ├── earn_40_achievements.png │ │ ├── earn_50_achievements.png │ │ ├── eigenvector.png │ │ ├── first_order_ode.png │ │ ├── heart_area.png │ │ ├── hows_your_finger.png │ │ ├── integral_master.png │ │ ├── its_all_relative.png │ │ ├── la_revolucion.png │ │ ├── lagrange_multipliers.png │ │ ├── laplace.png │ │ ├── last_minute.png │ │ ├── level_eight.png │ │ ├── level_five.png │ │ ├── level_four.png │ │ ├── level_nine.png │ │ ├── level_one.png │ │ ├── level_seven.png │ │ ├── level_six.png │ │ ├── level_ten.png │ │ ├── level_three.png │ │ ├── level_two.png │ │ ├── line_integrals.png │ │ ├── lines_and_planes.png │ │ ├── many_fractions.png │ │ ├── night_owl.png │ │ ├── ode_systems.png │ │ ├── on_fire.png │ │ ├── on_one_hand.png │ │ ├── on_the_hour.png │ │ ├── one_click.png │ │ ├── optimizer_prime.png │ │ ├── partial_derivatives.png │ │ ├── pattern_recognition.png │ │ ├── persistance.png │ │ ├── put_me_in_coach.png │ │ ├── reaching_a_limit.png │ │ ├── really_early_bird.png │ │ ├── revolucion_redux.png │ │ ├── roman_numeral_I.png │ │ ├── roman_numeral_II.png │ │ ├── seeing_green.png │ │ ├── speed_mather.png │ │ ├── step_by_step_1.png │ │ ├── step_by_step_10.png │ │ ├── step_by_step_20.png │ │ ├── step_by_step_30.png │ │ ├── step_by_step_5.png │ │ ├── still_not_right.png │ │ ├── super_persistance.png │ │ ├── super_speed_math.png │ │ ├── tangent_plane.png │ │ ├── taylor_hero.png │ │ ├── tea_time.png │ │ ├── the_biologist.png │ │ ├── the_fundamentals.png │ │ ├── the_lhopital.png │ │ ├── third_time.png │ │ ├── three_in_a_row.png │ │ ├── to_infinity.png │ │ ├── trig_ninja.png │ │ ├── triple_integral.png │ │ └── vector_fields.png │ └── templates │ ├── Contrib │ ├── Library │ ├── Student_Orientation │ ├── achievements │ ├── achievement_items_readme.txt │ ├── achievement_readme.txt │ ├── add_anything.at │ ├── back_for_more.at │ ├── blankachievement.at │ ├── by_definition.at │ ├── challenge_eight.at │ ├── challenge_five.at │ ├── challenge_four.at │ ├── challenge_nine.at │ ├── challenge_one.at │ ├── challenge_seven.at │ ├── challenge_six.at │ ├── challenge_ten.at │ ├── challenge_three.at │ ├── challenge_two.at │ ├── challenger.at │ ├── change_of_variables.at │ ├── chipping_away.at │ ├── complete_100_problems.at │ ├── complete_10_problems.at │ ├── complete_150_problems.at │ ├── complete_25_problems.at │ ├── complete_50_problems.at │ ├── complete_all_sets.at │ ├── complete_five_sets.at │ ├── complete_one_problem.at │ ├── complete_one_set.at │ ├── complete_ten_sets.at │ ├── complete_thirty_sets.at │ ├── complete_twenty_sets.at │ ├── crack_o_dawn.at │ ├── curvature.at │ ├── curvy_geometry.at │ ├── default_achievements.axp │ ├── derivative_master.at │ ├── doing_it_backwards.at │ ├── double_integral.at │ ├── early_bird.at │ ├── earn_n_achievements.at │ ├── extensions.at │ ├── extensions.axp │ ├── heart_area.at │ ├── hows_your_finger.at │ ├── integral_master.at │ ├── its_all_relative.at │ ├── la_revolucion.at │ ├── lagrange_multipliers.at │ ├── last_minute.at │ ├── level_eight.at │ ├── level_five.at │ ├── level_four.at │ ├── level_nine.at │ ├── level_one.at │ ├── level_seven.at │ ├── level_six.at │ ├── level_ten.at │ ├── level_three.at │ ├── level_two.at │ ├── line_integrals.at │ ├── lines_and_planes.at │ ├── many_fractions.at │ ├── night_owl.at │ ├── notifications │ │ └── default.html.ep │ ├── on_fire.at │ ├── on_one_hand.at │ ├── on_the_hour.at │ ├── one_click.at │ ├── optimizer_prime.at │ ├── partial_derivatives.at │ ├── pattern_recognition.at │ ├── persistance.at │ ├── preamble.at │ ├── put_me_in_coach.at │ ├── reaching_a_limit.at │ ├── really_early_bird.at │ ├── revolucion_redux.at │ ├── seeing_green.at │ ├── speed_mather.at │ ├── still_not_right.at │ ├── super_persistance.at │ ├── super_speed_math.at │ ├── surprise_message.txt │ ├── tangent_plane.at │ ├── taylor_hero.at │ ├── the_fundamentals.at │ ├── the_lhopital.at │ ├── third_time.at │ ├── three_in_a_row.at │ ├── to_infinity.at │ ├── trig_ninja.at │ ├── triple_integral.at │ └── vector_fields.at │ ├── capaLibrary │ ├── course_info.txt │ ├── defaultSetHeader.pg │ ├── demoCourse.lst │ ├── email │ └── welcome.msg │ ├── setDemo.def │ └── setDemo │ ├── c4s5p2.pg │ ├── calc.html │ ├── josephus.pg │ ├── limits.pg │ ├── liteApplet1.pg │ ├── liteApplet2.pg │ ├── nsc2s10p2.pg │ ├── paperHeaderFile1.pg │ ├── prob0837.pg │ ├── prob5.pg │ ├── prob6b.pg │ ├── s2_2_1.pg │ ├── sample_myown_ans.pg │ ├── sample_units_ans.pg │ ├── screenHeaderFile1.pg │ └── srw1_9_4.pg ├── doc ├── Artistic ├── Copying ├── devel │ ├── DBglue.notes │ ├── URL-notes │ ├── cg-refactor-notes │ ├── converted-cgs │ ├── daemon-problem-environment │ ├── dont-forget │ ├── hardcopy-notes │ ├── new-DB-API │ ├── new-DB-architecture │ ├── new-DB-notes │ ├── new-DB-sql │ ├── new-DB-structure │ ├── pre-bugzilla-TODO-file │ ├── schema-2002 │ ├── template-escapes │ └── unified-prof-page-form-notes └── parser │ ├── README │ ├── docs │ ├── ParserAnswerCheckers.pod │ └── UsingParser.pod │ ├── extensions │ ├── 1-function.pg │ ├── 2-function.pg │ ├── 3-operator.pg │ ├── 4-list.pg │ ├── 5-operator.pg │ ├── 6-precedence.pg │ ├── 7-context.pg │ └── 8-answer.pg │ └── problems │ ├── sample01.pg │ ├── sample02.pg │ ├── sample03.pg │ ├── sample04.pg │ ├── sample05.pg │ ├── sample06.pg │ ├── sample07.pg │ ├── sample08.pg │ ├── sample09.pg │ ├── sample10.pg │ ├── sample11.pg │ ├── sample12.pg │ ├── sample13.pg │ ├── sample14.pg │ ├── sample15.pg │ ├── sample16.pg │ ├── sample17.pg │ ├── sample18.pg │ ├── sample19.pg │ ├── sample20.pg │ ├── sample21.pg │ └── sample22.pg ├── docker-config ├── db │ ├── limits.conf │ ├── mariadb.cnf │ └── my.cnf ├── docker-compose.dist.yml ├── docker-entrypoint.sh ├── env.dist ├── imagemagick-allow-pdf-read.patch ├── pgfsys-dvisvmg-bbox-fix.patch └── ssl │ └── Readme ├── htdocs ├── CAPA_Graphics ├── DATA │ └── README ├── crossdomain.xml ├── css │ └── rtl.css ├── favicon.ico ├── generate-assets.js ├── images │ ├── defaulticon.png │ ├── favicon.ico │ ├── pi.svg │ └── webwork_logo.png ├── index.dist.html ├── js │ ├── AchievementItems │ │ └── achievementitems.js │ ├── AchievementList │ │ └── achievementlist.js │ ├── Achievements │ │ └── achievements.scss │ ├── ActionTabs │ │ └── actiontabs.js │ ├── Config │ │ └── config.js │ ├── DatePicker │ │ └── datepicker.js │ ├── FileManager │ │ └── filemanager.js │ ├── GatewayQuiz │ │ ├── gateway.js │ │ └── gateway.scss │ ├── InstructorTools │ │ └── instructortools.js │ ├── JobManager │ │ └── jobmanager.js │ ├── LTIUpdate │ │ └── ltiupdate.js │ ├── LocalStorage │ │ └── localstorage.js │ ├── MathJaxConfig │ │ └── mathjax-config.js │ ├── PGCodeMirror │ │ ├── PG.js │ │ ├── comment.js │ │ ├── pgeditor.js │ │ └── pgeditor.scss │ ├── PGProblemEditor │ │ └── pgproblemeditor.js │ ├── PODViewer │ │ ├── podviewer.css │ │ └── podviewer.js │ ├── Problem │ │ └── problem.js │ ├── ProblemGrader │ │ ├── problemgrader.js │ │ └── singleproblemgrader.js │ ├── ProblemSetDetail │ │ └── problemsetdetail.js │ ├── ProblemSetList │ │ └── problemsetlist.js │ ├── ProblemSets │ │ └── problemsets.js │ ├── README_js_organization │ ├── RenderProblem │ │ └── renderproblem.js │ ├── SampleProblemViewer │ │ ├── sample-problem.js │ │ ├── sample-problem.scss │ │ ├── viewer.js │ │ └── viewer.scss │ ├── SelectAll │ │ └── selectall.js │ ├── SendMail │ │ └── sendmail.js │ ├── SetMaker │ │ └── setmaker.js │ ├── Stats │ │ └── stats.js │ ├── System │ │ ├── system.js │ │ └── system.scss │ ├── TagWidget │ │ └── tagwidget.js │ ├── UserDetail │ │ └── userdetail.js │ └── UserList │ │ ├── userlist.js │ │ └── userlist.scss ├── library-tree.json ├── package-lock.json ├── package.json ├── show-source.cgi ├── site_info.txt ├── themes │ ├── math4-green │ │ ├── README │ │ ├── _theme-colors.scss │ │ ├── _theme-overrides.scss │ │ ├── bootstrap.scss │ │ ├── images │ │ │ ├── maa_logo.svg │ │ │ └── webwork_logo.svg │ │ ├── math4-overrides.css.dist │ │ └── math4-overrides.js.dist │ ├── math4-red │ │ ├── README │ │ ├── _theme-colors.scss │ │ ├── _theme-overrides.scss │ │ ├── bootstrap.scss │ │ ├── images │ │ │ ├── maa_logo.svg │ │ │ └── webwork_logo.svg │ │ ├── math4-overrides.css.dist │ │ └── math4-overrides.js.dist │ ├── math4-yellow │ │ ├── README │ │ ├── _theme-colors.scss │ │ ├── _theme-overrides.scss │ │ ├── bootstrap.scss │ │ ├── images │ │ │ ├── maa_logo.svg │ │ │ └── webwork_logo.svg │ │ ├── math4-overrides.css.dist │ │ └── math4-overrides.js.dist │ └── math4 │ │ ├── README │ │ ├── _theme-colors.scss │ │ ├── _theme-overrides.scss │ │ ├── bootstrap.scss │ │ ├── images │ │ ├── maa_logo.svg │ │ ├── webwork_logo.svg │ │ └── webwork_square.svg │ │ ├── math4-overrides.css.dist │ │ └── math4-overrides.js.dist └── tmp │ └── README ├── lib ├── Caliper │ ├── Actor.pm │ ├── Entity.pm │ ├── Event.pm │ ├── ResourceIri.pm │ └── Sensor.pm ├── FormatRenderedProblem.pm ├── HardcopyRenderedProblem.pm ├── Mojolicious │ ├── WeBWorK.pm │ └── WeBWorK │ │ └── Tasks │ │ ├── AchievementNotification.pm │ │ ├── LTIMassUpdate.pm │ │ └── SendInstructorEmail.pm ├── WeBWorK.pm ├── WeBWorK │ ├── AchievementEvaluator.pm │ ├── AchievementItems.pm │ ├── AchievementItems │ │ ├── AddNewTestGW.pm │ │ ├── DoubleProb.pm │ │ ├── DoubleSet.pm │ │ ├── DuplicateProb.pm │ │ ├── ExtendDueDate.pm │ │ ├── ExtendDueDateGW.pm │ │ ├── FullCreditProb.pm │ │ ├── FullCreditSet.pm │ │ ├── HalfCreditProb.pm │ │ ├── HalfCreditSet.pm │ │ ├── ReducedCred.pm │ │ ├── ResetIncorrectAttempts.pm │ │ ├── ResurrectGW.pm │ │ ├── ResurrectHW.pm │ │ ├── SuperExtendDueDate.pm │ │ └── Surprise.pm │ ├── Authen.pm │ ├── Authen │ │ ├── Basic_TheLastOption.pm │ │ ├── CAS.pm │ │ ├── Cosign.pm │ │ ├── LDAP.pm │ │ ├── LTI │ │ │ └── MassUpdate.pm │ │ ├── LTIAdvanced.pm │ │ ├── LTIAdvanced │ │ │ ├── Nonce.pm │ │ │ └── SubmitGrade.pm │ │ ├── LTIAdvantage.pm │ │ ├── LTIAdvantage │ │ │ └── SubmitGrade.pm │ │ ├── Moodle.pm │ │ ├── Proctor.pm │ │ └── Shibboleth.pm │ ├── Authz.pm │ ├── ConfigObject.pm │ ├── ConfigObject │ │ ├── boolean.pm │ │ ├── checkboxlist.pm │ │ ├── list.pm │ │ ├── lms_context_id.pm │ │ ├── number.pm │ │ ├── permission.pm │ │ ├── permission_checkboxlist.pm │ │ ├── popuplist.pm │ │ ├── setting.pm │ │ ├── text.pm │ │ ├── time.pm │ │ └── timezone.pm │ ├── ConfigValues.pm │ ├── ContentGenerator.pm │ ├── ContentGenerator │ │ ├── Achievements.pm │ │ ├── CourseAdmin.pm │ │ ├── EquationDisplay.pm │ │ ├── Feedback.pm │ │ ├── GatewayQuiz.pm │ │ ├── Grades.pm │ │ ├── Hardcopy.pm │ │ ├── Home.pm │ │ ├── Instructor │ │ │ ├── AchievementEditor.pm │ │ │ ├── AchievementList.pm │ │ │ ├── AchievementNotificationEditor.pm │ │ │ ├── AchievementUserEditor.pm │ │ │ ├── AddUsers.pm │ │ │ ├── Assigner.pm │ │ │ ├── Config.pm │ │ │ ├── FileManager.pm │ │ │ ├── Index.pm │ │ │ ├── JobManager.pm │ │ │ ├── LTIUpdate.pm │ │ │ ├── PGProblemEditor.pm │ │ │ ├── ProblemGrader.pm │ │ │ ├── ProblemSetDetail.pm │ │ │ ├── ProblemSetList.pm │ │ │ ├── Scoring.pm │ │ │ ├── ScoringDownload.pm │ │ │ ├── SendMail.pm │ │ │ ├── SetMaker.pm │ │ │ ├── ShowAnswers.pm │ │ │ ├── Stats.pm │ │ │ ├── StudentProgress.pm │ │ │ ├── UserDetail.pm │ │ │ ├── UserList.pm │ │ │ └── UsersAssignedToSet.pm │ │ ├── InstructorRPCHandler.pm │ │ ├── LTIAdvanced.pm │ │ ├── LTIAdvantage.pm │ │ ├── Login.pm │ │ ├── LoginProctor.pm │ │ ├── Logout.pm │ │ ├── Options.pm │ │ ├── PODViewer.pm │ │ ├── Problem.pm │ │ ├── ProblemSet.pm │ │ ├── ProblemSets.pm │ │ ├── ProctoredGatewayQuiz.pm │ │ ├── RenderViaRPC.pm │ │ ├── SampleProblemViewer.pm │ │ ├── ShowMeAnother.pm │ │ ├── Skeleton.pm │ │ └── TwoFactorAuthentication.pm │ ├── Controller.pm │ ├── CourseEnvironment.pm │ ├── DB.pm │ ├── DB │ │ ├── Driver.pm │ │ ├── Driver │ │ │ ├── Null.pm │ │ │ └── SQL.pm │ │ ├── Record.pm │ │ ├── Record │ │ │ ├── Achievement.pm │ │ │ ├── Depths.pm │ │ │ ├── GlobalUserAchievement.pm │ │ │ ├── Key.pm │ │ │ ├── LTICourseMap.pm │ │ │ ├── LTILaunchData.pm │ │ │ ├── LocationAddresses.pm │ │ │ ├── Locations.pm │ │ │ ├── Password.pm │ │ │ ├── PastAnswer.pm │ │ │ ├── PermissionLevel.pm │ │ │ ├── Problem.pm │ │ │ ├── ProblemVersion.pm │ │ │ ├── Set.pm │ │ │ ├── SetLocations.pm │ │ │ ├── SetVersion.pm │ │ │ ├── Setting.pm │ │ │ ├── User.pm │ │ │ ├── UserAchievement.pm │ │ │ ├── UserProblem.pm │ │ │ ├── UserSet.pm │ │ │ └── UserSetLocations.pm │ │ ├── Schema.pm │ │ ├── Schema │ │ │ ├── NewSQL.pm │ │ │ └── NewSQL │ │ │ │ ├── Merge.pm │ │ │ │ ├── NonVersioned.pm │ │ │ │ ├── Std.pm │ │ │ │ ├── Versioned.pm │ │ │ │ └── VersionedMerge.pm │ │ ├── Utils.pm │ │ └── Utils │ │ │ └── SQLAbstractIdentTrans.pm │ ├── Debug.pm │ ├── File │ │ ├── Classlist.pm │ │ ├── Scoring.pm │ │ └── SetDef.pm │ ├── HTML │ │ ├── CodeMirrorEditor.pm │ │ ├── ScrollingRecordList.pm │ │ └── SingleProblemGrader.pm │ ├── Localize.pm │ ├── Localize │ │ ├── cs-CZ.po │ │ ├── de.po │ │ ├── el.po │ │ ├── en.po │ │ ├── es.po │ │ ├── fr-CA.po │ │ ├── fr.po │ │ ├── he-IL.po │ │ ├── hu.po │ │ ├── ko.po │ │ ├── ru-RU.po │ │ ├── tr.po │ │ ├── webwork2.pot │ │ ├── zh-CN.po │ │ └── zh-HK.po │ ├── SafeTemplate.pm │ ├── Upload.pm │ ├── Utils.pm │ ├── Utils │ │ ├── CourseIntegrityCheck.pm │ │ ├── CourseManagement.pm │ │ ├── CourseManagement │ │ │ ├── sql_moodle.pm │ │ │ └── sql_single.pm │ │ ├── DBImportExport.pm │ │ ├── DBUpgrade.pm │ │ ├── DateTime.pm │ │ ├── Files.pm │ │ ├── FilterRecords.pm │ │ ├── FormatRecords.pm │ │ ├── Instructor.pm │ │ ├── JITAR.pm │ │ ├── LanguageAndDirection.pm │ │ ├── LibraryStats.pm │ │ ├── ListingDB.pm │ │ ├── Logs.pm │ │ ├── PODParser.pm │ │ ├── ProblemProcessing.pm │ │ ├── Rendering.pm │ │ ├── Routes.pm │ │ ├── Sets.pm │ │ ├── SortRecords.pm │ │ ├── TOTP.pm │ │ └── Tags.pm │ └── WWSafe.pm ├── WebworkSOAP.pm ├── WebworkSOAP │ ├── Classes │ │ ├── Course.pm │ │ ├── GlobalProblem.pm │ │ ├── GlobalSet.pm │ │ ├── Key.pm │ │ ├── Password.pm │ │ ├── Permission.pm │ │ ├── User.pm │ │ ├── UserProblem.pm │ │ └── UserSet.pm │ └── SOAP.pm ├── WebworkWebservice.pm └── WebworkWebservice │ ├── CourseActions.pm │ ├── LibraryActions.pm │ ├── ProblemActions.pm │ ├── RenderProblem.pm │ └── SetActions.pm ├── logs └── README ├── templates ├── AchievementEvaluator │ └── cheevoMessage.html.ep ├── ContentGenerator │ ├── Achievements.html.ep │ ├── Achievements │ │ ├── achievement_badges.html.ep │ │ ├── achievement_items.html.ep │ │ └── cheevobigbox.html.ep │ ├── Base │ │ ├── admin_links.html.ep │ │ ├── error_output.html.ep │ │ ├── feedback_macro_email.html.ep │ │ ├── feedback_macro_form.html.ep │ │ ├── footer.html.ep │ │ ├── links.html.ep │ │ ├── login_status.html.ep │ │ ├── set_status.html.ep │ │ └── warning_output.html.ep │ ├── CourseAdmin.html.ep │ ├── CourseAdmin │ │ ├── add_course_form.html.ep │ │ ├── archive_course_confirm.html.ep │ │ ├── archive_course_form.html.ep │ │ ├── delete_course_confirm.html.ep │ │ ├── delete_course_form.html.ep │ │ ├── edit_location_form.html.ep │ │ ├── hide_inactive_course_form.html.ep │ │ ├── manage_location_form.html.ep │ │ ├── manage_lti_course_map_form.html.ep │ │ ├── registration_form.html.ep │ │ ├── rename_course_confirm.html.ep │ │ ├── rename_course_confirm_short.html.ep │ │ ├── rename_course_form.html.ep │ │ ├── unarchive_course_confirm.html.ep │ │ ├── unarchive_course_form.html.ep │ │ ├── upgrade_course_confirm.html.ep │ │ └── upgrade_course_form.html.ep │ ├── EquationDisplay.html.ep │ ├── Feedback.html.ep │ ├── GatewayQuiz.html.ep │ ├── GatewayQuiz │ │ └── nav.html.ep │ ├── Grades.html.ep │ ├── Grades │ │ └── student_stats.html.ep │ ├── Hardcopy.html.ep │ ├── Hardcopy │ │ └── form.html.ep │ ├── Home.html.ep │ ├── Instructor │ │ ├── AchievementEditor.html.ep │ │ ├── AchievementEditor │ │ │ ├── save_as_form.html.ep │ │ │ └── save_form.html.ep │ │ ├── AchievementList.html.ep │ │ ├── AchievementList │ │ │ ├── assign_form.html.ep │ │ │ ├── cancel_edit_form.html.ep │ │ │ ├── cancel_export_form.html.ep │ │ │ ├── create_form.html.ep │ │ │ ├── default_table.html.ep │ │ │ ├── delete_form.html.ep │ │ │ ├── edit_form.html.ep │ │ │ ├── edit_table.html.ep │ │ │ ├── edit_table_row.html.ep │ │ │ ├── export_form.html.ep │ │ │ ├── export_table.html.ep │ │ │ ├── filter_form.html.ep │ │ │ ├── import_form.html.ep │ │ │ ├── save_edit_form.html.ep │ │ │ ├── save_export_form.html.ep │ │ │ └── score_form.html.ep │ │ ├── AchievementNotificationEditor.html.ep │ │ ├── AchievementNotificationEditor │ │ │ ├── disable_form.html.ep │ │ │ ├── existing_form.html.ep │ │ │ ├── save_as_form.html.ep │ │ │ └── save_form.html.ep │ │ ├── AchievementUserEditor.html.ep │ │ ├── AddUsers.html.ep │ │ ├── AddUsers │ │ │ └── student_entry_report.html.ep │ │ ├── Assigner.html.ep │ │ ├── Config.html.ep │ │ ├── Config │ │ │ └── config_help.html.ep │ │ ├── FileManager.html.ep │ │ ├── FileManager │ │ │ ├── archive.html.ep │ │ │ ├── confirm.html.ep │ │ │ ├── delete.html.ep │ │ │ ├── refresh.html.ep │ │ │ ├── refresh_edit.html.ep │ │ │ └── view.html.ep │ │ ├── Index.html.ep │ │ ├── JobManager.html.ep │ │ ├── JobManager │ │ │ ├── delete_form.html.ep │ │ │ ├── filter_form.html.ep │ │ │ ├── sort_button.html.ep │ │ │ └── sort_form.html.ep │ │ ├── LTIUpdate.html.ep │ │ ├── PGProblemEditor.html.ep │ │ ├── PGProblemEditor │ │ │ ├── add_problem_form.html.ep │ │ │ ├── format_code_form.html.ep │ │ │ ├── hardcopy_form.html.ep │ │ │ ├── revert_form.html.ep │ │ │ ├── save_as_form.html.ep │ │ │ ├── save_form.html.ep │ │ │ └── view_form.html.ep │ │ ├── ProblemGrader.html.ep │ │ ├── ProblemGrader │ │ │ └── siblings.html.ep │ │ ├── ProblemSetDetail.html.ep │ │ ├── ProblemSetDetail │ │ │ ├── attempts_row.html.ep │ │ │ ├── ip_locations_row.html.ep │ │ │ └── restricted_login_proctor_password_row.html.ep │ │ ├── ProblemSetList.html.ep │ │ ├── ProblemSetList │ │ │ ├── cancel_edit_form.html.ep │ │ │ ├── cancel_export_form.html.ep │ │ │ ├── create_form.html.ep │ │ │ ├── delete_form.html.ep │ │ │ ├── edit_form.html.ep │ │ │ ├── export_form.html.ep │ │ │ ├── filter_form.html.ep │ │ │ ├── import_form.html.ep │ │ │ ├── publish_form.html.ep │ │ │ ├── save_edit_form.html.ep │ │ │ ├── save_export_form.html.ep │ │ │ ├── score_form.html.ep │ │ │ ├── set_list_field.html.ep │ │ │ ├── set_list_row.html.ep │ │ │ ├── set_list_table.html.ep │ │ │ ├── sort_button.html.ep │ │ │ └── sort_form.html.ep │ │ ├── Scoring.html.ep │ │ ├── SendMail.html.ep │ │ ├── SendMail │ │ │ ├── main_form.html.ep │ │ │ └── preview.html.ep │ │ ├── SetMaker.html.ep │ │ ├── SetMaker │ │ │ ├── browse_course_sets_panel.html.ep │ │ │ ├── browse_library_panel.html.ep │ │ │ ├── browse_library_panel_advanced.html.ep │ │ │ ├── browse_library_panel_simple.html.ep │ │ │ ├── browse_local_panel.html.ep │ │ │ ├── browse_setdef_panel.html.ep │ │ │ ├── library-include-checks.html.ep │ │ │ ├── problem_row.html.ep │ │ │ ├── top_row.html.ep │ │ │ └── view_problems_line.html.ep │ │ ├── ShowAnswers.html.ep │ │ ├── ShowAnswers │ │ │ ├── instructor-selectors.html.ep │ │ │ └── past-answers-table.html.ep │ │ ├── Stats.html.ep │ │ ├── Stats │ │ │ ├── index.html.ep │ │ │ ├── problem_menu.html.ep │ │ │ ├── problem_stats.html.ep │ │ │ ├── set_stats.html.ep │ │ │ ├── siblings.html.ep │ │ │ ├── stats_table.html.ep │ │ │ ├── student_filter_menu.html.ep │ │ │ └── student_stats.html.ep │ │ ├── StudentProgress.html.ep │ │ ├── StudentProgress │ │ │ └── set_progress.html.ep │ │ ├── UserDetail.html.ep │ │ ├── UserDetail │ │ │ ├── set_date_table.html.ep │ │ │ └── set_row.html.ep │ │ ├── UserList.html.ep │ │ ├── UserList │ │ │ ├── add_form.html.ep │ │ │ ├── cancel_edit_form.html.ep │ │ │ ├── delete_form.html.ep │ │ │ ├── edit_form.html.ep │ │ │ ├── export_form.html.ep │ │ │ ├── filter_form.html.ep │ │ │ ├── import_form.html.ep │ │ │ ├── reset_2fa_form.html.ep │ │ │ ├── save_edit_form.html.ep │ │ │ ├── sort_button.html.ep │ │ │ ├── sort_form.html.ep │ │ │ ├── user_list.html.ep │ │ │ ├── user_list_field.html.ep │ │ │ └── user_row.html.ep │ │ └── UsersAssignedToSet.html.ep │ ├── LTI │ │ ├── content_item_selection.html.ep │ │ ├── content_item_selection_error.html.ep │ │ └── self_posting_form.html.ep │ ├── Login.html.ep │ ├── LoginProctor.html.ep │ ├── Logout.html.ep │ ├── Options.html.ep │ ├── PODViewer.html.ep │ ├── PODViewer │ │ └── POD.html.ep │ ├── Problem.html.ep │ ├── Problem │ │ ├── checkboxes.html.ep │ │ ├── instructor_buttons.html.ep │ │ ├── messages.html.ep │ │ ├── siblings.html.ep │ │ ├── student_nav.html.ep │ │ └── submit_buttons.html.ep │ ├── ProblemSet.html.ep │ ├── ProblemSet │ │ ├── info.html.ep │ │ ├── problem_list.html.ep │ │ ├── problem_list_row.html.ep │ │ ├── siblings.html.ep │ │ └── version_list.html.ep │ ├── ProblemSets.html.ep │ ├── ProblemSets │ │ ├── info.html.ep │ │ └── set_list_row.html.ep │ ├── ProctoredGatewayQuiz.html.ep │ ├── SampleProblemViewer.html.ep │ ├── SampleProblemViewer │ │ ├── sample_problem.html.ep │ │ └── viewer.html.ep │ ├── ShowMeAnother.html.ep │ ├── ShowMeAnother │ │ └── messages.html.ep │ └── TwoFactorAuthentication.html.ep ├── HTML │ ├── CodeMirrorEditor │ │ ├── controls.html.ep │ │ └── js.html.ep │ ├── ScrollingRecordList │ │ └── scrollingRecordList.html.ep │ └── SingleProblemGrader │ │ └── grader.html.ep ├── HelpFiles │ ├── Achievements.html.ep │ ├── AdminAddCourse.html.ep │ ├── AdminArchiveCourse.html.ep │ ├── AdminDeleteCourse.html.ep │ ├── AdminHideCourses.html.ep │ ├── AdminManageLTICourseMap.html.ep │ ├── AdminManageLocations.html.ep │ ├── AdminRenameCourse.html.ep │ ├── AdminUnarchiveCourse.html.ep │ ├── AdminUpgradeCourses.html.ep │ ├── Grades.html.ep │ ├── Hardcopy.html.ep │ ├── InstructorAchievementEditor.html.ep │ ├── InstructorAchievementList.html.ep │ ├── InstructorAchievementNotificationEditor.html.ep │ ├── InstructorAchievementUserEditor.html.ep │ ├── InstructorAddUsers.html.ep │ ├── InstructorAssigner.html.ep │ ├── InstructorConfig.html.ep │ ├── InstructorFileManager.html.ep │ ├── InstructorIndex.html.ep │ ├── InstructorJobManager.html.ep │ ├── InstructorLTIUpdate.html.ep │ ├── InstructorPGProblemEditor.html.ep │ ├── InstructorProblemGrader.html.ep │ ├── InstructorProblemSetDetail.html.ep │ ├── InstructorProblemSetList.html.ep │ ├── InstructorScoring.html.ep │ ├── InstructorSendMail.html.ep │ ├── InstructorSetMaker.html.ep │ ├── InstructorShowAnswers.html.ep │ ├── InstructorStats.html.ep │ ├── InstructorStudentProgress.html.ep │ ├── InstructorUserDetail.html.ep │ ├── InstructorUserList.html.ep │ ├── InstructorUsersAssignedToSet.html.ep │ ├── Levels.html.ep │ ├── Options.html.ep │ ├── ProblemSets.html.ep │ ├── admin_links.html.ep │ └── instructor_links.html.ep ├── RPCRenderFormats │ ├── default.html.ep │ ├── default.json.ep │ └── ptx.html.ep ├── exception.html.ep ├── exception_default.html.ep ├── exception_min.html.ep └── layouts │ ├── help_macro.html.ep │ ├── pod_viewer.html.ep │ └── system.html.ep ├── tmp └── README └── transifex.yml /.dockerignore: -------------------------------------------------------------------------------- 1 | Dockerfile 2 | logs/* 3 | tmp/* 4 | htdocs/tmp/* 5 | htdocs/DATA/library*.json 6 | htdocs/DATA/tagging-taxonomy.json 7 | htdocs/DATA/textbooks-tree.json 8 | .git 9 | .data 10 | .idea 11 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | max_line_length = 120 8 | trim_trailing_whitespace = true 9 | indent_style = tab 10 | indent_size = 4 11 | 12 | [*.yml] 13 | indent_style = space 14 | indent_size = 2 15 | 16 | [*.pg] 17 | trim_trailing_whitespace = false 18 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [openwebwork] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: ["https://webwork.maa.org/wiki"] 13 | -------------------------------------------------------------------------------- /.github/workflows/check-formats.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Check Formatting of Code Base 3 | 4 | defaults: 5 | run: 6 | shell: bash 7 | 8 | on: 9 | push: 10 | branches-ignore: [main, develop] 11 | pull_request: 12 | 13 | jobs: 14 | perltidy: 15 | name: Check Perl file formatting with perltidy 16 | runs-on: ubuntu-22.04 17 | container: 18 | image: perl:5.34 19 | steps: 20 | - name: Checkout code 21 | uses: actions/checkout@v4 22 | - name: Install dependencies 23 | run: cpanm -n Perl::Tidy@20220613 24 | - name: Run perltidy 25 | shell: bash 26 | run: | 27 | git config --global --add safe.directory "$GITHUB_WORKSPACE" 28 | shopt -s extglob globstar nullglob 29 | perltidy --pro=./.perltidyrc -b -bext='/' ./**/*.p[lm] ./**/*.t && git diff --exit-code 30 | 31 | prettier: 32 | name: Check JavaScript, style, and HTML file formatting with prettier 33 | runs-on: ubuntu-22.04 34 | steps: 35 | - name: Checkout code 36 | uses: actions/checkout@v4 37 | - name: Install Node 38 | uses: actions/setup-node@v4 39 | with: 40 | node-version: '20' 41 | - name: Install Dependencies 42 | run: cd htdocs && npm ci --ignore-scripts 43 | - name: Check formatting with prettier 44 | run: cd htdocs && npm run prettier-check 45 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | *~ 3 | *.swp 4 | *.save 5 | *.bak 6 | tmp/* 7 | logs/* 8 | 9 | conf/* 10 | !conf/*.dist* 11 | !conf/*.config 12 | 13 | node_modules 14 | 15 | htdocs/tmp/* 16 | htdocs/site_info.txt 17 | htdocs/DATA/* 18 | htdocs/themes/*/math4-overrides.css 19 | htdocs/themes/*/math4-overrides.js 20 | htdocs/static-assets.json 21 | htdocs/index.html 22 | htdocs/**/*.min.js 23 | htdocs/**/*.min.css 24 | htdocs/themes/*/images/* 25 | !htdocs/themes/*/images/maa_logo.svg 26 | !htdocs/themes/*/images/webwork_logo.svg 27 | !htdocs/themes/math4/images/webwork_square.svg 28 | htdocs/themes/*/*.css 29 | htdocs/themes/* 30 | !htdocs/themes/math4 31 | !htdocs/themes/math4-red 32 | !htdocs/themes/math4-green 33 | !htdocs/themes/math4-yellow 34 | !htdocs/themes/layouts 35 | 36 | DATA/* 37 | !DATA/uploads 38 | DATA/uploads/* 39 | !*README* 40 | 41 | docker-compose.yml 42 | docker-config/ssl/* 43 | !docker-config/ssl/Readme 44 | 45 | .vscode 46 | .vim 47 | -------------------------------------------------------------------------------- /.perltidyrc: -------------------------------------------------------------------------------- 1 | # PBP .perltidyrc file 2 | -l=120 # Max line width is 120 cols 3 | -et=4 # Use tabs instead of spaces. 4 | -i=4 # Indent level is 4 cols 5 | -ci=4 # Continuation indent is 4 cols 6 | -b # Write the file inline and create a .bak file 7 | -vt=0 # Minimal vertical tightness 8 | -cti=0 # No extra indentation for closing brackets 9 | -pt=2 # Maximum parenthesis tightness 10 | -bt=1 # Medium brace tightness 11 | -sbt=1 # Medium square bracket tightness 12 | -bbt=1 # Medium block brace tightness 13 | -nsfs # No space before semicolons 14 | -nolq # Don't outdent long quoted strings 15 | -mbl=1 # Do not allow multiple empty lines 16 | -ce # Cuddled else 17 | -cb # Cuddled blocks 18 | -nbbc # Do not add blank lines before full length comments 19 | -nbot # No line break on ternary 20 | -nlop # No logical padding (this causes mixed tabs and spaces) 21 | -wn # Weld nested containers 22 | -xci # Extended continuation indentation 23 | -vxl='q' # No vertical alignment of qw quotes 24 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "arrowParens": "always", 3 | "bracketSpacing": true, 4 | "printWidth": 120, 5 | "semi": true, 6 | "singleQuote": true, 7 | "trailingComma": "none" 8 | } 9 | -------------------------------------------------------------------------------- /.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | 4 | [o:webwork:p:webwork2:r:lib-webwork-localize-webwork2-pot--develop] 5 | file_filter = lib/WeBWorK/Localize/.po 6 | source_file = lib/WeBWorK/Localize/webwork2.pot 7 | source_lang = en 8 | type = PO 9 | lang_map = cs_CZ: cs-CZ, fr_CA: fr-CA, he_IL: he-IL, ru_RU: ru-RU, zh_CN: zh-CN, zh_HK: zh-HK, tr_TR: tr-TR 10 | minimum_perc = 0 11 | -------------------------------------------------------------------------------- /DATA/uploads/README: -------------------------------------------------------------------------------- 1 | $CVSHeader$ 2 | 3 | This directory is used as temporary storage for file uploads. 4 | -------------------------------------------------------------------------------- /VERSION: -------------------------------------------------------------------------------- 1 | $WW_VERSION = '2.19'; 2 | $WW_COPYRIGHT_YEARS = '1996-2024'; 3 | 4 | 1; 5 | -------------------------------------------------------------------------------- /assets/hardcopyThemes/empty.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | This theme is meant for rendering problems with no metadata or styling beyond 6 | the LaTeX defaults for the article class. Each problem gets its own page, 7 | including the PG header. 8 | 9 | 10 | 11 | \documentclass{article} 12 | \usepackage{webwork2} 13 | \pagestyle{empty} 14 | \parindent=0pt 15 | \begin{document} 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | \newpage 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | \newpage 34 | 35 | 36 | 37 | \newpage 38 | 39 | 40 | 41 | \end{document} 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /assets/pg/Student_Orientation/explorerfull.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/assets/pg/Student_Orientation/explorerfull.png -------------------------------------------------------------------------------- /assets/pg/Student_Orientation/explorerpiece.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/assets/pg/Student_Orientation/explorerpiece.png -------------------------------------------------------------------------------- /assets/pg/Student_Orientation/hardcopy.pg: -------------------------------------------------------------------------------- 1 | ## DESCRIPTION 2 | ## Hardcopies 3 | ## ENDDESCRIPTION 4 | 5 | DOCUMENT(); 6 | 7 | loadMacros(qw( 8 | PGstandard.pl 9 | PGML.pl 10 | PGcourse.pl 11 | )); 12 | 13 | $a = random(100, 900); 14 | 15 | BEGIN_PGML 16 | ## PDF Hardcopy ## 17 | 18 | From the *Assignments* page (which you may or may not have permission to visit), you may push a download button[@ 19 | MODES( 20 | HTML => ' ', 21 | TeX => '' 22 | ) 23 | @]* to download a PDF version. Alternatively, when you are at the page listing all of one set's exercises, there is a 24 | "Download Hardcopy for Current Set" button. 25 | 26 | This file is something that you can read onscreen while you are offline. You can even print it off and take it to a 27 | tutoring center or somewhere comfortable to work on. If you would like a Braille file for the assignment, that may be 28 | possible with some assistance from your institutional staff. 29 | 30 | To check that you understand how this works, download the PDF version of this Orientation assignment. At the end of 31 | this problem in the PDF, you will find the answer that is expected here: [_]{Compute("$a")}{4} 32 | 33 | [@ if ($displayMode eq 'TeX') {"The answer is $a."} @] 34 | 35 | [@ MODES(HTML => 'When you are ready, click "Next Problem".', TeX => '') @] 36 | END_PGML 37 | 38 | ENDDOCUMENT(); 39 | -------------------------------------------------------------------------------- /assets/pg/Student_Orientation/mathjaxmenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/assets/pg/Student_Orientation/mathjaxmenu.png -------------------------------------------------------------------------------- /assets/pg/Student_Orientation/welcome.pg: -------------------------------------------------------------------------------- 1 | ## DESCRIPTION 2 | ## Welcome to WeBWorK; Purpose of this Orientation 3 | ## ENDDESCRIPTION 4 | 5 | DOCUMENT(); 6 | 7 | loadMacros(qw( 8 | PGstandard.pl 9 | PGML.pl 10 | PGcourse.pl 11 | )); 12 | 13 | $isOpen = time() > $envir{openDate} && time() < $envir{dueDate}; 14 | $instruction = 15 | ($isOpen) 16 | ? 'To get started, click in the answer blank, type the correct answer, and click the "Submit Answers" button.' 17 | : 'This set is not currently open. You may want to ask your instructor to check if the open and close dates for ' 18 | . 'this set are correctly set. In the meantime, you can click in the answer blank, type the correct answer, ' 19 | . 'and click the "Check Answers" button to see if your answer is correct.'; 20 | 21 | BEGIN_PGML 22 | ## Welcome 23 | 24 | Welcome to the WeBWorK online homework platform. This orientation will familiarize you with basic features and usage of 25 | WeBWorK. 26 | 27 | [$instruction]** 28 | 29 | [`2+2={}`][_]{Context("LimitedNumeric"), 4}{4} 30 | 31 | [@ MODES(HTML => 'When you are ready, click "Next Problem".', TeX => '') @] 32 | END_PGML 33 | 34 | ENDDOCUMENT(); 35 | -------------------------------------------------------------------------------- /assets/pg/blankProblem.pg: -------------------------------------------------------------------------------- 1 | DOCUMENT(); 2 | 3 | # Load whatever macros you need for the problem 4 | loadMacros("PG.pl", 5 | "PGbasicmacros.pl", 6 | "PGchoicemacros.pl", 7 | "PGanswermacros.pl", 8 | "PGauxiliaryFunctions.pl", 9 | "PGgraphmacros.pl", 10 | ); 11 | 12 | ## Do NOT show partial correct answers 13 | $showPartialCorrectAnswers = 0; 14 | 15 | BEGIN_TEXT 16 | 17 | Enter a value for \(\pi\) 18 | 19 | \{ans_rule()\} 20 | END_TEXT 21 | 22 | ANS(num_cmp(3.14159)); 23 | 24 | ENDDOCUMENT(); 25 | -------------------------------------------------------------------------------- /assets/pg/blankProblem2.pg: -------------------------------------------------------------------------------- 1 | ##DESCRIPTION 2 | ## Arithemetic problem: give the value of pi 3 | ##ENDDESCRIPTION 4 | 5 | ##KEYWORDS('arithmetic', 'pi') 6 | 7 | ## DBsubject('Algebra') 8 | ## DBchapter('Fundamentals') 9 | ## DBsection('Real Numbers') 10 | ## Date('') 11 | ## Author('') 12 | ## Institution('') 13 | 14 | ######################################################################## 15 | 16 | DOCUMENT(); 17 | 18 | loadMacros( 19 | "PGstandard.pl", # Standard macros for PG language 20 | "MathObjects.pl", 21 | "PGML.pl", 22 | #"source.pl", # allows code to be displayed on certain sites. 23 | "PGcourse.pl", # Customization file for the course 24 | ); 25 | 26 | # Show which answers are correct and which ones are incorrect 27 | $showPartialCorrectAnswers = 1; 28 | 29 | ############################################################## 30 | # 31 | # Setup 32 | # 33 | # 34 | Context("Numeric"); 35 | 36 | $pi = Real("pi"); 37 | 38 | ############################################################## 39 | # 40 | # Text 41 | # 42 | # 43 | 44 | BEGIN_PGML 45 | Enter a value for [`\pi`]. 46 | 47 | [_____]{$pi} 48 | END_PGML 49 | 50 | ENDDOCUMENT(); 51 | -------------------------------------------------------------------------------- /assets/pg/newProblem.pg: -------------------------------------------------------------------------------- 1 | ## DESCRIPTION 2 | ## Give a value for pi 3 | ## ENDDESCRIPTION 4 | 5 | ## KEYWORDS('template', 'pi') 6 | 7 | ## DBsubject('Algebra') 8 | ## DBchapter('Fundamentals') 9 | ## DBsection('Real Numbers') 10 | ## Date('') 11 | ## Author('') 12 | ## Institution('') 13 | 14 | DOCUMENT(); 15 | 16 | loadMacros( 17 | "PGstandard.pl", # Standard macros for PG language 18 | "PGML.pl", # PGML markup and Math Objects 19 | "PGcourse.pl", # Customization file for the course 20 | ); 21 | 22 | # Uncomment the following if you don't want to show which 23 | # answers are correct and which are incorrect 24 | #$showPartialCorrectAnswers = 0; 25 | 26 | $pi = Real("pi"); 27 | 28 | BEGIN_PGML 29 | Enter a value for [`\pi`]. 30 | 31 | [_]{$pi}{5} 32 | END_PGML 33 | 34 | BEGIN_PGML_SOLUTION 35 | You could type [|pi|]* or [|3.14|]*, or [|22/7|]*, 36 | among other options. 37 | END_PGML_SOLUTION 38 | 39 | ENDDOCUMENT(); 40 | -------------------------------------------------------------------------------- /assets/tex/webwork_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/assets/tex/webwork_logo.png -------------------------------------------------------------------------------- /bin/Helper.pm: -------------------------------------------------------------------------------- 1 | package Helper; 2 | 3 | use warnings; 4 | use strict; 5 | use base 'Exporter'; 6 | 7 | our @EXPORT_OK = 'runScript'; 8 | 9 | sub runScript { 10 | my $script_path = shift; 11 | unless (do $script_path) { 12 | warn "Execution of $script_path failed:\n"; 13 | die $@ if $@; 14 | } 15 | } 16 | 17 | 1; 18 | -------------------------------------------------------------------------------- /bin/addadmin: -------------------------------------------------------------------------------- 1 | 2 | $db->addUser($db->newUser(user_id=>"admin", first_name=>"Prof", last_name=>"Admin",email_address=>"", student_id=>"admin", status=>"C",section=>"", recitation=>"",comment=>"administrator")); 3 | 4 | $db->addPassword($db->newPassword(user_id=>"admin", password=>crypt("admin", "dc"))); 5 | 6 | $db->addPermissionLevel($db->newPermissionLevel(user_id=>"admin", permission=>"20")); 7 | 8 | 9 | exit; 10 | 11 | -------------------------------------------------------------------------------- /bin/addprofa: -------------------------------------------------------------------------------- 1 | 2 | $db->addUser($db->newUser(user_id=>"profa", first_name=>"Prof", last_name=>"A",email_address=>"", student_id=>"profa", status=>"C",section=>"", recitation=>"",comment=>"administrator")); 3 | 4 | $db->addPassword($db->newPassword(user_id=>"profa", password=>crypt("profa", "dc"))); 5 | 6 | $db->addPermissionLevel($db->newPermissionLevel(user_id=>"profa", permission=>"10")); 7 | 8 | 9 | exit; 10 | 11 | -------------------------------------------------------------------------------- /bin/check_database_charsets.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | 3 | my $host = $ENV{WEBWORK_DB_HOST}; 4 | my $port = $ENV{WEBWORK_DB_PORT}; 5 | my $database_name = $ENV{WEBWORK_DB_NAME}; 6 | my $database_user = $ENV{WEBWORK_DB_USER}; 7 | my $database_password = $ENV{WEBWORK_DB_PASSWORD}; 8 | 9 | print 10 | `mysql -u $database_user -p$database_password $database_name -h $host -e "SHOW VARIABLES WHERE Variable_name LIKE \'character\_set\_%\' OR Variable_name LIKE \'collation%\' or Variable_name LIKE \'init_connect\' "`; 11 | -------------------------------------------------------------------------------- /bin/convert_fun_in_dir.sh: -------------------------------------------------------------------------------- 1 | find . -name "*.pg" -exec convert-functions.pl {} ';' 2 | -------------------------------------------------------------------------------- /bin/crypt_passwords_in_classlist.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | 3 | use strict; 4 | use warnings; 5 | use feature 'say'; 6 | 7 | use Mojo::File qw(curfile path); 8 | 9 | BEGIN { 10 | use Env qw(WEBWORK_ROOT); 11 | $WEBWORK_ROOT = curfile->dirname->dirname; 12 | } 13 | 14 | use lib "$ENV{WEBWORK_ROOT}/lib"; 15 | 16 | use WeBWorK::Utils qw(cryptPassword); 17 | use WeBWorK::File::Classlist qw(parse_classlist write_classlist); 18 | 19 | unless (@ARGV == 1) { 20 | say 'Usage: crypt_passwords_in_classlist.pl filename'; 21 | exit 0; 22 | } 23 | 24 | my $infile = shift; 25 | my $outfile = "crypted_$infile"; 26 | 27 | if (-e $outfile) { 28 | print qq{The file "$outfile" exists. Do you want to proceed and overwrite "$outfile"? (Y/n) }; 29 | my $input = <>; 30 | chomp $input; 31 | unless ($input eq 'Y') { 32 | say 'Aborting.'; 33 | exit 0; 34 | } 35 | } 36 | 37 | if (-e $infile && -r $infile) { 38 | my @classlist = parse_classlist($infile); 39 | for (@classlist) { 40 | $_->{password} = cryptPassword($_->{password} || $_->{user_id}); 41 | } 42 | write_classlist($outfile, @classlist); 43 | say qq{Output written to the file "$outfile".}; 44 | } else { 45 | say qq{The file "$infile" is does not exist or is not readable.}; 46 | } 47 | -------------------------------------------------------------------------------- /bin/dev_scripts/README.md: -------------------------------------------------------------------------------- 1 | # Development Scripts 2 | 3 | The files in this directory are for development use only. 4 | 5 | If you are system administrator installing WeBWorK, then you should not be using 6 | any of the scripts in this directory. 7 | -------------------------------------------------------------------------------- /bin/dev_scripts/pod-templates/main-index.mt: -------------------------------------------------------------------------------- 1 | 2 | 3 | % 4 | 5 | 6 | 7 | 8 | 9 | 10 | WeBWorK/PG POD 11 | 12 | % 13 | 14 | 19 |
20 |
21 |

(Plain Old Documentation)

22 | 34 |
35 |
36 | 37 | % 38 | 39 | -------------------------------------------------------------------------------- /bin/old_scripts/ww-update-config: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | 3 | use strict; 4 | use warnings; 5 | 6 | my $cvs_header_line = '\$' . 'CVSHeader'; 7 | 8 | foreach my $arg (@ARGV) { 9 | my ($conf_file, $dist_file); 10 | 11 | if ($arg =~ /^(.*)\.dist$/) { 12 | $conf_file = $1; 13 | $dist_file = $arg; 14 | } else { 15 | $conf_file = $arg; 16 | $dist_file = "$arg.dist"; 17 | } 18 | 19 | my $conf_version = cvs_version($conf_file) 20 | or die "couldn't find CVS version in $conf_file\n"; 21 | my $dist_version = cvs_version($dist_file) 22 | or die "couldn't find CVS version in $dist_file\n"; 23 | 24 | if ($conf_version eq $dist_version) { 25 | print "$conf_file is up-to-date at version $conf_version.\n"; 26 | next; 27 | } 28 | 29 | #print "conf_version=$conf_version dist_version=$dist_version\n"; 30 | system "cvs diff -r '$conf_version' -r '$dist_version' '$dist_file'" 31 | . "| patch '$conf_file'"; 32 | } 33 | 34 | sub cvs_version { 35 | my ($file) = @_; 36 | open my $fh, "<", $file or die "couldn't open $file for reading: $!\n"; 37 | my $line; 38 | while (my $line = <$fh>) { 39 | if ($line =~ /$cvs_header_line.*?(1(?:\.\d+)+)/) { 40 | return $1; 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /bin/putadmin: -------------------------------------------------------------------------------- 1 | 2 | $db->putUser($db->newUser(user_id=>"admin", first_name=>"Prof", last_name=>"Admin",email_address=>"", student_id=>"admin", status=>"C",section=>"", recitation=>"",comment=>"administrator")); 3 | 4 | $db->putPassword($db->newPassword(user_id=>"admin", password=>crypt("admin", "dc"))); 5 | 6 | $db->putPermissionLevel($db->newPermissionLevel(user_id=>"admin", permission=>"20")); 7 | 8 | 9 | print "data changed for user admin\n" ; 10 | 11 | -------------------------------------------------------------------------------- /bin/reset2fa: -------------------------------------------------------------------------------- 1 | warn "Pass users as additional arguments on the command line.\n" 2 | . "Usage: wwsh $ce->{courseName} /opt/webwork/webwork2/bin/reset2fa [users]\n" 3 | unless @ARGV; 4 | 5 | for (@ARGV) { 6 | my $password = eval { $db->getPassword($_) }; 7 | if ($@) { 8 | warn "Unable to retrieve password record for $_ from the database: $@\n"; 9 | next; 10 | } 11 | 12 | $password->otp_secret(''); 13 | eval { $db->putPassword($password) }; 14 | if ($@) { 15 | warn "Unable to reset two factor authentication secret for $_: $@\n"; 16 | } else { 17 | print "Successfully reset two factor authentication for $_.\n"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /bin/test_library_build.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | 3 | BEGIN { 4 | use Mojo::File qw(curfile); 5 | use Env qw(WEBWORK_ROOT); 6 | 7 | $WEBWORK_ROOT = curfile->dirname->dirname; 8 | } 9 | 10 | # Get database connection 11 | 12 | use lib "$ENV{WEBWORK_ROOT}/lib"; 13 | use lib "$ENV{WEBWORK_ROOT}/bin"; 14 | 15 | use WeBWorK::CourseEnvironment; 16 | use OPLUtils qw/build_library_directory_tree build_library_subject_tree build_library_textbook_tree/; 17 | use DBI; 18 | 19 | my $ce = WeBWorK::CourseEnvironment->new({ webwork_dir => $ENV{WEBWORK_ROOT} }); 20 | my $dbh = DBI->connect( 21 | $ce->{database_dsn}, 22 | $ce->{database_username}, 23 | $ce->{database_password}, 24 | { 25 | PrintError => 0, 26 | RaiseError => 1, 27 | }, 28 | ); 29 | 30 | # auto flush printing 31 | my $old_fh = select(STDOUT); 32 | $| = 1; 33 | select($old_fh); 34 | 35 | build_library_directory_tree($ce); 36 | build_library_subject_tree($ce, $dbh); 37 | build_library_textbook_tree($ce, $dbh); 38 | 39 | $dbh->disconnect; 40 | -------------------------------------------------------------------------------- /conf/webwork2-job-queue.dist.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=webwork2 job queue 3 | After=network.target 4 | 5 | [Service] 6 | Type=simple 7 | User=www-data 8 | Group=www-data 9 | WorkingDirectory=/opt/webwork/webwork2 10 | ExecStart=/opt/webwork/webwork2/bin/webwork2 minion worker -m production 11 | KillMode=process 12 | 13 | [Install] 14 | WantedBy=multi-user.target 15 | -------------------------------------------------------------------------------- /conf/webwork2.dist.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=webwork2 3 | After=network.target 4 | 5 | [Service] 6 | Type=forking 7 | User=www-data 8 | Group=www-data 9 | RuntimeDirectory=webwork2 10 | WorkingDirectory=/opt/webwork/webwork2 11 | PIDFile=/run/webwork2/webwork2.pid 12 | Environment="MOJO_REVERSE_PROXY=1" 13 | ExecStart=hypnotoad /opt/webwork/webwork2/bin/webwork2 14 | ExecReload=hypnotoad /opt/webwork/webwork2/bin/webwork2 15 | KillMode=process 16 | 17 | [Install] 18 | WantedBy=multi-user.target 19 | -------------------------------------------------------------------------------- /conf/webwork2.nginx.dist.conf: -------------------------------------------------------------------------------- 1 | # Note that if $webwork_url in site.conf is changed, then /webwork2 2 | # should be changed below to match. 3 | location /webwork2/ { 4 | proxy_pass http://127.0.0.1:8080; 5 | proxy_http_version 1.1; 6 | proxy_set_header Upgrade $http_upgrade; 7 | proxy_set_header Connection "upgrade"; 8 | proxy_set_header Host $host; 9 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 10 | proxy_set_header X-Forwarded-Proto $scheme; 11 | } 12 | 13 | # Note that if $webwork_htdocs_url in site.conf is changed, then /webwork2_files 14 | # should be changed below to match. 15 | location /webwork2_files/ { 16 | proxy_pass http://127.0.0.1:8080; 17 | } 18 | 19 | # Note that if $pg_htdocs_url in site.conf is changed, then /pg_files 20 | # should be changed below to match. 21 | location /pg_files/ { 22 | proxy_pass http://127.0.0.1:8080; 23 | } 24 | 25 | # Note that if $webwork_courses_url in site.conf is changed, then /pg_files 26 | # should be changed below to match. 27 | location /webwork2_course_files/ { 28 | proxy_pass http://127.0.0.1:8080; 29 | } 30 | -------------------------------------------------------------------------------- /courses.dist/adminClasslist.lst: -------------------------------------------------------------------------------- 1 | # Field order: student_id,last_name,first_name,status,comment,section,recitation,email_address,user_id,crypted_password,permission 2 | admin,Administrator,,C,,,,,admin,.bxpcera4I/bg,20 3 | -------------------------------------------------------------------------------- /courses.dist/defaultClasslist.lst: -------------------------------------------------------------------------------- 1 | # Field order: student_id,last_name,first_name,status,comment,section,recitation,email_address,user_id,crypted_password,permission 2 | practice1,Practice1,,C,,,,,practice1,,-5 3 | practice2,Practice2,,C,,,,,practice2,,-5 4 | practice3,Practice3,,C,,,,,practice3,,-5 5 | practice4,Practice4,,C,,,,,practice4,,-5 6 | practice5,Practice5,,C,,,,,practice5,,-5 7 | practice6,Practice6,,C,,,,,practice6,,-5 8 | practice7,Practice7,,C,,,,,practice7,,-5 9 | practice8,Practice8,,C,,,,,practice8,,-5 10 | practice9,Practice9,,C,,,,,practice9,,-5 11 | professor,Professor,,C,,,,,professor,dmU8ES4L.64VU,10 12 | -------------------------------------------------------------------------------- /courses.dist/modelCourse/hide_directory: -------------------------------------------------------------------------------- 1 | 2 | Place a file named "hide_directory" in a course or other directory 3 | and it will not show up in the courses list on the WeBWorK home page. 4 | It will still appear in the Course Administration listing. 5 | -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/2nd_order_ode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/2nd_order_ode.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/add_anything.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/add_anything.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/back_for_more.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/back_for_more.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/bug_sqush.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/bug_sqush.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/by_definition.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/by_definition.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/calendar.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/challenge_eight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/challenge_eight.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/challenge_five.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/challenge_five.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/challenge_four.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/challenge_four.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/challenge_nine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/challenge_nine.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/challenge_one.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/challenge_one.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/challenge_seven.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/challenge_seven.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/challenge_six.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/challenge_six.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/challenge_ten.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/challenge_ten.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/challenge_three.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/challenge_three.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/challenge_two.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/challenge_two.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/challenger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/challenger.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/change_of_variables.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/change_of_variables.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/chipping_away.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/chipping_away.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/complete_100_problems.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/complete_100_problems.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/complete_10_problems.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/complete_10_problems.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/complete_150_problems.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/complete_150_problems.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/complete_25_problems.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/complete_25_problems.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/complete_50_problems.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/complete_50_problems.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/complete_all_sets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/complete_all_sets.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/complete_five_sets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/complete_five_sets.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/complete_one_problem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/complete_one_problem.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/complete_one_set.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/complete_one_set.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/complete_ten_sets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/complete_ten_sets.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/complete_thirty_sets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/complete_thirty_sets.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/complete_twenty_sets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/complete_twenty_sets.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/crack_o_dawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/crack_o_dawn.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/curvature.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/curvature.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/curvy_geometry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/curvy_geometry.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/defaulticon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/defaulticon.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/derivative_master.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/derivative_master.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/doing_it_backwards.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/doing_it_backwards.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/double_integral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/double_integral.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/early_bird.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/early_bird.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/earn_10_achievements.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/earn_10_achievements.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/earn_20_achievements.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/earn_20_achievements.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/earn_30_achievements.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/earn_30_achievements.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/earn_40_achievements.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/earn_40_achievements.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/earn_50_achievements.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/earn_50_achievements.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/eigenvector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/eigenvector.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/first_order_ode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/first_order_ode.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/heart_area.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/heart_area.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/hows_your_finger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/hows_your_finger.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/integral_master.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/integral_master.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/its_all_relative.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/its_all_relative.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/la_revolucion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/la_revolucion.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/lagrange_multipliers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/lagrange_multipliers.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/laplace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/laplace.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/last_minute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/last_minute.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/level_eight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/level_eight.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/level_five.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/level_five.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/level_four.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/level_four.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/level_nine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/level_nine.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/level_one.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/level_one.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/level_seven.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/level_seven.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/level_six.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/level_six.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/level_ten.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/level_ten.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/level_three.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/level_three.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/level_two.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/level_two.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/line_integrals.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/line_integrals.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/lines_and_planes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/lines_and_planes.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/many_fractions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/many_fractions.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/night_owl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/night_owl.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/ode_systems.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/ode_systems.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/on_fire.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/on_fire.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/on_one_hand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/on_one_hand.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/on_the_hour.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/on_the_hour.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/one_click.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/one_click.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/optimizer_prime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/optimizer_prime.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/partial_derivatives.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/partial_derivatives.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/pattern_recognition.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/pattern_recognition.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/persistance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/persistance.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/put_me_in_coach.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/put_me_in_coach.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/reaching_a_limit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/reaching_a_limit.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/really_early_bird.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/really_early_bird.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/revolucion_redux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/revolucion_redux.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/roman_numeral_I.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/roman_numeral_I.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/roman_numeral_II.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/roman_numeral_II.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/seeing_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/seeing_green.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/speed_mather.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/speed_mather.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/step_by_step_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/step_by_step_1.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/step_by_step_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/step_by_step_10.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/step_by_step_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/step_by_step_20.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/step_by_step_30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/step_by_step_30.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/step_by_step_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/step_by_step_5.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/still_not_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/still_not_right.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/super_persistance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/super_persistance.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/super_speed_math.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/super_speed_math.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/tangent_plane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/tangent_plane.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/taylor_hero.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/taylor_hero.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/tea_time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/tea_time.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/the_biologist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/the_biologist.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/the_fundamentals.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/the_fundamentals.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/the_lhopital.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/the_lhopital.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/third_time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/third_time.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/three_in_a_row.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/three_in_a_row.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/to_infinity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/to_infinity.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/trig_ninja.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/trig_ninja.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/triple_integral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/triple_integral.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/html/achievements/vector_fields.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/html/achievements/vector_fields.png -------------------------------------------------------------------------------- /courses.dist/modelCourse/templates/Contrib: -------------------------------------------------------------------------------- 1 | ../../../libraries/webwork-open-problem-library/Contrib -------------------------------------------------------------------------------- /courses.dist/modelCourse/templates/Library: -------------------------------------------------------------------------------- 1 | ../../../libraries/webwork-open-problem-library/OpenProblemLibrary -------------------------------------------------------------------------------- /courses.dist/modelCourse/templates/Student_Orientation: -------------------------------------------------------------------------------- 1 | ../../../webwork2/assets/pg/Student_Orientation -------------------------------------------------------------------------------- /courses.dist/modelCourse/templates/achievements/extensions.at: -------------------------------------------------------------------------------- 1 | # This achievement executes unconditionally, and awards the user a certain number 2 | # of ExtendDueDate, SuperExtendDueDate, and ResurrectHW reward items. How many of 3 | # each is specified below. 4 | 5 | $globalData->{ExtendDueDate} += 10; 6 | $globalData->{SuperExtendDueDate} += 5; 7 | $globalData->{ResurrectHW} += 3; 8 | return 1; 9 | 10 | -------------------------------------------------------------------------------- /courses.dist/modelCourse/templates/achievements/extensions.axp: -------------------------------------------------------------------------------- 1 | extensions,Extensions,10001,one_time,default,"Award homework set extensions",0,,extensions.at,Fractal-Cornucopia.svg 2 | -------------------------------------------------------------------------------- /courses.dist/modelCourse/templates/achievements/notifications/default.html.ep: -------------------------------------------------------------------------------- 1 | <%= $user->first_name %>, 2 | 3 | Congratulations, you just earned the "<%= $achievement->{name} %>" achievement! 4 | 5 | <%= $achievement->{description} %> 6 | 7 | % if ($nextLevelPoints) { 8 | You have <%= $nextLevelPoints - $pointsEarned %> points remaining until your next level-up. 9 | 10 | % } 11 | Great job! 12 | --Prof. X 13 | -------------------------------------------------------------------------------- /courses.dist/modelCourse/templates/achievements/preamble.at: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/courses.dist/modelCourse/templates/achievements/preamble.at -------------------------------------------------------------------------------- /courses.dist/modelCourse/templates/achievements/surprise_message.txt: -------------------------------------------------------------------------------- 1 | The message for the Mysterious Package (with Ribbons) item goes in the file templates/achievements/surprise_message.txt.
2 | 3 | If you are a student seeing this message you should let your instructor know about it. -------------------------------------------------------------------------------- /courses.dist/modelCourse/templates/capaLibrary: -------------------------------------------------------------------------------- 1 | ../../../libraries/webwork-open-problem-library/Contrib/CAPA -------------------------------------------------------------------------------- /courses.dist/modelCourse/templates/course_info.txt: -------------------------------------------------------------------------------- 1 | Put information about your course here. Click the edit button above to add your own message. 2 | -------------------------------------------------------------------------------- /courses.dist/modelCourse/templates/demoCourse.lst: -------------------------------------------------------------------------------- 1 | practice1 ,PRACTICE1 ,JANE ,C, , , , ,practice1, ,-5 2 | practice2 ,PRACTICE2 ,JANE ,C, , , , ,practice2, ,-5 3 | practice3 ,PRACTICE3 ,JANE ,C, , , , ,practice3, ,-5 4 | practice4 ,PRACTICE4 ,JANE ,C, , , , ,practice4, ,-5 5 | practice5 ,PRACTICE5 ,JANE ,C, , , , ,practice5, ,-5 6 | practice6 ,PRACTICE6 ,JANE ,C, , , , ,practice6, ,-5 7 | practice7 ,PRACTICE7 ,JANE ,C, , , , ,practice7, ,-5 8 | practice8 ,PRACTICE8 ,JANE ,C, , , , ,practice8, ,-5 9 | practice9 ,PRACTICE9 ,JANE ,C, , , , ,practice9, ,-5 10 | -------------------------------------------------------------------------------- /courses.dist/modelCourse/templates/email/welcome.msg: -------------------------------------------------------------------------------- 1 | ## template for a Welcome message to be emailed to class (delete this line) 2 | ## Note that the From: address will be replaced by the email address of the account 3 | ## from which the message is sent. 4 | From: teacher@somewhere.edu (Jan Teacher) 5 | Subject: online homework for Math 123 6 | Message: 7 | Hi $FN, 8 | 9 | Our WeBWorK course is at: 10 | https://somewhere.edu/webwork2/JT_123 11 | 12 | Your username/password is: 13 | $LOGIN/$SID 14 | 15 | You should change your password once you have logged in by visiting 16 | Account Settings in the sidebar navigation. 17 | 18 | Have fun, 19 | Jan 20 | 21 | -------------------------------------------------------------------------------- /courses.dist/modelCourse/templates/setDemo/c4s5p2.pg: -------------------------------------------------------------------------------- 1 | #DESCRIPTION 2 | #KEYOWRDS('integrals', 'substitution') 3 | # Integrals - \int_0^{$x1} x(x^2 ?{$a})^5 dx 4 | # Substitution 5 | #ENDDESCRIPTION 6 | 7 | DOCUMENT(); # This should be the first executable line in the problem. 8 | 9 | loadMacros("PGbasicmacros.pl", 10 | "PGchoicemacros.pl", 11 | "PGanswermacros.pl", 12 | "PGauxiliaryFunctions.pl" 13 | ); 14 | 15 | $showPartialCorrectAnswers = 1; 16 | 17 | $n = random(3,6,1); 18 | $n1 = $n-1; 19 | 20 | BEGIN_TEXT 21 | Find \[ F(x) = \int x^{$n1}\cos(x^{$n}) \; dx \] 22 | Give a specific function for \( F(x) \). $BR $BR 23 | 24 | F(x) = \{ans_rule(45)\} 25 | END_TEXT 26 | 27 | $ans = "sin(x^$n)/$n"; 28 | ANS(function_cmp_up_to_constant($ans )); 29 | 30 | #$ans = "sin(x^$n)/$n + c"; # c is the constant of integration which 31 | # is a free parameter. It can be adjusted 32 | # to match the student's answer. 33 | #ANS( fun_cmp($ans, params => ['c'] ) ); 34 | $a1= random(-9,-1,1); 35 | $b1= random(0,9,1); 36 | 37 | BEGIN_TEXT 38 | $BR $BR 39 | Evaluate \[ F(x) = \int_{$a1}^{$b1} x^{$n1}\cos(x^{$n}) \; dx \] 40 | $BR 41 | \{ans_rule(50)\} 42 | END_TEXT 43 | 44 | $ans = (sin($b1**$n) - sin($a1**$n))/$n; 45 | 46 | &ANS(num_cmp($ans )); 47 | 48 | 49 | ENDDOCUMENT(); # This should be the last executable line in the problem. 50 | -------------------------------------------------------------------------------- /courses.dist/modelCourse/templates/setDemo/paperHeaderFile1.pg: -------------------------------------------------------------------------------- 1 | ##Problem set header for set 0, Spring 1999 2 | 3 | &DOCUMENT; 4 | 5 | loadMacros( 6 | "PG.pl", 7 | "PGbasicmacros.pl", 8 | "PGchoicemacros.pl", 9 | "PGanswermacros.pl" 10 | ); 11 | 12 | TEXT(EV2(< 'm')); 38 | ENDDOCUMENT() 39 | -------------------------------------------------------------------------------- /doc/devel/dont-forget: -------------------------------------------------------------------------------- 1 | Barbara from UNH had some ideas: 2 | - " [x] destroy existing versions " on build problem sets page. 3 | - others? 4 | 5 | Dan from UNH wants to be able to "name" math expressions so that images can be made conditional (i.e. if( blah ) { TEXT(\[ ... \]) } else { TEXT(\[ ... ]\) } (see email) 6 | 7 | Image generation alternatives: 8 | - math2img, with some generalization 9 | - math2img, as a function in dangerousMacros 10 | - something out of http://preview-latex.sourceforge.net/ 11 | - TeXd -- http://www.activetex.org/ 12 | 13 | 14 | 15 | 16 | defaults.config: 17 | - the "root" of the modperl handler should be sent in from outside 18 | - right now, it's in $webworkURLs{root} 19 | 20 | fun Apache::* modules: 21 | Apache::PerlVINC 22 | Apache::SubProcess - output of subprocesses goes to client 23 | 24 | also: http://perl.apache.org/docs/general/perl_reference/perl_reference.html#Exception_Handling_for_mod_perl 25 | -------------------------------------------------------------------------------- /doc/devel/hardcopy-notes: -------------------------------------------------------------------------------- 1 | students should be able to: 2 | - generate hardcopy for a single problem set for themselves 3 | professors should be able to: 4 | - generate hardcopy of a single problem set for any user 5 | - generate hardcopy of multiple problem sets for any user 6 | - generate hardcopy of a single problem set for multiple users 7 | 8 | inputs: 9 | 10 | $singleSet (from PATH_INFO) - added to @sets list 11 | @sets - lists sets to generate 12 | @users - lists users to generate for 13 | $generateHardcopy - true if "Generate Hardcopy" button has been clicked 14 | 15 | hardcopy generated is (sets x users), if permissions permit 16 | 17 | subroutines: 18 | &generateHardcopy 19 | - compiles tex, translates, converts to pdf 20 | - throws exceptions on PG errors, returns PG warnings 21 | &displayForm 22 | - displays options form 23 | -------------------------------------------------------------------------------- /doc/devel/template-escapes: -------------------------------------------------------------------------------- 1 | head 2 | path 3 | style = text|image 4 | image = URL of image 5 | text = text separator 6 | links 7 | siblings 8 | nav 9 | style = text|image 10 | imageprefix = prefix to image URL 11 | imagesuffix = suffix to image URL 12 | separator = HTML to place in between links 13 | title 14 | body 15 | -------------------------------------------------------------------------------- /doc/devel/unified-prof-page-form-notes: -------------------------------------------------------------------------------- 1 | { 2 | field_name => { 3 | type => /number|text|date|password|enumerable/, 4 | size => /\d*/, 5 | specificity => /global|user/, 6 | access => /readonly|writeonly|readwrite/, 7 | items => { # Only for enumerable 8 | value => "label", 9 | value => "label", 10 | } 11 | synonyms => { 12 | qr/pattern/ => "value", 13 | qr/pattern/ => "value", 14 | "*" => "value", 15 | } 16 | } 17 | } 18 | 19 | type number, text, longtext, date 20 | label 21 | value 22 | specificity global user 23 | Indicates whether it is a global setting that is overridden for a user, 24 | or a user-only setting that is only overwritten for multiUser editing. 25 | synonyms 26 | Regex-s indicating other values that could mean the same thing as the 27 | keys in the "items" hash. This is for backwards compatibility with the 28 | days when even multi-choice fields were given freeform frontends. 29 | the special value "*" (an illegal regular expression) points to a value 30 | that should be substituted for unrecognized values. The order that the 31 | values are checked against the regular expressions is unspecified, and 32 | probably won't be the order they are given in the source code. 33 | -------------------------------------------------------------------------------- /doc/parser/problems/sample06.pg: -------------------------------------------------------------------------------- 1 | ########################################################### 2 | # 3 | # Example showing how to use the Parser to make 4 | # a formula that you can evaluate and print in TeX form. 5 | # 6 | 7 | DOCUMENT(); # This should be the first executable line in the problem. 8 | 9 | loadMacros( 10 | "PGbasicmacros.pl", 11 | "PGanswermacros.pl", 12 | "Parser.pl", 13 | ); 14 | 15 | ########################################################### 16 | # 17 | # The setup 18 | # 19 | Context('Vector'); 20 | 21 | # 22 | # Define a vector 23 | # 24 | $a = non_zero_random(-8,8,1); 25 | $b = non_zero_random(-8,8,1); 26 | $c = non_zero_random(-8,8,1); 27 | 28 | $V = $a*i + $b*j + $c*k; # equivalently: $V = Vector($a,$b,$c); 29 | 30 | ########################################################### 31 | # 32 | # The problem text 33 | # 34 | 35 | Context()->texStrings; 36 | BEGIN_TEXT 37 | 38 | The length of the vector \($V\) is \{ans_rule(20)\}. 39 | 40 | END_TEXT 41 | Context()->normalStrings; 42 | 43 | ########################################################### 44 | # 45 | # The answer 46 | # 47 | 48 | ANS(num_cmp(norm($V)->value)); # easier: ANS($V->cmp) 49 | $showPartialCorrectAnswers = 1; 50 | 51 | ########################################################### 52 | 53 | ENDDOCUMENT(); # This should be the last executable line in the problem. 54 | -------------------------------------------------------------------------------- /doc/parser/problems/sample07.pg: -------------------------------------------------------------------------------- 1 | ########################################################## 2 | # 3 | # Example showing how to use the built-in answer checker for parsed values. 4 | # 5 | 6 | DOCUMENT(); # This should be the first executable line in the problem. 7 | 8 | loadMacros( 9 | "PGbasicmacros.pl", 10 | "PGanswermacros.pl", 11 | "Parser.pl", 12 | ); 13 | 14 | ########################################################## 15 | # 16 | # The setup 17 | # 18 | 19 | Context('Numeric'); 20 | 21 | $a = Real(random(2,6,1)); 22 | $b = Real(random($a+1,$a+8,1)); 23 | 24 | $c = sqrt($a**2 + $b**2); # still a Real object 25 | 26 | ########################################################## 27 | # 28 | # The problem text 29 | # 30 | 31 | Context()->texStrings; 32 | BEGIN_TEXT 33 | 34 | Suppose the legs of a triangle are of length \($a\) and \($b\).$BR 35 | Then the hypoteneuse is of length \{ans_rule(20)\}. 36 | 37 | END_TEXT 38 | Context()->normalStrings(); 39 | 40 | ########################################################### 41 | # 42 | # The answer 43 | # 44 | 45 | ANS($c->cmp); 46 | 47 | ########################################################### 48 | 49 | ENDDOCUMENT(); # This should be the last executable line in the problem. 50 | -------------------------------------------------------------------------------- /doc/parser/problems/sample08.pg: -------------------------------------------------------------------------------- 1 | ########################################################## 2 | # 3 | # Example showing how to use the built-in answer checker for parsed values. 4 | # 5 | 6 | DOCUMENT(); # This should be the first executable line in the problem. 7 | 8 | loadMacros( 9 | "PGbasicmacros.pl", 10 | "PGanswermacros.pl", 11 | "Parser.pl", 12 | ); 13 | 14 | ########################################################## 15 | # 16 | # The setup 17 | # 18 | 19 | Context('Complex'); 20 | 21 | $z = random(-5,5,1) + non_zero_random(-5,5,1)*i; 22 | 23 | $f = Formula('z^2 + 2z - 1'); 24 | $fz = $f->eval(z => $z); 25 | 26 | ########################################################## 27 | # 28 | # The problem text 29 | # 30 | 31 | Context()->texStrings; 32 | BEGIN_TEXT 33 | 34 | Suppose \(f(z) = $f\).$BR 35 | Then \(f($z)\) = \{ans_rule(20)\}. 36 | 37 | END_TEXT 38 | Context()->normalStrings; 39 | 40 | ########################################################### 41 | # 42 | # The answer 43 | # 44 | 45 | ANS($fz->cmp); 46 | 47 | ########################################################### 48 | 49 | ENDDOCUMENT(); # This should be the last executable line in the problem. 50 | -------------------------------------------------------------------------------- /doc/parser/problems/sample09.pg: -------------------------------------------------------------------------------- 1 | ########################################################## 2 | # 3 | # Example showing how to use the built-in answer checker for parsed values. 4 | # 5 | 6 | DOCUMENT(); # This should be the first executable line in the problem. 7 | 8 | loadMacros( 9 | "PGbasicmacros.pl", 10 | "PGanswermacros.pl", 11 | "Parser.pl", 12 | ); 13 | 14 | ########################################################## 15 | # 16 | # The setup 17 | # 18 | 19 | Context('Vector'); 20 | 21 | $P1 = Point(-2,4,2); 22 | $P2 = Point(2,-3,1); 23 | 24 | $M = ($P1+$P2)/2; 25 | 26 | ########################################################## 27 | # 28 | # The problem text 29 | # 30 | 31 | Context()->texStrings; 32 | BEGIN_TEXT 33 | 34 | The midpoint of the line segment from \($P1\) to \($P2\) 35 | is \{ans_rule(20)\}. 36 | 37 | END_TEXT 38 | Context()->normalStrings; 39 | 40 | ########################################################### 41 | # 42 | # The answer 43 | # 44 | 45 | ANS($M->cmp); 46 | 47 | ########################################################### 48 | 49 | ENDDOCUMENT(); # This should be the last executable line in the problem. 50 | -------------------------------------------------------------------------------- /doc/parser/problems/sample11.pg: -------------------------------------------------------------------------------- 1 | ########################################################## 2 | # 3 | # Example showing how to use the built-in answer checker for parsed values. 4 | # 5 | 6 | DOCUMENT(); # This should be the first executable line in the problem. 7 | 8 | loadMacros( 9 | "PGbasicmacros.pl", 10 | "PGanswermacros.pl", 11 | "Parser.pl", 12 | ); 13 | 14 | ########################################################## 15 | # 16 | # The setup 17 | # 18 | 19 | Context('Interval'); 20 | 21 | $p1 = random(-5,2,1); 22 | $p2 = random($p1+1,$p1+7,1); 23 | 24 | $f = Formula("x^2 - ($p1+$p2) x + $p1*$p2")->reduce; 25 | $I = Interval("($p1,$p2)"); 26 | 27 | ########################################################## 28 | # 29 | # The problem text 30 | # 31 | 32 | Context()->texStrings; 33 | BEGIN_TEXT 34 | The function \(f(x) = $f\) is negative for values of \(x\) in the interval 35 | \{ans_rule(20)\}. 36 | END_TEXT 37 | Context()->normalStrings; 38 | 39 | ########################################################### 40 | # 41 | # The answer 42 | # 43 | 44 | ANS($I->cmp); 45 | 46 | ########################################################### 47 | 48 | ENDDOCUMENT(); # This should be the last executable line in the problem. 49 | -------------------------------------------------------------------------------- /doc/parser/problems/sample14.pg: -------------------------------------------------------------------------------- 1 | ########################################################## 2 | # 3 | # Example showing how to use the built-in answer checker for parsed values. 4 | # 5 | 6 | DOCUMENT(); # This should be the first executable line in the problem. 7 | 8 | loadMacros( 9 | "PGbasicmacros.pl", 10 | "PGanswermacros.pl", 11 | "Parser.pl", 12 | "parserUtils.pl", 13 | ); 14 | 15 | ########################################################## 16 | # 17 | # The setup 18 | # 19 | 20 | Context("Numeric"); 21 | 22 | $a = random(1,5,1); 23 | $f = Formula("(x^2+1)/(x^2-$a^2)")->reduce; 24 | 25 | ########################################################## 26 | # 27 | # The problem text 28 | # 29 | 30 | Context()->texStrings; 31 | BEGIN_TEXT 32 | 33 | Suppose \(\displaystyle f(x) = $f\). 34 | $PAR 35 | Then \(f\) is defined for all \(x\) except for \{ans_rule(30)\}. 36 | $PAR 37 | ${BCENTER} 38 | ${BSMALL} 39 | To enter more than one value, separate them by commas.$BR 40 | Enter ${LQ}${BTT}NONE${ETT}${RQ} if there are no such values. 41 | ${ESMALL} 42 | ${ECENTER} 43 | 44 | END_TEXT 45 | Context()->normalStrings; 46 | 47 | ########################################################### 48 | # 49 | # The answer 50 | # 51 | 52 | ANS(List($a,-$a)->cmp); 53 | $showPartialCorrectAnswers = 1; 54 | 55 | ########################################################### 56 | 57 | ENDDOCUMENT(); # This should be the last executable line in the problem. 58 | -------------------------------------------------------------------------------- /doc/parser/problems/sample15.pg: -------------------------------------------------------------------------------- 1 | ########################################################## 2 | # 3 | # Example showing how to use the built-in answer checker for parsed values. 4 | # 5 | 6 | DOCUMENT(); # This should be the first executable line in the problem. 7 | 8 | loadMacros( 9 | "PGbasicmacros.pl", 10 | "PGanswermacros.pl", 11 | "Parser.pl", 12 | "parserUtils.pl", 13 | ); 14 | 15 | ########################################################## 16 | # 17 | # The setup 18 | # 19 | 20 | Context("Numeric"); 21 | 22 | $a = random(1,5,1); 23 | $f = Formula("(x^2-$a)/(x^2+$a)"); 24 | 25 | ########################################################## 26 | # 27 | # The problem text 28 | # 29 | 30 | Context()->texStrings; 31 | BEGIN_TEXT 32 | 33 | Suppose \(\displaystyle f(x) = $f\). 34 | $PAR 35 | Then \(f\) is defined for all \(x\) except for \{ans_rule(30)\}. 36 | $PAR 37 | ${BCENTER} 38 | ${BSMALL} 39 | To enter more than one value, separate them by commas.$BR 40 | Enter ${LQ}${BTT}NONE${ETT}${RQ} if there are no such values. 41 | ${ESMALL} 42 | ${ECENTER} 43 | 44 | END_TEXT 45 | Context()->normalStrings; 46 | 47 | ########################################################### 48 | # 49 | # The answer 50 | # 51 | 52 | ANS(List("NONE")->cmp); 53 | $showPartialCorrectAnswers = 1; 54 | 55 | ########################################################### 56 | 57 | ENDDOCUMENT(); # This should be the last executable line in the problem. 58 | -------------------------------------------------------------------------------- /docker-config/env.dist: -------------------------------------------------------------------------------- 1 | COURSES_DIRECTORY_ON_HOST=../ww-docker-data/courses 2 | WEBWORK2_HTTP_PORT_ON_HOST=8080 3 | WEBWORK_DB_USER=webworkWrite 4 | WEBWORK_DB_PASSWORD=passwordRWsetItBeforeFirstStartingTheDBcontainer 5 | WEBWORK_MYSQL_ROOT_PASSWORD=sqlRootPasswordSetThisPasswordBEFOREfirstStartingTheDBcontainer 6 | -------------------------------------------------------------------------------- /docker-config/imagemagick-allow-pdf-read.patch: -------------------------------------------------------------------------------- 1 | --- a/etc/ImageMagick-6/policy.xml 2020-11-22 14:46:53.591198189 -0600 2 | +++ b/etc/ImageMagick-6/policy.xml 2021-03-22 10:35:12.821990590 -0500 3 | @@ -91,6 +91,6 @@ 4 | 5 | 6 | 7 | - 8 | + 9 | 10 | 11 | -------------------------------------------------------------------------------- /docker-config/pgfsys-dvisvmg-bbox-fix.patch: -------------------------------------------------------------------------------- 1 | --- a/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-dvisvgm.def 2024-02-22 13:30:26.167777811 -0600 2 | +++ b/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-dvisvgm.def 2024-02-22 13:36:29.820956330 -0600 3 | @@ -127,7 +127,15 @@ 4 | \dp#1=0pt% 5 | \leavevmode% 6 | \pgf@xa=\pgf@trimleft@final\relax \ifdim\pgf@xa=0pt \else\kern\pgf@xa\fi% 7 | - \raise-\pgf@ya\hbox{\ifpgf@sys@svg@inpicture\else\special{dvisvgm:bbox \pgf@sys@tonumber\pgf@picmaxx\space\pgf@sys@tonumber\pgf@picmaxy}\fi\box#1}% 8 | + \raise-\pgf@ya\hbox{% 9 | + \ifpgf@sys@svg@inpicture 10 | + \box#1% 11 | + \else 12 | + \special{dvisvgm:bbox \pgf@sys@tonumber\pgf@picmaxx\space\pgf@sys@tonumber\pgf@picmaxy}% 13 | + \special{dvisvgm:bbox lock}% 14 | + \box#1% 15 | + \special{dvisvgm:bbox unlock}% 16 | + \fi}% 17 | \pgf@xa=\pgf@trimright@final\relax \ifdim\pgf@xa=0pt \else\kern\pgf@xa\fi% 18 | } 19 | 20 | -------------------------------------------------------------------------------- /docker-config/ssl/Readme: -------------------------------------------------------------------------------- 1 | Place your ssl certificate and key files here. 2 | -------------------------------------------------------------------------------- /htdocs/CAPA_Graphics: -------------------------------------------------------------------------------- 1 | ../../libraries/webwork-open-problem-library/Contrib/CAPA/CAPA_Graphics -------------------------------------------------------------------------------- /htdocs/DATA/README: -------------------------------------------------------------------------------- 1 | This directory is used for data files that need to be web accessible. 2 | -------------------------------------------------------------------------------- /htdocs/crossdomain.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /htdocs/css/rtl.css: -------------------------------------------------------------------------------- 1 | /* WeBWorK Online Homework Delivery System 2 | * Copyright © 2000-2024 The WeBWorK Project, https://github.com/openwebwork 3 | * 4 | * This program is free software; you can redistribute it and/or modify it under 5 | * the terms of either: (a) the GNU General Public License as published by the 6 | * Free Software Foundation; either version 2, or (at your option) any later 7 | * version, or (b) the "Artistic License" which comes with this package. 8 | * 9 | * This program is distributed in the hope that it will be useful, but WITHOUT 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 11 | * FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 12 | * Artistic License for more details. 13 | */ 14 | 15 | /* --- Modify some CSS for Right to left courses/problems --- */ 16 | 17 | /* The changes which were needed here in WeBWorK 2.16 are no 18 | * longer needed in WeBWorK 2.17. The file is being retained 19 | * for potential future use. */ 20 | -------------------------------------------------------------------------------- /htdocs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/htdocs/favicon.ico -------------------------------------------------------------------------------- /htdocs/images/defaulticon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/htdocs/images/defaulticon.png -------------------------------------------------------------------------------- /htdocs/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/htdocs/images/favicon.ico -------------------------------------------------------------------------------- /htdocs/images/webwork_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/htdocs/images/webwork_logo.png -------------------------------------------------------------------------------- /htdocs/index.dist.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | WeBWorK Placeholder Page 5 | 6 | 7 |

WeBWorK Placeholder Page

8 |

Exploring?

9 |

This is the default page for the root url of this site.

10 |

11 | If you want to see something better here, then copy webwork2/htdocs/index.dist.html (this file) to 12 | webwork/htdocs/index.html, and modify it to show what you want to show. Then that file will be displayed 13 | instead. 14 |

15 |

16 | Alternately, you may set the server_root_url_redirect config parameter in conf/webwork2.mojolicious.yml to 17 | have the server root url redirect to another site. 18 |

19 | 20 | 21 | -------------------------------------------------------------------------------- /htdocs/js/AchievementItems/achievementitems.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | for (const setSelect of document.querySelectorAll('select[data-problems]')) { 3 | setSelect.addEventListener('change', () => { 4 | const problemIds = JSON.parse( 5 | Array.from(setSelect.querySelectorAll('option')).find((option) => option.value === setSelect.value) 6 | ?.dataset.problemIds ?? '[]' 7 | ); 8 | 9 | const problemSelect = document.getElementById(setSelect.dataset.problems); 10 | if (problemSelect) { 11 | for (const option of problemSelect.querySelectorAll('option')) option.remove(); 12 | for (const id of problemIds) { 13 | const option = document.createElement('option'); 14 | option.value = id; 15 | option.text = id; 16 | problemSelect.add(option); 17 | } 18 | } 19 | 20 | // This is only used by the "Box of Transmogrification". 21 | const problemSelect2 = document.getElementById(setSelect.dataset.problems2); 22 | if (problemSelect2) { 23 | for (const option of problemSelect2.querySelectorAll('option')) option.remove(); 24 | for (const id of problemIds) { 25 | const option = document.createElement('option'); 26 | option.value = id; 27 | option.text = id; 28 | problemSelect2.add(option); 29 | } 30 | } 31 | }); 32 | } 33 | })(); 34 | -------------------------------------------------------------------------------- /htdocs/js/Config/config.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | const configForm = document.getElementById('config-form'); 3 | if (!configForm) return; 4 | 5 | const elementInitialValues = []; 6 | for (const element of configForm.elements) { 7 | if (element.name === 'current_tab') continue; 8 | elementInitialValues.push([element, element.type === 'checkbox' ? element.checked : element.value]); 9 | } 10 | 11 | window.onbeforeunload = () => { 12 | for (const [element, initialValue] of elementInitialValues) { 13 | if ( 14 | (element.type === 'checkbox' && element.checked !== initialValue) || 15 | (element.type !== 'checkbox' && element.value !== initialValue) 16 | ) 17 | return true; 18 | } 19 | }; 20 | 21 | configForm.addEventListener('submit', () => (window.onbeforeunload = null)); 22 | 23 | if (configForm.current_tab) { 24 | document.querySelectorAll('.tab-link').forEach((tabLink) => { 25 | tabLink.addEventListener('show.bs.tab', () => (configForm.current_tab.value = tabLink.dataset.tab)); 26 | }); 27 | } 28 | })(); 29 | -------------------------------------------------------------------------------- /htdocs/js/JobManager/jobmanager.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // Show/hide the filter elements depending on if the field matching option is selected. 3 | const filter_select = document.getElementById('filter_select'); 4 | const filter_elements = document.getElementById('filter_elements'); 5 | if (filter_select && filter_elements) { 6 | const toggle_filter_elements = () => { 7 | if (filter_select.value === 'match_regex') filter_elements.style.display = 'block'; 8 | else filter_elements.style.display = 'none'; 9 | }; 10 | filter_select.addEventListener('change', toggle_filter_elements); 11 | toggle_filter_elements(); 12 | } 13 | })(); 14 | -------------------------------------------------------------------------------- /htdocs/js/LTIUpdate/ltiupdate.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // Store select options in dictionary to rebuild the user/set menus from. 3 | const userOptions = {}; 4 | const setOptions = {}; 5 | const userMenu = document.getElementById('updateUserID'); 6 | const setMenu = document.getElementById('updateSetID'); 7 | for (let i = 1; i < userMenu.length; i++) { 8 | userOptions[userMenu[i].value] = userMenu[i]; 9 | } 10 | for (let i = 1; i < setMenu.length; i++) { 11 | setOptions[setMenu[i].value] = setMenu[i]; 12 | } 13 | 14 | // Update user and set drop down menus to only include valid user/set combinations. 15 | document.getElementById('updateUserID')?.addEventListener('change', (e) => { 16 | const setList = e.target.options[e.target.selectedIndex].dataset.sets.split(':'); 17 | const selectedSet = setMenu.value; 18 | while (setMenu.length > 1) setMenu.lastChild.remove(); 19 | setList.forEach((set) => { 20 | setMenu.append(setOptions[set]); 21 | }); 22 | setMenu.value = selectedSet; 23 | }); 24 | document.getElementById('updateSetID')?.addEventListener('change', (e) => { 25 | const userList = e.target.options[e.target.selectedIndex].dataset.users.split(':'); 26 | const selectedUser = userMenu.value; 27 | while (userMenu.length > 1) userMenu.lastChild.remove(); 28 | userList.forEach((user) => { 29 | userMenu.append(userOptions[user]); 30 | }); 31 | userMenu.value = selectedUser; 32 | }); 33 | })(); 34 | -------------------------------------------------------------------------------- /htdocs/js/PODViewer/podviewer.css: -------------------------------------------------------------------------------- 1 | .main-index-header, 2 | .pod-header { 3 | height: 65px; 4 | top: 0; 5 | left: 0; 6 | right: 0; 7 | z-index: 2; 8 | } 9 | 10 | #sidebar { 11 | --bs-offcanvas-width: 300px; 12 | overflow-y: auto; 13 | } 14 | 15 | #sidebar ul.nav ul.nav li { 16 | border-left: 1px solid #e1e4e8; 17 | padding-left: 10px; 18 | } 19 | 20 | #sidebar ul.nav ul.nav li:hover { 21 | border-left: 6px solid #e1e4e8; 22 | padding-left: 5px; 23 | } 24 | 25 | .main-index-container, 26 | .pod-page-container { 27 | margin-top: 65px; 28 | } 29 | 30 | @media only screen and (min-width: 768px) { 31 | #sidebar { 32 | height: calc(100vh - 65px); 33 | width: 300px; 34 | } 35 | 36 | .pod-page-container { 37 | margin-left: 300px; 38 | } 39 | } 40 | 41 | #_podtop_ pre { 42 | border: 1px solid #ccc; 43 | border-radius: 5px; 44 | background: #f6f6f6; 45 | padding: 0.75rem; 46 | } 47 | 48 | #_podtop_, 49 | #_podtop_ *[id] { 50 | scroll-margin-top: calc(65px + 1rem); 51 | } 52 | 53 | @media only screen and (max-width: 768px) { 54 | .pod-header { 55 | height: 100px; 56 | } 57 | 58 | .pod-page-container { 59 | margin-top: 100px; 60 | } 61 | 62 | #_podtop_, 63 | #_podtop_ *[id] { 64 | scroll-margin-top: calc(100px + 1rem); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /htdocs/js/PODViewer/podviewer.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | const offcanvas = bootstrap.Offcanvas.getOrCreateInstance(document.getElementById('sidebar')); 3 | for (const link of document.querySelectorAll('#sidebar .nav-link')) { 4 | // The timeout is to workaround an issue in Chrome. If the offcanvas hides before the window scrolls to the 5 | // fragment in the page, scrolling stops before it gets there. 6 | link.addEventListener('click', () => setTimeout(() => offcanvas.hide(), 500)); 7 | } 8 | })(); 9 | -------------------------------------------------------------------------------- /htdocs/js/Problem/problem.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // Cause achievement popups to appear and then go away 3 | document.querySelectorAll('.cheevo-toast').forEach((toast) => { 4 | const bsToast = new bootstrap.Toast(toast, { delay: 5000 }); 5 | bsToast.show(); 6 | }); 7 | 8 | // Prevent problems which are disabled from acting as links 9 | $('.problem-list .disabled-problem') 10 | .addClass('disabled') 11 | .on('click', (e) => e.preventDefault()); 12 | })(); 13 | -------------------------------------------------------------------------------- /htdocs/js/README_js_organization: -------------------------------------------------------------------------------- 1 | This is the README file for the WeBWorK htdocs/js folder. 2 | 3 | Please follow these guidelines for javascript used by WeBWorK. 4 | 5 | js: This directory contains first party WeBWorK javascript. 6 | Each library/app should have its own directory. 7 | 8 | All third party javascript and css libraries will be installed by npm. 9 | Run `npm install libname` in the htdocs directory to install a new library. 10 | Run `npm install` in the htdocs directory to install libraries. 11 | Run `npm ci` in the htdocs directory to install the precise versions of libraries defined in package-lock.json. 12 | The resulting libraries are installed in htdocs/node_modules. 13 | -------------------------------------------------------------------------------- /htdocs/js/SampleProblemViewer/sample-problem.js: -------------------------------------------------------------------------------- 1 | for (const pre of document.body.querySelectorAll('pre.CodeMirror')) { 2 | CodeMirror.runMode(pre.textContent, 'PG', pre); 3 | } 4 | 5 | for (const btn of document.querySelectorAll('.clipboard-btn')) { 6 | if (navigator.clipboard) btn.addEventListener('click', () => navigator.clipboard.writeText(btn.dataset.code)); 7 | } 8 | -------------------------------------------------------------------------------- /htdocs/js/SampleProblemViewer/sample-problem.scss: -------------------------------------------------------------------------------- 1 | pre.CodeMirror { 2 | background-color: #fcfaf1; 3 | } 4 | 5 | .explanation { 6 | --bs-code-color: #971556; 7 | } 8 | 9 | .preamble { 10 | background-color: lightblue; 11 | } 12 | 13 | .setup { 14 | background-color: #ddffdd; 15 | } 16 | 17 | .statement { 18 | background-color: #eeb08199; 19 | } 20 | 21 | .answer { 22 | background-color: #ffffdd; 23 | } 24 | 25 | .solution { 26 | background-color: #ffb6c199; 27 | } 28 | 29 | .hint { 30 | background-color: rgb(239, 207, 251); 31 | } 32 | 33 | .perl { 34 | color: darkred; 35 | } 36 | 37 | .clipboard-btn { 38 | z-index: 1; 39 | } 40 | -------------------------------------------------------------------------------- /htdocs/js/SampleProblemViewer/viewer.js: -------------------------------------------------------------------------------- 1 | const offcanvas = bootstrap.Offcanvas.getOrCreateInstance(document.getElementById('sidebar')); 2 | for (const link of document.querySelectorAll('#sidebar-list .list-group-item-action')) { 3 | link.addEventListener('click', () => offcanvas.hide()); 4 | } 5 | -------------------------------------------------------------------------------- /htdocs/js/SampleProblemViewer/viewer.scss: -------------------------------------------------------------------------------- 1 | .navbar { 2 | height: 70px; 3 | } 4 | 5 | .main-content { 6 | margin-top: 70px; 7 | } 8 | 9 | #sidebar { 10 | --bs-offcanvas-width: 320px; 11 | } 12 | 13 | @media only screen and (min-width: 768px) { 14 | #sidebar { 15 | width: 320px; 16 | height: calc(100vh - 70px); 17 | } 18 | 19 | .main-content { 20 | margin-left: 320px; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /htdocs/js/Stats/stats.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // Hover action to show exact value of each bar. 3 | document.querySelectorAll('.bar_graph_bar').forEach((el) => new bootstrap.Tooltip(el, { trigger: 'hover' })); 4 | 5 | if (!webworkConfig.renderProblem) return; 6 | 7 | const displayModeSelector = document.getElementById('problem_displaymode'); 8 | 9 | const render = () => { 10 | webworkConfig.renderProblem('problem_render_area', { 11 | set_id: document.getElementById('hidden_set_id')?.value, 12 | probNum: document.getElementById('hidden_problem_id')?.value, 13 | sourceFilePath: document.getElementById('hidden_source_file')?.value 14 | }); 15 | }; 16 | 17 | // Render the problem on page load. 18 | render(); 19 | 20 | // Re-render when a new display mode is selected. 21 | displayModeSelector?.addEventListener('change', render); 22 | })(); 23 | -------------------------------------------------------------------------------- /htdocs/js/UserList/userlist.scss: -------------------------------------------------------------------------------- 1 | .edit-classlist-table-container { 2 | table.table { 3 | border-collapse: separate; 4 | border-spacing: 0; 5 | 6 | .table-group-divider { 7 | tr:first-child { 8 | th, 9 | td { 10 | border-top: calc(var(--bs-border-width) * 2) solid; 11 | } 12 | } 13 | } 14 | 15 | th, 16 | td { 17 | border-right: var(--bs-border-width) solid var(--bs-table-border-color); 18 | } 19 | 20 | th:first-child, 21 | td:first-child { 22 | position: sticky; 23 | z-index: 1; 24 | left: 0; 25 | border-left: var(--bs-border-width) solid var(--bs-table-border-color); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /htdocs/site_info.txt: -------------------------------------------------------------------------------- 1 | 6 | 7 | This file is at htdocs/site_info.txt. Use it to display information for the entire WeBWorK site which will be viewed at login time. 8 | 9 | 10 | -------------------------------------------------------------------------------- /htdocs/themes/math4-green/README: -------------------------------------------------------------------------------- 1 | This is an "alternative" colorization to math4. If you want to provide 2 | multiple themes to your users you should follow this as an example. 3 | 4 | Everything except for the math4-overrides.js, math4-overrides.css, 5 | _theme-colors.scss, and _theme-overrides.scss files should be links pointing 6 | back to the corresponding files in math4. This will make it so that all your 7 | themes will automatically get updates. All of your changes should be in the 8 | listed override files. 9 | -------------------------------------------------------------------------------- /htdocs/themes/math4-green/_theme-colors.scss: -------------------------------------------------------------------------------- 1 | /* WeBWorK Online Homework Delivery System 2 | * Copyright © 2000-2021 The WeBWorK Project, https://github.com/openwebwork 3 | * 4 | * This program is free software; you can redistribute it and/or modify it under 5 | * the terms of either: (a) the GNU General Public License as published by the 6 | * Free Software Foundation; either version 2, or (at your option) any later 7 | * version, or (b) the "Artistic License" which comes with this package. 8 | * 9 | * This program is distributed in the hope that it will be useful, but WITHOUT 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 11 | * FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 12 | * Artistic License for more details. 13 | */ 14 | 15 | // Include bootstrap scss functions (so you can manipulate colors, SVGs, calc, etc) 16 | @import '../../node_modules/bootstrap/scss/functions'; 17 | 18 | // Theme colors 19 | $primary: #324f36; 20 | $info: #618265; 21 | 22 | // Link colors 23 | $link-color: #283f2b; 24 | $link-hover-color: #618265; 25 | 26 | // Webwork logo background color in the banner 27 | $ww-logo-background-color: darken($info, 8%); 28 | 29 | // Achievment level bar 30 | $ww-achievement-level-color: #708e74; 31 | -------------------------------------------------------------------------------- /htdocs/themes/math4-green/_theme-overrides.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | --ww-site-nav-link-active-background-color: #{darken($primary, 2%)}; 3 | } 4 | -------------------------------------------------------------------------------- /htdocs/themes/math4-green/bootstrap.scss: -------------------------------------------------------------------------------- 1 | ../math4/bootstrap.scss -------------------------------------------------------------------------------- /htdocs/themes/math4-green/images/maa_logo.svg: -------------------------------------------------------------------------------- 1 | ../../math4/images/maa_logo.svg -------------------------------------------------------------------------------- /htdocs/themes/math4-green/images/webwork_logo.svg: -------------------------------------------------------------------------------- 1 | ../../math4/images/webwork_logo.svg -------------------------------------------------------------------------------- /htdocs/themes/math4-green/math4-overrides.css.dist: -------------------------------------------------------------------------------- 1 | ../math4/math4-overrides.css.dist -------------------------------------------------------------------------------- /htdocs/themes/math4-green/math4-overrides.js.dist: -------------------------------------------------------------------------------- 1 | ../math4/math4-overrides.js.dist -------------------------------------------------------------------------------- /htdocs/themes/math4-red/README: -------------------------------------------------------------------------------- 1 | This is an "alternative" colorization to math4. If you want to provide 2 | multiple themes to your users you should follow this as an example. 3 | 4 | Everything except for the math4-overrides.js, math4-overrides.css, 5 | _theme-colors.scss, and _theme-overrides.scss files should be links pointing 6 | back to the corresponding files in math4. This will make it so that all your 7 | themes will automatically get updates. All of your changes should be in the 8 | listed override files. 9 | -------------------------------------------------------------------------------- /htdocs/themes/math4-red/_theme-colors.scss: -------------------------------------------------------------------------------- 1 | /* WeBWorK Online Homework Delivery System 2 | * Copyright © 2000-2021 The WeBWorK Project, https://github.com/openwebwork 3 | * 4 | * This program is free software; you can redistribute it and/or modify it under 5 | * the terms of either: (a) the GNU General Public License as published by the 6 | * Free Software Foundation; either version 2, or (at your option) any later 7 | * version, or (b) the "Artistic License" which comes with this package. 8 | * 9 | * This program is distributed in the hope that it will be useful, but WITHOUT 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 11 | * FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 12 | * Artistic License for more details. 13 | */ 14 | 15 | // Include bootstrap scss functions (so you can manipulate colors, SVGs, calc, etc) 16 | @import '../../node_modules/bootstrap/scss/functions'; 17 | 18 | // Theme colors 19 | $primary: #800; 20 | $info: #c30; 21 | 22 | // Link colors 23 | $link-color: $primary; 24 | $link-hover-color: #c00; 25 | 26 | // Webwork logo background color in the banner 27 | $ww-logo-background-color: darken($info, 8%); 28 | 29 | // Achievment level bar 30 | $ww-achievement-level-color: #08c; 31 | -------------------------------------------------------------------------------- /htdocs/themes/math4-red/_theme-overrides.scss: -------------------------------------------------------------------------------- 1 | a:not(.btn):focus { 2 | outline-color: #{lighten($link-hover-color, 26%)}; 3 | } 4 | -------------------------------------------------------------------------------- /htdocs/themes/math4-red/bootstrap.scss: -------------------------------------------------------------------------------- 1 | ../math4/bootstrap.scss -------------------------------------------------------------------------------- /htdocs/themes/math4-red/images/maa_logo.svg: -------------------------------------------------------------------------------- 1 | ../../math4/images/maa_logo.svg -------------------------------------------------------------------------------- /htdocs/themes/math4-red/images/webwork_logo.svg: -------------------------------------------------------------------------------- 1 | ../../math4/images/webwork_logo.svg -------------------------------------------------------------------------------- /htdocs/themes/math4-red/math4-overrides.css.dist: -------------------------------------------------------------------------------- 1 | ../math4/math4-overrides.css.dist -------------------------------------------------------------------------------- /htdocs/themes/math4-red/math4-overrides.js.dist: -------------------------------------------------------------------------------- 1 | ../math4/math4-overrides.js.dist -------------------------------------------------------------------------------- /htdocs/themes/math4-yellow/README: -------------------------------------------------------------------------------- 1 | This is an "alternative" colorization to math4. If you want to provide 2 | multiple themes to your users you should follow this as an example. 3 | 4 | Everything except for the math4-overrides.js, math4-overrides.css, 5 | _theme-colors.scss, and _theme-overrides.scss files should be links pointing 6 | back to the corresponding files in math4. This will make it so that all your 7 | themes will automatically get updates. All of your changes should be in the 8 | listed override files. 9 | -------------------------------------------------------------------------------- /htdocs/themes/math4-yellow/_theme-overrides.scss: -------------------------------------------------------------------------------- 1 | // Redo the btn-info to get a nice yellow on black coloring instead of white on black. 2 | // Only the foreground colors are changed. 3 | .btn-info { 4 | @include button-variant( 5 | // background color 6 | $info, 7 | // border color 8 | $info, 9 | // foreground color 10 | $primary, 11 | // hover background color 12 | tint-color($info, $btn-hover-bg-tint-amount), 13 | // hover border color 14 | tint-color($info, $btn-hover-border-tint-amount), 15 | // hover foreground color 16 | $primary, 17 | // active background color 18 | tint-color($info, $btn-active-bg-tint-amount), 19 | // active border color 20 | tint-color($info, $btn-active-border-tint-amount), 21 | // active foreground color 22 | $primary, 23 | // disabled background color 24 | $info, 25 | // disabled border color 26 | $info, 27 | // disabled foreground color 28 | color-contrast($info) 29 | ); 30 | } 31 | 32 | .btn-outline-primary { 33 | --#{$prefix}btn-color: #{shade_color($primary, 60%)}; 34 | --#{$prefix}btn-border-color: #{shade_color($primary, 20%)}; 35 | } 36 | 37 | .text-primary { 38 | color: $link-color !important; 39 | } 40 | 41 | a:not(.btn):focus { 42 | outline-color: #{darken($link-hover-color, 1%)}; 43 | } 44 | 45 | :root { 46 | --ww-site-nav-link-active-background-color: #{$primary}; 47 | } 48 | -------------------------------------------------------------------------------- /htdocs/themes/math4-yellow/bootstrap.scss: -------------------------------------------------------------------------------- 1 | ../math4/bootstrap.scss -------------------------------------------------------------------------------- /htdocs/themes/math4-yellow/images/maa_logo.svg: -------------------------------------------------------------------------------- 1 | ../../math4/images/maa_logo.svg -------------------------------------------------------------------------------- /htdocs/themes/math4-yellow/images/webwork_logo.svg: -------------------------------------------------------------------------------- 1 | ../../math4/images/webwork_logo.svg -------------------------------------------------------------------------------- /htdocs/themes/math4-yellow/math4-overrides.css.dist: -------------------------------------------------------------------------------- 1 | ../math4/math4-overrides.css.dist -------------------------------------------------------------------------------- /htdocs/themes/math4-yellow/math4-overrides.js.dist: -------------------------------------------------------------------------------- 1 | ../math4/math4-overrides.js.dist -------------------------------------------------------------------------------- /htdocs/themes/math4/README: -------------------------------------------------------------------------------- 1 | This folder contains the files necessary for the math4 theme. These files are 2 | tracked by git and any changes made to them will be overwritten when you 3 | upgrade. The two exceptions are math4-overrides.css and math4-overrides.js. 4 | 5 | These files do not need to be present, but if they are they will be included in 6 | system.conf and can be used for general overrides. They can created by copying 7 | math4-overrides.css.dist and math4-overrides.js.dist. This is similar to how 8 | localOverrides.conf interacts with defaults.conf and localOverrides.conf.dist. 9 | In particular if you upgrade your server math4-overrides.js and 10 | math4-overrides.css will not change, but their .dist versions and the other 11 | math4 theme files may change. This might cause problems until you merge the 12 | changes. 13 | 14 | If you want to customize math4 you should only change math4-overrides.css and 15 | math4-overrides.js. Note: Because you can include arbitrary JavaScript in 16 | math4-overrides.js you can actually change pretty much anything, including 17 | adding new html or changing existing html. 18 | 19 | -------------------------------------------------------------------------------- /htdocs/themes/math4/_theme-colors.scss: -------------------------------------------------------------------------------- 1 | /* WeBWorK Online Homework Delivery System 2 | * Copyright © 2000-2024 The WeBWorK Project, https://github.com/openwebwork 3 | * 4 | * This program is free software; you can redistribute it and/or modify it under 5 | * the terms of either: (a) the GNU General Public License as published by the 6 | * Free Software Foundation; either version 2, or (at your option) any later 7 | * version, or (b) the "Artistic License" which comes with this package. 8 | * 9 | * This program is distributed in the hope that it will be useful, but WITHOUT 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 11 | * FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 12 | * Artistic License for more details. 13 | */ 14 | 15 | // Include bootstrap scss functions (so you can manipulate colors, SVGs, calc, etc) 16 | @import '../../node_modules/bootstrap/scss/functions'; 17 | 18 | // Theme colors 19 | $primary: #038; 20 | $info: #1a67ea; 21 | 22 | // Link colors 23 | $link-color: $primary; 24 | $link-hover-color: $info; 25 | 26 | // Webwork logo background color in the banner 27 | $ww-logo-background-color: darken($info, 14%); 28 | 29 | // Achievment level bar 30 | $ww-achievement-level-color: #88d; 31 | -------------------------------------------------------------------------------- /htdocs/themes/math4/_theme-overrides.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwebwork/webwork2/4c05f12de911e67eea1330355bb8560a31b9568a/htdocs/themes/math4/_theme-overrides.scss -------------------------------------------------------------------------------- /htdocs/themes/math4/math4-overrides.css.dist: -------------------------------------------------------------------------------- 1 | /* This is the override file for math4.css. If you copy * math4-overrides.css.dist to 2 | * math4-overrides.css you can add css rules to this file and they will override the css 3 | * values normally used for math4. This includes colors, padding, spacing, and so on. 4 | * 5 | * If you upgrade webwork this file will not be overwritten. However, the math4.css and 6 | * math4-overrides.css.dist file may change. If this happens it may cause problems with 7 | * your theme until your reconcile the changes with your modifactions here. (Similar to 8 | * how localOverrides.conf works.) 9 | * 10 | * Note that theming is no longer done with this file. Instead copy one of the existing 11 | * themes and modify _theme-colors.scss and _theme-overrides.scss. Then run 12 | * `./generate-assets.js` from the htdocs directory. 13 | */ 14 | -------------------------------------------------------------------------------- /htdocs/themes/math4/math4-overrides.js.dist: -------------------------------------------------------------------------------- 1 | /* This is the override file for math4.js. If you copy * math4-overrides.js.dist to 2 | * math4-overrides.js you add javascript to this file to change behavior and display of 3 | * user interface items. This includes anything you can accomplish with jQuery and 4 | * provides a lot of flexibility. 5 | * 6 | * If you upgrade your machine this file will not be overwritten, however, the math4.js 7 | * and math4-overrides.js.dist file may change. If this happens it may cause problems 8 | * with your theme until your reconcile the changes with your modifactions here. (Similar 9 | * to how localOverrides.conf works.) 10 | * 11 | * Note that theming is no longer done with this file. Instead copy one of the existing 12 | * themes and modify _theme-colors.scss and _theme-overrides.scss. Then run 13 | * `./generate-assets.js` from the htdocs directory. 14 | */ 15 | -------------------------------------------------------------------------------- /htdocs/tmp/README: -------------------------------------------------------------------------------- 1 | Web-accessible temporary files are stored in this directory. 2 | -------------------------------------------------------------------------------- /lib/Caliper/Actor.pm: -------------------------------------------------------------------------------- 1 | package Caliper::Actor; 2 | 3 | ##### Library Imports ##### 4 | use strict; 5 | use warnings; 6 | use WeBWorK::CourseEnvironment; 7 | use WeBWorK::DB; 8 | use WeBWorK::Debug; 9 | use Data::Dumper; 10 | 11 | use Caliper::ResourceIri; 12 | 13 | sub generate_anonymous_actor { 14 | return { 15 | 'id' => 'http://purl.imsglobal.org/caliper/Person', 16 | 'type' => 'Person', 17 | }; 18 | } 19 | 20 | sub generate_default_actor { 21 | my ($ce, $db, $user) = @_; 22 | my $resource_iri = Caliper::ResourseIri->new($ce); 23 | 24 | return { 25 | 'id' => $resource_iri->actor_homepage($user->user_id()), 26 | 'type' => 'Person', 27 | 'name' => $user->first_name() . " " . $user->last_name(), 28 | }; 29 | } 30 | 31 | sub generate_actor { 32 | my ($ce, $db, $user_id) = @_; 33 | 34 | if (!defined($user_id)) { 35 | return Caliper::Entity::generate_anonymous_actor(); 36 | } else { 37 | my $user = $db->getUser($user_id); 38 | 39 | if (defined($ce->{caliper}{custom_actor_generator})) { 40 | return $ce->{caliper}{custom_actor_generator}($ce, $db, $user); 41 | } else { 42 | return generate_default_actor($ce, $db, $user); 43 | } 44 | } 45 | } 46 | 47 | 1; 48 | -------------------------------------------------------------------------------- /lib/WeBWorK/ConfigObject/text.pm: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # WeBWorK Online Homework Delivery System 3 | # Copyright © 2000-2021 The WeBWorK Project, https://github.com/openwebwork 4 | # 5 | # This program is free software; you can redistribute it and/or modify it under 6 | # the terms of either: (a) the GNU General Public License as published by the 7 | # Free Software Foundation; either version 2, or (at your option) any later 8 | # version, or (b) the "Artistic License" which comes with this package. 9 | # 10 | # This program is distributed in the hope that it will be useful, but WITHOUT 11 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 | # FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 13 | # Artistic License for more details. 14 | ################################################################################ 15 | 16 | package WeBWorK::ConfigObject::text; 17 | use Mojo::Base 'WeBWorK::ConfigObject', -signatures; 18 | 19 | # The base ConfigObject handles everything for this package. This is just a namespace. 20 | 21 | 1; 22 | -------------------------------------------------------------------------------- /lib/WeBWorK/ContentGenerator/ProctoredGatewayQuiz.pm: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # WeBWorK Online Homework Delivery System 3 | # Copyright © 2000-2024 The WeBWorK Project, https://github.com/openwebwork 4 | # 5 | # This program is free software; you can redistribute it and/or modify it under 6 | # the terms of either: (a) the GNU General Public License as published by the 7 | # Free Software Foundation; either version 2, or (at your option) any later 8 | # version, or (b) the "Artistic License" which comes with this package. 9 | # 10 | # This program is distributed in the hope that it will be useful, but WITHOUT 11 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 | # FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 13 | # Artistic License for more details. 14 | ################################################################################ 15 | 16 | package WeBWorK::ContentGenerator::ProctoredGatewayQuiz; 17 | use Mojo::Base 'WeBWorK::ContentGenerator::GatewayQuiz', -signatures; 18 | 19 | =head1 NAME 20 | 21 | WeBWorK::ContentGenerator::ProctoredGatewayQuiz - 22 | this is a wrapper for GatewayQuiz.pm and has no content 23 | 24 | =cut 25 | 26 | 1; 27 | -------------------------------------------------------------------------------- /lib/WeBWorK/DB/Record/Depths.pm: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # WeBWorK Online Homework Delivery System 3 | # Copyright © 2000-2024 The WeBWorK Project, https://github.com/openwebwork 4 | # 5 | # This program is free software; you can redistribute it and/or modify it under 6 | # the terms of either: (a) the GNU General Public License as published by the 7 | # Free Software Foundation; either version 2, or (at your option) any later 8 | # version, or (b) the "Artistic License" which comes with this package. 9 | # 10 | # This program is distributed in the hope that it will be useful, but WITHOUT 11 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 | # FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 13 | # Artistic License for more details. 14 | ################################################################################ 15 | 16 | package WeBWorK::DB::Record::Depths; 17 | use base WeBWorK::DB::Record; 18 | 19 | =head1 NAME 20 | 21 | WeBWorK::DB::Record::Depths - represent a record from the depths table. 22 | 23 | =cut 24 | 25 | use strict; 26 | use warnings; 27 | 28 | #use WeBWorK::Utils::DBUpgrade; 29 | 30 | BEGIN { 31 | __PACKAGE__->_fields( 32 | md5 => { type => "CHAR(33) NOT NULL", key => 1 }, 33 | depth => { type => "SMALLINT" }, 34 | ); 35 | 36 | } 37 | 38 | 1; 39 | 40 | -------------------------------------------------------------------------------- /lib/WeBWorK/DB/Record/Key.pm: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # WeBWorK Online Homework Delivery System 3 | # Copyright © 2000-2024 The WeBWorK Project, https://github.com/openwebwork 4 | # 5 | # This program is free software; you can redistribute it and/or modify it under 6 | # the terms of either: (a) the GNU General Public License as published by the 7 | # Free Software Foundation; either version 2, or (at your option) any later 8 | # version, or (b) the "Artistic License" which comes with this package. 9 | # 10 | # This program is distributed in the hope that it will be useful, but WITHOUT 11 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 | # FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 13 | # Artistic License for more details. 14 | ################################################################################ 15 | 16 | package WeBWorK::DB::Record::Key; 17 | use base WeBWorK::DB::Record; 18 | 19 | =head1 NAME 20 | 21 | WeBWorK::DB::Record::Key - represent a record from the key table. 22 | 23 | =cut 24 | 25 | use strict; 26 | use warnings; 27 | 28 | BEGIN { 29 | __PACKAGE__->_fields( 30 | user_id => { type => "VARCHAR(100) NOT NULL", key => 1 }, 31 | key => { type => "TEXT" }, 32 | timestamp => { type => "BIGINT" }, 33 | session => { type => "TEXT NOT NULL DEFAULT ('{}')" }, 34 | ); 35 | } 36 | 37 | 1; 38 | -------------------------------------------------------------------------------- /lib/WeBWorK/DB/Record/LTICourseMap.pm: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # WeBWorK Online Homework Delivery System 3 | # Copyright © 2000-2024 The WeBWorK Project, https://github.com/openwebwork 4 | # 5 | # This program is free software; you can redistribute it and/or modify it under 6 | # the terms of either: (a) the GNU General Public License as published by the 7 | # Free Software Foundation; either version 2, or (at your option) any later 8 | # version, or (b) the "Artistic License" which comes with this package. 9 | # 10 | # This program is distributed in the hope that it will be useful, but WITHOUT 11 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 | # FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 13 | # Artistic License for more details. 14 | ################################################################################ 15 | 16 | package WeBWorK::DB::Record::LTICourseMap; 17 | use base WeBWorK::DB::Record; 18 | 19 | =head1 NAME 20 | 21 | WeBWorK::DB::Record::LMSCourseMap - represent a record from the lti_course_map table. 22 | 23 | =cut 24 | 25 | use strict; 26 | use warnings; 27 | 28 | BEGIN { 29 | __PACKAGE__->_fields( 30 | course_id => { type => "VARCHAR(40) NOT NULL", key => 1 }, 31 | lms_context_id => { type => "VARCHAR(200) NOT NULL", key => 1 } 32 | ); 33 | } 34 | 35 | 1; 36 | -------------------------------------------------------------------------------- /lib/WeBWorK/DB/Record/Locations.pm: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # WeBWorK Online Homework Delivery System 3 | # Copyright © 2000-2024 The WeBWorK Project, https://github.com/openwebwork 4 | # 5 | # This program is free software; you can redistribute it and/or modify it under 6 | # the terms of either: (a) the GNU General Public License as published by the 7 | # Free Software Foundation; either version 2, or (at your option) any later 8 | # version, or (b) the "Artistic License" which comes with this package. 9 | # 10 | # This program is distributed in the hope that it will be useful, but WITHOUT 11 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 | # FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 13 | # Artistic License for more details. 14 | ################################################################################ 15 | package WeBWorK::DB::Record::Locations; 16 | use base WeBWorK::DB::Record; 17 | 18 | =head1 NAME 19 | 20 | WeBWorK::DB::Record::Locations - represent a record from the locations table. 21 | 22 | =cut 23 | 24 | use strict; 25 | use warnings; 26 | 27 | BEGIN { 28 | __PACKAGE__->_fields( 29 | location_id => { type => "VARCHAR(40) NOT NULL", key => 1 }, 30 | description => { type => "TEXT" }, 31 | ); 32 | } 33 | 34 | 1; 35 | -------------------------------------------------------------------------------- /lib/WeBWorK/DB/Record/Password.pm: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # WeBWorK Online Homework Delivery System 3 | # Copyright © 2000-2024 The WeBWorK Project, https://github.com/openwebwork 4 | # 5 | # This program is free software; you can redistribute it and/or modify it under 6 | # the terms of either: (a) the GNU General Public License as published by the 7 | # Free Software Foundation; either version 2, or (at your option) any later 8 | # version, or (b) the "Artistic License" which comes with this package. 9 | # 10 | # This program is distributed in the hope that it will be useful, but WITHOUT 11 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 | # FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 13 | # Artistic License for more details. 14 | ################################################################################ 15 | 16 | package WeBWorK::DB::Record::Password; 17 | use base WeBWorK::DB::Record; 18 | 19 | =head1 NAME 20 | 21 | WeBWorK::DB::Record::Password - represent a record from the password table. 22 | 23 | =cut 24 | 25 | use strict; 26 | use warnings; 27 | 28 | BEGIN { 29 | __PACKAGE__->_fields( 30 | user_id => { type => "VARCHAR(100) NOT NULL", key => 1 }, 31 | password => { type => "TEXT" }, 32 | otp_secret => { type => "TEXT" } 33 | ); 34 | } 35 | 36 | 1; 37 | -------------------------------------------------------------------------------- /lib/WeBWorK/DB/Record/PermissionLevel.pm: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # WeBWorK Online Homework Delivery System 3 | # Copyright © 2000-2024 The WeBWorK Project, https://github.com/openwebwork 4 | # 5 | # This program is free software; you can redistribute it and/or modify it under 6 | # the terms of either: (a) the GNU General Public License as published by the 7 | # Free Software Foundation; either version 2, or (at your option) any later 8 | # version, or (b) the "Artistic License" which comes with this package. 9 | # 10 | # This program is distributed in the hope that it will be useful, but WITHOUT 11 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 | # FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 13 | # Artistic License for more details. 14 | ################################################################################ 15 | 16 | package WeBWorK::DB::Record::PermissionLevel; 17 | use base WeBWorK::DB::Record; 18 | 19 | =head1 NAME 20 | 21 | WeBWorK::DB::Record::PermissionLevel - represent a record from the permission 22 | table. 23 | 24 | =cut 25 | 26 | use strict; 27 | use warnings; 28 | 29 | BEGIN { 30 | __PACKAGE__->_fields( 31 | user_id => { type => "VARCHAR(100) NOT NULL", key => 1 }, 32 | permission => { type => "INT" }, 33 | ); 34 | } 35 | 36 | 1; 37 | -------------------------------------------------------------------------------- /lib/WeBWorK/DB/Record/SetLocations.pm: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # WeBWorK Online Homework Delivery System 3 | # Copyright © 2000-2024 The WeBWorK Project, https://github.com/openwebwork 4 | # 5 | # This program is free software; you can redistribute it and/or modify it under 6 | # the terms of either: (a) the GNU General Public License as published by the 7 | # Free Software Foundation; either version 2, or (at your option) any later 8 | # version, or (b) the "Artistic License" which comes with this package. 9 | # 10 | # This program is distributed in the hope that it will be useful, but WITHOUT 11 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 | # FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 13 | # Artistic License for more details. 14 | ################################################################################ 15 | package WeBWorK::DB::Record::SetLocations; 16 | use base WeBWorK::DB::Record; 17 | 18 | =head1 NAME 19 | 20 | WeBWorK::DB::Record::SetLocations - represent a record from the set_locations table. 21 | 22 | =cut 23 | 24 | use strict; 25 | use warnings; 26 | 27 | BEGIN { 28 | __PACKAGE__->_fields( 29 | set_id => { type => "VARCHAR(100) NOT NULL", key => 1 }, 30 | location_id => { type => "VARCHAR(40) NOT NULL", key => 1 }, 31 | ); 32 | } 33 | 34 | 1; 35 | -------------------------------------------------------------------------------- /lib/WeBWorK/SafeTemplate.pm: -------------------------------------------------------------------------------- 1 | package WeBWorK::SafeTemplate; 2 | use Mojo::Base 'Mojo::Template'; 3 | 4 | # The Mojo::Template _wrap method adds "use Mojo::Base -strict" and "no warnings 'ambiguous'" to the code generated in 5 | # this method. When that is called later it causes an error in the safe compartment because "require" is trapped. So 6 | # instead this imports strict, warnings, and utf8 which is equivalent to calling "use Mojo::Base -strict". Calling "no 7 | # warnings 'ambiguous'" prevents warnings from a lack of parentheses on a scalar call in the generated code. So if this 8 | # package is used, those warnings need to be prevented in another way. 9 | sub _wrap { 10 | my ($self, $body, $vars) = @_; 11 | 12 | # Variables 13 | my $args = ''; 14 | if ($self->vars && (my @vars = grep {/^\w+$/} keys %$vars)) { 15 | $args = 'my (' . join(',', map {"\$$_"} @vars) . ')'; 16 | $args .= '= @{shift()}{qw(' . join(' ', @vars) . ')};'; 17 | } 18 | 19 | # Wrap lines 20 | my $num = () = $body =~ /\n/g; 21 | my $code = $self->_line(1) . "\npackage @{[$self->namespace]};"; 22 | $code .= 'BEGIN { strict->import; warnings->import; utf8->import; }'; 23 | $code .= "sub { my \$_O = ''; @{[$self->prepend]};{ $args { $body\n"; 24 | $code .= $self->_line($num + 1) . "\n;}@{[$self->append]}; } \$_O };"; 25 | 26 | return $code; 27 | } 28 | 29 | 1; 30 | -------------------------------------------------------------------------------- /lib/WebworkSOAP/Classes/Course.pm: -------------------------------------------------------------------------------- 1 | package WebworkSOAP::Classes::Course; 2 | 3 | 1; 4 | -------------------------------------------------------------------------------- /lib/WebworkSOAP/Classes/GlobalProblem.pm: -------------------------------------------------------------------------------- 1 | package WebworkSOAP::Classes::GlobalProblem; 2 | 3 | =pod 4 | 5 | =begin WSDL 6 | _ATTR set_id $string set_id 7 | _ATTR problem_id $string problem_id 8 | _ATTR source_file $string source_file 9 | _ATTR value $string value 10 | _ATTR max_attempts $string max_attempts 11 | _ATTR showMeAnother $string showMeAnother 12 | _ATTR showMeAnotherCount $string showMeAnotherCount 13 | =end WSDL 14 | 15 | =cut 16 | 17 | sub new { 18 | my $self = shift; 19 | my $data = shift; 20 | $self = {}; 21 | $self->{set_id} = SOAP::Data->type('string', $data->set_id); 22 | $self->{problem_id} = SOAP::Data->type('string', $data->problem_id); 23 | $self->{source_file} = SOAP::Data->type('string', $data->source_file); 24 | $self->{value} = SOAP::Data->type('string', $data->value); 25 | $self->{max_attempts} = SOAP::Data->type('string', $data->max_attempts); 26 | $self->{showMeAnother} = SOAP::Data->type('string', $data->showMeAnother); 27 | $self->{showMeAnotherCount} = SOAP::Data->type('string', $data->showMeAnotherCount); 28 | bless $self; 29 | return $self; 30 | } 31 | 32 | 1; 33 | -------------------------------------------------------------------------------- /lib/WebworkSOAP/Classes/Key.pm: -------------------------------------------------------------------------------- 1 | package WebworkSOAP::Classes::Key; 2 | 3 | =pod 4 | 5 | =begin WSDL 6 | _ATTR user_id $string user_id 7 | _ATTR key $string key 8 | _ATTR timestamp $string timestamp 9 | =end WSDL 10 | 11 | =cut 12 | 13 | sub new { 14 | my $self = shift; 15 | my $data = shift; 16 | $self = {}; 17 | $self->{user_id} = SOAP::Data->type('string', $data->user_id); 18 | $self->{key} = SOAP::Data->type('string', $data->key); 19 | $self->{timestamp} = SOAP::Data->type('string', $data->timestamp); 20 | bless $self; 21 | return $self; 22 | } 23 | 24 | 1; 25 | -------------------------------------------------------------------------------- /lib/WebworkSOAP/Classes/Password.pm: -------------------------------------------------------------------------------- 1 | package WebworkSOAP::Classes::Password; 2 | 3 | =pod 4 | 5 | =begin WSDL 6 | _ATTR user_id $string user_id 7 | _ATTR password $string password 8 | =end WSDL 9 | 10 | =cut 11 | 12 | sub new { 13 | my $self = shift; 14 | my $data = shift; 15 | $self = {}; 16 | $self->{user_id} = SOAP::Data->type('string', $data->user_id); 17 | $self->{password} = SOAP::Data->type('string', $data->password); 18 | bless $self; 19 | return $self; 20 | } 21 | 22 | 1; 23 | -------------------------------------------------------------------------------- /lib/WebworkSOAP/Classes/Permission.pm: -------------------------------------------------------------------------------- 1 | package WebworkSOAP::Classes::Permission; 2 | 3 | =pod 4 | 5 | =begin WSDL 6 | _ATTR user_id $string user_id 7 | _ATTR permission $string permission 8 | =end WSDL 9 | 10 | =cut 11 | 12 | sub new { 13 | my $self = shift; 14 | my $data = shift; 15 | $self = {}; 16 | $self->{user_id} = SOAP::Data->type('string', $data->user_id); 17 | $self->{permission} = SOAP::Data->type('string', $data->permission); 18 | bless $self; 19 | return $self; 20 | } 21 | 22 | 1; 23 | -------------------------------------------------------------------------------- /lib/WebworkSOAP/Classes/User.pm: -------------------------------------------------------------------------------- 1 | package WebworkSOAP::Classes::User; 2 | 3 | =pod 4 | 5 | =begin WSDL 6 | _ATTR user_id $string user_id 7 | _ATTR first_name $string first_name 8 | _ATTR last_name $string last_name 9 | _ATTR email_address $string email_address 10 | _ATTR student_id $string student_id 11 | _ATTR status $string status 12 | _ATTR section $string section 13 | _ATTR recitation $string recitation 14 | _ATTR comment $string comment 15 | =end WSDL 16 | 17 | =cut 18 | 19 | sub new { 20 | my $self = shift; 21 | my $data = shift; 22 | $self = {}; 23 | $self->{user_id} = SOAP::Data->type('string', $data->user_id); 24 | $self->{first_name} = SOAP::Data->type('string', $data->first_name); 25 | $self->{last_name} = SOAP::Data->type('string', $data->last_name); 26 | $self->{email_address} = SOAP::Data->type('string', $data->email_address); 27 | $self->{student_id} = SOAP::Data->type('string', $data->student_id); 28 | $self->{status} = SOAP::Data->type('string', $data->status); 29 | $self->{section} = SOAP::Data->type('string', $data->section); 30 | $self->{recitation} = SOAP::Data->type('string', $data->recitation); 31 | $self->{comment} = SOAP::Data->type('string', $data->comment); 32 | bless $self; 33 | return $self; 34 | } 35 | 36 | 1; 37 | -------------------------------------------------------------------------------- /logs/README: -------------------------------------------------------------------------------- 1 | $CVSHeader: webwork-modperl/DATA/uploads/README,v 1.1 2004/06/07 23:00:01 sh002i Exp $ 2 | 3 | WeBWorK log files are written to this directory. 4 | -------------------------------------------------------------------------------- /templates/AchievementEvaluator/cheevoMessage.html.ep: -------------------------------------------------------------------------------- 1 | 30 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Achievements.html.ep: -------------------------------------------------------------------------------- 1 | % use WeBWorK::Utils qw(getAssetURL); 2 | % 3 | % content_for css => begin 4 | <%= stylesheet getAssetURL($ce, 'js/Achievements/achievements.css') =%> 5 | % end 6 | % 7 | % content_for js => begin 8 | <%= javascript getAssetURL($ce, 'js/AchievementItems/achievementitems.js'), defer => undef =%> 9 | % end 10 | % 11 | % # Exit if there is no global achievement data for this user. 12 | % unless (defined $c->{globalData}) { 13 |

<%= maketext(q{You don't have any Achievement data associated to you!}) =%>

14 | % last; 15 | % } 16 | % 17 | <%= include 'ContentGenerator/Achievements/cheevobigbox', $c->getAchievementLevelData =%> 18 | <%= include 'ContentGenerator/Achievements/achievement_items', $c->getAchievementItemsData =%> 19 | <%= include 'ContentGenerator/Achievements/achievement_badges', $c->getAchievementsData =%> 20 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Achievements/cheevobigbox.html.ep: -------------------------------------------------------------------------------- 1 | % last unless $achievement; 2 | % 3 |
4 |
5 | <%= image $achievement->{icon} 6 | ? "$ce->{courseURLs}{achievements}/$achievement->{icon}" 7 | : "$ce->{webworkURLs}{htdocs}/images/defaulticon.png", alt => 'Level Icon' =%> 8 |
9 |

<%= $achievement->name %>

10 | % if ($c->{globalData}->next_level_points) { 11 |
13 |
14 |
15 |
<%= maketext('Level Progress:') %> <%= "$level_progress/$level_goal" %>
16 | % } 17 |
18 | <%= maketext('Total Points:') %> <%= $c->{globalData}->achievement_points %> 19 |
20 |
21 |
22 |
23 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Base/feedback_macro_email.html.ep: -------------------------------------------------------------------------------- 1 | <%= form_for 'feedback', method => 'POST', begin %> 2 | % # This is used in forms with hidden_authen_fields already included on many pages. 3 | % # So we need to change the hidden fields to be email-hidden. 4 | <%= $c->hidden_authen_fields('email-') =%> 5 | % while (my ($key, $value) = each %$params) { 6 | % next if $key eq 'pg_object'; # Not used in internal feedback mechanism 7 | <%= hidden_field $key => $value =%> 8 | % } 9 |

10 | <%= submit_button maketext($ce->{feedback_button_name}) || maketext('Email instructor'), 11 | name => 'feedbackForm', class => 'btn btn-primary' =%> 12 |

13 | % end 14 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Base/feedback_macro_form.html.ep: -------------------------------------------------------------------------------- 1 | % use MIME::Base64; 2 | % use Encode; 3 | % 4 | % # enctype="multipart/form-data" 5 | <%= form_for $feedbackFormURL, method => 'POST', target => 'WW_info', begin =%> 6 | <%= $c->hidden_authen_fields =%> 7 | % 8 | % while (my ($key, $value) = each %$params) { 9 | % if ($key eq 'pg_object') { 10 | <%= hidden_field $key => encode_base64( 11 | Encode::encode( 12 | 'UTF-8', 13 | $value->{body_text} 14 | . ($value->{result}{msg} ? tag('p', tag('b', 'Note: ') . tag('i', $value->{result}{msg})) : '') 15 | ), 16 | '' 17 | ) =%> 18 | % } else { 19 | <%= hidden_field $key => $value =%> 20 | % } 21 | % } 22 | % 23 |

24 | <%= submit_button maketext($ce->{feedback_button_name}) || maketext('Email instructor'), 25 | name => 'feedbackForm', class => 'btn btn-primary' =%> 26 |

27 | <% end =%> 28 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Base/footer.html.ep: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Base/login_status.html.ep: -------------------------------------------------------------------------------- 1 | % if ($authen && $authen->was_verified) { 2 | % my $db = stash('db'); 3 | % 4 | % my $userID = param('user'); 5 | % my $user = $db->getUser($userID); 6 | % my $effectiveUserID = param('effectiveUser'); 7 | % my $userName = $user->full_name || $user->user_id; 8 | % 9 | <%= maketext('Logged in as [_1].', $userName) %> 10 | <%= link_to $c->systemLink(url_for 'logout'), class => 'btn btn-light btn-sm ms-2', begin %> 11 | <%= maketext('Log Out') %> 12 | <% end %> 13 | % 14 | % if ($effectiveUserID ne $userID) { 15 | % my $effectiveUser = $db->getUser($effectiveUserID); 16 | % unless ($effectiveUser) { 17 | % param('effectiveUser', $userID); 18 | % next; 19 | % } 20 | % my $effectiveUserName = 21 | % $effectiveUser->full_name 22 | % ? join(' ', $effectiveUser->full_name, '(' . $effectiveUser->user_id . ')') 23 | % : $effectiveUser->user_id; 24 | % 25 |
26 | <%= maketext('Acting as [_1].', $effectiveUserName) %> 27 | <%= link_to $c->systemLink(url_for, params => { effectiveUser => $userID }), 28 | class => 'btn btn-light btn-sm ms-2', begin %> 29 | <%= maketext('Stop Acting') %> 30 | <% end %> 31 | % } 32 | % } else { 33 | <%= maketext('Not logged in.') =%> 34 | % } 35 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Base/warning_output.html.ep: -------------------------------------------------------------------------------- 1 | % use Date::Format; 2 | % 3 |

<%= maketext('WeBWorK Warnings') %>

4 |

5 | <%= maketext( 6 | 'WeBWorK has encountered warnings while processing your request. If this occurred when viewing ' 7 | . 'a problem, it was likely caused by an error or ambiguity in that problem. Otherwise, it may indicate ' 8 | . 'a problem with the WeBWorK system itself. If you are a student, report these warnings to your ' 9 | . 'professor to have them corrected. If you are a professor, please consult the warning output below ' 10 | . 'for more information.' 11 | ) %> 12 |

13 |

<%= maketext('Warning messages') %>

14 |
    15 | % for (@$warnings) { 16 |
  • <%= $_ %>
  • 17 | % } 18 |
19 |

<%= maketext('Request information') %>

20 | 21 | 22 | 23 | 24 |
<%= maketext('Time') %><%= time2str('%a %b %d %H:%M:%S %Y', time) %>
<%= maketext('Method') %><%= $c->req->method %>
<%= maketext('URI') %><%= url_for %>
25 | -------------------------------------------------------------------------------- /templates/ContentGenerator/CourseAdmin/delete_course_confirm.html.ep: -------------------------------------------------------------------------------- 1 |

<%= maketext('Delete Course') %> <%= $c->helpMacro('AdminDeleteCourse') %>

2 |

3 | <%== maketext( 4 | 'Are you sure you want to delete the course [_1]? All course files and data will be destroyed. ' 5 | . 'There is no undo available.', 6 | tag('b', param('delete_courseID') || '') 7 | ) =%> 8 |

9 | <%= form_for current_route, method => 'POST', begin =%> 10 | <%= $c->hidden_authen_fields =%> 11 | <%= $c->hidden_fields('subDisplay') =%> 12 | <%= $c->hidden_fields('delete_courseID') =%> 13 | % 14 |
15 | <%= submit_button maketext("Don't delete"), name => 'decline_delete_course', class => 'btn btn-primary' =%> 16 | <%= submit_button maketext('Delete'), name => 'confirm_delete_course', class => 'btn btn-primary' =%> 17 |
18 | <% end =%> 19 | -------------------------------------------------------------------------------- /templates/ContentGenerator/CourseAdmin/manage_lti_course_map_form.html.ep: -------------------------------------------------------------------------------- 1 |

<%= maketext('Manage LTI Course Map') %> <%= $c->helpMacro('AdminManageLTICourseMap') %>

2 | <%= form_for current_route, method => 'POST', begin =%> 3 | <%= $c->hidden_authen_fields =%> 4 | <%= $c->hidden_fields('subDisplay') =%> 5 | % 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | % for (sort { lc $a cmp lc $b } keys %$courseMap) { 17 | 18 | 19 | 24 | 25 | % } 26 | 27 |
<%= maketext('LTI Course Map') %>
<%= maketext('Course ID') %><%= maketext('LMS Context ID') %>
<%= $_ =%> 20 | <%= text_field "$_-context-id" => $courseMap->{$_}, size => 40, 21 | class => 'form-control form-control-sm d-inline w-auto', 22 | 'aria-labelledby' => 'lms-context-id-header' =%> 23 |
28 |
29 |
<%= submit_button maketext('Save'), name => 'save_lti_course_map', class => 'btn btn-primary' =%>
30 | <% end =%> 31 | -------------------------------------------------------------------------------- /templates/ContentGenerator/CourseAdmin/unarchive_course_confirm.html.ep: -------------------------------------------------------------------------------- 1 |

<%= maketext('Unarchive Course') %> <%= $c->helpMacro('AdminUnarchiveCourse') %>

2 | <%= form_for current_route, method => 'POST', begin =%> 3 |
4 | <%= label_for new_courseID => maketext('Unarchive [_1] to course:', $unarchive_courseID), 5 | class => 'col-auto col-form-label' =%> 6 |
7 | 8 |
9 |
10 |
11 |
12 |
13 | 18 |
19 |
20 |
21 | <%= $c->hidden_authen_fields =%> 22 | <%= $c->hidden_fields(qw(subDisplay unarchive_courseID create_newCourseID)) =%> 23 |
24 | <%= submit_button maketext(q{Don't Unarchive}), 25 | name => 'decline_unarchive_course', class => 'btn btn-primary' =%> 26 | <%= submit_button maketext('Unarchive'), name => 'confirm_unarchive_course', class => 'btn btn-primary' =%> 27 |
28 | <% end =%> 29 | -------------------------------------------------------------------------------- /templates/ContentGenerator/EquationDisplay.html.ep: -------------------------------------------------------------------------------- 1 |
Copy the location of this image (or drag and drop) into your editing area:
2 |

<%= $typesetStr %>

3 |

<%== $typesetStr %>

4 | <%= form_for current_route, method => 'POST', begin =%> 5 | <%= $c->hidden_authen_fields =%> 6 | <%= text_area eq => '', class => 'form-control mb-3', placeholder => 'Enter equation here', 7 | cols => 40, rows => 5 =%> 8 | <%= submit_button 'typeset', class => 'btn btn-primary' =%> 9 | <% end =%> 10 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Grades.html.ep: -------------------------------------------------------------------------------- 1 | <%= $c->displayStudentStats($c->{studentID}) =%> 2 | <%= $c->scoring_info =%> 3 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Home.html.ep: -------------------------------------------------------------------------------- 1 | % use WeBWorK::Utils::CourseManagement qw(listCourses); 2 | % 3 | % my $coursesDir = $ce->{webworkDirs}{courses}; 4 | % my @courseIDs = listCourses($ce); 5 | % my $admin_course_id = $ce->{admin_course_id}; 6 | % 7 |

<%= maketext('Welcome to WeBWorK!') %>

8 | % 9 | % if ((grep { $_ eq $admin_course_id } @courseIDs) && !-f "$coursesDir/$admin_course_id/hide_directory") { 10 |

<%= link_to maketext('Course Administration') => url_for('course_admin') =%>

11 | % } 12 | % 13 |

<%= maketext('Courses') %>

14 | % 15 |
    16 | % for my $courseID (sort { lc($a) cmp lc($b) } @courseIDs) { 17 | % next if $courseID eq $admin_course_id; # Already shown above. 18 | % next if -f "$coursesDir/$courseID/hide_directory"; 19 |
  • 20 | <%= link_to $courseID =~ s/_/ /gr => url_for('set_list', courseID => $courseID) =%> 21 |
  • 22 | % } 23 |
24 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/AchievementEditor/save_form.html.ep: -------------------------------------------------------------------------------- 1 | % if (-w $c->{sourceFilePath}) { 2 | <%== maketext('Save [_1]', tag('b', $c->shortPath($c->{sourceFilePath}))) %> 3 | % } 4 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/AchievementList/assign_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 |
3 | <%= label_for assign_select => maketext('Assign which achievements?'), 4 | class => 'col-form-label col-form-label-sm col-sm-auto' =%> 5 |
6 | <%= select_field 'action.assign.scope' => [ 7 | [ maketext('all course achievements') => 'all' ], 8 | [ maketext('selected achievements') => 'selected', selected => undef ] 9 | ], 10 | id => 'assign_select', 11 | class => 'form-select form-select-sm' =%> 12 |
13 |
14 |
15 | <%= label_for 'assign_data_select' => maketext('Choose what to do with existing data:'), 16 | class => 'col-form-label col-form-label-sm col-sm-auto' =%> 17 |
18 | <%= select_field 'action.assign.overwrite' => [ 19 | [ maketext('overwrite') => 'everything' ], 20 | [ maketext('preserve') => 'new_only', selected => undef ] 21 | ], 22 | id => 'assign_data_select', 23 | class => 'form-select form-select-sm' =%> 24 |
25 |
26 |
27 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/AchievementList/cancel_edit_form.html.ep: -------------------------------------------------------------------------------- 1 | <%= maketext('Abandon changes') =%> 2 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/AchievementList/cancel_export_form.html.ep: -------------------------------------------------------------------------------- 1 | <%= maketext('Abandon export') =%> 2 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/AchievementList/create_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 |
3 | <%= label_for 'create_text', class => 'col-form-label col-form-label-sm col-auto', begin =%> 4 | <%= maketext('Create a new achievement with ID') =%>*: 5 | <% end =%> 6 |
7 | <%= text_field 'action.create.id' => '', id => 'create_text', 8 | class => 'form-control form-control-sm d-inline w-auto' =%> 9 |
10 |
11 |
12 | <%= label_for create_select => maketext("Create as what type of achievement?"), 13 | class => 'col-form-label col-form-label-sm col-auto' =%> 14 |
15 | <%= select_field 'action.create.type' => [ 16 | [ maketext('a new empty achievement') => 'empty', selected => undef ], 17 | [ maketext('a duplicate of the first selected achievement') => 'copy' ], 18 | ], 19 | id => 'create_select', 20 | class => 'form-select form-select-sm d-inline w-auto' =%> 21 |
22 |
23 |
24 | <%= maketext('Please enter in an ID for the new achievement.') %> 25 |
26 |
27 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/AchievementList/delete_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 |
3 | <%= maketext('Deletion destroys all achievement-related data and is not undoable!') =%> 4 |
5 |
6 | <%= label_for delete_select => maketext('Delete selected achievements?'), 7 | class => 'col-form-label col-form-label-sm col-auto' =%> 8 |
9 | <%= select_field 'action.delete.confirm' => [ 10 | [ maketext('No') => 'no', selected => undef ], 11 | [ maketext('Yes') => 'yes' ], 12 | ], 13 | id => 'delete_select', 14 | class => 'form-select form-select-sm d-inline w-auto me-3' =%> 15 |
16 |
17 |
18 | <%= maketext('Please confirm it is okay to delete selected achievements permanently.') %> 19 |
20 |
21 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/AchievementList/edit_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 | <%= label_for edit_select => maketext('Edit which achievements?'), 3 | class => 'col-form-label col-form-label-sm col-auto' =%> 4 |
5 | <%= select_field 'action.edit.scope' => [ 6 | [ maketext('all course achievements') => 'all' ], 7 | [ maketext('selected achievements') => 'selected', selected => undef ], 8 | ], 9 | id => 'edit_select', 10 | class => 'form-select form-select-sm' =%> 11 |
12 |
13 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/AchievementList/edit_table_row.html.ep: -------------------------------------------------------------------------------- 1 | % if ($fieldName =~ /\.enabled$/) { 2 | % # If the "enabled" checkbox is checked it returns a 1, if it is unchecked it returns nothing 3 | % # in which case the hidden field overrides the parameter with a 0. 4 | <%= check_box $fieldName => 1, 5 | 'aria-labelledby' => ($fieldName =~ s/^.*\.([^.]*)$/$1/r) . '_header', 6 | class => 'form-check-input', 7 | $value ? (checked => undef) : () =%> 8 | <%= hidden_field $fieldName => 0 =%> 9 | % } elsif ($fieldName =~ /\.assignment_type$/) { 10 | % my @allowedTypes = split(',', $value); 11 | % for my $type ([ default => 'homework' ], [ gateway => 'tests' ], [ jitar => 'just-in-time' ]) { 12 | 17 | % } 18 | % } elsif ($fieldName =~ /\.achievement_id$/) { 19 | <%= $value =%> 20 | % } else { 21 | <%= text_field $fieldName => $value, 22 | 'aria-labelledby' => ($fieldName =~ s/^.*\.([^.]*)$/$1/r) . '_header', 23 | size => $size, 24 | class => 'form-control form-control-sm' =%> 25 | % } 26 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/AchievementList/export_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 | <%= label_for export_select => maketext('Export which achievements?'), 3 | class => 'col-form-label col-form-label-sm col-auto' =%> 4 |
5 | <%= select_field 'action.export.scope' => [ 6 | [ maketext('all course achievements') => 'all' ], 7 | [ maketext('selected achievements') => 'selected', selected => undef ], 8 | ], 9 | id => 'export_select', 10 | class => 'form-select form-select-sm d-inline w-auto' =%> 11 |
12 |
13 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/AchievementList/import_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 |
3 | <%= label_for import_file_select => maketext('Import from where?'), 4 | class => 'col-form-label col-form-label-sm col-sm-auto' =%> 5 |
6 | <%= select_field 'action.import.source' => [ 7 | [ maketext('Select import file') => '', selected => undef ], 8 | @$axpList 9 | ], 10 | id => 'import_file_select', 11 | class => 'form-select form-select-sm d-inline w-auto' =%> 12 |
13 |
14 |
15 | <%= label_for import_users_select => maketext('Assign this achievement to which users?'), 16 | class => 'col-form-label col-form-label-sm col-sm-auto' =%> 17 |
18 | <%= select_field 'action.import.assign' => [ 19 | [ maketext('all current users') => 'all' ], 20 | [ maketext('no users') => 'none', selected => undef ], 21 | ], 22 | id => 'import_users_select', 23 | class => 'form-select form-select-sm d-inline w-auto' =%> 24 |
25 |
26 |
27 | <%= maketext('Please select a file to import from.') %> 28 |
29 |
30 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/AchievementList/save_edit_form.html.ep: -------------------------------------------------------------------------------- 1 | <%= maketext('Save changes') =%> 2 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/AchievementList/save_export_form.html.ep: -------------------------------------------------------------------------------- 1 | <%= maketext('Export selected achievements') =%> 2 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/AchievementList/score_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 | <%= label_for score_select => maketext('Score which achievements?'), 3 | class => 'col-form-label col-form-label-sm col-auto' =%> 4 |
5 | <%= select_field 'action.score.scope' => [ 6 | [ maketext('all course achievements') => 'all' ], 7 | [ maketext('selected achievements') => 'selected', selected => undef ], 8 | ], 9 | id => 'score_select', 10 | class => 'form-select form-select-sm d-inline w-auto' =%> 11 |
12 |
13 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/AchievementNotificationEditor/disable_form.html.ep: -------------------------------------------------------------------------------- 1 | % last unless ($c->{achievement}->email_template); 2 | <%== maketext('Disable email notifications for [_1]', tag('b', $achievementID)) %> 3 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/AchievementNotificationEditor/existing_form.html.ep: -------------------------------------------------------------------------------- 1 | % use Mojo::File qw(path); 2 | % 3 |
4 | <%= label_for 'action.existing.target_file_id' => maketext('Use existing template:'), 5 | class => 'col-form-label col-auto' =%> 6 |
7 | % my $relativeSourceFilePath = $c->getRelativeSourceFilePath($c->{sourceFilePath}); 8 | <%= select_field 'action.existing.target_file' => [ 9 | map { [ $_ =~ s/(\.html)?\.ep//r => $_, $_ eq $relativeSourceFilePath ? (selected => undef) : () ] } 10 | @{ path($ce->{courseDirs}{achievement_notifications})->list->grep(qr/\.ep$/) 11 | ->map(sub { $c->getRelativeSourceFilePath($_) })->to_array } 12 | ], 13 | id => 'action.existing.target_file_id', class => 'form-select form-select-sm d-inline w-auto', 14 | dir => 'ltr' =%> 15 |
16 |
17 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/AchievementNotificationEditor/save_as_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 |
3 | <%= label_for 'action.save_as.target_file_id' => maketext('Save as:'), class => 'col-form-label col-auto' =%> 4 |
5 |
6 | [ACHEVNOTIFYDIR]/ 7 | % param('action.save_as.target_file', $c->getRelativeSourceFilePath($c->{sourceFilePath})); 8 | <%= text_field 'action.save_as.target_file' => '', id => 'action.save_as.target_file_id', size => 40, 9 | class => 'form-control form-control-sm', dir => 'ltr' =%> 10 |
11 |
12 |
13 |
14 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/AchievementNotificationEditor/save_form.html.ep: -------------------------------------------------------------------------------- 1 | % if (-w $c->{sourceFilePath}) { 2 | <%== maketext('Save [_1]', tag('b', $c->shortPath($c->{sourceFilePath}))) %> 3 | % } 4 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/FileManager/confirm.html.ep: -------------------------------------------------------------------------------- 1 |
2 |
3 | <%= $message =%> 4 | <%= text_field name => $value, size => 50, class => 'form-control mt-3' =%> 5 |
6 | <%= submit_button maketext('Cancel'), name => 'formAction', class => 'btn btn-sm btn-secondary' =%> 7 | <%= submit_button $button, name => 'formAction', class => 'btn btn-sm btn-secondary' =%> 8 | % if ($button2) { 9 | <%= submit_button $button2, name => 'formAction', class => 'btn btn-sm btn-secondary' =%> 10 | % } 11 |
12 |
13 |
14 | <%= hidden_field confirmed => $button =%> 15 | <%= $c->HiddenFlags =%> 16 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/FileManager/refresh_edit.html.ep: -------------------------------------------------------------------------------- 1 | % my $name = "$c->{pwd}/$file" =~ s!^\./?!!r; 2 | % my %button = (name => 'action', class => 'btn btn-sm btn-secondary w-100'); 3 | % 4 |
5 |
<%= $name %>
6 |
7 |
8 |
9 | % param('data', $contents); 10 | <%= text_area data => '', rows => 30, columns => 80, dir => 'auto', 11 | class => 'file-manager-editor form-control' =%> 12 |
13 |
14 |
15 | % my $canRevert = -f "$c->{courseRoot}/$c->{pwd}/$file"; 16 |
17 | <%= submit_button maketext('Cancel'), %button %> 18 |
19 | % if ($canRevert) { 20 |
<%= submit_button maketext('Revert'), %button %>
21 | % } 22 |
23 | <%= submit_button maketext('Save'), %button %> 24 |
25 |
26 |
27 | <%= submit_button maketext('Save As'), name => 'action', class => 'btn btn-sm btn-secondary' =%> 28 | <%= text_field name => '', size => 20, class => 'form-control form-control-sm' =%> 29 |
30 |
31 |
32 | % 33 | <%= hidden_field files => $file =%> 34 | <%= $c->HiddenFlags =%> 35 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/FileManager/view.html.ep: -------------------------------------------------------------------------------- 1 | % use WeBWorK::Utils::Files qw(readFile); 2 | % 3 | % my $fileManagerURL = $c->systemLink(url_for, params => { download => $filename, pwd => $c->{pwd} } ); 4 | % 5 | % # Include a download link 6 |
7 | <%= $name %> 8 |
9 | <%= link_to maketext('Download') => $fileManagerURL, class => 'btn btn-primary' =%> 10 | % if (-T $file) { 11 | <%= link_to maketext('Edit') => 12 | $c->systemLink(url_for, params => { action => 'Edit', files => [$filename], pwd => $c->{pwd} } ), 13 | class => 'btn btn-primary' =%> 14 | % } 15 |
16 |
17 |
18 | % 19 | % # For files display the file, if possible. If the file is an image, display it as an image. 20 | % if (-T $file) { # Check that it is a text file 21 |
<%= readFile($file) =%>
22 | % } elsif ($file =~ m/\.(gif|jpg|png)$/i) { 23 | <%= image $fileManagerURL, style => 'border:0;', alt => $name =%> 24 | % } else { 25 |
26 | <%= maketext('The file "[_1]" does not appear to be a text or image file.', $file) =%> 27 |
28 | % } 29 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/JobManager/delete_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 |
3 | <%= label_for delete_select => maketext('Delete which jobs?'), 4 | class => 'col-form-label col-form-label-sm col-auto' =%> 5 |
6 | <%= select_field 'action.delete.scope' => [ 7 | [ maketext('no jobs') => 'none', selected => undef ], 8 | [ maketext('selected jobs') => 'selected' ] 9 | ], 10 | id => 'delete_select', class => 'form-select form-select-sm' =%> 11 |
12 |
13 |
14 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/PGProblemEditor/add_problem_form.html.ep: -------------------------------------------------------------------------------- 1 | % use WeBWorK::Utils::Sets qw(format_set_name_display); 2 | % 3 | % last unless $c->{is_pg}; 4 | % 5 | % my $allSetNames = [ map { $_->[0] =~ s/^set|\.def$//gr } $db->listGlobalSetsWhere({}, 'set_id') ]; 6 | % 7 |
8 |
9 | <%= label_for action_add_problem_target_set_id => maketext('Add to what set?'), 10 | class => 'col-form-label col-auto' =%> 11 |
12 | <%= select_field 'action.add_problem.target_set' => [ 13 | map { [ 14 | format_set_name_display($_) => $_, $_ eq ($c->{setID} // '') ? (selected => undef) : () 15 | ] } @$allSetNames 16 | ], 17 | id => 'action_add_problem_target_set_id', class => 'form-select form-select-sm d-inline w-auto', 18 | dir => 'ltr' =%> 19 |
20 |
21 |
22 | <%= label_for action_add_problem_file_type_id => maketext('Add as what filetype?'), 23 | class => 'col-form-label col-auto' =%> 24 |
25 | <%= select_field 'action.add_problem.file_type' => [ 26 | map { [ $_ =~ s/_/ /gr => $_, $c->{file_type} eq $_ ? (selected => undef) : () ] } 27 | ('problem', 'set_header', 'hardcopy_header') 28 | ], 29 | id => 'action_add_problem_file_type_id', class => 'form-select form-select-sm d-inline w-auto' =%> 30 |
31 |
32 |
33 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/ProblemGrader/siblings.html.ep: -------------------------------------------------------------------------------- 1 | % use WeBWorK::Utils::JITAR qw(jitar_id_to_seq); 2 | % 3 | % unless ($set 4 | % && $authz->hasPermissions(param('user'), 'access_instructor_tools') 5 | % && $authz->hasPermissions(param('user'), 'problem_grader')) 6 | % { 7 | % last; 8 | % } 9 | % 10 |
11 |

<%= maketext('Problems') %>

12 | 24 |
25 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/ProblemSetDetail/attempts_row.html.ep: -------------------------------------------------------------------------------- 1 | 2 | <%= label_for "problem.$problemID.attempts.id" => maketext('Attempts') =%> 3 | 4 | 5 | <%= text_field "problem.$problemID.attempts", 6 | ($problemRecord->num_correct || 0) + ($problemRecord->num_incorrect || 0), 7 | id => "problem.$problemID.attempts.id", class => 'form-control-plaintext form-control-sm', 8 | readonly => undef, size => 5 =%> 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/ProblemSetDetail/ip_locations_row.html.ep: -------------------------------------------------------------------------------- 1 | 2 | 3 | <%= label_for "set.$setID.selected_ip_locations_id" => maketext('Restrict Locations'), 4 | $forUsers 5 | ? (id => "set.$setID.selected_ip_locations.label", class => 'form-check-label') 6 | : (class => 'form-label') =%> 7 | 8 | 9 | 10 | <%= select_field "set.$setID.selected_ip_locations" => [ 11 | $forUsers ? [ maketext('Set Default') => '', %$defaultLocations ? () : (selected => undef) ] : (), 12 | map { [ $_ => $_, $defaultLocations->{$_} ? (selected => undef) : () ] } @$locations 13 | ], 14 | id => "set.$setID.selected_ip_locations_id", size => 5, multiple => undef, 15 | class => 'form-select form-select-sm' =%> 16 | 17 | % if ($forUsers) { 18 | 19 | <%= text_area "set.$setID.selected_ip_locations.class_value" => join("\n", @$globalLocations), 20 | readonly => undef, rows => 5, class => 'form-control form-control-sm', 21 | 'aria-labelledby' => "set.$setID.selected_ip_locations.label" =%> 22 | 23 | % } 24 | 25 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/ProblemSetList/cancel_edit_form.html.ep: -------------------------------------------------------------------------------- 1 | <%= maketext('Abandon changes') %> 2 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/ProblemSetList/cancel_export_form.html.ep: -------------------------------------------------------------------------------- 1 | <%= maketext('Abandon export') %> 2 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/ProblemSetList/create_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 |
3 | <%= label_for 'create_text', class => 'col-form-label col-form-label-sm col-auto', begin =%> 4 | <%= maketext('Name the new set') =%>*: 5 | <% end =%> 6 |
7 | <%= text_field 'action.create.name' => '', id => 'create_text', maxlength => '100', 8 | 'aria-required' => 'true', class => 'form-control form-control-sm', dir => 'ltr' =%> 9 |
10 |
11 |
12 | <%= label_for create_select => maketext("Create as what type of set?"), 13 | class => 'col-form-label col-form-label-sm col-auto' =%> 14 |
15 | <%= select_field 'action.create.type' => [ 16 | [ maketext('a new empty set') => 'empty', selected => undef ], 17 | [ maketext('a duplicate of the first selected set') => 'copy' ] 18 | ], 19 | id => 'create_select', class => 'form-select form-select-sm' =%> 20 |
21 |
22 |
23 | <%= maketext('Please enter a name for the new set.') %> 24 |
25 |
26 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/ProblemSetList/delete_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 |
3 | <%= maketext('Warning: Deletion destroys all set-related data and is not undoable!') =%> 4 |
5 |
6 | <%= label_for delete_select => maketext('Delete selected sets?'), 7 | class => 'col-form-label col-form-label-sm col-auto' =%> 8 |
9 | <%= select_field 'action.delete.confirm' => [ 10 | [ maketext('No') => 'no', selected => undef ], 11 | [ maketext('Yes') => 'yes' ] 12 | ], 13 | id => 'delete_select', class => 'form-select form-select-sm' =%> 14 |
15 |
16 |
17 | <%= maketext('Please confirm it is okay to delete selected sets permanently.') %> 18 |
19 |
20 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/ProblemSetList/edit_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 | <%= label_for edit_select => maketext('Edit which sets?'), class => 'col-form-label col-form-label-sm col-auto' =%> 3 |
4 | <%= select_field 'action.edit.scope' => [ 5 | [ maketext('all course sets') => 'all' ], 6 | [ maketext('selected sets') => 'selected', selected => undef ] 7 | ], 8 | id => 'edit_select', class => 'form-select form-select-sm' =%> 9 |
10 |
11 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/ProblemSetList/export_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 | <%= label_for export_select => maketext('Prepare which sets for export?'), 3 | class => 'col-form-label col-form-label-sm col-auto' =%> 4 |
5 | <%= select_field 'action.export.scope' => [ 6 | [ maketext('all course sets') => 'all' ], 7 | [ maketext('selected sets') => 'selected', selected => undef ], 8 | ], 9 | id => 'export_select', class => 'form-select form-select-sm' =%> 10 |
11 |
12 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/ProblemSetList/publish_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 |
3 | <%= label_for publish_select => maketext('Choose which sets to be affected') . ':', 4 | class => 'col-form-label col-form-label-sm col-sm-auto' =%> 5 |
6 | <%= select_field 'action.publish.scope' => [ 7 | [ maketext('all course sets') => 'all' ], 8 | [ maketext('selected sets') => 'selected', selected => undef ] 9 | ], 10 | id => 'publish_select', class => 'form-select form-select-sm' =%> 11 |
12 |
13 |
14 | <%= label_for publish_visibility_select => maketext('Choose visibility of the sets to be affected') . ':', 15 | class => 'col-form-label col-form-label-sm col-sm-auto' =%> 16 |
17 | <%= select_field 'action.publish.value' => [ 18 | [ maketext('Hidden') => 0 ], 19 | [ maketext('Visible') => 1, selected => undef ] 20 | ], 21 | id => 'publish_visibility_select', class => 'form-select form-select-sm d-inline w-auto' =%> 22 |
23 |
24 |
25 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/ProblemSetList/save_edit_form.html.ep: -------------------------------------------------------------------------------- 1 | <%= maketext('Save changes') %> 2 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/ProblemSetList/save_export_form.html.ep: -------------------------------------------------------------------------------- 1 | <%= maketext('Confirm which sets to export.') %> 2 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/ProblemSetList/score_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 | <%= label_for score_select => maketext('Score which sets?'), 3 | class => 'col-form-label col-form-label-sm col-auto' =%> 4 |
5 | <%= select_field 'action.score.scope' => [ 6 | [ maketext('all course sets') => 'all' ], 7 | [ maketext('selected sets') => 'selected', selected => undef ] 8 | ], 9 | id => 'score_select', class => 'form-select form-select-sm' =%> 10 |
11 |
12 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/ProblemSetList/sort_button.html.ep: -------------------------------------------------------------------------------- 1 | % if ($c->{primarySortField} eq $field) { 2 | 13 | % } elsif ($c->{secondarySortField} eq $field) { 14 | 25 | % } 26 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/SendMail.html.ep: -------------------------------------------------------------------------------- 1 | % use WeBWorK::Utils qw(getAssetURL); 2 | % 3 | % content_for js => begin 4 | <%= javascript getAssetURL($ce, 'js/SendMail/sendmail.js'), defer => undef =%> 5 | % end 6 | % 7 | % unless ($authz->hasPermissions(param('user'), 'access_instructor_tools')) { 8 |
<%= maketext('You are not authorized to access instructor tools') %>
9 | % last; 10 | % } 11 | % 12 | % unless ($authz->hasPermissions(param('user'), 'send_mail')) { 13 |
<%= maketext('You are not authorized to send mail to students') %>
14 | % last; 15 | % } 16 | % 17 | % my $response = $c->{response} // ''; 18 | % 19 | % if ($response eq 'preview') { 20 | <%= $c->print_preview =%> 21 | % } else { 22 | % if ($response eq 'send_email' && $c->{ra_send_to} && @{ $c->{ra_send_to} }) { 23 | % my $message = begin 24 | 25 | <%= maketext( 26 | 'Email is being sent to [quant,_1,recipient]. ' 27 | . 'This job may take several minutes to complete if the class is large. ' 28 | . 'Go to the "Job Manager" to see the status of this job.', 29 | scalar(@{ $c->{ra_send_to} }) 30 | ) =%> 31 | 32 | % end 33 | % $c->addgoodmessage($message->()); 34 | % } 35 | % 36 | <%= include('ContentGenerator/Instructor/SendMail/main_form') =%> 37 | % } 38 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/SendMail/preview.html.ep: -------------------------------------------------------------------------------- 1 |

<%= maketext('This sample mail would be sent to [_1]', $ur->email_address) %>

2 |
<%= $msg %>
3 | % if ($c->{merge_file}) { 4 |

<%= maketext('Merge file data:') %>

5 |

<%= maketext('Showing data from merge file [_1] for user [_2]:', $c->{merge_file}, $ur->user_id) %>

6 |
<%== $preview_header %>
7 | % } else { 8 |

<%= maketext('No merge file selected.') %>

9 | % } 10 | % if (@{ $c->{ra_send_to} }) { 11 |

<%= maketext('Emails to be sent to the following:') %>

12 |
13 |
    14 | % for (@{ $c->{ra_send_to} }) { 15 |
  • 16 | <%= $_ %> 17 | % if ($c->{merge_file} && !$merge_data->{$student_ids->{$_}}) { 18 | (<%= maketext('No merge data found') %>) 19 | % } 20 |
  • 21 | % } 22 |
23 |
24 | % } else { 25 |

<%= maketext('No recipients selected.') %>

26 | % } 27 |
<%= maketext('Use browser back button to return from preview mode.') %>
28 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/SetMaker/browse_course_sets_panel.html.ep: -------------------------------------------------------------------------------- 1 | % use WeBWorK::Utils::Sets qw(format_set_name_display); 2 | % 3 | % $selected_library //= ''; 4 | % 5 |
6 |
7 | <%= label_for library_sets => maketext('Browse from:'), class => 'col-form-label-sm' =%> 8 | <%= select_field library_sets => [ 9 | @$local_sets == 0 ? [ maketext('No sets in this course yet') => '' ] 10 | : ( 11 | $selected_library eq '' ? [ maketext('Select a Homework Set') => '', selected => undef, disabled => 'disabled' ] : (), 12 | map { [ format_set_name_display($_) => $_, $_ eq $selected_library ? (selected => undef) : () ] } 13 | @$local_sets 14 | ) 15 | ], 16 | id => 'library_sets', class => 'form-select form-select-sm d-inline w-auto', dir => 'ltr' =%> 17 |
18 | <%= include 'ContentGenerator/Instructor/SetMaker/view_problems_line', internal_name => 'view_course_set' =%> 19 |
20 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/SetMaker/browse_library_panel.html.ep: -------------------------------------------------------------------------------- 1 | % # See if the problem library is installed. 2 | % my $libraryRoot = $ce->{problemLibrary}{root}; 3 | % unless ($libraryRoot) { 4 |
The problem library has not been installed.
5 | % last; 6 | % } 7 | % # Test if the Library directory link exists. If not, try to make it. 8 | % unless (-d "$ce->{courseDirs}{templates}/Library" 9 | % || symlink($libraryRoot, "$ce->{courseDirs}{templates}/Library")) 10 | % { 11 | % my $msg = begin 12 | You are missing the directory templates/Library, which is needed for the Problem Library to function. 13 | It should be a link pointing to <%= $libraryRoot %>, which you set in conf/site.conf. An 14 | attempt was made to create the link, but that failed. Check the permissions in your templates 15 | directory. 16 | % end 17 | % $c->addbadmessage($msg->()); 18 | % } 19 | % 20 | % if ($c->{library_basic} == 1) { 21 | <%= include 'ContentGenerator/Instructor/SetMaker/browse_library_panel_simple' =%> 22 | % } else { 23 | <%= include 'ContentGenerator/Instructor/SetMaker/browse_library_panel_advanced' =%> 24 | % } 25 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/SetMaker/browse_local_panel.html.ep: -------------------------------------------------------------------------------- 1 | % $selected_library //= ''; 2 | % my $lib = (stash('lib') || '') =~ s/^browse_//r; 3 | % 4 | % my $prob_dirs = $c->get_problem_directories($lib); 5 | % 6 |
7 |
8 | % my $courseFilesText = maketext('Course Files'); 9 | <%= label_for library_sets => maketext('[_1] Problems:', $lib eq '' ? $courseFilesText : $c->{problibs}{$lib}), 10 | class => 'col-form-label-sm' =%> 11 | <%= select_field library_sets => [ 12 | @$prob_dirs == 0 ? [ maketext('Found no directories containing problems') => '' ] 13 | : ( 14 | $selected_library eq '' 15 | ? [ maketext('Select a Folder') => '', selected => undef, disabled => 'disabled' ] 16 | : (), 17 | $lib ? ( 18 | map { [ $_ =~ s/^$lib\/(.*)$/$1/r => $_, $_ eq $selected_library ? (selected => undef) : () ] } 19 | @$prob_dirs 20 | ) : ( 21 | map { [ 22 | $_ =~ s/^My Problems$/[templates folder]/r => $_, 23 | $_ eq $selected_library ? (selected => undef) : () 24 | ] } 25 | @$prob_dirs 26 | ) 27 | ) 28 | ], 29 | id => 'library_sets', class => 'form-select form-select-sm d-inline w-auto' =%> 30 |
31 | <%= include 'ContentGenerator/Instructor/SetMaker/view_problems_line', internal_name => 'view_local_set' =%> 32 |
33 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/SetMaker/library-include-checks.html.ep: -------------------------------------------------------------------------------- 1 | % if (-d "$ce->{courseDirs}{templates}/Contrib" && -r "$ce->{courseDirs}{templates}/Contrib") { 2 |
3 | % param('includeOPL', 'on') unless defined param('includeOPL'); 4 | <%= check_box includeOPL => 'on', id => 'includeOPL', class => 'form-check-input' =%> 5 | <%= label_for includeOPL => maketext('Include OPL'), class => 'form-check-label' =%> 6 | <%= hidden_field includeOPL => 0 =%> 7 |
8 |
9 | <%= check_box includeContrib => 'on', id => 'includeContrib', class => 'form-check-input' =%> 10 | <%= label_for includeContrib => maketext('Include Contrib'), class => 'form-check-label' =%> 11 |
12 | % } else { 13 | <%= hidden_field includeOPL => 1 =%> 14 | % } 15 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/ShowAnswers.html.ep: -------------------------------------------------------------------------------- 1 | % unless ($authz->hasPermissions(param('user'), 'view_answers')) { 2 |
<%= maketext('You are not authorized to view past answers') %>
3 | % last; 4 | % } 5 | % 6 | % # Only instructors should be able to veiw other people's answers. 7 | % my $isInstructor = $authz->hasPermissions(param('user'), 'access_instructor_tools'); 8 | % 9 | % if ($isInstructor) { 10 | <%= include 'ContentGenerator/Instructor/ShowAnswers/instructor-selectors', $c->getInstructorData =%> 11 | % } 12 | % 13 | <%= include 'ContentGenerator/Instructor/ShowAnswers/past-answers-table', isInstructor => $isInstructor =%> 14 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/Stats.html.ep: -------------------------------------------------------------------------------- 1 | % use WeBWorK::Utils qw(getAssetURL); 2 | % 3 | % unless ($authz->hasPermissions(param('user'), 'access_instructor_tools')) { 4 |
<%= maketext('You are not authorized to access instructor tools') %>
5 | % last; 6 | % } 7 | % 8 | % if (current_route eq 'instructor_user_statistics') { 9 | % # Stats and StudentProgress share this template. 10 | <%= include 'ContentGenerator/Instructor/Stats/student_stats' =%> 11 | % } elsif (current_route eq 'instructor_set_statistics') { 12 | <%= $c->set_stats =%> 13 | % } elsif (current_route eq 'instructor_problem_statistics') { 14 | <%= $c->problem_stats =%> 15 | % } else { 16 | % # Stats and StudentProgress share this template also. 17 | <%= include 'ContentGenerator/Instructor/Stats/index', 18 | set_header => maketext('View statistics by set'), 19 | student_header => maketext('View statistics by student') =%> 20 | % } 21 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/Stats/problem_menu.html.ep: -------------------------------------------------------------------------------- 1 | % use WeBWorK::Utils::JITAR qw(jitar_id_to_seq); 2 | % 3 |
4 | <%= link_to $c->{prettyID} ? maketext('Problem [_1]', $c->{prettyID}) : maketext('All problems') => '#', 5 | id => 'problemMenu', class => 'btn btn-primary dropdown-toggle', role => 'button', 'aria-expanded' => 'false', 6 | data => { bs_toggle => 'dropdown' } =%> 7 | 30 |
\ 31 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/Stats/stats_table.html.ep: -------------------------------------------------------------------------------- 1 |
2 | 3 | % while (@$tableHeaders && @$tableData) { 4 | 5 | 6 | % for (@{ shift @$tableData }) { 7 | 8 | % } 9 | 10 | % } 11 |
<%= shift @$tableHeaders %><%= $_ %>
12 |
13 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/Stats/student_filter_menu.html.ep: -------------------------------------------------------------------------------- 1 | % last unless @$filters > 1; 2 | % 3 | % # Create a section/recitation "filter by" dropdown if there are sections or recitations. 4 |
5 | % my $filter = param('filter') || 'all'; 6 | % my $current_filter = $filters->[0][0]; 7 | % for (@$filters) { 8 | % $current_filter = $_->[0] if $_->[1] eq $filter; 9 | % } 10 | <%= link_to $current_filter => '#', id => 'filter', class => 'btn btn-primary dropdown-toggle', 11 | role => 'button', 'aria-expanded' => 'false', data => { bs_toggle => 'dropdown' } =%> 12 | 20 |
21 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/Stats/student_stats.html.ep: -------------------------------------------------------------------------------- 1 | % # Note that this template is used by both WeBWorK::ContentGenerator::Instructor::Stats and 2 | % # WeBWorK::ContentGenerator::Instructor::StudentProgress. 3 | % 4 | % use WeBWorK::ContentGenerator::Grades; 5 | % 6 | % my $studentRecord = $db->getUser($c->{studentID}); 7 | % unless ($studentRecord) { 8 |
<%= maketext('Record for user [_1] not found.', $c->{studentID}) %>
9 | % last; 10 | % } 11 | % 12 | % my $email = $studentRecord->email_address; 13 | % if ($email) { 14 | <%= link_to $email => "mailto:$email" =%> 15 |
16 | % } 17 | % if ($studentRecord->section ne '') { 18 | <%= maketext('Section') =%>: <%= $studentRecord->section %> 19 |
20 | % } 21 | % if ($studentRecord->recitation ne '') { 22 | <%= maketext('Recitation') =%>: <%= $studentRecord->recitation %> 23 |
24 | % } 25 | % if ($authz->hasPermissions(param('user'), 'become_student')) { 26 | <%= maketext('Act as:') =%> 27 | <%= link_to $studentRecord->user_id => 28 | $c->systemLink(url_for('set_list'), params => { effectiveUser => $c->{studentID} }) =%> 29 | % } 30 | <%= WeBWorK::ContentGenerator::Grades::displayStudentStats($c, $c->{studentID}) =%> 31 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/StudentProgress.html.ep: -------------------------------------------------------------------------------- 1 | % unless ($authz->hasPermissions(param('user'), 'access_instructor_tools')) { 2 |
<%= maketext('You are not authorized to access instructor tools') %>
3 | % last; 4 | % } 5 | % 6 | % if (current_route eq 'instructor_user_progress') { 7 | % # Stats and StudentProgress share this template. 8 | <%= include 'ContentGenerator/Instructor/Stats/student_stats' =%> 9 | % } elsif (current_route eq 'instructor_set_progress') { 10 | <%= $c->displaySets =%> 11 | % } else { 12 | % # Stats and StudentProgress share this template also. 13 | <%= include 'ContentGenerator/Instructor/Stats/index', 14 | set_header => maketext('View student progress by set'), 15 | student_header => maketext('View student progress by student') =%> 16 | % } 17 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/UserList/add_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 | <%= label_for 'add_entry', class => 'col-form-label col-form-label-sm col-auto', begin =%> 3 | <%= maketext('Add how many users?') %>* 4 | <% end =%> 5 |
6 | <%= number_field number_of_students => 1, id => 'add_entry', min => 1, 'aria-required' => 'true', 7 | class => 'form-control form-control-sm', style => 'width: 6em' =%> 8 |
9 |
10 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/UserList/cancel_edit_form.html.ep: -------------------------------------------------------------------------------- 1 | <%= maketext('Abandon changes') =%> 2 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/UserList/delete_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 |
3 | <%= maketext('Warning: Deletion destroys all user-related data and is not undoable!') =%> 4 |
5 |
6 | <%= label_for delete_select => maketext('Delete selected users?'), 7 | class => 'col-form-label col-form-label-sm col-auto' =%> 8 |
9 | <%= select_field 'action.delete.confirm' => [ 10 | [ maketext('No') => 'no', selected => undef ], 11 | [ maketext('Yes') => 'yes' ] 12 | ], 13 | id => 'delete_select', class => 'form-select form-select-sm' =%> 14 |
15 |
16 |
17 | <%= maketext('Please confirm it is okay to delete selected users permanently.') %> 18 |
19 |
20 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/UserList/edit_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 | <%= label_for edit_select => maketext('Edit which users?'), class => 'col-form-label col-form-label-sm col-auto' =%> 3 |
4 | <%= select_field 'action.edit.scope' => [ 5 | [ maketext('all course users') => 'all' ], 6 | [ maketext('selected users') => 'selected', selected => undef ] 7 | ], 8 | id => 'edit_select', class => 'form-select form-select-sm' =%> 9 |
10 |
11 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/UserList/reset_2fa_form.html.ep: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | <%= maketext('Warning: This will make users need to setup two factor authentication again! Only do this ' 5 | . 'for users that can no longer access the course due the account being lost in the authenticator app.') 6 | =%> 7 | 8 |
9 |
10 | <%= label_for reset_2fa_select => maketext('Reset two factor authentication for selected users?'), 11 | class => 'col-form-label col-form-label-sm col-auto' =%> 12 |
13 | <%= select_field 'action.reset_2fa.confirm' => [ 14 | [ maketext('No') => 'no', selected => undef ], 15 | [ maketext('Yes') => 'yes' ] 16 | ], 17 | id => 'reset_2fa_select', class => 'form-select form-select-sm' =%> 18 |
19 |
20 |
21 | <%= maketext('Please confirm it is okay to reset two factor authentication for selected users.') %> 22 |
23 |
24 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Instructor/UserList/save_edit_form.html.ep: -------------------------------------------------------------------------------- 1 | <%= maketext('Save changes') %> 2 | -------------------------------------------------------------------------------- /templates/ContentGenerator/LTI/content_item_selection_error.html.ep: -------------------------------------------------------------------------------- 1 | 2 | output_course_lang_and_dir %>> 3 | % 4 | 5 | 6 | 7 | <%= maketext('Available Content') %> 8 | <%= stylesheet $c->url({ type => 'webwork', name => 'theme', file => 'bootstrap.css' }) =%> 9 | 10 | % 11 | 12 |
13 | 14 | % if (stash->{contextData}) { 15 |
16 | <%= maketext('An LTI content item request was received with no associated LMS course. ' 17 | . 'The following parameters were received which can be used to make this association:') =%> 18 |
19 | 20 | % for (@{ stash->{contextData} }) { 21 | 22 | % } 23 |
<%= $_->[0] %><%= $_->[1] %>
24 | % } 25 |
26 | 27 | % 28 | 29 | -------------------------------------------------------------------------------- /templates/ContentGenerator/LTI/self_posting_form.html.ep: -------------------------------------------------------------------------------- 1 | <%= form_for $form_target, method => 'POST', enctype => 'application/x-www-form-urlencoded', 2 | name => 'ltiRepost', id => 'ltiRepost', begin =%> 3 | % for (keys %$form_params) { 4 | <%= hidden_field $_ => $form_params->{$_} =%> 5 | % } 6 | <% end =%> 7 | <%= javascript begin =%> 8 | document.ltiRepost.submit(); 9 | <% end =%> 10 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Logout.html.ep: -------------------------------------------------------------------------------- 1 |

<%= maketext('You have been logged out of WeBWorK.') =%>

2 | % 3 | % # This should be set in the course environment when a sequence of authentication modules is used. 4 | % if ($ce->{external_auth} || $authen->{external_auth}) { 5 |

6 | <%== maketext( 7 | 'The course [_1] uses an external authentication system ([_2]). Please go there to log in again.', 8 | tag('strong', stash('courseID')), 9 | $ce->{LTI}{ $ce->{LTIVersion} }{LMS_url} 10 | ? link_to(tag('strong', $ce->{LTI}{ $ce->{LTIVersion} }{LMS_name}) => 11 | $ce->{LTI}{ $ce->{LTIVersion} }{LMS_url}) 12 | : $ce->{LTI}{ $ce->{LTIVersion} }{LMS_name} 13 | ) =%> 14 |

15 | % } else { 16 | <%= form_for 'set_list', method => 'POST', begin =%> 17 | <%= hidden_field force_passwd_authen => 1 =%> 18 |

<%= submit_button maketext('Log In Again'), name => 'submit', class => 'btn btn-primary' =%>

19 | <% end =%> 20 | % } 21 | -------------------------------------------------------------------------------- /templates/ContentGenerator/PODViewer.html.ep: -------------------------------------------------------------------------------- 1 | % layout 'pod_viewer'; 2 | % title maketext('PG POD'); 3 | % 4 | % my %section_names = ( 5 | % doc => maketext('Documentation'), 6 | % lib => maketext('Libraries'), 7 | % macros => maketext('Macros') 8 | % ); 9 | % 10 | % for my $section (sort keys %$sections) { 11 | % content_for toc => begin 12 | <%= link_to $section_names{$section} => "#$section", class => 'nav-link' %> 13 | % end 14 | % content_for subjects => begin 15 |

<%= $section_names{$section} %>

16 |
17 | % for (@{ $sections->{$section} }) { 18 | % my $link_name = $_; 19 | % $link_name = $1 =~ s!/!::!gr if $link_name =~ m/^(.*)\.pm$/; 20 | <%= link_to $link_name, 'pod_viewer', { filePath => "$section/$_" }, 21 | class => 'list-group-item list-group-item-action' =%> 22 | % } 23 |
24 | % end 25 | % } 26 | % content_for sidebar => begin 27 | 30 | % end 31 | <%= content 'subjects' %> 32 | -------------------------------------------------------------------------------- /templates/ContentGenerator/PODViewer/POD.html.ep: -------------------------------------------------------------------------------- 1 | % layout 'pod_viewer'; 2 | % my $title = $filePath =~ s!^[^/]*/!!r; 3 | % $title = $1 =~ s!/!::!gr if $title =~ m/^(.*)\.pm$/; 4 | % title $title; 5 | % 6 | % content_for sidebar => begin 7 | 16 | % end 17 | % 18 | % if (stash('podHTML')) { 19 | <%== stash('podHTML') =%> 20 | % } elsif (stash('podError')) { 21 | <%= maketext('Error generating POD for file [_1]: [_2]', $filePath, stash('podError')) =%> 22 | % } else { 23 | <%= maketext('Macro file [_1] not found.', $filePath) =%> 24 | % } 25 | -------------------------------------------------------------------------------- /templates/ContentGenerator/Problem/instructor_buttons.html.ep: -------------------------------------------------------------------------------- 1 | % last unless $authz->hasPermissions(param('user'), 'access_instructor_tools'); 2 | % 3 |
4 | % if ($c->{can}{showCorrectAnswers}) { 5 | <%= submit_button maketext('Show Correct Answers'), name => 'showCorrectAnswers', 6 | class => 'btn btn-primary mb-1' =%> 7 | % } 8 | % if ($c->{can}{showProblemGrader} && !$c->{will}{showMeAnother}) { 9 | % if ($c->{will}{showProblemGrader}) { 10 | <%= submit_button maketext('Hide Problem Grader'), name => 'hideProblemGrader', 11 | class => 'btn btn-primary mb-1' =%> 12 | <%= hidden_field showProblemGrader => 1 =%> 13 | % } else { 14 | <%= submit_button maketext('Show Problem Grader'), name => 'showProblemGrader', 15 | class => 'btn btn-primary mb-1' =%> 16 | % } 17 | % } 18 |
19 | -------------------------------------------------------------------------------- /templates/ContentGenerator/ProblemSet.html.ep: -------------------------------------------------------------------------------- 1 | % use WeBWorK::Utils::DateTime qw(before between); 2 | % 3 | % if ( 4 | % $c->{invalidSet} 5 | % && ($c->{invalidSet} !~ /^Client ip address .* is not in the list of addresses/ 6 | % || $authz->{merged_set}->assignment_type !~ /gateway/) 7 | % ) 8 | % { 9 |
10 |

11 | <%= maketext( 12 | 'The selected problem set ([_1]) is not a valid set for [_2].', 13 | stash('setID'), param('effectiveUser') 14 | ) =%> 15 |

16 |

<%= $c->{invalidSet} %>

17 |
18 | % last; 19 | % } 20 | % 21 | % my $set = $c->{set}; 22 | % 23 | % # Stats message displays the current status of the set and states the next important date. 24 | <%= include 'ContentGenerator/Base/set_status', set => $set =%> 25 | % 26 | <%= $set->assignment_type =~ /gateway/ ? $c->gateway_body : $c->problem_list =%> 27 | % 28 |
29 | <%= $c->feedbackMacro( 30 | route => current_route, 31 | set => $set->set_id, 32 | problem => '', 33 | displayMode => $c->{displayMode}, 34 | showOldAnswers => '', 35 | showCorrectAnswers => '', 36 | showHints => '', 37 | showSolutions => '', 38 | ) =%> 39 |
40 | -------------------------------------------------------------------------------- /templates/ContentGenerator/ProblemSet/info.html.ep: -------------------------------------------------------------------------------- 1 | % if (defined $c->{set} && $authz->hasPermissions(param('user'), 'modify_problem_sets')) { 2 |

3 | <%= maketext('Set Info') =%> 4 | <%= link_to maketext('Edit') => $c->systemLink( 5 | url_for('instructor_problem_editor_withset_withproblem', setID => $c->{set}->set_id, problemID => 0), 6 | params => { file_type => 'set_header' } 7 | ), 8 | target => 'WW_Editor', class => 'btn btn-sm btn-info m-1' =%> 9 |

10 | % } else { 11 |

<%= maketext('Set Info') %>

12 | % } 13 | % 14 | % if ($c->{pg}{flags}{error_flag}) { 15 |
16 | <%= $c->errorOutput($c->{pg}{errors}, $c->{pg}{body_text}) =%> 17 |
18 | % } else { 19 | <%== $c->{pg}{body_text} =%> 20 | % } 21 | -------------------------------------------------------------------------------- /templates/ContentGenerator/ProblemSet/siblings.html.ep: -------------------------------------------------------------------------------- 1 | % use WeBWorK::Utils::Sets qw(format_set_name_display); 2 | % 3 |
4 |

<%= maketext('Sets') %>

5 | 17 |
18 | -------------------------------------------------------------------------------- /templates/ContentGenerator/ProblemSets/info.html.ep: -------------------------------------------------------------------------------- 1 | % last unless stash('course_info_contents') || stash('course_info_error'); 2 | % 3 | % if ($authz->hasPermissions(param('user'), 'access_instructor_tools')) { 4 |

5 | <%= maketext('Course Info') =%> 6 | <%= link_to(maketext('Edit') => 7 | $c->systemLink(url_for('instructor_problem_editor'), params => { file_type => 'course_info' }), 8 | target => 'WW_Editor', class => 'btn btn-sm btn-info m-1') =%> 9 |

10 | % if (stash('course_info_error')) { 11 |
<%= stash('course_info_error') %>
12 | % } 13 | % } else { 14 |

<%= maketext('Course Info') %>

15 | % } 16 | % 17 | % if (stash('course_info_contents')) { 18 | <%== stash('course_info_contents') =%> 19 | % } 20 | -------------------------------------------------------------------------------- /templates/ContentGenerator/ProctoredGatewayQuiz.html.ep: -------------------------------------------------------------------------------- 1 | %= include 'ContentGenerator/GatewayQuiz' 2 | -------------------------------------------------------------------------------- /templates/ContentGenerator/ShowMeAnother.html.ep: -------------------------------------------------------------------------------- 1 | %= include 'ContentGenerator/Problem' 2 | -------------------------------------------------------------------------------- /templates/HTML/CodeMirrorEditor/js.html.ep: -------------------------------------------------------------------------------- 1 | % use WeBWorK::Utils qw(getAssetURL); 2 | % 3 | % if ($ce->{options}{PGCodeMirror}) { 4 | % content_for css => begin 5 | <%= stylesheet getAssetURL($ce, 'node_modules/codemirror/lib/codemirror.css') =%> 6 | % 7 | % for my $addon (@$codemirrorAddonsCSS) { 8 | <%= stylesheet getAssetURL($ce, "node_modules/codemirror/addon/$addon") =%> 9 | % } 10 | <%= stylesheet getAssetURL($ce, 'js/PGCodeMirror/pgeditor.css') =%> 11 | % end 12 | % 13 | % content_for js => begin 14 | <%= javascript getAssetURL($ce, 'node_modules/codemirror/lib/codemirror.js'), defer => undef =%> 15 | % 16 | % for my $addon (@$codemirrorAddonsJS) { 17 | <%= javascript getAssetURL($ce, "node_modules/codemirror/addon/$addon"), defer => undef =%> 18 | % } 19 | % for my $mode (@$codemirrorModesJS) { 20 | <%= javascript getAssetURL( 21 | $ce, 22 | $mode eq 'PG' ? 'js/PGCodeMirror/PG.js' : "node_modules/codemirror/mode/$mode/$mode.js" 23 | ), defer => undef =%> 24 | % } 25 | % 26 | <%= javascript getAssetURL($ce, 'js/PGCodeMirror/pgeditor.js'), defer => undef =%> 27 | <%= javascript getAssetURL($ce, 'js/PGCodeMirror/comment.js'), defer => undef =%> 28 | % end 29 | % } 30 | % 31 | % # The textarea styles in this file are still needed if CodeMirror is disabled. 32 | % content_for css => begin 33 | <%= stylesheet getAssetURL($ce, 'js/PGCodeMirror/pgeditor.css') =%> 34 | % end 35 | -------------------------------------------------------------------------------- /templates/HelpFiles/Achievements.html.ep: -------------------------------------------------------------------------------- 1 | %################################################################################ 2 | %# WeBWorK Online Homework Delivery System 3 | %# Copyright © 2000-2024 The WeBWorK Project, https://github.com/openwebwork 4 | %# 5 | %# This program is free software; you can redistribute it and/or modify it under 6 | %# the terms of either: (a) the GNU General Public License as published by the 7 | %# Free Software Foundation; either version 2, or (at your option) any later 8 | %# version, or (b) the "Artistic License" which comes with this package. 9 | %# 10 | %# This program is distributed in the hope that it will be useful, but WITHOUT 11 | %# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 | %# FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 13 | %# Artistic License for more details. 14 | %################################################################################ 15 | % 16 | % layout 'help_macro'; 17 | % title maketext('Achievements Help'); 18 | % 19 |

20 | <%= maketext(q{This page displays a student's current achievement level and progress toward the next level, } 21 | . 'and lists the rewards and badges that the student has earned. If rewards have been earned, ' 22 | . 'then the student may also redeem those rewards.') =%> 23 |

24 | -------------------------------------------------------------------------------- /templates/HelpFiles/AdminDeleteCourse.html.ep: -------------------------------------------------------------------------------- 1 | %################################################################################ 2 | %# WeBWorK Online Homework Delivery System 3 | %# Copyright © 2000-2024 The WeBWorK Project, https://github.com/openwebwork 4 | %# 5 | %# This program is free software; you can redistribute it and/or modify it under 6 | %# the terms of either: (a) the GNU General Public License as published by the 7 | %# Free Software Foundation; either version 2, or (at your option) any later 8 | %# version, or (b) the "Artistic License" which comes with this package. 9 | %# 10 | %# This program is distributed in the hope that it will be useful, but WITHOUT 11 | %# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 | %# FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 13 | %# Artistic License for more details. 14 | %################################################################################ 15 | % 16 | % layout 'help_macro'; 17 | % title maketext('Delete Course Help'); 18 | % 19 |

20 | <%= maketext('Select a course to delete. Warning, all data will be deleted and this cannot be undone. ' 21 | . 'This will not delete any course archives.') =%> 22 |

23 | -------------------------------------------------------------------------------- /templates/HelpFiles/AdminRenameCourse.html.ep: -------------------------------------------------------------------------------- 1 | %################################################################################ 2 | %# WeBWorK Online Homework Delivery System 3 | %# Copyright © 2000-2024 The WeBWorK Project, https://github.com/openwebwork 4 | %# 5 | %# This program is free software; you can redistribute it and/or modify it under 6 | %# the terms of either: (a) the GNU General Public License as published by the 7 | %# Free Software Foundation; either version 2, or (at your option) any later 8 | %# version, or (b) the "Artistic License" which comes with this package. 9 | %# 10 | %# This program is distributed in the hope that it will be useful, but WITHOUT 11 | %# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 | %# FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 13 | %# Artistic License for more details. 14 | %################################################################################ 15 | % 16 | % layout 'help_macro'; 17 | % title maketext('Rename Course Help'); 18 | % 19 |

20 | <%= maketext('Select the course to change its Course ID, Course Title, or Institution. Note that changing a ' 21 | . q{course's ID will change the URL of all links to the course, and could break links from external sites } 22 | . 'such as an LMS.') =%> 23 |

24 | -------------------------------------------------------------------------------- /templates/HelpFiles/InstructorUsersAssignedToSet.html.ep: -------------------------------------------------------------------------------- 1 | %################################################################################ 2 | %# WeBWorK Online Homework Delivery System 3 | %# Copyright © 2000-2024 The WeBWorK Project, https://github.com/openwebwork 4 | %# 5 | %# This program is free software; you can redistribute it and/or modify it under 6 | %# the terms of either: (a) the GNU General Public License as published by the 7 | %# Free Software Foundation; either version 2, or (at your option) any later 8 | %# version, or (b) the "Artistic License" which comes with this package. 9 | %# 10 | %# This program is distributed in the hope that it will be useful, but WITHOUT 11 | %# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 | %# FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 13 | %# Artistic License for more details. 14 | %################################################################################ 15 | % 16 | % layout 'help_macro'; 17 | % title maketext('Users Assigned to Set Help'); 18 | % 19 |

20 | <%= maketext('A student needs to be assigned a set in order for them to work it. Once a student is unassigned a ' 21 | . 'set, all the data for them is lost and there is no way to undo it. When unassigning be sure to change the ' 22 | . 'option to "Allow unassign".') =%> 23 |

24 | -------------------------------------------------------------------------------- /templates/RPCRenderFormats/ptx.html.ep: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | %== $problemText 5 | %== $answerhashXML 6 | 7 | -------------------------------------------------------------------------------- /templates/exception.html.ep: -------------------------------------------------------------------------------- 1 | % use Date::Format; 2 | % use UUID::Tiny ':std'; 3 | % 4 | % my $uuid = create_uuid_as_string(UUID_SHA1, UUID_NS_URL, $c->req->url->path->to_string) 5 | % . "::" . create_uuid_as_string(UUID_TIME); 6 | % my $time = time2str('%a %b %d %H:%M:%S %Y', time); 7 | % 8 | % # Log the error to the Mojolicious error log 9 | % if (config('JSON_ERROR_LOG')) { 10 | % log->error($c->jsonMessage($uuid, $time)) if $c->can('jsonMessage'); 11 | % } else { 12 | % log->error($c->textMessage($uuid, $time)) if $c->can('textMessage'); 13 | % } 14 | % 15 | % if (config('MIN_HTML_ERRORS')) { 16 | <%= include 'exception_min', uuid => $uuid, time => $time, status => 500 =%> 17 | % } else { 18 | <%= include 'exception_default', uuid => $uuid, time => $time, status => 500 =%> 19 | % } 20 | -------------------------------------------------------------------------------- /templates/exception_min.html.ep: -------------------------------------------------------------------------------- 1 | 2 | 3 | % 4 | 5 | 6 | 7 | 8 | WeBWorK error 9 | 10 | % 11 | 12 | 13 |
14 |

WeBWorK error

15 |

An error occurred while processing your request.

16 |

17 | For help, please send mail to this site's webmaster\ 18 | % # $ENV{WEBWORK_SERVER_ADMIN} is set from $webwork_server_admin_email in site.conf. 19 | <% if ($ENV{WEBWORK_SERVER_ADMIN}) { =%> 20 | <%= link_to $ENV{WEBWORK_SERVER_ADMIN} => "mailto:$ENV{WEBWORK_SERVER_ADMIN}" %>\ 21 | <% } =%>\ 22 | , including the following information as well as what what you were doing when the error occurred. 23 |

24 |

Error record identifier

25 |

<%= $uuid %>

26 |

Time generated:

27 |

<%= $time %>

28 |
29 | 30 | % 31 | 32 | -------------------------------------------------------------------------------- /templates/layouts/help_macro.html.ep: -------------------------------------------------------------------------------- 1 | <%= link_to '#', data => { bs_toggle => 'modal', bs_target => "#${name}_help_modal" }, %$args, begin =%> 2 | <%== $label =%> 3 | <% end =%> 4 | <% content_for 'modal-dialog-area' => begin =%> 5 | 17 | <% end =%> 18 | -------------------------------------------------------------------------------- /tmp/README: -------------------------------------------------------------------------------- 1 | $CVSHeader: webwork-modperl/logs/README,v 1.1 2004/06/30 01:26:02 sh002i Exp $ 2 | 3 | This directory is used for temporary files that need not be web 4 | accessible. 5 | -------------------------------------------------------------------------------- /transifex.yml: -------------------------------------------------------------------------------- 1 | git: 2 | filters: 3 | - filter_type: file 4 | file_format: PO 5 | source_language: en 6 | source_file: lib/WeBWorK/Localize/webwork2.pot 7 | translation_files_expression: 'lib/WeBWorK/Localize/.po' 8 | 9 | settings: 10 | pr_branch_name: tx_translations_update_ 11 | language_mapping: 12 | cs_CZ: cs-CZ 13 | fr_CA: fr-CA 14 | he_IL: he-IL 15 | ru_RU: ru-RU 16 | tr_TR: tr-TR 17 | zh_CN: zh-CN 18 | zh_HK: zh-HK 19 | --------------------------------------------------------------------------------