Преглед изворни кода

Fixed bug 1896914. Tripal will now disallow creation or update of analysis with the same name or unique constraint as another.

spficklin пре 12 година
родитељ
комит
15866040bc
1 измењених фајлова са 85 додато и 48 уклоњено
  1. 85 48
      tripal_analysis/tripal_analysis.module

+ 85 - 48
tripal_analysis/tripal_analysis.module

@@ -128,14 +128,13 @@ function chado_analysis_insert($node) {
   // If this analysis already exists then don't recreate it in chado
   $analysis_id = $node->analysis_id;
   if ($analysis_id) {
-    $sql = "SELECT analysis_id ".
-           "FROM {Analysis} ".
-           "WHERE analysis_id = %d ";
-    $previous_db = tripal_db_set_active('chado');
-    $analysis = db_fetch_object(db_query($sql, $node->analysis_id));
-    tripal_db_set_active($previous_db);
+    $values = array('analysis_id' => $node->analysis_id);
+    $result = tripal_core_chado_select('analysis', array('analysis_id'), $values);
+    if($result and count($result) > 0) {
+      $analysis = $result[0];
+    }
   }
-
+  
   // If the analysis doesn't exist then let's create it in chado.
   if (!$analysis) {
       // insert and then get the newly inserted analysis record
@@ -355,10 +354,10 @@ function chado_analysis_form($node) {
   $form['analysisname']= array(
       '#type' => 'textfield',
       '#title' => t('Analysis Name'),
-      '#required' => FALSE,
+      '#required' => TRUE,
       '#default_value' => $analysisname,
-      '#description' => t("This should be a handy short identifier that
-         describes the analysis succintly as possible which helps the user find analyses."),
+      '#description' => t("This should be a brief name that
+         describes the analysis succintly. This name will helps the user find analyses."),
   );
   $form['program']= array(
       '#type' => 'textfield',
@@ -639,48 +638,86 @@ function chado_analysis_validate($node, &$form) {
  * @ingroup tripal_analysis
  */
 function tripal_analysis_validate($node, &$form) {
-
-    // Only nodes being updated will have an nid already
-    if ($node->nid) {
-        //---------------------------------------------------
-        // CASE A: We are validating a form for updating an existing node
-        //---------------------------------------------------
-
-        // TO DO: check that the new fields don't yield a non-unique primary key in chado
+  
+ 
+  // Only nodes being updated will have an nid already
+  if (!is_null($node->nid)) {    
+    // CASE A: We are validating a form for updating an existing node
+    
+    // get the existing node    
+    $values = array('analysis_id' => $node->analysis_id);      
+    $result = tripal_core_chado_select('analysis', array('*'), $values);
+    $analysis = $result[0];
+      
+    // if the name has changed make sure it doesn't conflict with an existing name
+    if($analysis->name != $node->analysisname) {
+      $values = array('name' => $node->analysisname);
+      $result = tripal_core_chado_select('analysis', array('analysis_id'), $values);
+      if($result and count($result) > 0) {
+        form_set_error('analysisname', 'Cannot update the analysis with this analysis name. An analysis with this name already exists.');
+        return;
+      }  
     }
-    else{
-        // To differentiate if we are syncing or creating a new analysis altogther, see if an
-        // analysis_id already exists
-
-        if ($node->analysis_id) {
-
-            //---------------------------------------------------
-            // CASE B: Synchronizing a node from chado to drupal
-            //---------------------------------------------------
-
+    
+    // if the unique constraint has changed check to make sure it doesn't conflict with an
+    // existing record
+    if($analysis->program != $node->program or $analysis->programversion != $node->programversion or 
+       $analysis->sourcename != $node->sourcename) {
+      $values = array(
+        'program' => $node->program,
+        'programversion' => $node->programversion,
+        'sourcename' => $node->sourcename,
+      );
+      $result = tripal_core_chado_select('analysis', array('analysis_id'), $values);
+      if ($result and count($result) > 0) {
+        if ($analysis->program != $node->program) {
+          $field = 'program';  
         }
-        else{
-
-            //---------------------------------------------------
-            // CASE C: We are validating a form for inserting a new node
-            //---------------------------------------------------
-            // The primary key for the chado analysis table is
-            // program, programversion, sourcename
-
-
-            $values = array(
-               'program' => $node->program,
-               'programversion' => $node->programversion,
-               'sourcename' => $node->sourcename,
-            );
-            $analysis = tripal_core_chado_select('analysis', array('analysis_id'), $values);
-            if (sizeof($analysis) > 0) {
-              form_set_error('program', 'Cannot add the analysis with this program,
-                  program version and source name. An analysis with these values already exists.');
-              return;
-            }
+        if ($analysis->programversion != $node->programversion) {
+          $field = 'programversion';  
+        }
+        if ($analysis->sourcename != $node->sourcename) {
+          $field = 'sourcename';  
         }
+        form_set_error($field, 'Cannot update the analysis with this program,
+          program version and source name. An analysis with these values already exists.');
+        return;
+      }  
+    }
+  }
+  else{
+    // To differentiate if we are syncing or creating a new analysis altogther, see if an
+    // analysis_id already exists
+    if ($node->analysis_id and $node->analysis_id != 0) {
+      // CASE B: Synchronizing a node from chado to drupal
+      // we don't need to do anything.
+    }
+    else {
+      // CASE C: We are validating a form for inserting a new node
+      // The unique constraint for the chado analysis table is: program, programversion, sourcename
+      $values = array(
+        'program' => $node->program,
+        'programversion' => $node->programversion,
+        'sourcename' => $node->sourcename,
+      );
+      $analysis = tripal_core_chado_select('analysis', array('analysis_id'), $values);
+      if ($analysis and count($analysis) > 0) {
+        form_set_error('program', 'Cannot add the analysis with this program,
+          program version and source name. An analysis with these values already exists.');
+        return;
+      }
+      
+      // make sure we have a unique analysis name. This is not a requirement 
+      // for the analysis table but we use the analysis name for the Drupal node
+      // title, so it should be unique      
+      $values = array('name' => $node->analysisname);
+      $result = tripal_core_chado_select('analysis', array('analysis_id'), $values);
+      if($result and count($result) > 0) {
+        form_set_error('analysisname', 'Cannot add the analysis with this analysis name. An analysis with this name already exists.');
+        return;
+      }
     }
+  }
 }
 
 /**