/** * Run all upgrade steps from before elis 2.6. * * @param int $oldversion The currently installed version of the old component. * @return bool Success/Failure. */ function elisprogram_usetclassify_pre26upgradesteps($oldversion) { global $CFG, $THEME, $DB; $dbman = $DB->get_manager(); $result = true; if ($oldversion < 2011071400) { // Rename field. $field = field::find(new field_filter('shortname', '_elis_cluster_classification')); if ($field->valid()) { $field = $field->current(); $field->shortname = USERSET_CLASSIFICATION_FIELD; if ($field->name == 'Cluster classification') { // Rhe field name hasn't been changed from the old default. $field->name = get_string('classification_field_name', 'elisprogram_usetclassify'); } $field->save(); $category = $field->category; if ($category->name == 'Cluster classification') { // The field name hasn't been changed from the old default. $category->name = get_string('classification_category_name', 'elisprogram_usetclassify'); $category->save(); } } upgrade_plugin_savepoint($result, 2011071400, 'pmplugins', 'userset_classification'); } if ($result && $oldversion < 2011101200) { $field = field::find(new field_filter('shortname', USERSET_CLASSIFICATION_FIELD)); if ($field->valid()) { $field = $field->current(); if ($owner = new field_owner(!isset($field->owners) || !isset($field->owners['manual']) ? false : $field->owners['manual'])) { $owner->fieldid = $field->id; $owner->plugin = 'manual'; //$owner->exclude = 0; // TBD $owner->param_help_file = 'elisprogram_usetclassify/cluster_classification'; $owner->save(); } } upgrade_plugin_savepoint($result, 2011101200, 'pmplugins', 'userset_classification'); } if ($result && $oldversion < 2011101800) { // Userset -> 'User Set'. $field = field::find(new field_filter('shortname', USERSET_CLASSIFICATION_FIELD)); if ($field->valid()) { $field = $field->current(); if (stripos($field->name, 'Userset') !== false) { $field->name = str_ireplace('Userset', 'User Set', $field->name); $field->save(); } $category = $field->category; if (stripos($category->name, 'Userset') !== false) { $category->name = str_ireplace('Userset', 'User Set', $category->name); $category->save(); } } upgrade_plugin_savepoint($result, 2011101800, 'pmplugins', 'userset_classification'); } if ($result && $oldversion < 2011110300) { // Make sure to rename the default classification name from "Cluster" to "User set". require_once elispm::file('plugins/usetclassify/usersetclassification.class.php'); // Make sure there are no custom fields with invalid categories. pm_fix_orphaned_fields(); $field = field::find(new field_filter('shortname', USERSET_CLASSIFICATION_FIELD)); if ($field->valid()) { $field = $field->current(); $category = $field->category; $default = usersetclassification::find(new field_filter('shortname', 'regular')); if ($default->valid()) { $default = $default->current(); $default->name = get_string('cluster', 'local_elisprogram'); $default->save(); } // Upgrade field owner data for the default User Set field. $field = field::ensure_field_exists_for_context_level($field, CONTEXT_ELIS_USERSET, $category); $owners = field_owner::find(new field_filter('fieldid', $field->id)); if ($owners->valid()) { foreach ($owners as $owner) { if ($owner->plugin == 'cluster_classification') { $owner->plugin = 'userset_classification'; $owner->save(); } else { if ($owner->plugin == 'manual') { $owner->param_options_source = 'userset_classifications'; $owner->param_help_file = 'elisprogram_usetclassify/cluster_classification'; $owner->save(); } } } } upgrade_plugin_savepoint($result, 2011110300, 'pmplugins', 'userset_classification'); } } return $result; }
/** * Validate that an invalid category for a field causes a field * to be moved to the Miscellaneous category */ public function test_orphanedcustomfieldsmovedtomiscellaneouscategory() { global $CFG, $DB; $contextlevel = CONTEXT_ELIS_USERSET; $misccat = get_string('misc_category', 'local_elisprogram'); // Set up a custom field with an invalid category. $field = new field(array('name' => 'testcustomfieldname', 'datatype' => 'char', 'categoryid' => '99', 'multivalued' => 1)); $field->save(); // Set up the default data. $defaultparams = array('fieldid' => $field->id, 'contextid' => $contextlevel, 'data' => 'value1'); $defaultdata = new field_data_char($defaultparams); $defaultdata->save(); // Also create a contextlevel record for the field. $fieldcontext = new field_contextlevel(); $fieldcontext->fieldid = $field->id; $fieldcontext->contextlevel = $contextlevel; $fieldcontext->save(); // Call function to check if this is an orphaned field. pm_fix_orphaned_fields(); // Assert that the field exists. $result = $DB->get_field(field::TABLE, 'id', array('id' => $field->id)); $this->assertEquals($field->id, $result); // Assert that the field is in the correct context still. $sql = "SELECT field.id\n FROM {" . field::TABLE . "} field\n JOIN {" . field_contextlevel::TABLE . "} ctx\n ON ctx.fieldid = field.id\n WHERE ctx.contextlevel = ?\n AND field.id = ?"; $params = array($contextlevel, $field->id); $result = $DB->get_field_sql($sql, $params); $this->assertEquals($field->id, $result); // Assert that the Miscellaneous category exists. $result = $DB->get_field(field_category::TABLE, 'name', array('name' => $misccat)); $this->assertEquals($misccat, $result); // Assert that the Miscellaneous category is in the correct context. $sql = "SELECT category.name\n FROM {" . field_category::TABLE . "} category\n JOIN {" . field_category_contextlevel::TABLE . "} category_context\n ON category.id = category_context.categoryid\n WHERE category_context.contextlevel = ?\n AND category.name = ?"; $params = array($contextlevel, $misccat); $result = $DB->get_field_sql($sql, $params); $this->assertEquals($misccat, $result); // Assert that the field is in the Miscellaneous category. $sql = "SELECT field.id\n FROM {" . field::TABLE . "} field\n JOIN {" . field_category::TABLE . "} category\n ON category.id = field.categoryid\n WHERE field.id = ?\n AND category.name = ?"; $params = array($field->id, $misccat); $result = $DB->get_field_sql($sql, $params); $this->assertEquals($field->id, $result); // Now check that an invalid field will be moved to the existing Miscellaneous category // and not create a second Miscellaneous category. // Set up a custom field with an invalid category. $field = new field(array('name' => 'testcustomfieldname2', 'datatype' => 'char', 'categoryid' => '109')); $field->save(); // Set up the default data. $defaultparams = array('fieldid' => $field->id, 'contextid' => $contextlevel, 'data' => 'value2'); $defaultdata = new field_data_char($defaultparams); $defaultdata->save(); // Also create a contextlevel record for the field. $fieldcontext = new field_contextlevel(); $fieldcontext->fieldid = $field->id; $fieldcontext->contextlevel = $contextlevel; $fieldcontext->save(); // Call function to check if this is an orphaned field. pm_fix_orphaned_fields(); // Assert that only one Miscellaneous category exists. $result = $DB->get_records(field_category::TABLE, array('name' => $misccat)); $this->assertEquals(1, count($result)); // Assert that the field is in the Miscellaneous category. $sql = "SELECT field.id\n FROM {" . field::TABLE . "} field\n JOIN {" . field_category::TABLE . "} category\n ON category.id = field.categoryid\n WHERE field.id = ?\n AND category.name = ?"; $params = array($field->id, $misccat); $result = $DB->get_field_sql($sql, $params); $this->assertEquals($field->id, $result); }