diff --git a/lang/en/admin.php b/lang/en/admin.php index 4e639a7c8f9..9a6ab356fb0 100644 --- a/lang/en/admin.php +++ b/lang/en/admin.php @@ -1398,7 +1398,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..1fd8578121c --- /dev/null +++ b/lib/classes/task/badges_adhoc_task.php @@ -0,0 +1,70 @@ +. + +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 { + + /** + * 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); + $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..c6e6f9eebeb 100644 --- a/lib/classes/task/badges_cron_task.php +++ b/lib/classes/task/badges_cron_task.php @@ -45,50 +45,43 @@ class badges_cron_task extends scheduled_task { */ public function execute() { global $DB, $CFG; - if (!empty($CFG->enablebadges)) { - require_once($CFG->libdir . '/badgeslib.php'); - $total = 0; - - $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()); - } - - $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) { - $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).'); + if (empty($CFG->enablebadges)) { + return; } + require_once($CFG->libdir . '/badgeslib.php'); + + $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); + + foreach ($badges as $bid) { + $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"); } }