. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @file * Install, update and uninstall functions for the Mica Datasets module. */ // Load content_taxonomy.module because of a "Call to undefined function content_taxonomy_allowed_values()" error include_once(DRUPAL_ROOT . '/' . drupal_get_path('module', 'content_taxonomy') . '/content_taxonomy.module'); /** * Implements hook_install(). */ function mica_datasets_install() { mica_core_configure_feeds_tamper('mica_datasets'); } /** * Implements hook_schema(). */ function mica_datasets_schema() { $schema = array(); $schema['mica_dataset_connector'] = array( 'description' => 'Stores all dataset connectors created through Mica Datasets.', 'fields' => array( 'id' => array( 'description' => 'The primary identifier for a connector.', 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, ), 'name' => array( 'description' => 'The displayed name for a connector.', 'type' => 'varchar', 'length' => 200, 'not null' => TRUE, ), 'description' => array( 'description' => 'The displayed description for a connector.', 'type' => 'text', 'not null' => FALSE, ), 'dataset_id' => array( 'description' => 'The dataset identifier for a connector.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, ), 'study_id' => array( 'description' => 'The study identifier for a connector.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, ), 'class' => array( 'description' => 'The id of the connection class to use for this connector.', 'type' => 'varchar', 'length' => 100, 'not null' => TRUE, ), 'options' => array( 'description' => 'The options used to configure the service object.', 'type' => 'text', 'serialize' => TRUE, 'not null' => TRUE, ), 'enabled' => array( 'description' => 'A flag indicating whether the connector is enabled.', 'type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 1, ), ) + entity_exportable_schema_fields(), 'indexes' => array( 'indexing' => array('enabled', 'study_id', 'dataset_id'), ), 'primary key' => array('id'), ); $schema['mica_dataset_query'] = array( 'description' => 'Stores all the queries that are to be applied to their associated Mica Datasets.', 'fields' => array( 'id' => array( 'description' => 'The primary identifier for a query.', 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, ), 'name' => array( 'description' => 'The displayed name for a query.', 'type' => 'varchar', 'length' => 200, 'not null' => TRUE, ), 'description' => array( 'description' => 'The displayed description for a query.', 'type' => 'text', 'not null' => FALSE, ), 'dataset_id' => array( 'description' => 'The dataset identifier for a query.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, ), 'cross_variable_id' => array( 'description' => 'The cross variable identifier for a query.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => FALSE, ), 'user_id' => array( 'description' => 'The query author identifier.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, ), 'published' => array( 'description' => 'A flag indicating whether the query is available to users that are not the author.', 'type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 0, ), ) + entity_exportable_schema_fields(), 'indexes' => array( 'indexing' => array('published', 'user_id', 'dataset_id'), ), 'primary key' => array('id'), ); $schema['mica_dataset_query_term'] = array( 'description' => 'Stores the query terms of a query.', 'fields' => array( 'id' => array( 'description' => 'The primary identifier for a query term.', 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, ), 'query_id' => array( 'description' => 'The query identifier for a query term.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, ), 'variable_id' => array( 'description' => 'The variable identifier for a query term.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, ), 'weight' => array( 'description' => 'The weight of a term in its query.', 'type' => 'int', 'not null' => TRUE, 'default' => 0, ), 'depth' => array( 'description' => 'The depth of a term in its query.', 'type' => 'int', 'not null' => TRUE, 'default' => 0, ), 'options' => array( 'description' => 'The options that describe the query term.', 'type' => 'text', 'serialize' => TRUE, 'not null' => TRUE, ), ) + entity_exportable_schema_fields(), 'indexes' => array( 'indexing' => array('query_id'), ), 'primary key' => array('id'), ); return $schema; } /** * Implements hook_requirements() */ function mica_datasets_requirements($phase) { $requirements = array(); $path = drupal_get_path('module', 'taxonomy_csv'); $info = drupal_parse_info_file($path . '/taxonomy_csv.info'); $version = $info['version']; $nb = explode('.', substr($version, strpos($version, '-') + 1)); if ($nb[0] < 5 || ($nb[0] == 5 && $nb[1] < 10)) { $requirements['taxonomy_csv']['severity'] = REQUIREMENT_ERROR; $requirements['taxonomy_csv']['title'] = 'mica_datasets'; $requirements['taxonomy_csv']['description'] = t('The version of taxonomy_csv must be >= 5.10'); } return $requirements; } /** * Import taxonomy dimensions
* Update dataset_studies field type from view_reference to node_reference
* Update dataset_variables field type from view_reference to node_reference
* Rename content type 'Participant Variable' to 'Variable' */ function mica_datasets_update_7120(&$sandbox) { watchdog('mica', 'Update Mica Datasets', array(), WATCHDOG_INFO); // Import taxonomies $base_path = drupal_get_path('module', 'mica_datasets') . '/taxonomies/'; foreach (_mica_datasets_taxonomies() as $taxonomy) { mica_core_taxonomy_import($taxonomy[0], $base_path, $taxonomy[1]); } module_enable(array('mica_category_field')); $query = new EntityFieldQuery; $result = $query->entityCondition('entity_type', 'node') ->entityCondition('bundle', 'participant_variable') ->execute(); $participant_variable = empty($result['node']) ? array() : entity_load('node', array_keys($result['node'])); _mica_datasets_change_dataset_studies_column(); _mica_datasets_change_dataset_variables_column(); features_revert(array('mica_datasets' => array('field', 'user_permission', 'variable', 'menu_links'))); _mica_datasets_migrate_participant_variable($participant_variable); _mica_datasets_configure_field_bundle_settings(); module_load_include('inc', 'mica_datasets', 'mica_datasets.facet_blocks'); mica_datasets_configure_facet_blocks(); mica_core_configure_feeds_tamper('mica_datasets'); watchdog('mica', 'Mica Datasets have been successfully updated', array(), WATCHDOG_INFO); return st('Mica Datasets have been successfully updated'); } /** * Add fields for dataset_studies and dataset_variables to the field_revision */ function mica_datasets_update_7121(&$sandbox) { db_drop_field('field_revision_field_dataset_studies', 'field_dataset_studies_view_id'); db_drop_field('field_revision_field_dataset_studies', 'field_dataset_studies_arguments'); db_drop_index('field_revision_field_dataset_studies', 'field_dataset_studies_view_id'); db_add_field('field_revision_field_dataset_studies', 'field_dataset_studies_nid', array( 'type' => 'int', 'unsigned' => TRUE, 'default' => NULL, ) ); db_drop_field('field_revision_field_dataset_variables', 'field_dataset_variables_view_id'); db_drop_field('field_revision_field_dataset_variables', 'field_dataset_variables_arguments'); db_drop_index('field_revision_field_dataset_variables', 'field_dataset_variables_view_id'); db_add_field('field_revision_field_dataset_variables', 'field_dataset_variables_nid', array( 'type' => 'int', 'unsigned' => TRUE, 'default' => NULL, ) ); } /** * * Apply new permissions.
* Import taxonomies 'Individual Participant Measures' and 'Laboratory Measures' */ function mica_datasets_update_7130(&$sandbox) { db_add_field('mica_dataset_query', 'cross_variable_id', array( 'type' => 'int', 'unsigned' => TRUE, 'default' => NULL, ) ); features_revert(array('mica_datasets' => array('field', 'user_permission'))); // import new taxonomies $base_path = drupal_get_path('module', 'mica_datasets') . '/taxonomies/'; mica_core_taxonomy_import('individual_participant_measures.csv', $base_path, 'Individual Participant Measures'); mica_core_taxonomy_import('laboratory_measures.csv', $base_path, 'Laboratory Measures'); // enable footer area for variable _mica_datasets_configure_field_bundle_settings(); // configure facet blocks require_once(drupal_get_path('module', 'mica_datasets') . '/mica_datasets.facet_blocks.inc'); // configure facets, we can call this configuration for all facet blocks since its a new feature in 1.3 mica_datasets_configure_facet_blocks(); } /** * * Update to 7120 depends on the update of mica_core */ function mica_datasets_update_dependencies() { $dependencies = array(); $dependencies['mica_datasets'][7120] = array('mica_core' => 7120, 'mica_field_description' => 7120); // need to execute field_update_7002() before mica_datasets_update_7130() $dependencies['mica_datasets'][7130] = array('field' => 7002); return $dependencies; } /** * Manually configure field_bundle_settings variable because it is exported via strongarms in mica_studies * so we can't export variable display configuration in mica_datasets. */ function _mica_datasets_configure_field_bundle_settings() { $variable_settings = array( 'view_modes' => array( 'teaser' => array('custom_settings' => TRUE), 'banner_area' => array('custom_settings' => TRUE), 'left_area' => array('custom_settings' => TRUE), 'right_area' => array('custom_settings' => TRUE), 'footer_area' => array('custom_settings' => TRUE), ), 'extra_fields' => array( 'form' => array(), 'display' => array(), ), ); field_bundle_settings('node', 'variable', $variable_settings); } function _mica_datasets_change_dataset_studies_column() { if (db_table_exists('field_data_field_dataset_studies')) { db_update('field_config') ->fields( array( 'type' => 'node_reference', 'module' => 'node_reference', 'data' => 'a:7:{s:12:"entity_types";a:0:{}s:17:"field_permissions";a:1:{s:4:"type";s:1:"0";}s:12:"foreign keys";a:1:{s:3:"nid";a:2:{s:5:"table";s:4:"node";s:7:"columns";a:1:{s:3:"nid";s:3:"nid";}}}s:7:"indexes";a:1:{s:3:"nid";a:1:{i:0;s:3:"nid";}}s:8:"settings";a:2:{s:19:"referenceable_types";a:17:{s:7:"article";i:0;s:4:"blog";i:0;s:7:"contact";i:0;s:19:"data_access_request";i:0;s:18:"data_access_review";i:0;s:7:"dataset";i:0;s:9:"documents";i:0;s:5:"event";i:0;s:17:"field_description";i:0;s:5:"forum";i:0;s:4:"page";i:0;s:5:"panel";i:0;s:7:"project";i:0;s:11:"publication";i:0;s:5:"study";s:5:"study";s:14:"teleconference";i:0;s:8:"variable";i:0;}s:4:"view";a:3:{s:4:"args";a:0:{}s:12:"display_name";s:0:"";s:9:"view_name";s:0:"";}}s:12:"translatable";s:1:"0";s:7:"storage";a:4:{s:4:"type";s:17:"field_sql_storage";s:8:"settings";a:0:{}s:6:"module";s:17:"field_sql_storage";s:6:"active";i:1;}}' ) ) ->condition('field_name', 'field_dataset_studies') ->execute(); db_drop_field('field_data_field_dataset_studies', 'field_dataset_studies_view_id'); db_drop_field('field_data_field_dataset_studies', 'field_dataset_studies_arguments'); db_drop_index('field_data_field_dataset_studies', 'field_dataset_studies_view_id'); db_add_field('field_data_field_dataset_studies', 'field_dataset_studies_nid', array( 'type' => 'int', 'unsigned' => TRUE, 'default' => NULL, ) ); db_add_index('field_data_field_dataset_studies', 'field_dataset_studies_nid', array('field_dataset_studies_nid')); $result = db_select('field_data_mica_dataset', 'f') ->fields('f', array('entity_id')) ->fields('f', array('mica_dataset_nid')) ->execute(); foreach ($result as $row) { watchdog('mica', 'Copy dataset %dataset - study %study', array('%dataset' => $row->mica_dataset_nid, '%study' => $row->entity_id), WATCHDOG_DEBUG); db_update('field_data_field_dataset_studies') ->fields(array('field_dataset_studies_nid' => $row->entity_id)) ->condition('entity_id', $row->mica_dataset_nid) ->execute(); } } } function _mica_datasets_change_dataset_variables_column() { if (db_table_exists('field_data_field_dataset_variables')) { db_update('field_config') ->fields( array( 'type' => 'node_reference', 'module' => 'node_reference', 'data' => 'a:7:{s:12:"entity_types";a:0:{}s:17:"field_permissions";a:1:{s:4:"type";s:1:"0";}s:12:"foreign keys";a:1:{s:3:"nid";a:2:{s:5:"table";s:4:"node";s:7:"columns";a:1:{s:3:"nid";s:3:"nid";}}}s:7:"indexes";a:1:{s:3:"nid";a:1:{i:0;s:3:"nid";}}s:8:"settings";a:2:{s:19:"referenceable_types";a:17:{s:7:"article";i:0;s:4:"blog";i:0;s:7:"contact";i:0;s:19:"data_access_request";i:0;s:18:"data_access_review";i:0;s:7:"dataset";i:0;s:9:"documents";i:0;s:5:"event";i:0;s:17:"field_description";i:0;s:5:"forum";i:0;s:4:"page";i:0;s:5:"panel";i:0;s:7:"project";i:0;s:11:"publication";i:0;s:5:"study";i:0;s:14:"teleconference";i:0;s:8:"variable";s:8:"variable";}s:4:"view";a:3:{s:4:"args";a:0:{}s:12:"display_name";s:0:"";s:9:"view_name";s:0:"";}}s:12:"translatable";s:1:"0";s:7:"storage";a:4:{s:4:"type";s:17:"field_sql_storage";s:8:"settings";a:0:{}s:6:"module";s:17:"field_sql_storage";s:6:"active";i:1;}}' ) ) ->condition('field_name', 'field_dataset_variables') ->execute(); db_drop_field('field_data_field_dataset_variables', 'field_dataset_variables_view_id'); db_drop_field('field_data_field_dataset_variables', 'field_dataset_variables_arguments'); db_drop_index('field_data_field_dataset_variables', 'field_dataset_variables_view_id'); db_add_field('field_data_field_dataset_variables', 'field_dataset_variables_nid', array( 'type' => 'int', 'unsigned' => TRUE, 'default' => NULL, ) ); db_add_index('field_data_field_dataset_variables', 'field_dataset_variables_nid', array('field_dataset_variables_nid')); $result = db_select('field_data_field_dataset', 'f') ->fields('f', array('entity_id')) ->fields('f', array('field_dataset_nid')) ->condition('bundle', 'variable') ->execute(); foreach ($result as $row) { watchdog('mica', 'Copy dataset %dataset - variable %variable', array('%dataset' => $row->mica_dataset_nid, '%variable' => $row->entity_id), WATCHDOG_DEBUG); db_update('field_data_field_dataset_variables') ->fields(array('field_dataset_variables_nid' => $row->entity_id)) ->condition('entity_id', $row->field_dataset_nid) ->execute(); } } } function _mica_datasets_migrate_participant_variable($participant_variables) { foreach ($participant_variables as $nid => $participant_variable) { $wrapper = entity_metadata_wrapper('node', $participant_variable); $repeatable = $wrapper->field_repeatable->value(); $infos = array( 'type' => 'variable', 'language' => LANGUAGE_NONE, 'title' => $wrapper->title->value(), 'body' => $wrapper->body->value(), 'field_label' => $wrapper->field_label->value(), 'field_value_type' => $wrapper->field_value_type->value(), 'field_repeatable' => empty($repeatable) ? 0 : $wrapper->field_repeatable->value(), 'field_dataset' => $wrapper->field_dataset->value(), ); $variable = entity_property_values_create_entity('node', $infos); foreach ($wrapper->field_categories->value() as $index => $category) { $variable->field_variable_categories[$index]->name = $category; $variable->field_variable_categories[$index]->label = $category; } $variable->save(); } // manual node delete instead of node_delete_multiple() to avoid calls the node-specific callbacks $nids = array_keys($participant_variables); if (!empty($nids)) { db_delete('node')->condition('nid', $nids, 'IN')->execute(); db_delete('node_revision')->condition('nid', $nids, 'IN')->execute(); db_delete('history')->condition('nid', $nids, 'IN')->execute(); db_delete('node_access')->condition('nid', $nids, 'IN')->execute(); } search_api_index_delete('participant_variable_index'); node_type_delete('participant_variable'); node_type_cache_reset(); node_types_rebuild(); variable_del('node_preview_participant_variable'); }