From 386bfdeae8f83c79e6449fc112654d026d8e030d Mon Sep 17 00:00:00 2001 From: Wilford Date: Fri, 19 Dec 2025 10:32:30 -0600 Subject: [PATCH 1/4] remove redundant grade function --- locallib.php | 60 ++++++++++++++++++++-------------------------------- 1 file changed, 23 insertions(+), 37 deletions(-) diff --git a/locallib.php b/locallib.php index fec264e9d1..e0f4a4a565 100644 --- a/locallib.php +++ b/locallib.php @@ -2176,49 +2176,35 @@ function moodleoverflow_count_discussions($moodleoverflow, $course) { * * @param object $moodleoverflow * @param int $postuserrating - * @param object $postinguser - * + * @param int $postinguser + * @return void */ -function moodleoverflow_update_user_grade($moodleoverflow, $postuserrating, $postinguser) { - +function moodleoverflow_update_user_grade(object $moodleoverflow, int $postuserrating, int $postinguser): void { + global $DB; // Check whether moodleoverflow object has the added params. if ($moodleoverflow->grademaxgrade > 0 && $moodleoverflow->gradescalefactor > 0) { - moodleoverflow_update_user_grade_on_db($moodleoverflow, $postuserrating, $postinguser); - } -} + // Calculate the posting user's updated grade. + $grade = $postuserrating / $moodleoverflow->gradescalefactor; -/** - * Updates user grade in database. - * - * @param object $moodleoverflow - * @param int $postuserrating - * @param int $userid - * - */ -function moodleoverflow_update_user_grade_on_db($moodleoverflow, $postuserrating, $userid) { - global $DB; - - // Calculate the posting user's updated grade. - $grade = $postuserrating / $moodleoverflow->gradescalefactor; + if ($grade > $moodleoverflow->grademaxgrade) { + $grade = $moodleoverflow->grademaxgrade; + } - if ($grade > $moodleoverflow->grademaxgrade) { - $grade = $moodleoverflow->grademaxgrade; - } + // Save updated grade on local table. + if ($DB->record_exists('moodleoverflow_grades', ['userid' => $postinguser, 'moodleoverflowid' => $moodleoverflow->id])) { + $DB->set_field('moodleoverflow_grades', 'grade', $grade, ['userid' => $postinguser, + 'moodleoverflowid' => $moodleoverflow->id, ]); + } else { + $gradedataobject = new stdClass(); + $gradedataobject->moodleoverflowid = $moodleoverflow->id; + $gradedataobject->userid = $postinguser; + $gradedataobject->grade = $grade; + $DB->insert_record('moodleoverflow_grades', $gradedataobject, false); + } - // Save updated grade on local table. - if ($DB->record_exists('moodleoverflow_grades', ['userid' => $userid, 'moodleoverflowid' => $moodleoverflow->id])) { - $DB->set_field('moodleoverflow_grades', 'grade', $grade, ['userid' => $userid, - 'moodleoverflowid' => $moodleoverflow->id, ]); - } else { - $gradedataobject = new stdClass(); - $gradedataobject->moodleoverflowid = $moodleoverflow->id; - $gradedataobject->userid = $userid; - $gradedataobject->grade = $grade; - $DB->insert_record('moodleoverflow_grades', $gradedataobject, false); + // Update gradebook. + moodleoverflow_update_grades($moodleoverflow, $postinguser); } - - // Update gradebook. - moodleoverflow_update_grades($moodleoverflow, $userid); } /** @@ -2257,7 +2243,7 @@ function moodleoverflow_update_all_grades_for_cm($moodleoverflowid) { $userrating = ratings::moodleoverflow_get_reputation($moodleoverflow->id, $userid, true); // Calculate the posting user's updated grade. - moodleoverflow_update_user_grade_on_db($moodleoverflow, $userrating, $userid); + moodleoverflow_update_user_grade($moodleoverflow, $userrating, $userid); } } } From b91f9a6904b29ef06dae76de89c4ad9a9a117256 Mon Sep 17 00:00:00 2001 From: Wilford Date: Sat, 20 Dec 2025 12:19:25 -0600 Subject: [PATCH 2/4] remove redundant ci-config file --- .github/workflows/config.json | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 .github/workflows/config.json diff --git a/.github/workflows/config.json b/.github/workflows/config.json deleted file mode 100644 index 91629598e8..0000000000 --- a/.github/workflows/config.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "moodle-testmatrix": { - "MOODLE_405_STABLE": { - "php": ["8.1", "8.2", "8.3"] - }, - "MOODLE_500_STABLE": { - "php": ["8.2", "8.3", "8.4"], - "db": ["pgsql", "mariadb", "mysqli"] - }, - "MOODLE_501_STABLE": { - "php": ["8.2", "8.3", "8.3"], - "db": ["pgsql", "mariadb", "mysqli"] - } - } -} \ No newline at end of file From 83f12bbabe41022be921a202e6a7783629249d89 Mon Sep 17 00:00:00 2001 From: Wilford Date: Sat, 20 Dec 2025 16:20:59 -0600 Subject: [PATCH 3/4] add grade pass functionality This commits adds the ability to set a passing grade for a moodleoverflow that can be checked in the activity completions --- db/install.xml | 1 + db/upgrade.php | 12 ++++++++++++ lang/en/moodleoverflow.php | 2 ++ mod_form.php | 38 ++++++++++++++++++++++++++++++++++++-- version.php | 2 +- 5 files changed, 52 insertions(+), 3 deletions(-) diff --git a/db/install.xml b/db/install.xml index ba0ba5dd78..430da45825 100644 --- a/db/install.xml +++ b/db/install.xml @@ -24,6 +24,7 @@ + diff --git a/db/upgrade.php b/db/upgrade.php index 8fc139d088..dd14cfc995 100644 --- a/db/upgrade.php +++ b/db/upgrade.php @@ -314,5 +314,17 @@ function xmldb_moodleoverflow_upgrade($oldversion) { upgrade_mod_savepoint(true, 2025031200, 'moodleoverflow'); } + if ($oldversion < 2025112701) { + // Define table moodleoverflow to be edited. + $table = new xmldb_table('moodleoverflow'); + + // Create the field for the passing grade. + $field = new xmldb_field('gradepass', XMLDB_TYPE_INTEGER, '10', null, null, null, 0, 'gradescalefactor'); + if (!$dbman->field_exists($table, $field)) { + $dbman->add_field($table, $field); + } + + upgrade_mod_savepoint(true, 2025112701, 'moodleoverflow'); + } return true; } diff --git a/lang/en/moodleoverflow.php b/lang/en/moodleoverflow.php index 8229795b4c..6f75aedd4b 100644 --- a/lang/en/moodleoverflow.php +++ b/lang/en/moodleoverflow.php @@ -165,6 +165,8 @@ $string['give_a_reason'] = 'Give a reason (optional)'; $string['gotoindex'] = 'Manage preferences'; $string['grademaxgradeerror'] = 'Maximum grade must be a positive integer different than 0'; +$string['gradepasserror'] = 'Grade pass must be a positive integer'; +$string['gradepassvalidationerror'] = 'Grade pass can not be greater than the max grade'; $string['gradesreport'] = 'Grades report'; $string['gradesupdated'] = 'Grades updated'; $string['helpamountofactivity'] = 'Help icon for activity'; diff --git a/mod_form.php b/mod_form.php index 80a32632de..05f21af153 100644 --- a/mod_form.php +++ b/mod_form.php @@ -175,12 +175,29 @@ public function definition() { $mform->addElement('text', 'grademaxgrade', get_string('modgrademaxgrade', 'grades')); $mform->setType('grademaxgrade', PARAM_INT); - $mform->addRule('grademaxgrade', get_string('grademaxgradeerror', 'moodleoverflow'), 'regex', '/^[0-9]+$/', 'client'); + $mform->addRule( + 'grademaxgrade', + get_string('grademaxgradeerror', 'moodleoverflow'), + 'regex', + '/^(0|[1-9][0-9]*)$/', + 'client' + ); $mform->addElement('text', 'gradescalefactor', get_string('scalefactor', 'moodleoverflow')); $mform->addHelpButton('gradescalefactor', 'scalefactor', 'moodleoverflow'); $mform->setType('gradescalefactor', PARAM_INT); - $mform->addRule('gradescalefactor', get_string('scalefactorerror', 'moodleoverflow'), 'regex', '/^[0-9]+$/', 'client'); + $mform->addRule( + 'gradescalefactor', + get_string('scalefactorerror', 'moodleoverflow'), + 'regex', + '/^(0|[1-9][0-9]*)$/', + 'client' + ); + + $mform->addElement('text', 'gradepass', get_string('gradepass', 'grades')); + $mform->addHelpButton('gradepass', 'gradepass', 'grades'); + $mform->setType('gradepass', PARAM_INT); + $mform->addRule('gradepass', get_string('gradepasserror', 'moodleoverflow'), 'regex', '/^(0|[1-9][0-9]*)$/', 'client'); if ($this->_features->gradecat) { $mform->addElement( @@ -299,6 +316,18 @@ public function data_postprocessing($data) { } } + /** + * Handles data preprocessing. + * @param array $defaultvalues + * @return void + */ + public function data_preprocessing(&$defaultvalues) { + parent::data_preprocessing($defaultvalues); + if (isset($defaultvalues['gradepass'])) { + $defaultvalues['gradepass'] = (int)$defaultvalues['gradepass']; + } + } + /** * Validates set data in mod_form * @param array $data @@ -309,6 +338,11 @@ public function data_postprocessing($data) { public function validation($data, $files): array { $errors = parent::validation($data, $files); + // Validate the grade settings. + if (isset($data['gradepass']) && isset($data['grademaxgrade']) && $data['gradepass'] > $data['grademaxgrade']) { + $errors['gradepass'] = get_string('gradepassvalidationerror', 'moodleoverflow'); + } + // Validate that the limited answer settings. $currenttime = time(); $isstarttime = !empty($data['la_starttime']); diff --git a/version.php b/version.php index 32e56d7e3c..8019100652 100644 --- a/version.php +++ b/version.php @@ -26,7 +26,7 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2025112700; +$plugin->version = 2025112701; $plugin->requires = 2024100700.00; // Require Moodle 4.5. $plugin->supported = [405, 501]; $plugin->component = 'mod_moodleoverflow'; From 1f6e1bf02f8ffef3230d0f155328c84ef0e53c2c Mon Sep 17 00:00:00 2001 From: Wilford Date: Sat, 20 Dec 2025 16:25:23 -0600 Subject: [PATCH 4/4] use join statement for better readability --- lib.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib.php b/lib.php index 6fad020f42..323d07012e 100644 --- a/lib.php +++ b/lib.php @@ -639,7 +639,7 @@ function moodleoverflow_can_create_attachment($moodleoverflow, $context) { } /** - * Obtain grades from plugin's database tab + * Get the grades of a moodleoverflow instance for all users or a single user. * * @param stdClass $moodleoverflow moodleoverflow object * @param int $userid optional userid, 0 means all users. @@ -652,8 +652,9 @@ function moodleoverflow_get_user_grades($moodleoverflow, $userid = 0) { $params = ["moodleoverflowid" => $moodleoverflow->id]; $sql = "SELECT u.id AS userid, g.grade AS rawgrade - FROM {user} u, {moodleoverflow_grades} g - WHERE u.id = g.userid AND g.moodleoverflowid = :moodleoverflowid"; + FROM {user} u + JOIN {moodleoverflow_grades} g ON u.id = g.userid + WHERE g.moodleoverflowid = :moodleoverflowid"; if ($userid) { $sql .= ' AND u.id = :userid ';