mirror of
https://github.com/moodle/moodle.git
synced 2025-04-21 16:32:18 +02:00
MDL-13034 fixes "insertion of question / category ids at the CONTEXT_MODULE level does not respect whether the instance of the module has been selected for backup" and cleans up code a little.
This commit is contained in:
parent
406af084a3
commit
ede67707a6
@ -30,47 +30,28 @@
|
||||
// the data about student interaction with the questions. The functions to do
|
||||
// that are included with the following library
|
||||
require_once("$CFG->dirroot/question/backuplib.php");
|
||||
|
||||
|
||||
/*
|
||||
* Insert necessary category ids to backup_ids table. Called during backup_check.html
|
||||
* Insert necessary category ids to backup_ids table. Called during backup_check.html.
|
||||
* This backs up ids for quiz module. It backs up :
|
||||
* all categories and questions in course
|
||||
* all categories and questions in contexts of quiz module instances which have been selected for backup
|
||||
* all categories and questions in contexts above course level that are used by quizzes that have been selected for backup
|
||||
*/
|
||||
function insert_category_and_question_ids($course, $backup_unique_code, $instances = null) {
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
// Create missing categories and reasign orphaned questions.
|
||||
fix_orphaned_questions($course);
|
||||
// First, all categories from this course's context.
|
||||
|
||||
$coursecontext = get_context_instance(CONTEXT_COURSE, $course);
|
||||
$status = execute_sql("INSERT INTO {$CFG->prefix}backup_ids
|
||||
(backup_code, table_name, old_id, info)
|
||||
SELECT '$backup_unique_code', 'question_categories', qc.id, ''
|
||||
FROM {$CFG->prefix}question_categories qc
|
||||
WHERE qc.contextid = {$coursecontext->id}", false);
|
||||
$status = $status && question_insert_c_and_q_ids_for_course($coursecontext, $backup_unique_code);
|
||||
|
||||
// then, all categories and questions from this course's modules' contexts.
|
||||
$status = $status && question_insert_c_and_q_ids_for_module($backup_unique_code, $course, 'quiz', $instances);
|
||||
|
||||
|
||||
// then, all categories from this course's modules' contexts.
|
||||
// using 'dummykeyname' in sql because otherwise get_records_sql_menu returns an error
|
||||
// if two key names are the same.
|
||||
$cmcontexts = get_records_sql_menu("SELECT c.id, c.id AS dummykeyname FROM {$CFG->prefix}modules m,
|
||||
{$CFG->prefix}course_modules cm,
|
||||
{$CFG->prefix}context c
|
||||
WHERE m.name = 'quiz' AND m.id = cm.module AND cm.id = c.instanceid
|
||||
AND c.contextlevel = ".CONTEXT_MODULE." AND cm.course = $course");
|
||||
if ($cmcontexts){
|
||||
$status = $status && execute_sql("INSERT INTO {$CFG->prefix}backup_ids
|
||||
(backup_code, table_name, old_id, info)
|
||||
SELECT '$backup_unique_code', 'question_categories', qc.id, ''
|
||||
FROM {$CFG->prefix}question_categories qc
|
||||
WHERE qc.contextid IN (".join(array_keys($cmcontexts), ', ').")", false);
|
||||
}
|
||||
//put the ids of the questions from all these categories into the db.
|
||||
$status = $status && execute_sql("INSERT INTO {$CFG->prefix}backup_ids
|
||||
(backup_code, table_name, old_id, info)
|
||||
SELECT '$backup_unique_code', 'question', q.id, ''
|
||||
FROM {$CFG->prefix}question q, {$CFG->prefix}backup_ids bk
|
||||
WHERE q.category = bk.old_id AND bk.table_name = 'question_categories' AND
|
||||
bk.backup_code = '$backup_unique_code'", false);
|
||||
|
||||
// Then categories from parent contexts used by the quizzes we are backing up.
|
||||
//TODO this will need generalising when we have modules other than quiz using shared questions above course level.
|
||||
$parentcontexts = get_parent_contexts($coursecontext);
|
||||
@ -176,7 +157,7 @@
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Helper function adding the id of all the subcategories of a category to an array.
|
||||
*/
|
||||
@ -517,9 +498,6 @@
|
||||
////Return an array of info (name,value)
|
||||
/// $instances is an array with key = instanceid, value = object (name,id,userdata)
|
||||
function quiz_check_backup_mods($course,$user_data= false,$backup_unique_code,$instances=null) {
|
||||
//Deletes data from mdl_backup_ids (categories section)
|
||||
delete_ids ($backup_unique_code, 'question_categories');
|
||||
delete_ids ($backup_unique_code, 'question');
|
||||
//this function selects all the questions / categories to be backed up.
|
||||
insert_category_and_question_ids($course, $backup_unique_code, $instances);
|
||||
if ($course != SITEID){
|
||||
|
@ -423,14 +423,62 @@
|
||||
WHERE backup_code = '$backup_unique_code' AND
|
||||
table_name = 'question'");
|
||||
}
|
||||
|
||||
//Function for inserting question and category ids into db that are all called from
|
||||
// quiz_check_backup_mods during execution of backup_check.html
|
||||
|
||||
//Delete category ids from backup_ids table
|
||||
function delete_ids ($backup_unique_code, $tablename) {
|
||||
|
||||
function question_insert_c_and_q_ids_for_course($coursecontext, $backup_unique_code){
|
||||
global $CFG;
|
||||
$status = execute_sql("DELETE FROM {$CFG->prefix}backup_ids
|
||||
WHERE backup_code = '$backup_unique_code' AND table_name = '$tablename'",false);
|
||||
// First, all categories from this course's context.
|
||||
$status = execute_sql("INSERT INTO {$CFG->prefix}backup_ids
|
||||
(backup_code, table_name, old_id, info)
|
||||
SELECT '$backup_unique_code', 'question_categories', qc.id, 'course'
|
||||
FROM {$CFG->prefix}question_categories qc
|
||||
WHERE qc.contextid = {$coursecontext->id}", false);
|
||||
$status = $status && question_insert_q_ids($backup_unique_code, 'course');
|
||||
return $status;
|
||||
}
|
||||
/*
|
||||
* Insert all question ids for categories whose ids have already been inserted in the backup_ids table
|
||||
* Insert code to identify categories to later insert all question ids later eg. course, quiz or other module name.
|
||||
*/
|
||||
function question_insert_q_ids($backup_unique_code, $info){
|
||||
global $CFG;
|
||||
//put the ids of the questions from all these categories into the db.
|
||||
$status = execute_sql("INSERT INTO {$CFG->prefix}backup_ids
|
||||
(backup_code, table_name, old_id, info)
|
||||
SELECT '$backup_unique_code', 'question', q.id, ''
|
||||
FROM {$CFG->prefix}question q, {$CFG->prefix}backup_ids bk
|
||||
WHERE q.category = bk.old_id AND bk.table_name = 'question_categories'
|
||||
AND bk.info = '$info'
|
||||
AND bk.backup_code = '$backup_unique_code'", false);
|
||||
return $status;
|
||||
}
|
||||
|
||||
function question_insert_c_and_q_ids_for_module($backup_unique_code, $course, $modulename, $instances){
|
||||
global $CFG;
|
||||
$status = true;
|
||||
// using 'dummykeyname' in sql because otherwise get_records_sql_menu returns an error
|
||||
// if two key names are the same.
|
||||
$cmcontexts = get_records_sql_menu("SELECT c.id, c.id AS dummykeyname FROM {$CFG->prefix}modules m,
|
||||
{$CFG->prefix}course_modules cm,
|
||||
{$CFG->prefix}context c
|
||||
WHERE m.name = 'quiz' AND m.id = cm.module AND cm.id = c.instanceid
|
||||
AND c.contextlevel = ".CONTEXT_MODULE." AND cm.course = $course
|
||||
AND cm.instance IN (".implode(',',array_keys($instances)).")");
|
||||
|
||||
if ($cmcontexts){
|
||||
$status = $status && execute_sql("INSERT INTO {$CFG->prefix}backup_ids
|
||||
(backup_code, table_name, old_id, info)
|
||||
SELECT '$backup_unique_code', 'question_categories', qc.id, '$modulename'
|
||||
FROM {$CFG->prefix}question_categories qc
|
||||
WHERE qc.contextid IN (".join(array_keys($cmcontexts), ', ').")", false);
|
||||
}
|
||||
$status = $status && question_insert_q_ids($backup_unique_code, $modulename);
|
||||
return $status;
|
||||
}
|
||||
|
||||
function question_insert_site_file_names($course, $backup_unique_code){
|
||||
global $QTYPES, $CFG;
|
||||
$status = true;
|
||||
|
Loading…
x
Reference in New Issue
Block a user