'fieldset',
'#title' => t('Sync Analyses')
);
// get the list of analyses
$sql = "SELECT * FROM {analysis} ORDER BY name";
$ana_rset = chado_query($sql);
// if we've added any analyses to the list that can be synced
// then we want to build the form components to allow the user
// to select one or all of them. Otherwise, just present
// a message stating that all analyses are currently synced.
$ana_boxes = array();
$added = 0;
while ($analysis = $ana_rset->fetchObject()) {
// check to see if the analysis is already present as a node in drupal.
// if so, then skip it.
$sql = "SELECT * FROM {chado_analysis} WHERE analysis_id = :analysis_id";
if (!db_query($sql, array(':analysis_id' => $analysis->analysis_id))->fetchObject()) {
$ana_boxes[$analysis->analysis_id] = "$analysis->name";
$added++;
}
}
// if we have analyses we need to add to the checkbox then
// build that form element
if ($added > 0) {
$ana_boxes['all'] = "All analyses";
$form['sync']['analyses'] = array(
'#title' => t('Available analyses'),
'#type' => t('checkboxes'),
'#description' => t("Check the analyses you want to sync. Drupal " .
"content will be created for each of the analyses listed above. " .
"Select 'All analyses' to sync all of them."),
'#required' => FALSE,
'#prefix' => '
',
'#suffix' => '
',
'#options' => $ana_boxes,
);
$form['sync']['button'] = array(
'#type' => 'submit',
'#value' => t('Submit Sync Job')
);
}
// we don't have any analyses to select from
else {
$form['sync']['value'] = array(
'#markup' => t('All analyses in Chado are currently synced with Drupal.')
);
}
$form['cleanup'] = array(
'#type' => 'fieldset',
'#title' => t('Clean Up')
);
$form['cleanup']['description'] = array(
'#markup' => t("With Drupal and chado residing in different databases " .
"it is possible that nodes in Drupal and analyses in Chado become " .
"\"orphaned\". This can occur if an analysis node in Drupal is " .
"deleted but the corresponding chado analysis is not and/or vice " .
"versa. Click the button below to resolve these discrepancies."),
'#weight' => 1,
);
$form['cleanup']['button'] = array(
'#type' => 'submit',
'#value' => t('Clean up orphaned analyses'),
'#weight' => 2,
);
return $form;
}
/**
* Validate the administrative form
*
* @param $form
* The form API array of the form to be validated
* @form_state
* The user submitted values
*
* @ingroup tripal_analysis
*/
function tripal_analysis_sync_form_submit($form, &$form_state) {
global $user; // we need access to the user info
$job_args = array();
if ($form_state['values']['op'] == t('Submit Sync Job')) {
// check to see if the user wants to sync chado and drupal. If
// so then we need to register a job to do so with tripal
$analyses = $form_state['values']['analyses'];
$do_all = FALSE;
$to_sync = array();
foreach ($analyses as $analysis_id) {
if (preg_match("/^all$/i", $analysis_id)) {
$do_all = TRUE;
}
if ($analysis_id and preg_match("/^\d+$/i", $analysis_id)) {
// get the list of analyses
$sql = "SELECT * FROM {analysis} WHERE analysis_id = :analysis_id";
$analysis = chado_query($sql, array(':analysis_id' => $analysis_id))->fetchObject();
$to_sync[$analysis_id] = $analysis->name;
}
}
// submit the job the tripal job manager
if ($do_all) {
tripal_add_job('Sync all analyses', 'tripal_analysis', 'tripal_analysis_sync_analyses', $job_args, $user->uid);
}
else{
foreach ($to_sync as $analysis_id => $name) {
$job_args[0] = $analysis_id;
tripal_add_job("Sync analysis: $name", 'tripal_analysis', 'tripal_analysis_sync_analyses', $job_args, $user->uid);
}
}
}
// -------------------------------------
// Submit the Cleanup Job if selected
if ($form_state['values']['op'] == t('Clean up orphaned analyses')) {
tripal_add_job('Cleanup orphaned analyses', 'tripal_analysis',
'tripal_analyses_cleanup', $job_args, $user->uid);
}
}
/**
* Synchronize analyses from chado to drupal
*
* @ingroup tripal_analysis
*/
function tripal_analysis_sync_analyses($analysis_id = NULL, $job_id = NULL) {
global $user;
$page_content = '';
if (!$analysis_id) {
$sql = "SELECT * FROM {analysis}";
$results = chado_query($sql);
}
else {
$sql = "SELECT * FROM {analysis} WHERE analysis_id = :analysis_id";
$results = chado_query($sql, array(':analysis_id' => $analysis_id));
}
// We'll use the following SQL statement for checking if the analysis
// already exists as a drupal node.
$sql = "SELECT * FROM {chado_analysis} WHERE analysis_id = :analysis_id";
foreach ($results as $analysis) {
// check if this analysis already exists in the drupal database. if it
// does then skip this analysis and go to the next one.
if (!db_query($sql, array(':analysis_id' => $analysis->analysis_id))->fetchObject()) {
$new_node = new stdClass();
$new_node->type = 'chado_analysis';
$new_node->uid = $user->uid;
$new_node->analysis_id = $analysis->analysis_id;
$new_node->analysisname = $analysis->name;
$new_node->description = $analysis->description;
$new_node->program = $analysis->program;
$new_node->programversion = $analysis->programversion;
$new_node->algorithm = $analysis->algorithm;
$new_node->sourcename = $analysis->sourcename;
$new_node->sourceversion = $analysis->sourceversion;
$new_node->sourceuri = $analysis->sourceuri;
$new_node->timeexecuted = $analysis->timeexecuted;
// If the analysis has a name, use it as the node title. If not,
// construct the title using program, programversion, and sourcename
if ($new_node->analysisname) {
$new_node->title = $new_node->analysisname;
}
else {
// Construct node title as "program (version)"
$new_node->title = "$analysis->program ($analysis->programversion)";
}
$form = array(); // dummy variable
$form_state = array(); // dummy variable
node_validate($new_node, $form, $form_state);
if (!form_get_errors()) {
$node = node_submit($new_node);
node_save($node);
if ($node->nid) {
print "Added $new_node->title\n";
}
}
else {
print "Failed to insert analysis $analysis->name\n";
watchdog('tanalysis_sync', "Unable to create analysis node. ID: %analysis_id, Name: %name.",
array('%analysis_id' => $analysis->analysis_id, '%name' => $analysis->name), WATCHDOG_WARNING);
}
}
}
}
/**
* Remove orphaned drupal nodes
*
* @param $dummy
* Not Used -kept for backwards compatibility
* @param $job_id
* The id of the tripal job executing this function
*
* @ingroup tripal_analysis
*/
function tripal_analyses_cleanup($dummy = NULL, $job_id = NULL) {
return tripal_core_chado_node_cleanup_orphaned('analysis', $job_id);
}