diff --git a/repository/filesystem/classes/task/cron_task.php b/repository/filesystem/classes/task/cron_task.php new file mode 100644 index 00000000000..026a53c10c1 --- /dev/null +++ b/repository/filesystem/classes/task/cron_task.php @@ -0,0 +1,72 @@ +. + +namespace repository_filesystem\task; +defined('MOODLE_INTERNAL') || die(); + +/** + * A schedule task for file system repository cron. + * + * @package repository_filesystem + * @copyright 2019 Simey Lameze + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class cron_task extends \core\task\scheduled_task { + /** + * Get a descriptive name for this task (shown to admins). + * + * @return string + */ + public function get_name() { + return get_string('crontask', 'repository_filesystem'); + } + + /** + * Run file system repository cron. + */ + public function execute() { + global $CFG; + require_once($CFG->dirroot . '/repository/lib.php'); + + $fs = get_file_storage(); + // Find all generated thumbnails and group them in array by itemid (itemid == repository instance id). + $allfiles = array_merge( + $fs->get_area_files(SYSCONTEXTID, 'repository_filesystem', 'thumb'), + $fs->get_area_files(SYSCONTEXTID, 'repository_filesystem', 'icon') + ); + $filesbyitem = array(); + foreach ($allfiles as $file) { + if (!isset($filesbyitem[$file->get_itemid()])) { + $filesbyitem[$file->get_itemid()] = array(); + } + $filesbyitem[$file->get_itemid()][] = $file; + } + // Find all instances of repository_filesystem. + $instances = \repository::get_instances(array('type' => 'filesystem')); + // Loop through all itemids of generated thumbnails. + foreach ($filesbyitem as $itemid => $files) { + if (!isset($instances[$itemid]) || !($instances[$itemid] instanceof repository_filesystem)) { + // Instance was deleted. + $fs->delete_area_files(SYSCONTEXTID, 'repository_filesystem', 'thumb', $itemid); + $fs->delete_area_files(SYSCONTEXTID, 'repository_filesystem', 'icon', $itemid); + mtrace(" instance $itemid does not exist: deleted all thumbnails"); + } else { + // Instance has some generated thumbnails, check that they are not outdated. + $instances[$itemid]->remove_obsolete_thumbnails($files); + } + } + } +} diff --git a/repository/filesystem/db/tasks.php b/repository/filesystem/db/tasks.php new file mode 100644 index 00000000000..5f0cd109498 --- /dev/null +++ b/repository/filesystem/db/tasks.php @@ -0,0 +1,34 @@ +. +/** + * Definition of file system repository scheduled tasks. + * + * @package repository_filesystem + * @copyright 2019 Simey Lameze + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +defined('MOODLE_INTERNAL') || die(); +$tasks = array( + array( + 'classname' => '\repository_filesystem\task\cron_task', + 'blocking' => 0, + 'minute' => '*', + 'hour' => '*', + 'day' => '*', + 'month' => '*', + 'dayofweek' => '*' + ) +); diff --git a/repository/filesystem/lang/en/repository_filesystem.php b/repository/filesystem/lang/en/repository_filesystem.php index c292f23a0e1..4b4650f1786 100644 --- a/repository/filesystem/lang/en/repository_filesystem.php +++ b/repository/filesystem/lang/en/repository_filesystem.php @@ -25,6 +25,7 @@ $string['blockedpath'] = 'Blocked root path'; $string['configplugin'] = 'Configuration for file system repository'; +$string['crontask'] = 'Background processing for filesystem repository'; $string['donotusesysdir'] = 'Don\'t use system directory as repository, including'; $string['filesystem:view'] = 'View file system repository'; $string['information'] = 'These folders are within the {$a} directory.'; diff --git a/repository/filesystem/version.php b/repository/filesystem/version.php index c4d65fbebc4..490c07b2a8e 100644 --- a/repository/filesystem/version.php +++ b/repository/filesystem/version.php @@ -26,6 +26,6 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2018120300; // The current plugin version (Date: YYYYMMDDXX) +$plugin->version = 2018120301; // The current plugin version (Date: YYYYMMDDXX) $plugin->requires = 2018112800; // Requires this Moodle version $plugin->component = 'repository_filesystem'; // Full name of the plugin (used for diagnostics)