.
*
* 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
* Code for the Mica Datasets feature.
*/
include_once('mica_datasets.features.inc');
include_once('mica_datasets.devel.inc');
include_once('mica_datasets.menu.inc');
require_once('includes/query_entity.inc');
define('PRIVATE_KEY_FILE', 'private://mica-privatekey.pem');
define('PUBLIC_KEY_FILE', 'private://mica-publickey.pem');
define('MICA_HARMONIZATION_IMPOSSIBLE', base_path() . drupal_get_path('module', 'mica_datasets') . '/images/bullet_red.png');
define('MICA_HARMONIZATION_COMPLETE', base_path() . drupal_get_path('module', 'mica_datasets') . '/images/bullet_green.png');
define('MICA_HARMONIZATION_FORBIDDEN', base_path() . drupal_get_path('module', 'mica_datasets') . '/images/bullet_white.png');
define('MICA_HARMONIZATION_UNDETERMINED', base_path() . drupal_get_path('module', 'mica_datasets') . '/images/bullet_black.png');
define('MICA_HARMONIZATION_REFRESH', base_path() . drupal_get_path('module', 'mica_datasets') . '/images/refresh.png');
define('MICA_HARMONIZATION_MISING_TICK', base_path() . drupal_get_path('module', 'mica_datasets') . '/images/tick.png');
/**
* Creates default content after Features successfully installed
* Implements hook_features_rebuild_completed()
*/
function mica_datasets_features_rebuild_completed() {
if (!variable_get('mica_datasets_features_rebuild_completed', FALSE)) {
_mica_datasets_create_default_content();
variable_set('mica_datasets_features_rebuild_completed', TRUE);
}
}
function _mica_datasets_create_default_content() {
$page = mica_core_add_page(
st("Datasets"),
st(
"The consortium makes study-specific datasets and harmonized datasets available to the research community. Each dataset is described by a comprehensive data dictionary which gives details on each available variable.
Moreover, Mica includes for studies using the OBiBa Opal software as main database solution, a distributed query engine that enables researchers to obtain real-time aggregated reports on the exact number of participant with specific characteristics or phenotypes. Mica makes even possible to run remotely some regression analyses on the real study data using the DataSHIELD method (Wolfson M et al. Int J Epidemiol. 2010) which is implemented both in Mica and Opal. More information on the OBiBa suite of software is available at www.obiba.org.
"
),
"datasets"
);
$datasets_path = 'node/' . $page->nid;
$resource_menu = mica_core_find_menu_for_alias('resources');
$dataset_menu = mica_core_create_node_menu($page, FALSE, TRUE, 0, $resource_menu->link_path);
mica_core_create_menu(st('Study Datasets'), 'study-datasets', 'study-datasets', FALSE, FALSE, 1, $datasets_path);
mica_core_create_menu(st('Harmonization Datasets'), 'harmonization-datasets', 'harmonization-datasets', FALSE, FALSE, 2, $datasets_path);
mica_core_create_menu(st('Variables Search'), 'variable-search', 'variable-search', FALSE, FALSE, 3, $datasets_path);
// Set menu parent option for dataset
mica_core_set_menu_option('dataset', $dataset_menu['mlid']);
}
/**
* Implements hook_theme().
*/
function mica_datasets_theme() {
return array(
'mica_datasets_query_edit_form' => array(
'render element' => 'form'
),
'mica_datasets_reorder_variables' => array(
'render element' => 'form',
'file' => 'mica_datasets.pages.variables.inc',
),
);
}
/**
* Implements hook_permission().
*/
function mica_datasets_permission() {
$perms = array(
"view any dataset query" => array(
'title' => t('View any Dataset Query'),
'description' => t('Permission for viewing own and published queries.'),
),
"create edit delete own dataset query" => array(
'title' => t('Create, edit and delete own Dataset Query'),
),
"edit delete any dataset query" => array(
'title' => t('Edit and delete any Dataset Query'),
'description' => t('Permission for editing and deleting own and published queries.'),
),
"publish dataset query" => array(
'title' => t('Publish Dataset Query'),
'description' => t('Edition permission on the query is required to be effectively allowed to publish it.'),
),
);
return $perms;
}
/**
* Implements hook_menu().
*/
function mica_datasets_menu() {
$items['node/%node/datasets'] = array(
'title' => 'Edit Datasets',
'access callback' => '_mica_datasets_node_access',
'access arguments' => array(1, 'study', 'update'),
'page callback' => 'mica_datasets_study_datasets_edit_page',
'page arguments' => array(1),
'weight' => 5,
'type' => MENU_LOCAL_ACTION,
'file' => 'mica_datasets.pages.inc',
);
$items['node/%node/studies'] = array(
'title' => 'Edit Studies',
'access callback' => '_mica_datasets_node_access',
'access arguments' => array(1, 'dataset', 'update'),
'page callback' => 'mica_datasets_dataset_studies_edit_page',
'page arguments' => array(1),
'weight' => -1,
'type' => MENU_LOCAL_ACTION,
'file' => 'mica_datasets.pages.inc',
);
$items['node/%node/reordervariables'] = array(
'title' => 'Reorder Variables',
'description' => 'Reorder Variables within their Dataset.',
'access callback' => '_mica_datasets_node_access',
'access arguments' => array(1, 'dataset', 'update'),
'page callback' => 'drupal_get_form',
'page arguments' => array('mica_datasets_reorder_variables', 1),
'type' => MENU_LOCAL_TASK,
'file' => 'mica_datasets.pages.variables.inc',
);
// queries
$items['node/%node/queries'] = array(
'title' => 'Queries',
'access callback' => '_mica_datasets_node_queries_access',
'access arguments' => array(1, 'view'),
'page callback' => 'mica_datasets_queries_page',
'page arguments' => array(1),
'type' => MENU_LOCAL_ACTION,
'file' => 'mica_datasets.pages.query.inc',
);
$items['node/%node/queries/add'] = array(
'title' => 'Add Query',
'access callback' => '_mica_datasets_node_queries_access',
'access arguments' => array(1, 'update'),
'page callback' => 'mica_datasets_query_edit_page',
'page arguments' => array(1, NULL),
'weight' => 7,
'type' => MENU_LOCAL_ACTION,
'file' => 'mica_datasets.pages.query.inc',
);
$items['node/%node/queries/%mica_dataset_query'] = array(
'title callback' => '_mica_datasets_query_title',
'title arguments' => array(1, 3),
'access callback' => '_mica_datasets_query_access',
'access arguments' => array(1, 3, 'view'),
'page callback' => 'drupal_get_form',
'page arguments' => array('mica_datasets_query_run_page', 1, 3, 4),
'weight' => 7,
'file' => 'mica_datasets.pages.query.inc',
);
$items['node/%node/queries/%mica_dataset_query/view'] = array(
'title' => 'Run',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -10,
);
$items['node/%node/queries/%mica_dataset_query/edit'] = array(
'title' => 'Edit',
'access callback' => '_mica_datasets_query_access',
'access arguments' => array(1, 3, 'update'),
'page callback' => 'mica_datasets_query_edit_page',
'page arguments' => array(1, 3),
'type' => MENU_LOCAL_TASK,
'file' => 'mica_datasets.pages.query.inc',
);
$items['mica/%ctools_js/node/%node/queries/%mica_dataset_query/delete'] = array(
'title' => 'Delete',
'access callback' => '_mica_datasets_query_access',
'access arguments' => array(3, 5, 'update'),
'page callback' => 'mica_datasets_dataset_query_delete_modal_page',
'page arguments' => array(1, 3, 5),
'type' => MENU_CALLBACK,
'file' => 'mica_datasets.pages.query.inc',
);
// query term
$items['node/%node/queries/%mica_dataset_query/term/%mica_dataset_query_term'] = array(
'title callback' => '_mica_datasets_query_term_title',
'title arguments' => array(1, 3, 5),
'access callback' => TRUE,
'access callback' => '_mica_datasets_query_access',
'access arguments' => array(1, 3, 'view'),
'page callback' => 'mica_datasets_query_term_page',
'page arguments' => array(1, 3, 5),
'file' => 'mica_datasets.pages.query.term.inc',
);
$items['node/%node/queries/%mica_dataset_query/term/%mica_dataset_query_term/view'] = array(
'title' => 'View',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -10,
);
$items['mica/%ctools_js/node/%node/queries/%mica_dataset_query/term/%mica_dataset_query_term/edit'] = array(
'title' => 'Edit',
'access callback' => '_mica_datasets_query_term_access',
'access arguments' => array(3, 5, 7, 'update'),
'page callback' => 'mica_datasets_query_term_edit_modal_page',
'page arguments' => array(1, 3, 5, 7, 9),
'type' => MENU_CALLBACK,
'file' => 'mica_datasets.pages.query.term.inc',
);
$items['mica/%ctools_js/node/%node/queries/%mica_dataset_query/term/%mica_dataset_query_term/delete'] = array(
'title' => 'Delete',
'access callback' => '_mica_datasets_query_term_access',
'access arguments' => array(3, 5, 7, 'update'),
'page callback' => 'mica_datasets_query_term_delete_modal_page',
'page arguments' => array(1, 3, 5, 7, 9),
'type' => MENU_CALLBACK,
'file' => 'mica_datasets.pages.query.term.inc',
);
$items['variables/autocomplete/%'] = array(
'access callback' => TRUE,
'page callback' => 'variables_autocomplete',
'page arguments' => array(2),
'type' => MENU_CALLBACK,
'file' => 'mica_datasets.pages.query.inc',
);
// dataset connector entity edit
$items['mica/%ctools_js/node/%node/study/%node/connector/add'] = array(
'title' => 'Dataset Connection',
'access callback' => '_mica_datasets_node_access',
'access arguments' => array(3, 'dataset', 'update'),
'page callback' => 'mica_datasets_dataset_connection_modal_page',
'page arguments' => array(1, NULL, 3, 5),
'type' => MENU_CALLBACK,
'file' => 'mica_datasets.pages.inc',
);
$items['mica/%ctools_js/node/%node/study/%node/connector/%mica_dataset_connector/edit'] = array(
'title' => 'Dataset Connection',
'access callback' => '_mica_datasets_node_access',
'access arguments' => array(3, 'dataset', 'update'),
'page callback' => 'mica_datasets_dataset_connection_modal_page',
'page arguments' => array(1, 7, 3, 5),
'type' => MENU_CALLBACK,
'file' => 'mica_datasets.pages.inc',
);
$items['mica/ajax/dataset/%node/%node/edit'] = array(
'title' => 'Dataset Connection Edit',
'delivery callback' => 'ajax_deliver',
'theme callback' => 'ajax_base_page_theme',
'access callback' => '_mica_datasets_node_access',
'access arguments' => array(4, 'study', 'update'),
'page callback' => 'mica_dataset_edit_ajax_form_callback',
'page arguments' => array(3, 4),
'type' => MENU_CALLBACK,
'file' => 'mica_datasets.pages.inc',
);
$items['node/%node/dataset-harmonization'] = array(
'title' => 'Harmonization',
'description' => 'View the list of harmonized variables',
'page callback' => 'mica_datasets_dataset_harmonization_page',
'page arguments' => array(1),
'access callback' => '_mica_datasets_node_access',
'access arguments' => array(1, 'dataset', 'view'),
'type' => MENU_LOCAL_ACTION,
'file' => 'mica_datasets.pages.harmonization.inc',
);
// Mica administration
$items['admin/config/system/mica'] = array(
'title' => 'Mica',
'description' => 'Manage Mica Unit.',
'access callback' => 'user_access',
'access arguments' => array(0),
'page callback' => 'unit_certificate_page',
'page arguments' => array(0),
'file' => 'mica_datasets.pages.unit.inc',
'type' => MENU_NORMAL_ITEM,
);
$items['admin/config/system/mica/configure'] = array(
'title' => 'Configure key pair',
'access callback' => 'user_access',
'access arguments' => array(0),
'page callback' => 'drupal_get_form',
'page arguments' => array('unit_form'),
'file' => 'mica_datasets.pages.unit.inc',
'type' => MENU_LOCAL_ACTION,
);
// Mica datasets taxonomy imports/delete
$items['admin/config/development/mica_datasets'] = array(
'title' => 'Mica Datasets',
'description' => 'development tools for Mica Datasets',
'page callback' => 'drupal_get_form',
'page arguments' => array('_mica_datasets_devel_form'),
'access arguments' => array('administer site configuration'),
);
$items['mica_datasets_harmonization/nojs/%'] = array(
'page callback' => 'mica_datasets_import_variables_callback',
'page arguments' => array(1, 2),
'access callback' => '_mica_datasets_node_access',
'access arguments' => array(2, 'dataset', 'update'),
'type' => MENU_CALLBACK,
);
$items['mica_datasets_harmonization/ajax/%/%'] = array(
'page callback' => 'mica_datasets_import_variables_callback',
'page arguments' => array(1, 2, 3),
'access callback' => '_mica_datasets_node_access',
'access arguments' => array(2, 'dataset', 'update'),
'type' => MENU_CALLBACK,
'delivery callback' => 'ajax_deliver',
);
return $items;
}
/**
* Implements hook_menu_local_tasks_alter().
*/
function mica_datasets_menu_local_tasks_alter(&$data, $router_item, $root_path) {
$links = array();
switch ($root_path) {
case 'study-datasets':
case 'harmonization-datasets':
if (node_access('create', 'dataset')) {
$links['add-dataset'] = array(
'#theme' => 'menu_local_action',
'#link' => array(
'title' => t('Add a Dataset'),
'href' => 'node/add/dataset',
'localized_options' => array(
'query' => array(
'type' => 'dataset'
)
)
),
);
}
break;
case 'node/%/reordervariables':
$node = $router_item['page_arguments'][1];
if ($node != NULL && $node->type === 'dataset') {
if (node_access('update', $node)) {
// add variables
$links['add-variable'] = array(
'#theme' => 'menu_local_action',
'#weight' => 7,
'#link' => array(
'title' => t('Add new variable'),
'href' => 'node/add/variable',
'localized_options' => array(
'query' => array(
'dataset' => $node->nid
)
)
),
);
}
}
break;
case 'node/%':
$node = $router_item['page_arguments'][0];
if ($node != NULL && $node->type === 'dataset') {
if (node_access('update', $node)) {
// add variables
$links['add-variable'] = array(
'#theme' => 'menu_local_action',
'#weight' => 7,
'#link' => array(
'title' => t('Add new variable'),
'href' => 'node/add/variable',
'localized_options' => array(
'query' => array(
'dataset' => $node->nid
)
)
),
);
// If at least one study as a connection to Opal
$dataset_wrapper = entity_metadata_wrapper('node', $node);
foreach ($dataset_wrapper->field_dataset_studies->value() as $study) {
if (mica_dataset_connector_query($dataset_wrapper->nid->value(), $study->nid, 1)) {
// import variables
$links['import-variables'] = array(
'#theme' => 'menu_local_action',
'#weight' => 7,
'#link' => array(
'title' => t('Import Variables'),
'href' => 'mica_datasets_harmonization/nojs/' . $node->nid,
)
);
break;
}
}
}
if (node_access('view', $node)) {
// highlight queries and harmonization
foreach ($data['actions']['output'] as $key => $link) {
if (isset($link['#link']['path']) && $link['#link']['path'] == 'node/%/queries') {
$data['actions']['output'][$key]['#link']['localized_options'] = array(
'attributes' => array('class' => 'highlight')
);
$data['actions']['output'][$key]['#weight'] = 40;
}
if (isset($link['#link']['path']) && $link['#link']['path'] == 'node/%/dataset-harmonization') {
//Hide Harmonization button when its a study dataset
$dataset_wrapper = entity_metadata_wrapper('node', $node);
if ($dataset_wrapper->field_dataset_type->value() === 'study') {
$data['actions']['output'][$key]['#access'] = FALSE;
}
else {
$data['actions']['output'][$key]['#link']['localized_options'] = array(
'attributes' => array('class' => 'highlight')
);
$data['actions']['output'][$key]['#weight'] = 42;
}
}
}
// variables
$links['view-variable'] = array(
'#weight' => 30,
'#theme' => 'menu_local_action',
'#link' => array(
'title' => t('Variables'),
'href' => 'variable-search',
'localized_options' => array(
'query' => array(
'f[0]' => 'field_dataset:' . $node->nid
),
'attributes' => array(
'class' => 'highlight',
),
),
),
);
}
}
break;
case 'node/%/dataset-harmonization':
$node = $router_item['page_arguments'][0];
if ($node != NULL && $node->type === 'dataset') {
if (node_access('update', $node)) {
// add variables
$links['add-variable'] = array(
'#theme' => 'menu_local_action',
'#weight' => 7,
'#link' => array(
'title' => t('Add new variable'),
'href' => 'node/add/variable',
'localized_options' => array(
'query' => array(
'dataset' => $node->nid
)
)
),
);
// Edit studies
$item = menu_get_item("node/$node->nid/studies");
if ($item['access']) {
$data['actions']['output'][] = array(
'#theme' => 'menu_local_action',
'#link' => $item,
);
}
}
}
break;
}
$data['actions']['output'] = array_merge($data['actions']['output'], $links);
}
/**
* Get the title for the query.
*
* @param node $dataset_node
* @param mica_dataset_query $query
*/
function _mica_datasets_query_title($dataset_node, $query) {
return $query->name;
}
/**
* Get the title for the query term.
*
* @param node $dataset_node
* @param mica_dataset_query $query
* @param mica_dataset_query_term $term
*/
function _mica_datasets_query_term_title($dataset_node, $query, $term) {
$variable_node = node_load($term->variable_id);
return $variable_node->title;
}
/**
* Check node type (if provided) and node access.
*
* @param node $node
* @param string $bundle
* @param string $op
*/
function _mica_datasets_node_access($node, $bundle = NULL, $op = 'update') {
if (!is_object($node)) {
$node = node_load($node);
}
// Make sure the user can view the original node content.
if ($bundle != NULL) {
return $node->type === $bundle && node_access($op, $node);
}
else {
return node_access($op, $node);
}
}
/**
* Check whether queries tab is accessible: requires to have access to dataset node and having participant variables
* defined for this dataset.
*
* @param node $dataset_node
* @param string $op
*/
function _mica_datasets_node_queries_access($dataset_node, $op = 'update') {
global $user;
if (_mica_datasets_node_access($dataset_node, 'dataset', 'view')) {
if (mica_dataset_dataset_variables($dataset_node->nid) && _mica_datasets_has_connectors($dataset_node->nid)) {
if ($op === 'view') {
return user_access('view any dataset query');
}
if ($op === 'update') {
return user_access('create edit delete own dataset query');
}
}
}
return FALSE;
}
/**
* Check for query accessibility: associated dataset is accessible, and query terms are all visible,
* and user is the query author or query is published for viewing.
*
* @param node $dataset_node
* @param MicaDatasetQuery $query
* @param string $op
*/
function _mica_datasets_query_access($dataset_node, $query, $op = 'update') {
global $user;
// consistency check
if ($dataset_node->nid != $query->dataset_id) {
return FALSE;
}
if (!_mica_datasets_node_access($dataset_node, 'dataset', 'view')) {
return FALSE;
}
// All variables associated to the query terms must be visible
$terms = mica_dataset_query_term_query($query);
if (isset($terms)) {
foreach ($terms as $term) {
if (node_access('view', node_load($term->variable_id)) == FALSE) {
return FALSE;
}
}
}
// View query
if ($op == 'view') {
$view_perm = user_access('view any dataset query');
if ($query->user_id == $user->uid) {
return $view_perm;
}
else {
return $view_perm && $query->published;
}
}
// Edit/delete query
if ($op == 'update') {
$edit_perm = user_access('edit delete any dataset query');
if ($query->user_id == $user->uid) {
return user_access('create edit delete own dataset query') || ($edit_perm && $query->published);
}
else {
return $edit_perm && $query->published;
}
}
return FALSE;
}
/**
* Check for query term access: associated query must be accessible.
*
* @param node $dataset_node
* @param mica_dataset_query $query
* @param mica_dataset_query_term $query_term
* @param string $op
*/
function _mica_datasets_query_term_access($dataset_node, $query, $query_term, $op = 'update') {
if (!is_object($query_term)) {
$query_term = mica_dataset_query_term_load($query_term);
}
if (!is_object($query)) {
$query = mica_dataset_query_load($query);
}
// consistency check
if (MicaDatasetQueryManager::isCached($query) == FALSE && $query->id != $query_term->query_id) {
return FALSE;
}
return _mica_datasets_query_access($dataset_node, $query, $op);
}
/**
* Implements hook_form().
*/
function mica_datasets_form($node, &$form_state) {
return node_content_form($node, $form_state);
}
/**
* Implements hook_field_attach_form()
*/
function mica_datasets_field_attach_form($entity_type, $entity, &$form, &$form_state, $langcode) {
// do not display manual edition of study view reference field
if ($entity_type === 'node') {
switch ($entity->type) {
case 'dataset';
$form['field_dataset_studies']['#attributes']['style'] = array('display:none;');
$form['field_dataset_variables']['#attributes']['style'] = array('display:none;');
break;
case 'study':
$form['field_study_study_variable_att']['#attributes']['style'] = array('display:none;');
break;
case 'variable':
$form['field_variable_study_var_att']['#attributes']['style'] = array('display:none;');
break;
case 'study_variable_attributes':
$form['field_sva_variable']['#attributes']['style'] = array('display:none;');
$form['field_sva_study']['#attributes']['style'] = array('display:none;');
break;
}
}
}
/**
* Implements hook_entity_info().
*/
function mica_datasets_entity_info() {
$info['mica_dataset_connector'] = array(
'label' => t('Dataset connector'),
'controller class' => 'EntityAPIController',
'metadata controller class' => FALSE,
'entity class' => 'MicaDatasetConnector',
'base table' => 'mica_dataset_connector',
'uri callback' => 'mica_dataset_connector_url',
'module' => 'mica_dataset',
'exportable' => FALSE,
'entity keys' => array(
'id' => 'id',
'label' => 'name',
),
);
$info['mica_dataset_query'] = array(
'label' => t('Dataset query'),
'controller class' => 'EntityAPIController',
'metadata controller class' => FALSE,
'entity class' => 'MicaDatasetQuery',
'base table' => 'mica_dataset_query',
'uri callback' => 'mica_dataset_query_url',
'module' => 'mica_dataset',
'exportable' => FALSE,
'entity keys' => array(
'id' => 'id',
'label' => 'name',
),
);
$info['mica_dataset_query_term'] = array(
'label' => t('Dataset query term'),
'controller class' => 'EntityAPIController',
'metadata controller class' => FALSE,
'entity class' => 'MicaDatasetQueryTerm',
'base table' => 'mica_dataset_query_term',
'uri callback' => 'mica_dataset_query_term_url',
'module' => 'mica_dataset',
'exportable' => FALSE,
'entity keys' => array(
'id' => 'id',
'label' => 'name',
),
);
return $info;
}
/**
* Implements hook_entity_property_info().
*/
function mica_datasets_entity_property_info() {
$info['mica_dataset_connector']['properties'] = array(
'id' => array(
'label' => t('ID'),
'type' => 'integer',
'description' => t('The primary identifier for a connector.'),
),
'name' => array(
'label' => t('Name'),
'type' => 'text',
'description' => t('The displayed name for a connector.'),
'required' => TRUE,
),
'description' => array(
'label' => t('Description'),
'type' => 'text',
'description' => t('The displayed description for a connector.'),
'sanitize' => 'filter_xss',
),
'dataset_id' => array(
'label' => t('Dataset ID'),
'type' => 'integer',
'description' => t('The primary identifier for the Dataset node.'),
),
'study_id' => array(
'label' => t('Study ID'),
'type' => 'integer',
'description' => t('The primary identifier for the Study node.'),
),
'class' => array(
'label' => t('Connection class'),
'type' => 'text',
'description' => t('The ID of the connection class to use for this server.'),
'required' => TRUE,
),
'enabled' => array(
'label' => t('Enabled'),
'type' => 'boolean',
'description' => t('A flag indicating whether the connector is enabled.'),
),
);
$info['mica_dataset_query']['properties'] = array(
'id' => array(
'label' => t('ID'),
'type' => 'integer',
'description' => t('The primary identifier for a query.'),
),
'name' => array(
'label' => t('Name'),
'type' => 'text',
'description' => t('The displayed name for a query.'),
'required' => TRUE,
),
'description' => array(
'label' => t('Description'),
'type' => 'text',
'description' => t('The displayed description for a query.'),
'sanitize' => 'filter_xss',
),
'dataset_id' => array(
'label' => t('Dataset ID'),
'type' => 'integer',
'description' => t('The primary identifier for the Dataset node.'),
),
'user_id' => array(
'label' => t('User ID'),
'type' => 'integer',
'description' => t('The primary identifier for the user.'),
),
'published' => array(
'label' => t('Published'),
'type' => 'boolean',
'description' => t('A flag indicating whether the query is published.'),
),
);
$info['mica_dataset_query_term']['properties'] = array(
'id' => array(
'label' => t('ID'),
'type' => 'integer',
'description' => t('The primary identifier for a query term.'),
),
'query_id' => array(
'label' => t('Query ID'),
'type' => 'integer',
'description' => t('The query identifier for a query term.'),
),
'variable_id' => array(
'label' => t('Variable ID'),
'type' => 'integer',
'description' => t('The variable identifier for a query term.'),
),
'weight' => array(
'label' => t('Weight'),
'type' => 'integer',
'description' => t('The weight of a term in its query.'),
),
'depth' => array(
'label' => t('Depth'),
'type' => 'integer',
'description' => t('The depth of a term in its query.'),
),
);
return $info;
}
//
// Mica Dataset Connector
//
/**
* Load the dataset connector corresponding to the specified dataset and study ids.
*
* @param $dataset_id
* @param $study_id
* @param $enabled
*
* @return MicaDatasetConnector
* A connector or FALSE if not found.
*/
function mica_dataset_connector_query($dataset_id, $study_id, $enabled = NULL) {
$q = db_select('mica_dataset_connector', 'c');
$q->addField('c', 'id');
$q->condition('c.dataset_id', $dataset_id);
$q->condition('c.study_id', $study_id);
if (isset($enabled)) {
$q->condition('c.enabled', $enabled);
}
$q->range(0, 1);
$result = $q->execute();
$rval = $result->fetchField();
return $rval ? mica_dataset_connector_load($rval) : FALSE;
}
/**
* Load the dataset connectors corresponding to the specified dataset id.
*
* @param $dataset_id
* @param $enabled
*
* @return MicaDatasetConnector
* An array of connectors (may be empty).
*/
function mica_dataset_connector_query_multiple($dataset_id, $enabled = NULL) {
$connectors = array();
// check rights to make query
if (_mica_datasets_node_queries_access(node_load($dataset_id), 'view')) {
$q = db_select('mica_dataset_connector', 'c');
$q->addField('c', 'id');
$q->condition('c.dataset_id', $dataset_id);
if (isset($enabled)) {
$q->condition('c.enabled', $enabled);
}
$result = $q->execute();
while ($record = $result->fetchAssoc()) {
$connector = mica_dataset_connector_load($record['id']);
// check that study is visible by user
$study = node_load($connector->study_id);
if (node_access('view', $study)) {
$connectors[] = $connector;
}
}
}
return $connectors;
}
/**
* Load the dataset connector with the specified id.
*
* @param $id
* The dataset connector's id.
* @param $reset
* Whether to reset the internal cache.
*
* @return MicaDatasetConnector
* An object representing the connector with the specified id.
*/
function mica_dataset_connector_load($id, $reset = FALSE) {
$ret = mica_dataset_connector_load_multiple(array($id), array(), $reset);
return $ret ? reset($ret) : FALSE;
}
/**
* Load multiple connectors at once, determined by IDs or machine names, or by
* other conditions.
*
* @see entity_load()
*
* @param $ids
* An array of connector IDs or machine names.
* @param $conditions
* An array of conditions on the {mica_dataset_connector} table in the form
* 'field' => $value.
* @param $reset
* Whether to reset the internal entity_load cache.
*
* @return array
* An array of connector objects keyed by machine name.
*/
function mica_dataset_connector_load_multiple($ids = array(), $conditions = array(), $reset = FALSE) {
return entity_load('mica_dataset_connector', $ids, $conditions, $reset);
}
/**
* Entity uri callback.
*/
function mica_dataset_connector_url(MicaDatasetConnector $connector) {
return array(
'path' => 'admin/config/system/mica/connector/' . $connector->id,
'options' => array(),
);
}
/**
* Inserts a new dataset connector into the database.
*
* @param array $values
* An array containing the values to be inserted.
*
* @return
* The newly inserted connector's id, or FALSE on error.
*/
function mica_dataset_connector_insert(array $values) {
$connector = new MicaDatasetConnector($values);
$connector->is_new = TRUE;
$connector->save();
return $connector->id;
}
/**
* Load all node of type 'variable' associated with a dataset
*
* @param $dataset nid
*/
//TODO maybe use wrapper and dataset->field_dataset_variables field instead of query...
function mica_dataset_dataset_variables($dataset) {
// Get field information
$field = field_info_field('field_dataset');
$query = new EntityFieldQuery;
$query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'variable')
->fieldCondition($field, 'nid', $dataset);
$entities = $query->execute();
return empty($entities) ? FALSE : node_load_multiple(array_keys($entities['node']));
}
/**
* Returns either a list of all available connection infos, or a specific one.
*
* @see hook_mica_datasets_connection_info()
*
* @param $id
* The ID of the connection info to retrieve.
*
* @return array
* If $id was not specified, an array of all available service classes.
* Otherwise, either the service info with the specified id (if it exists),
* or NULL.
*/
function mica_datasets_get_connection_info($id = NULL) {
$connections = &drupal_static(__FUNCTION__);
if (!isset($connections)) {
$connections = module_invoke_all('mica_datasets_connection_info');
}
if (isset($id)) {
return isset($connections[$id]) ? $connections[$id] : NULL;
}
return $connections;
}
//
// Mica Dataset Query
//
/**
* Load the dataset query with the specified id.
*
* @param $id
* The dataset query's id.
* @param $reset
* Whether to reset the internal cache.
*
* @return MicaDatasetQuery
* An object representing the query with the specified id.
*/
function mica_dataset_query_load($id, $reset = FALSE) {
if (is_numeric($id)) {
$ret = mica_dataset_query_load_multiple(array($id), array(), $reset);
return $ret ? reset($ret) : FALSE;
}
return MicaDatasetQueryManager::getQuery($id);
}
/**
* Load multiple queries at once, determined by IDs or machine names, or by
* other conditions.
*
* @see entity_load()
*
* @param $ids
* An array of query IDs or machine names.
* @param $conditions
* An array of conditions on the {mica_dataset_query} table in the form
* 'field' => $value.
* @param $reset
* Whether to reset the internal entity_load cache.
*
* @return array
* An array of query objects keyed by id.
*/
function mica_dataset_query_load_multiple($ids = array(), $conditions = array(), $reset = FALSE) {
$queries = array();
$qs = entity_load('mica_dataset_query', $ids, $conditions, $reset);
foreach ($qs as $q) {
if (_mica_datasets_query_access(node_load($q->dataset_id), $q, 'view')) {
$queries[] = $q;
}
}
return $queries;
}
/**
* Entity uri callback.
*/
function mica_dataset_query_url(MicaDatasetQuery $query) {
return array(
'path' => 'admin/config/system/mica/query/' . $query->id,
'options' => array(),
);
}
//
// Mica Dataset Query Term
//
/**
* Load the dataset query terms corresponding to the specified query id, ordered by weight.
*
* @param MicaDatasetQuery $query
*/
function mica_dataset_query_term_query($query) {
if (MicaDatasetQueryManager::isCached($query) == FALSE) {
$q = db_select('mica_dataset_query_term', 'c');
$q->addField('c', 'id');
$q->condition('c.query_id', $query->id, '=');
$q->orderBy('c.weight', 'ASC');
$result = $q->execute();
$rval = array();
while ($record = $result->fetchAssoc()) {
$rval[] = $record['id'];
}
return !empty($rval) ? mica_dataset_query_term_load_multiple($rval) : FALSE;
}
$rval = MicaDatasetQueryManager::getCache($query)->getTerms();
return empty($rval) ? FALSE : $rval;
}
/**
* Load the dataset query term with the specified id.
*
* @param $id
* The dataset query term's id.
* @param $reset
* Whether to reset the internal cache.
*
* @return MicaDatasetQueryTerm
* An object representing the query term with the specified id.
*/
function mica_dataset_query_term_load($id, $reset = FALSE) {
if (is_numeric($id)) {
$ret = mica_dataset_query_term_load_multiple(array($id), array(), $reset);
return $ret ? reset($ret) : FALSE;
}
return MicaDatasetQueryManager::getTerm($id);
}
/**
* Load multiple query terms at once, determined by IDs or machine names, or by
* other conditions.
*
* @see entity_load()
*
* @param $ids
* An array of query term IDs or machine names.
* @param $conditions
* An array of conditions on the {mica_dataset_query_term} table in the form
* 'field' => $value.
* @param $reset
* Whether to reset the internal entity_load cache.
*
* @return array
* An array of query objects keyed by machine name.
*/
function mica_dataset_query_term_load_multiple($ids = array(), $conditions = array(), $reset = FALSE) {
// TODO filter the cached ones from the persisted ones by their id pattern
return entity_load('mica_dataset_query_term', $ids, $conditions, $reset);
}
/**
* Entity uri callback.
*/
function mica_dataset_query_term_url(MicaDatasetQueryTerm $query_term) {
return array(
'path' => 'admin/config/system/mica/query/' . $query_term->query_id . '/term/' . $query_term->id,
'options' => array(),
);
}
/**
* Inserts a new dataset query term into the database.
*
* @param array $values
* An array containing the values to be inserted.
*
* @return
* The newly inserted query term's id, or FALSE on error.
*/
function mica_dataset_query_term_insert(array $values) {
$query_term = new MicaDatasetQueryTerm($values);
$query_term->is_new = TRUE;
$query_term->save();
return $query_term->id;
}
//
// Feeds
//
/**
* implements hook_feeds_after_parse
* used to extract the dataset_id from the importer and set it on the mapper
* so that nodes created have a link to their dataset. This method also creates
* a guid for each variable (dataset_id:title
*/
function mica_datasets_feeds_after_parse(FeedsSource $source, FeedsParserResult $result) {
if (get_class($source->importer->processor) === 'FeedsNodeProcessor') {
$config = $source->importer->processor->getConfig();
if ($config['content_type'] === 'variable') {
$src_config = $source->getConfigFor($source->importer->fetcher);
$dataset_id = NULL;
if (isset($src_config['mica_dataset_connector'])) {
$nid = $src_config['mica_dataset_connector'];
$connector_node = mica_dataset_connector_load($nid);
$dataset_id = $connector_node->dataset_id;
$titleSource = _find_source_for_target($source->importer->processor, 'title');
foreach ($result->items as &$item) {
$item['dataset_id'] = $dataset_id;
$item['uid'] = $dataset_id . ":" . $item[$titleSource];
}
unset($item);
}
}
}
}
/**
* Returns the name of the source for a specified target.
*
* @param FeedsProcessor $processor
* @param String $target the name of the target field (e.g.: 'title')
*
* @return the name of source item mapped to the target (e.g.: 'jsonpath:0')
*/
function _find_source_for_target(FeedsProcessor $processor, $target) {
$config = $processor->getConfig();
foreach ($config['mappings'] as $map) {
if ($map['target'] == $target) {
return $map['source'];
}
}
throw new Exception("could not find source for $target", 500);
}
function mica_dataset_private_file_absolute_path($reference) {
if (file_valid_uri($reference)) {
$wrapper = file_stream_wrapper_get_instance_by_uri($reference);
if ($wrapper) {
return $wrapper->realpath();
}
}
return $reference;
}
/**
* Implements hook_node_view_alter().
*/
function mica_datasets_node_view_alter(&$build) {
if ($build['#view_mode'] === 'right_area' && $build['#bundle'] === 'variable') {
$node = $build['#node'];
$wrapper = entity_metadata_wrapper('node', $node);
$dataset = $wrapper->field_dataset->value();
if (!empty($dataset)) {
$values = array();
$values['variable_id'] = $node->nid;
$values['dataset_id'] = $wrapper->field_dataset->nid->value();
$term = new MicaDatasetQueryTerm($values);
$impl = $term->termImpl();
if ($impl->hasConnectors()) {
$build['statistics'] = array(
'#type' => 'fieldset',
'#title' => t('Statistics'),
'#weight' => 50,
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'table' => array(
'#markup' => $impl->view(),
),
);
}
}
}
if ($build['#view_mode'] === 'footer_area' && $build['#bundle'] === 'variable') {
$node = $build['#node'];
$wrapper = entity_metadata_wrapper('node', $node);
$dataset = $wrapper->field_dataset->value();
if (!empty($dataset)) {
$dataset = entity_load_single('node', $dataset->nid);
$dataset_wrapper = entity_metadata_wrapper('node', entity_load_single('node', $dataset->nid));
if ($dataset_wrapper->field_dataset_type->value() !== 'study') {
require_once('mica_datasets.pages.harmonization.inc');
ctools_add_css('prettify', 'mica_datasets');
ctools_add_js('prettify', 'mica_datasets');
ctools_add_js('mica_datasets_prettify', 'mica_datasets');
$header = array(
'study' => t('Study'),
'status' => t('Status'),
'comment' => t('Comment'),
'script' => t('Script'),
);
$options = array();
$status_values = field_info_field('field_sva_status');
foreach ($wrapper->field_variable_study_var_att->value() as $study_variable_attributes) {
$sva_wrapper = entity_metadata_wrapper('node', $study_variable_attributes);
$study_wrapper = entity_metadata_wrapper('node', $sva_wrapper->field_sva_study->value()->nid);
if ($study_wrapper->access('view')) {
$script = $sva_wrapper->field_sva_script->value() ? $sva_wrapper->field_sva_script->value() : '';
$script = _mica_datasets_toHtmlTruncate(
$script, t('script'), 200, TRUE
); //'' . check_markup(truncate_utf8($script, 400, FALSE)) . '';
$comment = $sva_wrapper->field_sva_comment->value() ? $sva_wrapper->field_sva_comment->value() : '';
$comment = _mica_datasets_toHtmlTruncate($comment, t('comment'), 200, FALSE);
if ($sva_wrapper->access('view') == FALSE) {
$status = 'forbidden';
$status_label = t('Access Denied');
$script = NULL;
$comment = NULL;
}
elseif (!empty($study_variable_attributes->field_sva_status)) {
$status = $sva_wrapper->field_sva_status->value();
$status_label = $status_values['settings']['allowed_values'][$status];
}
else {
$status = 'undetermined';
$status_label = t('Undetermined');
$script = NULL;
}
$name = $study_wrapper->field_acroym->value() ? $study_wrapper->field_acroym->value() : $study_wrapper->title->value();
$status = "";
$option = array(
'study' => $name,
'status' => $status,
'comment' => truncate_utf8($comment, 100, FALSE, TRUE),
'script' => $script,
);
if ($sva_wrapper->access('view')) {
$header['view'] = '';
$option['view'] = "nid->value()) . "'>" . t('View') . "";
}
$options[] = $option;
}
}
$build['harmonization'] = array(
'#type' => 'fieldset',
'#title' => t('Harmonization'),
'#weight' => 50,
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'legend' => array(
'#markup' => drupal_render(drupal_get_form('mica_datasets_harmonization_legend_form')),
),
'table' => array(
'#markup' => theme(
'table', array('header' => $header, 'rows' => $options, 'empty' => t('No harmonization found'))
),
),
'overview' => array(
'#markup' => "
" . t( "View $dataset->title Harmonization" ) . "
", ), ); } } } } function _mica_datasets_has_connectors($dataset_nid) { return count(MicaDatasetConnector::findConnectorsByDataset($dataset_nid)) > 0; } /** * Implements hook_node_presave() */ function mica_datasets_node_presave($node) { switch ($node->type) { case 'variable': _mica_datasets_set_variable_position($node); break; case 'dataset': $dataset = entity_metadata_wrapper('node', $node); if ($dataset->field_dataset_type->value() === 'harmonization') { foreach ($dataset->field_dataset_studies as $study) { _mica_datasets_create_svas($study->value(), $dataset->value()); } } else { foreach ($dataset->field_dataset_studies as $study) { _mica_datasets_delete_svas($dataset->value(), $study->value()); } } break; } } /** * Implements hook_node_insert() */ function mica_datasets_node_insert($node) { switch ($node->type) { case 'dataset': _mica_datasets_create_dataset_menu($node); break; case 'variable': _mica_datasets_add_study_variable_attributes_to($node); _mica_datasets_create_variable_menu($node); break; } } /** * Implements hook_node_delete() */ function mica_datasets_node_delete($node) { switch ($node->type) { case 'dataset': $dataset_id = $node->nid; // remove queries and their terms $queries = MicaDatasetQueryManager::getPersistedQueries($dataset_id); if (!empty($queries)) { foreach ($queries as $query) { $query_id = $query->id; $terms = mica_dataset_query_term_query($query_id); if (!empty($terms)) { foreach ($terms as $term) { entity_delete('mica_dataset_query_term', $term->id); } } entity_delete('mica_dataset_query', $query_id); } } // flush cached queries MicaDatasetQueryManager::deleteQueries($dataset_id); // remove variables $dataset = entity_metadata_wrapper('node', $dataset_id); $variables = $dataset->field_dataset_variables; $variables_value = $variables->value(); if (!empty($variables_value)) { foreach ($variables as $variable) { $variable->delete(); } } // remove reference from studies $query = new EntityFieldQuery(); $entities = $query->entityCondition('entity_type', 'node') ->entityCondition('bundle', 'study') ->fieldCondition('mica_dataset', 'nid', $dataset_id) ->execute(); if (!empty($entities)) { $studies = node_load_multiple(array_keys($entities['node'])); foreach ($studies as $study_node) { foreach ($study_node->mica_dataset[$study_node->language] as $key => $value) { if ($value['nid'] == $dataset_id) { unset($study_node->mica_dataset[$study_node->language][$key]); $connector = mica_dataset_connector_query($dataset_id, $study_node->nid); if ($connector) { $connector->delete(); } break; } } node_save($study_node); } } break; case 'study': $study = entity_metadata_wrapper('node', $node); $field_study_study_variable_att_value = $study->field_study_study_variable_att->value(); if (empty($field_study_study_variable_att_value) == FALSE) { foreach ($study->field_study_study_variable_att as $sva) { if (empty($sva->field_sva_variable) == FALSE) { _mica_datasets_remove_and_save_element_from_entity_list_wrapper($sva->field_sva_variable, $sva, 'field_variable_study_var_att'); $sva->delete(); } } } foreach ($study->mica_dataset as $dataset) { _mica_datasets_remove_and_save_element_from_entity_list_wrapper($dataset, $study, 'field_dataset_studies'); } break; case 'variable': $variable = entity_metadata_wrapper('node', $node); $field_variable_study_var_att_value = $variable->field_variable_study_var_att->value(); if (empty($field_variable_study_var_att_value) == FALSE) { foreach ($variable->field_variable_study_var_att as $sva) { if (empty($sva->field_sva_study) == FALSE) { _mica_datasets_remove_and_save_element_from_entity_list_wrapper($sva->field_sva_study, $sva, 'field_study_study_variable_att'); $sva->delete(); } } } _mica_datasets_remove_and_save_element_from_entity_list_wrapper($variable->field_dataset, $variable, 'field_dataset_variables'); break; case 'study_variable_attributes': $sva = entity_metadata_wrapper('node', $node); $field_sva_variable_value = $sva->field_sva_variable->value(); if (empty($field_sva_variable_value) == FALSE) { _mica_datasets_remove_and_save_element_from_entity_list_wrapper($sva->field_sva_variable, $sva, 'field_variable_study_var_att'); } $field_sva_study_value = $sva->field_sva_study->value(); if (empty($field_sva_study_value) == FALSE) { _mica_datasets_remove_and_save_element_from_entity_list_wrapper($sva->field_sva_study, $sva, 'field_study_study_variable_att'); } break; } } /** * @param $study * @param $dataset * * For all variable in $dataset,link them to $study with Study Variables entity */ function _mica_datasets_create_svas(&$study, &$dataset) { $wrapper_study = entity_metadata_wrapper('node', $study); $study_value = $wrapper_study->value(); $wrapper_dataset = entity_metadata_wrapper('node', $dataset); if ($wrapper_dataset->field_dataset_type->value() === 'harmonization') { $query = new EntityFieldQuery(); $results = $query->entityCondition('entity_type', 'node') ->entityCondition('bundle', 'study_variable_attributes') ->fieldCondition('field_sva_study', 'nid', $wrapper_study->nid->value()) ->execute(); $study_variable_attributes = array(); if (empty($results['node']) == FALSE) { $study_variable_attributes = entity_load('node', array_keys($results['node'])); } $variables = array(); foreach ($wrapper_dataset->field_dataset_variables as $wrapper_variable) { $exist = FALSE; $variable_value = $wrapper_variable->value(); foreach ($study_variable_attributes as $sv) { $wrapper_sv = entity_metadata_wrapper('node', $sv); $field_sva_variable_value = $wrapper_sv->field_sva_variable->value(); $field_sva_study_value = $wrapper_sv->field_sva_study->value(); if ($field_sva_variable_value->nid === $variable_value->nid && $field_sva_study_value->nid === $study_value->nid ) { $exist = TRUE; } } if (!$exist) { if ($variable_value !== NULL) { array_push($variables, $wrapper_variable); } } } if (isset($variables)) { _mica_datasets_create_study_variable_attributes_for_study($wrapper_study, $variables); } } } function _mica_datasets_delete_svas(&$dataset, &$study) { $dataset_wrapper = entity_metadata_wrapper('node', $dataset->nid); $study_wrapper = entity_metadata_wrapper('node', $study->nid); $variables = $dataset_wrapper->field_dataset_variables; foreach ($variables as $variable) { if (isset($variable->field_variable_study_var_att)) { foreach ($variable->field_variable_study_var_att as $sva) { if ($sva->field_sva_study->nid->value() === $study_wrapper->nid->value()) { $sva->delete(); _mica_datasets_remove_and_save_element_from_entity_list_wrapper($variable, $sva, 'field_variable_study_var_att'); } } } } } /** * Implements hook_node_validate() */ function mica_datasets_node_validate($node, $form, &$form_state) { // check dataset node title is unique if (!isset($node->nid) && $node->type === 'dataset') { if (mica_core_node_title_exists($node->type, $node->title)) { form_set_error('title', t('Dataset name \'!title\' is already given.', array('!title' => $node->title))); } } } /** * Implements hook_block_view_alter() */ function mica_datasets_block_view_alter(&$data, $block) { if (!empty($block) && $block->delta === 'variable_current_search' && $block->module === 'current_search') { _mica_datasets_variable_current_search($data, $block); } } function _mica_datasets_variable_current_search(&$data, $block) { if (isset($data['content']['field_group'])) { $data['content']['results']['#markup'] .= ' - ' . l( t('Clear all criteria') . ' [X]', 'variable-search', array( 'attributes' => array( 'rel' => 'nofollow', 'class' => array('current-search-clear-all'), ) ) ); } } /** * Inspired from prepopulate module * Implementation of hook_form_alter(). */ function mica_datasets_form_alter(&$form, $form_state, $form_id) { switch ($form_id) { case 'variable_node_form': _mica_datasets_form_alter_variable($form, $form_state, $form_id); break; } } function _mica_datasets_form_alter_variable(&$form, $form_state, $form_id) { if (isset($_REQUEST['dataset'])) { $lang = $form['field_dataset']['#language']; $form['field_dataset'][$lang]['#after_build'][] = '_mica_datasets_prepopulate_variable_after_build'; // Hide this way to prevent a 'dataset field is required' after adding a category $form['field_dataset']['#attributes'] = array('style' => 'display:none'); } // hide field_position $form['field_position']['#access'] = FALSE; $nid = $form['nid']['#value']; if (!empty($nid)) { $next_variable = _mica_datasets_find_next_variable($nid); if ($next_variable != NULL) { $form['actions']['save_edit_next'] = array( '#access' => TRUE, '#value' => t('Save & edit next'), '#weight' => 6, '#type' => 'submit', '#submit' => array('node_form_submit', '_mica_datasets_save_edit_next_submit'), '#next_variable_nid' => $next_variable->nid, ); } } } function _mica_datasets_prepopulate_variable_after_build(&$form_element) { if (isset($_REQUEST['dataset'])) { $form_element[0]['nid']['#default_value'] = $_REQUEST['dataset']; $form_element[0]['nid']['#value'] = node_reference_autocomplete_value($form_element[0]['nid'], FALSE, NULL); } return $form_element; } function _mica_datasets_save_edit_next_submit($form, &$form_state) { if (isset($form['actions']['save_edit_next'])) { $form_state['redirect'] = 'node/' . $form['actions']['save_edit_next']['#next_variable_nid'] . '/edit'; } } function _mica_datasets_find_next_variable($variable_nid) { $variable = node_load($variable_nid); $wrapper = entity_metadata_wrapper('node', $variable); $dataset_id = $wrapper->field_dataset->nid->value(); $query = new EntityFieldQuery(); $results = $query->entityCondition('entity_type', 'node') ->entityCondition('bundle', 'variable') ->fieldCondition('field_dataset', 'nid', $dataset_id) ->fieldCondition('field_position', 'value', $wrapper->field_position->value(), '>') ->fieldOrderBy("field_position", 'value', "asc") ->range(0, 1) ->execute(); if (!empty($results['node'])) { return array_pop(entity_load('node', array_keys($results['node']))); } return NULL; } function _mica_datasets_set_variable_position(&$variable) { $wrapper = entity_metadata_wrapper('node', $variable); $position = $wrapper->field_position->value(); if ($position != NULL && $position != 0) { return NULL; } $dataset_id = $wrapper->field_dataset->nid->value(); $query = new EntityFieldQuery(); $results = $query->entityCondition('entity_type', 'node') ->entityCondition('bundle', 'variable') ->fieldCondition('field_dataset', 'nid', $dataset_id) ->fieldOrderBy("field_position", 'value', "desc") ->range(0, 1) ->execute(); if (empty($results['node'])) { $wrapper->field_position->set(1); } else { $last_variable = array_pop(entity_load('node', array_keys($results['node']))); $last_variable_wrapper = entity_metadata_wrapper('node', $last_variable); $wrapper->field_position->set($last_variable_wrapper->field_position->value() + 1); } return $variable; } function _mica_datasets_add_study_variable_attributes_to(&$variable) { $wrapper_variable = entity_metadata_wrapper('node', $variable); $wrapper_dataset = entity_metadata_wrapper('node', $wrapper_variable->field_dataset->nid->value()); if ($wrapper_dataset->field_dataset_studies->count() !== 0 && $wrapper_dataset->field_dataset_type->value() === 'harmonization') { $studies = array(); foreach ($wrapper_dataset->field_dataset_studies as $wrapper_study) { if ($wrapper_study->value() !== NULL) { array_push($studies, $wrapper_study); } } _mica_datasets_create_study_variable_attributes_for_variable($wrapper_variable, $studies); } } function _mica_datasets_create_study_variable_attributes_for_variable(&$variable, $studies) { if (!empty($studies)) { foreach ($studies as $study) { _mica_datasets_create_study_variable_attribute($variable, $study); $study->save(); } //do not called ->save(), because drupal will not update $variable but save, then: duplication error field_attach_update('variable', $variable); } } function _mica_datasets_create_study_variable_attributes_for_study(&$study, $variables) { if (!empty($variables)) { foreach ($variables as $variable) { _mica_datasets_create_study_variable_attribute($variable, $study); $variable->save(); } $study->save(); } } function _mica_datasets_create_study_variable_attribute(&$wrapper_variable, &$wrapper_study) { global $user; $infos = array( 'type' => 'study_variable_attributes', 'title' => $wrapper_variable->title->value() . ' -- ' . $wrapper_study->title->value(), 'language' => LANGUAGE_NONE, 'field_sva_study' => $wrapper_study->nid->value(), 'field_sva_variable' => $wrapper_variable->nid->value(), 'uid' => $user->uid, ); $new_study_variable_attributes = entity_property_values_create_entity('node', $infos); $saved = $new_study_variable_attributes->save(); _mica_datasets_add_element_in_entity_list_wrapper($wrapper_variable, $saved, 'field_variable_study_var_att'); _mica_datasets_add_element_in_entity_list_wrapper($wrapper_study, $saved, 'field_study_study_variable_att'); } function _mica_datasets_add_element_in_entity_list_wrapper(&$entity, &$entity_to_add, $field_name) { $nids = array(); if (isset($entity->$field_name)) { foreach ($entity->$field_name->value() as $item) { if (isset($item)) { array_push($nids, $item->nid); } } } array_push($nids, $entity_to_add->nid->value()); $nids = array_unique($nids); $entity->$field_name->set($nids); } function _mica_datasets_remove_and_save_element_from_entity_list_wrapper(&$entity, &$entity_to_remove, $field_name) { if ($entity->value() !== NULL) { foreach ($entity->$field_name->value() as $key => $value) { if (isset($value)) { if ($value->nid === $entity_to_remove->nid->value()) { $entity->$field_name->offsetUnset($key); break; } } } $entity->save(); } } function mica_datasets_node_view($node, $view_mode) { if ($node->type === 'study_variable_attributes') { // add icon to script status $status_values = field_info_field('field_sva_status'); $status = array_search( $node->content['field_sva_status'][0]['#markup'], $status_values['settings']['allowed_values'] ); $node->content['field_sva_status'][0]['#prefix'] = "';
$node->content['field_sva_script'][0]['#suffix'] = '';
$node->content['field_sva_script'][0]['#markup'] = check_markup(
drupal_html_to_text($node->content['field_sva_script'][0]['#markup'])
);
ctools_add_css('prettify', 'mica_datasets');
ctools_add_js('prettify', 'mica_datasets');
ctools_add_js('mica_datasets_prettify', 'mica_datasets');
}
}
else {
if ($node->type === 'variable') {
// Show moderation state messages if we're on a node page.
if (node_is_page($node) && $view_mode === 'banner_area' && empty($node->in_preview)) {
workbench_moderation_messages('view', $node);
}
// Replace "Missing" by an icon
if (!(empty($node->content['field_variable_categories']))
&& !empty($node->content['field_variable_categories']['#object']->field_variable_categories)
) {
foreach ($node->content['field_variable_categories'][0]['#rows'] as &$row) {
if (!empty($row['missing'])) {
// replace with div icon
$row['missing'] = "";
// split at ).
$lines = explode(").", $text);
$text = implode(")\n.", $lines);
}
else {
$lines = str_split($text, 60);
$text = implode("\n", $lines);
}
if (strlen($text) > $size) {
$htmlTruncate .= check_markup(truncate_utf8($text, $size, FALSE));
if ($is_code) {
$htmlTruncate .= "";
}
$htmlTruncate .= "[" . $label . " " . t("truncated") . "]";
}
else {
$htmlTruncate .= check_markup($text);
if ($is_code) {
$htmlTruncate .= "";
}
}
}
return $htmlTruncate;
}
function _mica_datasets_get_status_icon($status) {
switch ($status) {
case 'impossible':
return MICA_HARMONIZATION_IMPOSSIBLE;
case 'complete':
return MICA_HARMONIZATION_COMPLETE;
case 'forbidden':
return MICA_HARMONIZATION_FORBIDDEN;
default:
return MICA_HARMONIZATION_UNDETERMINED;
}
}
function mica_datasets_import_variables_callback($type, $dataset_nid, $study_nid = NULL) {
ctools_include('ajax');
ctools_add_js('ajax-responder');
$dataset = entity_load_single('node', $dataset_nid);
if (isset($study_nid)) {
$study_nids = array($study_nid);
}
else {
// fetch all study_nids of the dataset
$dataset_wrapper = entity_metadata_wrapper('node', $dataset);
foreach ($dataset_wrapper->field_dataset_studies->value() as $study) {
$study_nids[] = $study->nid;
}
}
foreach ($study_nids as $nid) {
$study = entity_load_single('node', $nid);
$study_wrapper = entity_metadata_wrapper('node', $study);
$harmonizations = FALSE;
try {
$harmonizations = mica_opal_fetch_harmonization_view($dataset_nid, $nid);
} catch (Exception $e) {
drupal_set_message($e->getMessage(), 'error');
}
if ($harmonizations) {
$nb = mica_datasets_create_variables($harmonizations);
drupal_set_message(
t(
'@count variables have been imported for study @study into the dataset @dataset',
array(
'@count' => $nb,
'@study' => $study_wrapper->title->value(),
'@dataset' => $dataset->title,
)
)
);
}
}
if ($type === 'ajax') {
$commands[] = ctools_ajax_command_reload();
return array(
'#type' => 'ajax',
'#commands' => $commands
);
}
else {
drupal_goto('node/' . $dataset_nid);
}
}
function mica_datasets_create_variables($harmonizations) {
global $user;
$position = 1;
$nb_created = 0;
foreach ($harmonizations['variables'] as $harmonization) {
$query = new EntityFieldQuery();
$result = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'variable')
->propertyCondition('title', $harmonization['title'])
->fieldCondition('field_dataset', 'nid', $harmonizations['dataset_nid'])
->execute();
if (empty($result)) {
$infos = array(
'type' => 'variable',
'title' => $harmonization['title'],
'language' => LANGUAGE_NONE,
'uid' => $user->uid,
'status' => 0, // sva should be draft by default
'menu' => '',
'field_dataset' => $harmonizations['dataset_nid'],
);
$variable = entity_property_values_create_entity('node', $infos);
$variable->save();
$wrapper = entity_metadata_wrapper('node', $variable);
$wrapper->field_label->set($harmonization['label']);
$wrapper->field_value_type->set($harmonization['value_type']);
$wrapper->field_repeatable->set($harmonization['repeatable']);
$wrapper->field_unit->set($harmonization['unit']);
$wrapper->field_position->set($position++);
$wrapper->body->value->set($harmonization['description']);
// Update categories
if (!empty($harmonization['categories'])) {
for ($i = 0; $i < count($harmonization['categories']); $i++) {
$wrapper->field_variable_categories[$i]->name->set($harmonization['categories'][$i]['name']);
$wrapper->field_variable_categories[$i]->label->set($harmonization['categories'][$i]['label']);
$wrapper->field_variable_categories[$i]->missing->set($harmonization['categories'][$i]['missing']);
}
}
$wrapper->save();
}
else {
$variable = entity_load_single('node', array_shift(array_keys($result['node'])));
$wrapper = entity_metadata_wrapper('node', $variable);
}
// Update study_variable_attributes
foreach ($wrapper->field_variable_study_var_att->value() as $study_variable_attributes) {
$sva = entity_metadata_wrapper('node', $study_variable_attributes);
if ($sva->field_sva_study->nid->value() === $harmonizations['study_nid']) {
$sva->field_sva_script->set($harmonization['script']);
$sva->field_sva_status->set($harmonization['status']);
$sva->field_sva_comment->set($harmonization['comment']);
$sva->save();
}
}
$nb_created++;
}
return $nb_created;
}