.
*
* 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');
}