From 85c9ebb926af4735e4e6e3715ecd6d0a0307a3c5 Mon Sep 17 00:00:00 2001 From: skodak Date: Tue, 18 Sep 2007 18:37:58 +0000 Subject: [PATCH] MDL-1883 improved perf when editing scales - new function xxx_scale_used_anywhere() --- grade/edit/scale/edit_form.php | 15 ++++----- grade/edit/scale/index.php | 18 +++++------ lang/en_utf8/moodle.php | 1 + lib/grade/grade_scale.php | 69 +++++++++++++++++++++++++++--------------- mod/assignment/lib.php | 17 ++++++++++- mod/forum/lib.php | 15 +++++++++ mod/glossary/lib.php | 15 +++++++++ mod/hotpot/lib.php | 11 +++++++ mod/journal/lib.php | 15 +++++++++ mod/lams/lib.php | 11 +++++++ 10 files changed, 146 insertions(+), 41 deletions(-) diff --git a/grade/edit/scale/edit_form.php b/grade/edit/scale/edit_form.php index e97bc24a3..88b045e45 100644 --- a/grade/edit/scale/edit_form.php +++ b/grade/edit/scale/edit_form.php @@ -18,7 +18,7 @@ class edit_scale_form extends moodleform { $mform->setHelpButton('standard', array(false, get_string('scalestandard'), false, true, false, get_string('scalestandardhelp', 'grades'))); - $mform->addElement('static', 'activities', get_string('activities')); + $mform->addElement('static', 'used', get_string('used')); $mform->addElement('textarea', 'scale', get_string('scale'), array('cols'=>50, 'rows'=>2)); $mform->setHelpButton('scale', array('scales', get_string('scale'))); @@ -55,9 +55,9 @@ class edit_scale_form extends moodleform { if ($id = $mform->getElementValue('id')) { $scale = grade_scale::fetch(array('id'=>$id)); - $count = $scale->get_item_uses_count(); + $used = $scale->is_used(); - if ($count) { + if ($used) { $mform->hardFreeze('scale'); } @@ -67,15 +67,16 @@ class edit_scale_form extends moodleform { } else if (empty($scale->courseid) and !has_capability('moodle/course:managescales', get_context_instance(CONTEXT_SYSTEM))) { $mform->hardFreeze('standard'); - } else if ($count and !empty($scale->courseid)) { + } else if ($used and !empty($scale->courseid)) { $mform->hardFreeze('standard'); } - $activities_el =& $mform->getElement('activities'); - $activities_el->setValue(get_string('usedinnplaces', '', $count)); + $usedstr = $scale->is_used() ? get_string('yes') : get_string('no'); + $used_el =& $mform->getElement('used'); + $used_el->setValue($usedstr); } else { - $mform->removeElement('activities'); + $mform->removeElement('used'); if (empty($courseid) or !has_capability('moodle/course:managescales', get_context_instance(CONTEXT_SYSTEM))) { $mform->hardFreeze('standard'); } diff --git a/grade/edit/scale/index.php b/grade/edit/scale/index.php index 300857884..fd1eb272b 100644 --- a/grade/edit/scale/index.php +++ b/grade/edit/scale/index.php @@ -37,7 +37,7 @@ $strname = get_string('name'); $strdelete = get_string('delete'); $stredit = get_string('edit'); $srtcreatenewscale = get_string('scalescustomcreate'); -$stritems = get_string('items', 'grades'); +$strused = get_string('used'); $stredit = get_string('edit'); switch ($action) { @@ -82,20 +82,20 @@ if ($courseid and $scales = grade_scale::fetch_all_local($courseid)) { $line = array(); $line[] = format_string($scale->name).'
'.str_replace(",",", ",$scale->scale).'
'; - $scales_uses = $scale->get_item_uses_count(); - $line[] = $scales_uses; + $used = $scale->is_used(); + $line[] = $used ? get_string('yes') : get_string('no'); $buttons = ""; $buttons .= "id\">pixpath/t/edit.gif\" class=\"iconsmall\" alt=\"$stredit\" /> "; - if (empty($scales_uses)) { + if (!$used) { $buttons .= "id&action=delete&sesskey=$USER->sesskey\">pixpath/t/delete.gif\" class=\"iconsmall\" alt=\"$strdelete\" /> "; } $line[] = $buttons; $data[] = $line; } - $table->head = array($strscale, $stritems, $stredit); + $table->head = array($strscale, $strused, $stredit); $table->size = array('70%', '20%', '10%'); $table->align = array('left', 'center', 'center'); $table->width = '90%'; @@ -110,22 +110,22 @@ if ($scales = grade_scale::fetch_all_global()) { $line = array(); $line[] = format_string($scale->name).'
'.str_replace(",",", ",$scale->scale).'
'; - $scales_uses = $scale->get_item_uses_count(); - $line[] = $scales_uses; + $used = $scale->is_used(); + $line[] = $used ? get_string('yes') : get_string('no'); $buttons = ""; if (has_capability('moodle/course:managescales', get_context_instance(CONTEXT_SYSTEM))) { $buttons .= "id\">pixpath/t/edit.gif\" class=\"iconsmall\" alt=\"$stredit\" /> "; } - if (empty($scales_uses) and has_capability('moodle/course:managescales', get_context_instance(CONTEXT_SYSTEM))) { + if (!$used and has_capability('moodle/course:managescales', get_context_instance(CONTEXT_SYSTEM))) { $buttons .= "id&action=delete&sesskey=$USER->sesskey\">pixpath/t/delete.gif\" class=\"iconsmall\" alt=\"$strdelete\" /> "; } $line[] = $buttons; $data[] = $line; } - $table->head = array($strscale, $stritems, $stredit); + $table->head = array($strscale, $strused, $stredit); $table->size = array('70%', '20%', '10%'); $table->align = array('left', 'center', 'center'); $table->width = '90%'; diff --git a/lang/en_utf8/moodle.php b/lang/en_utf8/moodle.php index 735d8d82e..64ec5eb28 100644 --- a/lang/en_utf8/moodle.php +++ b/lang/en_utf8/moodle.php @@ -1489,6 +1489,7 @@ $string['uploadrenamedcollision'] = 'File was renamed from $a->oldname to $a->ne $string['uploadserverlimit'] = 'Uploaded file exceeded the maximum size limit set by the server'; $string['uploadthisfile'] = 'Upload this file'; $string['uploadusers'] = 'Upload users'; +$string['used'] = 'Used'; $string['usedinnplaces'] = 'Used in $a places'; $string['usemessageform'] = 'or use the form below to send a message to the selected students'; $string['user'] = 'User'; diff --git a/lib/grade/grade_scale.php b/lib/grade/grade_scale.php index af1df4d0c..703e060f2 100644 --- a/lib/grade/grade_scale.php +++ b/lib/grade/grade_scale.php @@ -200,43 +200,64 @@ class grade_scale extends grade_object { * @return boolean */ function can_delete() { - $count = $this->get_item_uses_count(); - return empty($count); + return !$this->is_used(); } /** - * Returns the number of places where scale is used - activities, grade items, outcomes, etc. - * @return int + * Returns if scale used anywhere - activities, grade items, outcomes, etc. + * @return bool */ - function get_item_uses_count() { + function is_used() { global $CFG; -//TODO: fix me - this methods does some duplicate counting in grade items and activities - $count = 0; - if (!empty($this->courseid)) { - if ($scales_uses = course_scale_used($this->courseid,$this->id)) { - $count += count($scales_uses); - } - } else { - $courses = array(); - if ($scales_uses = site_scale_used($this->id,$courses)) { - $count += count($scales_uses); - } - } - - // count grade items + // count grade items excluding the $sql = "SELECT COUNT(id) FROM {$CFG->prefix}grade_items WHERE scaleid = {$this->id} AND outcomeid IS NULL"; - if ($scales_uses = count_records_sql($sql)) { - $count += $scales_uses; + if (count_records_sql($sql)) { + return true; } // count outcomes $sql = "SELECT COUNT(id) FROM {$CFG->prefix}grade_outcomes WHERE scaleid = {$this->id}"; - if ($scales_uses = count_records_sql($sql)) { - $count += $scales_uses; + if (count_records_sql($sql)) { + return true; + } + + $legacy_mods = false; + if ($mods = get_records('modules', 'visible', 1)) { + foreach ($mods as $mod) { + //Check cm->name/lib.php exists + if (file_exists($CFG->dirroot.'/mod/'.$mod->name.'/lib.php')) { + include_once($CFG->dirroot.'/mod/'.$mod->name.'/lib.php'); + $function_name = $mod->name.'_scale_used_anywhere'; + $old_function_name = $mod->name.'_scale_used'; + if (function_exists($function_name)) { + if ($function_name($this->id)) { + return true; + } + + } else if (function_exists($old_function_name)) { + $legacy_mods = true; + break; + } + } + } + } + + // some mods are missing the new xxx_scale_used_anywhere() - use the really slow old way + if ($legacy_mods) { + if (!empty($this->courseid)) { + if (course_scale_used($this->courseid,$this->id)) { + return true; + } + } else { + $courses = array(); + if (site_scale_used($this->id,$courses)) { + return true; + } + } } - return $count; + return false; } } ?> diff --git a/mod/assignment/lib.php b/mod/assignment/lib.php index 6aed46fe3..67dca3c56 100644 --- a/mod/assignment/lib.php +++ b/mod/assignment/lib.php @@ -2234,7 +2234,7 @@ function assignment_get_participants($assignmentid) { * @param $scaleid int * @return boolean True if the scale is used by the assignment */ -function assignment_scale_used ($assignmentid, $scaleid) { +function assignment_scale_used($assignmentid, $scaleid) { $return = false; @@ -2248,6 +2248,21 @@ function assignment_scale_used ($assignmentid, $scaleid) { } /** + * Checks if scale is being used by any instance of assignment + * + * This is used to find out if scale used anywhere + * @param $scaleid int + * @return boolean True if the scale is used by any assignment + */ +function assignment_scale_used_anywhere($scaleid) { + if ($scaleid and record_exists('assignment', 'grade', -$scaleid)) { + return true; + } else { + return false; + } +} + +/** * Make sure up-to-date events are created for all assignment instances * * This standard function will check all instances of this module diff --git a/mod/forum/lib.php b/mod/forum/lib.php index 123fdb246..30a64099e 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -1272,6 +1272,21 @@ function forum_scale_used ($forumid,$scaleid) { return $return; } +/** + * Checks if scale is being used by any instance of forum + * + * This is used to find out if scale used anywhere + * @param $scaleid int + * @return boolean True if the scale is used by any forum + */ +function forum_scale_used_anywhere($scaleid) { + if ($scaleid and record_exists('forum', 'scale', -$scaleid)) { + return true; + } else { + return false; + } +} + // SQL FUNCTIONS /////////////////////////////////////////////////////////// /** diff --git a/mod/glossary/lib.php b/mod/glossary/lib.php index d54b508d8..395b67944 100644 --- a/mod/glossary/lib.php +++ b/mod/glossary/lib.php @@ -444,6 +444,21 @@ function glossary_scale_used ($glossaryid,$scaleid) { return $return; } +/** + * Checks if scale is being used by any instance of glossary + * + * This is used to find out if scale used anywhere + * @param $scaleid int + * @return boolean True if the scale is used by any glossary + */ +function glossary_scale_used_anywhere($scaleid) { + if ($scaleid and record_exists('glossary', 'scale', -$scaleid)) { + return true; + } else { + return false; + } +} + ////////////////////////////////////////////////////////////////////////////////////// /// Any other glossary functions go here. Each of them must have a name that /// starts with glossary_ diff --git a/mod/hotpot/lib.php b/mod/hotpot/lib.php index c22d6e934..1df8537a2 100644 --- a/mod/hotpot/lib.php +++ b/mod/hotpot/lib.php @@ -1217,6 +1217,17 @@ function hotpot_scale_used ($hotpotid, $scaleid) { return $report; } +/** + * Checks if scale is being used by any instance of hotpot + * + * This is used to find out if scale used anywhere + * @param $scaleid int + * @return boolean True if the scale is used by any hotpot + */ +function hotpot_scale_used_anywhere($scaleid) { + return false; +} + ////////////////////////////////////////////////////////// /// Any other hotpot functions go here. /// Each of them must have a name that starts with hotpot diff --git a/mod/journal/lib.php b/mod/journal/lib.php index a542bd11a..44ba27123 100644 --- a/mod/journal/lib.php +++ b/mod/journal/lib.php @@ -307,6 +307,21 @@ function journal_scale_used ($journalid,$scaleid) { return $return; } +/** + * Checks if scale is being used by any instance of journal + * + * This is used to find out if scale used anywhere + * @param $scaleid int + * @return boolean True if the scale is used by any journal + */ +function journal_scale_used_anywhere($scaleid) { + if ($scaleid and record_exists('journal', 'assessed', -$scaleid)) { + return true; + } else { + return false; + } +} + // SQL FUNCTIONS /////////////////////////////////////////////////////////////////// function journal_get_users_done($journal) { diff --git a/mod/lams/lib.php b/mod/lams/lib.php index f96f32877..06244abbb 100644 --- a/mod/lams/lib.php +++ b/mod/lams/lib.php @@ -140,6 +140,17 @@ function lams_scale_used ($lamsid,$scaleid) { return $return; } +/** + * Checks if scale is being used by any instance of lams + * + * This is used to find out if scale used anywhere + * @param $scaleid int + * @return boolean True if the scale is used by any lams + */ +function lams_scale_used_anywhere($scaleid) { + return false; +} + ////////////////////////////////////////////////////////////////////////////////////// /// Any other lams functions go here. Each of them must have a name that /// starts with lams_ -- 2.11.4.GIT