From 5b5e0aab8c262760aeebc752f4ab0824c1965992 Mon Sep 17 00:00:00 2001 From: Jay Oswald Date: Thu, 30 Nov 2023 15:33:22 +1100 Subject: [PATCH 1/2] MDL-79091 core_badges: use adhoc tasks --- lang/en/admin.php | 3 +- lib/classes/task/badges_adhoc_task.php | 60 ++++++++++++++++++++++++++ lib/classes/task/badges_cron_task.php | 23 +++------- 3 files changed, 67 insertions(+), 19 deletions(-) create mode 100644 lib/classes/task/badges_adhoc_task.php diff --git a/lang/en/admin.php b/lang/en/admin.php index edcfb8ccfd3..775b0d121d0 100644 --- a/lang/en/admin.php +++ b/lang/en/admin.php @@ -1399,7 +1399,8 @@ $string['taskadmintitle'] = 'Tasks'; $string['taskanalyticscleanup'] = 'Analytics cleanup'; $string['taskautomatedbackup'] = 'Automated backups'; $string['taskbackupcleanup'] = 'Clean backup tables, logs and files'; -$string['taskbadgescron'] = 'Award badges'; +$string['taskbadgesadhoc'] = 'Award badge'; +$string['taskbadgescron'] = 'Add award badges adhoc tasks'; $string['taskbadgesmessagecron'] = 'Background processing for sending badges notifications'; $string['taskblogcron'] = 'Sync external blogs'; $string['taskcachecleanup'] = 'Remove expired cache entries'; diff --git a/lib/classes/task/badges_adhoc_task.php b/lib/classes/task/badges_adhoc_task.php new file mode 100644 index 00000000000..dd2ad797f15 --- /dev/null +++ b/lib/classes/task/badges_adhoc_task.php @@ -0,0 +1,60 @@ +. + +namespace core\task; +/** + * Class badges_adhoc_task + * + * @package core + * @copyright 2023 Jay Oswald + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class badges_adhoc_task extends adhoc_task { + + public function get_name() { + return get_string('taskbadgesadhoc', 'admin'); + } + + public function execute() { + $data = $this->get_custom_data(); + $badge = new \core_badges\badge($data->badgeid); + $traceprefix = "Badge $data->badgeid: $badge->name: "; + + try { + if (!$badge->has_criteria()) { + mtrace("$traceprefix Badge has no criteria to be processed"); + return; + } + + $issued = $badge->review_all_criteria(); + mtrace("$traceprefix badge was issued to $issued users."); + + } catch (\moodle_exception $e) { + $badgeeditlink = + new \moodle_url('/badges/edit.php', ['id' => $data->badgeid, 'action' => 'badge']); + + switch($e->errorcode){ + case 'invalidcoursemoduleid': + $badge->set_status(BADGE_STATUS_INACTIVE); + mtrace("$traceprefix has invalid course modules, it has been made inactive $badgeeditlink"); + break; + default: + mtrace("$traceprefix Error: {$e->getMessage()} $badgeeditlink"); + throw($e); + } + } + } +} diff --git a/lib/classes/task/badges_cron_task.php b/lib/classes/task/badges_cron_task.php index 6e591a5facb..82e53e3d2db 100644 --- a/lib/classes/task/badges_cron_task.php +++ b/lib/classes/task/badges_cron_task.php @@ -47,7 +47,6 @@ class badges_cron_task extends scheduled_task { global $DB, $CFG; if (!empty($CFG->enablebadges)) { require_once($CFG->libdir . '/badgeslib.php'); - $total = 0; $courseparams = array(); if (empty($CFG->badges_allowcoursebadges)) { @@ -72,23 +71,11 @@ class badges_cron_task extends scheduled_task { mtrace('Started reviewing available badges.'); foreach ($badges as $bid) { - $badge = new \badge($bid); - - if ($badge->has_criteria()) { - if (debugging()) { - mtrace('Processing badge "' . $badge->name . '"...'); - } - - $issued = $badge->review_all_criteria(); - - if (debugging()) { - mtrace('...badge was issued to ' . $issued . ' users.'); - } - $total += $issued; - } - } - - mtrace('Badges were issued ' . $total . ' time(s).'); + $task = new badges_adhoc_task(); + $task->set_custom_data(['badgeid' => $bid]); + manager::queue_adhoc_task($task, true); } + + mtrace(count($badges) . " adhoc badge tasks were added"); } } From 248f7e91f24b679f4769d575febc36b4b34bd995 Mon Sep 17 00:00:00 2001 From: Jay Oswald Date: Thu, 30 Nov 2023 15:34:12 +1100 Subject: [PATCH 2/2] MDL-79091 core_badges: refactor bades cron task MDL-79091 core_badges: refactor bades cron task --- lib/classes/task/badges_adhoc_task.php | 12 +++++- lib/classes/task/badges_cron_task.php | 52 ++++++++++++++------------ 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/lib/classes/task/badges_adhoc_task.php b/lib/classes/task/badges_adhoc_task.php index dd2ad797f15..1fd8578121c 100644 --- a/lib/classes/task/badges_adhoc_task.php +++ b/lib/classes/task/badges_adhoc_task.php @@ -24,10 +24,20 @@ namespace core\task; */ class badges_adhoc_task extends adhoc_task { + /** + * Sets the name of the badges adhoc task + * + * @return void + */ public function get_name() { return get_string('taskbadgesadhoc', 'admin'); } + /** + * Badge adhoc task to assign a single badge + * + * @return void + */ public function execute() { $data = $this->get_custom_data(); $badge = new \core_badges\badge($data->badgeid); @@ -43,7 +53,7 @@ class badges_adhoc_task extends adhoc_task { mtrace("$traceprefix badge was issued to $issued users."); } catch (\moodle_exception $e) { - $badgeeditlink = + $badgeeditlink = new \moodle_url('/badges/edit.php', ['id' => $data->badgeid, 'action' => 'badge']); switch($e->errorcode){ diff --git a/lib/classes/task/badges_cron_task.php b/lib/classes/task/badges_cron_task.php index 82e53e3d2db..c6e6f9eebeb 100644 --- a/lib/classes/task/badges_cron_task.php +++ b/lib/classes/task/badges_cron_task.php @@ -45,32 +45,38 @@ class badges_cron_task extends scheduled_task { */ public function execute() { global $DB, $CFG; - if (!empty($CFG->enablebadges)) { - require_once($CFG->libdir . '/badgeslib.php'); + if (empty($CFG->enablebadges)) { + return; + } + require_once($CFG->libdir . '/badgeslib.php'); - $courseparams = array(); - if (empty($CFG->badges_allowcoursebadges)) { - $coursesql = ''; - } else { - $coursesql = ' OR EXISTS (SELECT c.id FROM {course} c WHERE c.visible = :visible AND c.startdate < :current' - . ' AND c.id = b.courseid) '; - $courseparams = array('visible' => true, 'current' => time()); - } + $courseparams = []; + if (empty($CFG->badges_allowcoursebadges)) { + $coursesql = ''; + } else { + $coursesql = "OR EXISTS ( + SELECT c.id + FROM {course} c + WHERE c.visible = :visible + AND c.startdate < :current + AND c.id = b.courseid + ) "; + $courseparams = ['visible' => 1, 'current' => time()]; + } - $sql = 'SELECT b.id - FROM {badge} b - WHERE (b.status = :active OR b.status = :activelocked) - AND (b.type = :site ' . $coursesql . ')'; - $badgeparams = [ - 'active' => BADGE_STATUS_ACTIVE, - 'activelocked' => BADGE_STATUS_ACTIVE_LOCKED, - 'site' => BADGE_TYPE_SITE - ]; - $params = array_merge($badgeparams, $courseparams); - $badges = $DB->get_fieldset_sql($sql, $params); + $sql = "SELECT b.id + FROM {badge} b + WHERE (b.status = :active OR b.status = :activelocked) + AND (b.type = :site $coursesql )"; + $badgeparams = [ + 'active' => BADGE_STATUS_ACTIVE, + 'activelocked' => BADGE_STATUS_ACTIVE_LOCKED, + 'site' => BADGE_TYPE_SITE, + ]; + $params = array_merge($badgeparams, $courseparams); + $badges = $DB->get_fieldset_sql($sql, $params); - mtrace('Started reviewing available badges.'); - foreach ($badges as $bid) { + foreach ($badges as $bid) { $task = new badges_adhoc_task(); $task->set_custom_data(['badgeid' => $bid]); manager::queue_adhoc_task($task, true);