From 6b7b7455d1358b4a4880d3fe131ea7e37cffec85 Mon Sep 17 00:00:00 2001 From: Frederic Massart Date: Thu, 6 Jun 2013 11:50:58 +0800 Subject: [PATCH] MDL-38314 repository: Delete repository instances on context deletion --- lib/accesslib.php | 4 ++++ repository/lib.php | 26 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/lib/accesslib.php b/lib/accesslib.php index dbb20318e70..6a779e9c6d5 100644 --- a/lib/accesslib.php +++ b/lib/accesslib.php @@ -5284,6 +5284,10 @@ abstract class context extends stdClass implements IteratorAggregate { $fs = get_file_storage(); $fs->delete_area_files($this->_id); + // Delete all repository instances attached to this context. + require_once($CFG->dirroot . '/repository/lib.php'); + repository::delete_all_for_context($this->_id); + // delete all advanced grading data attached to this context require_once($CFG->dirroot.'/grade/grading/lib.php'); grading_manager::delete_all_for_context($this->_id); diff --git a/repository/lib.php b/repository/lib.php index 0e28f1c3fa8..137700bee74 100644 --- a/repository/lib.php +++ b/repository/lib.php @@ -2077,6 +2077,32 @@ abstract class repository implements cacheable_object { return true; } + /** + * Delete all the instances associated to a context. + * + * This method is intended to be a callback when deleting + * a course or a user to delete all the instances associated + * to their context. The usual way to delete a single instance + * is to use {@link self::delete()}. + * + * @param int $contextid context ID. + * @param boolean $downloadcontents true to convert references to hard copies. + * @return void + */ + final public static function delete_all_for_context($contextid, $downloadcontents = true) { + global $DB; + $repoids = $DB->get_fieldset_select('repository_instances', 'id', 'contextid = :contextid', array('contextid' => $contextid)); + if ($downloadcontents) { + foreach ($repoids as $repoid) { + $repo = repository::get_repository_by_id($repoid, $contextid); + $repo->convert_references_to_local(); + } + } + cache::make('core', 'repositories')->purge(); + $DB->delete_records_list('repository_instances', 'id', $repoids); + $DB->delete_records_list('repository_instance_config', 'instanceid', $repoids); + } + /** * Hide/Show a repository *