Просмотр исходного кода

Tripal CV: Can now add cvterm; also added documentation to tripal cv and allowed chado select to select all records in a table

laceysanderson 14 лет назад
Родитель
Сommit
4a14001243
2 измененных файлов с 514 добавлено и 174 удалено
  1. 17 11
      tripal_core/tripal_core.api.inc
  2. 497 163
      tripal_cv/tripal_cv.module

+ 17 - 11
tripal_core/tripal_core.api.inc

@@ -405,19 +405,25 @@ function tripal_core_chado_select($table,$columns,$values){
    }
 
    // now build the SQL select statement
-   $sql  = "SELECT " . implode(',',$columns) . " ";
-   $sql .= "FROM {$table} ";
-   $sql .= "WHERE ";
-   foreach($where as $field => $value){
-     if (is_array($value)) {
-       $sql .= "$field IN (".db_placeholders($value,'varchar').") AND ";
-       foreach ($value as $v) { $args[] = $v; }
-     } else {
-       $sql .= "$field = '%s' AND ";
-       $args[] = $value;
+   if (empty($where)) {
+     // sometimes want to select everything
+     $sql  = "SELECT " . implode(',',$columns) . " ";
+     $sql .= "FROM {$table} ";
+   } else {
+     $sql  = "SELECT " . implode(',',$columns) . " ";
+     $sql .= "FROM {$table} ";
+     $sql .= "WHERE ";
+     foreach($where as $field => $value){
+       if (is_array($value)) {
+         $sql .= "$field IN (".db_placeholders($value,'varchar').") AND ";
+         foreach ($value as $v) { $args[] = $v; }
+       } else {
+         $sql .= "$field = '%s' AND ";
+         $args[] = $value;
+       }
      }
+     $sql = substr($sql,0,-4);  // get rid of the trailing 'AND'
    }
-   $sql = substr($sql,0,-4);  // get rid of the trailing 'AND'
    
    $resource = db_query($sql,$args);
    $results = array();

+ 497 - 163
tripal_cv/tripal_cv.module

@@ -59,6 +59,22 @@ function tripal_cv_menu() {
      'access arguments' => array('access administration pages'),
      'type' => MENU_NORMAL_ITEM,
    );
+
+   $items['admin/tripal/tripal_cv/add_cvterm'] = array(
+     'title' => 'Add Controlled Vocabulary Terms',
+     'description' => 'Manage controlled vocabulary/ontology terms in Chado ',
+     'page callback' => 'drupal_get_form',
+     'page arguments' => array('tripal_cv_add_cvterm_form'),
+     'access arguments' => array('administer site configuration'),
+     'type' => MENU_NORMAL_ITEM,
+   );
+
+   $items['admin/tripal/tripal_cv/add_cvterm/js'] = array(
+     'page callback' => 'tripal_cv_add_cvterm_callback',
+     'access arguments' => array('administer site configuration'),
+     'type' => MENU_CALLBACK,
+   );
+   
    $items['admin/tripal/tripal_cv/obo_loader'] = array(
      'title' =>'Add/Update Ontology With OBO File',
      'page callback' => 'drupal_get_form',
@@ -135,6 +151,7 @@ function tripal_cv_menu() {
 
    return $items;
 }
+
 /*******************************************************************************
  *  The following function proves access control for users trying to
  *  perform actions on data managed by this module
@@ -161,6 +178,7 @@ function chado_cv_access($op, $node, $account){
    }
    return FALSE;
 }
+
 /*******************************************************************************
 *  Set the permission types that the chado module uses.  Essentially we
 *  want permissionis that protect creation, editing and deleting of chado
@@ -185,6 +203,19 @@ function tripal_cv_views_api() {
 	return array('api' => 2.0);
 }
 
+/*******************************************************************************
+ *  We need to let drupal know about our theme functions and their arguments.
+ *  We create theme functions to allow users of the module to customize the
+ *  look and feel of the output generated in this module
+ */
+function tripal_cv_theme () {
+   return array(
+      'tripal_cv_cvterm_edit' => array (
+         'arguments' => array('cvterm'),
+      ),
+   );
+}
+
 /*************************************************************************
  * Purpose: Provide Guidance to new Tripal Admin
  *
@@ -194,21 +225,72 @@ function tripal_cv_module_description_page() {
   $text = '';
   
   $text .= '<h3>Description:</h3>';
-  $text .= '<p>TODO: Basic Description of this module including mention/link to the chado module</p>';
+  $text .= '<p>The Tripal CV (Controlled Vocabularies) Module provides 
+  	functionality for managing controlled vocabularies and the terms they are
+  	comprised of. The flexibility and extendibility of the chado schema depends
+  	on controlled vocabularies. For example, by using a controlled vocabulary for
+  	feature types the chado schema can describe features of any type, even those
+  	we have not concieved of yet.</p>';
 
   $text .= '<h3>Post Installation Instructions:</h3>';
-  $text .= '<p>TODO: Describe any post installation intructions here. You shouldalways include setting user permissions.</p>';
+  $text .= '<p>The main post installation step is <b>load any controlled 
+  	vocabularies/ontologies needed for you content</b>. It is suggested that you
+  	use community developed ontologes whenever possible. These ontologies
+  	are often very well thought out and cover possibilities you may not have
+  	thought of yet.</p>';
+  $text .= '<p>However, in some cases, community developed ontologies for your
+  	data may not yet be developed. In this case, it is suggested that you begin
+  	developement of an ontology using one of the online tools. You might find
+  	that many researchers are trying to deal with the same data and are willing
+  	to help you in this endevor. You can create a controlled vocabulary and
+  	add terms to it to provide functionality to your site while you are waiting
+  	for the ontology to be developed.</p>';
   
   
   $text .= '<h3>Features of this Module:</h3>';
-  $text .= '<p>TODO: Discuss the Features of this module including links. Some features to consider are creating content, details pages/node content, editing/deleteing, basic listings and vies integration. See admin/tripal/tripal_stock for an example.</p>';
+  $text .= '<b>'.l('Load an already Existing Ontology/Controlled Vocabulary', 'admin/tripal/tripal_cv/obo_loader').'</b>';
+  $text .= '<p>This module provides an ontology loader to load already existing
+  	ontologies into chado. You can access this loader at '.
+  	l('Admin->Tripal Management->Tripal CV->Add/Update Ontology With OBO File', 'admin/tripal/tripal_cv/obo_loader')
+  	.'. This loader allows you to choose from a list of common ontologies or
+  	enter the URL or location to an OBO file. Even the list of common
+  	ontologies is using a URL ensuring you get the most up to date ontology.</p>';
+  $text .= '<p>This loader adds a Tripal Job which then waits in a queue to
+  	be launched. To launch Tripal Jobs either navidate to the root of your
+  	drupal installation and execute "php sites/all/modules/tripal/tripal_core/
+  	tripal_launch_jobs.php <drupal user>" or set up a cron job (See user manual
+  	for more details).</p>';
+  
+  $text .= '<b>Create/Update/Delete A Controlled Vocaulbulary</b>';
+  $text .= '<p>As mentioned above, there are some cases where you might need 
+  	to create your own controlled vocabulary. To do this go to '.
+  	l('Admin->Tripal Management->Tripal CV->Add a Controlled Vocabulary','admin/tripal/tripal_cv/add_cv')
+  	.' and fill out the form provided.</p>';
+  $text .= '<p>Sometimes you might want to update or even delete an already
+  	existing controlled vocabulary. To Update/Delete a controlled vocabulary
+  	go to '.l('Admin->Tripal Management->Tripal CV->Update/Delete Controlled Vocabulary', 'admin/tripal/tripal_cv/edit_cv')
+  	.', select the existing controlled vocabulary you want to modify and then 
+  	edit it as desired. This only modifies the name, description of a
+  	controlled vocabulary. See the next section for adding, removing, editing
+  	the term a controlled vocabulary contains.</p>';
+  
+  $text .= '<b>Create a Controlled Vocaulbulary Term</b>';
+  $text .= '<p>To Add a term to an already existing controlled vocabulary
+  	go to '.l('Admin->Tripal Management->Tripal CV->Add a Controlled Vocabulary Term','admin/tripal/tripal_cv/add_cvterm')
+  	.', select the controlled vocabulary you want to add terms to and then fill
+  	out the form.</p>';
   
   return $text;
 }
 
 /*************************************************************************
-*
-*/
+ * @section Edit/Delete CVs
+ *************************************************************************/
+ 
+/*************************************************************************
+ * Purpose: Provides the form for Updating and Deleteing existing
+ *   chado controlled vocabularies (See chado cv table)
+ */
 function tripal_cv_admin_page(){
    $add_url = url("admin/tripal/tripal_cv/new");
    $obo_url = url("admin/tripal/tripal_cv/obo");
@@ -222,9 +304,12 @@ function tripal_cv_admin_page(){
    $output .= '<div id="db-edit-div">Please select a vocabulary above to view or edit</div>';
    return $output;
 }
+
 /*************************************************************************
-*
-*/
+ * Purpose: Provides the actual "Select CV" form on the Update/Delete Controlled
+ *   Vocabulary page. This form also triggers the edit javascript
+ * @todo Modify this form to use Drupal AJAX
+ */
 function tripal_cv_select_form(){
 
 	$previous_db = tripal_db_set_active('chado');  // use chado database
@@ -255,151 +340,18 @@ function tripal_cv_select_form(){
    return $form;
 }
 /*************************************************************************
-*
-*/
+ * Purpose: The edit controlled vocabulary javascript
+ */
 function tripal_ajax_cv_edit (){ 
    // get the database id, build the form and then return the JSON object
    $cvid = $_POST['cvid'];
    $form = drupal_get_form('tripal_cv_edit_form',$cvid);
    drupal_json(array('status' => TRUE, 'data' => $form));
 }
-/*************************************************************************
-*
-*/
-function tripal_cv_add_form(&$form_state = NULL){
-
-
-   $form['cvid'] = array(
-      '#type' => 'hidden',
-      '#value' => $cvid
-   );
-
-
-   $form['name']= array(
-      '#type'          => 'textfield',
-      '#title'         => t("Controlled Vocabulary name"),
-      '#description'   => t('Please enter the name for this vocabulary.  This field will be ignored if an OBO file or URL is provided above'),
-      '#required'      => FALSE,
-      '#default_value' => $default_cv,
-      '#weight'        => 1
-   );
-
-   $form['definition']= array(
-      '#type'          => 'textarea',
-      '#title'         => t('Description'),
-      '#description'   => t('Please enter a description for this vocabulary'),
-      '#default_value' => $default_desc,
-      '#weight'        => 2
-   );
-
-
-   $form['add'] = array (
-     '#type'         => 'submit',
-     '#value'        => t('Add'),
-     '#weight'       => 5,
-     '#executes_submit_callback' => TRUE,
-   );
-
-   $form['#redirect'] = 'admin/tripal/tripal_cv';
-
-
-   return $form;
-}
-/*************************************************************************
-*
-*/
-function tripal_cv_obo_form(&$form_state = NULL){
-
-
-	// get a list of db from chado for user to choose
-	$sql = "SELECT * FROM {tripal_cv_obo} ORDER BY obo_id";
-	$results = db_query ($sql);
-
-
-	$obos = array();
-   $obos[] = '';
-	while ($obo = db_fetch_object($results)){
-		$obos[$obo->obo_id] = "$obo->name  | $obo->path";
-	}
-
 
-   $form['obo_existing'] = array(
-      '#type' =>'fieldset',
-      '#title' => t('Use a Saved Ontology OBO Reference')
-   );
-
-   $form['obo_new'] = array(
-      '#type' =>'fieldset',
-      '#title' => t('Use a New Ontology OBO Reference')
-   );
-
-
-   $form['obo_existing']['existing_instructions']= array(
-      '#value' => t('The Ontology OBO files listed in the drop down below have been automatically added upon 
-                     installation of the Tripal CV module or were added from a previous upload.  Select
-                     an OBO, then click the submit button to load the vocabulary into the database.  If the
-                     vocabularies already exist then the ontology will be updated.'),
-      '#weight'        => -1
-   );
-
-	$form['obo_existing']['obo_id'] = array(
-      '#title' => t('Ontology OBO File Reference'),
-      '#type' => 'select',
-      '#options' => $obos,
-      '#weight'        => 0
-	);
-
-   $form['obo_new']['path_instructions']= array(
-      '#value' => t('Provide the name and path for the OBO file.  If the vocabulary OBO file 
-                     is stored local to the server provide a file name. If the vocabulry is stored remotely, 
-                     provide a URL.  Only provide a URL or a local file, not both.'),
-      '#weight'        => 0
-   );
-
-   $form['obo_new']['obo_name']= array(
-      '#type'          => 'textfield',
-      '#title'         => t('New Vocabulary Name'),
-      '#description'   => t('Please provide a name for this vocabulary.  After upload, this name will appear in the drop down
-                             list above for use again later.'),
-      '#weight'        => 1
-   );
-
-
-
-   $form['obo_new']['obo_url']= array(
-      '#type'          => 'textfield',
-      '#title'         => t('Remote URL'),
-      '#description'   => t('Please enter a URL for the online OBO file.  The file will be downloaded and parsed.
-                             (e.g. http://www.obofoundry.org/ro/ro.obo'),
-      '#default_value' => $default_desc,
-      '#weight'        => 2
-   );
-   $form['obo_new']['obo_file']= array(
-      '#type'          => 'textfield',
-      '#title'         => t('Local File'),
-      '#description'   => t('Please enter the full system path for an OBO definition file, or a path within the Drupal
-                             installation (e.g. /sites/default/files/xyz.obo).  The path must be accessible to the
-                             server on which this Drupal instance is running.'),
-      '#default_value' => $default_desc,
-      '#weight'        => 3
-   );
-
-
-   $form['submit'] = array (
-     '#type'         => 'submit',
-     '#value'        => t('Submit'),
-     '#weight'       => 5,
-     '#executes_submit_callback' => TRUE,
-   );
-
-   $form['#redirect'] = 'admin/tripal/tripal_cv/obo';
-
-
-   return $form;
-}
 /*************************************************************************
-*
-*/
+ * Purpose: Provides a form to allow updating/deleteing of controlled vocabularies
+ */
 function tripal_cv_edit_form(&$form_state = NULL,$cvid = NULL){
 
   
@@ -464,9 +416,10 @@ function tripal_cv_edit_form(&$form_state = NULL,$cvid = NULL){
 
    return $form;
 }
+
 /************************************************************************
-*
-*/
+ * Purpose: The submit function of the update/delete controlled vocabulary form
+ */
 function tripal_cv_edit_form_submit($form, &$form_state){
 
    $name =  $form_state['values']['name'];
@@ -508,9 +461,57 @@ function tripal_cv_edit_form_submit($form, &$form_state){
 
    return '';
 }
+
+/*************************************************************************
+ * @section Add CVs
+ *************************************************************************/
+
+/*************************************************************************
+ * Purpose: Provides the Add controlled vocabulary form
+ */
+function tripal_cv_add_form(&$form_state = NULL){
+
+
+   $form['cvid'] = array(
+      '#type' => 'hidden',
+      '#value' => $cvid
+   );
+
+
+   $form['name']= array(
+      '#type'          => 'textfield',
+      '#title'         => t("Controlled Vocabulary name"),
+      '#description'   => t('Please enter the name for this vocabulary.  This field will be ignored if an OBO file or URL is provided above'),
+      '#required'      => FALSE,
+      '#default_value' => $default_cv,
+      '#weight'        => 1
+   );
+
+   $form['definition']= array(
+      '#type'          => 'textarea',
+      '#title'         => t('Description'),
+      '#description'   => t('Please enter a description for this vocabulary'),
+      '#default_value' => $default_desc,
+      '#weight'        => 2
+   );
+
+
+   $form['add'] = array (
+     '#type'         => 'submit',
+     '#value'        => t('Add'),
+     '#weight'       => 5,
+     '#executes_submit_callback' => TRUE,
+   );
+
+   $form['#redirect'] = 'admin/tripal/tripal_cv';
+
+
+   return $form;
+}
+
 /************************************************************************
-*
-*/
+ * Purpose: The submit function for the add controlled vocabulary form
+ */
 function tripal_cv_add_form_submit($form, &$form_state){
 
    $name =  $form_state['values']['name'];
@@ -534,9 +535,342 @@ function tripal_cv_add_form_submit($form, &$form_state){
 
    return '';
 }
+
+/*************************************************************************
+ * @section Add Controlled Vocabulary Term
+ *************************************************************************/
+
+/*************************************************************************
+ * Purpose: Provides the form that allows adding of terms to an existing
+ *   controlled vocabulary
+ */
+function tripal_cv_add_cvterm_form (&$form_state) {
+	$form = array();
+	
+	$results = tripal_core_chado_select(
+		'cv', 
+		array('cv_id','name'),
+		array()
+	);
+	$cvs = array();
+  $cvs[] = '';
+	foreach ($results as $cv) {
+		$cvs[$cv->cv_id] = $cv->name;
+	}
+
+	$form['cv_id'] = array(
+      '#title' => t('Controlled Vocabulary/Ontology Name'),
+      '#type' => 'select',
+      '#options' => $cvs,
+      '#ahah' => array(
+         'path' => 'admin/tripal/tripal_cv/add_cvterm/js',
+         'wrapper' => 'cvterm-add-div',
+         'effect' => 'fade',
+         'event' => 'change',
+         'method' => 'replace',
+      ),
+      '#required' => TRUE,
+	);
+
+	$form['add_cvterm'] = array(
+		'#type'					 => 'item',
+		'#value'				 => t('Please select a vocabulary above to add a term to it'),
+		'#prefix'				 => '<div id="cvterm-add-div">',
+		'#suffix'				 => '</div>'		
+	);
+	
+	if ($form_state['values']['cv_id']) {
+
+		$form['add_cvterm'] = array(
+			'#type'					 => 'fieldset',
+			'#title'	 			 => t('Add Term to the current Controlled Vocabulary'),
+			'#prefix'				 => '<div id="cvterm-add-div">',
+			'#suffix'				 => '</div>'
+		);
+	
+  	$form['add_cvterm']['name']= array(
+    	'#type'          => 'textfield',
+    	'#title'         => t("Term Name"),
+    	'#description'   => t('Please enter the name for this vocabulary term.'),
+    	'#required'      => FALSE,
+    	'#weight'        => 1,
+    	'#required' => TRUE,
+  	);
+
+  	$form['add_cvterm']['definition']= array(
+    	'#type'          => 'textarea',
+    	'#title'         => t('Description'),
+    	'#description'   => t('Please enter a description for this term'),
+  		'#weight'        => 2
+  	);
+  
+    $form['add_cvterm']['is_relationshiptype'] = array(
+      '#type'          => 'checkbox',
+      '#title'         => t('This term describes a relationship?'),
+      '#weight'        => 3,
+    );
+
+    $form['add_cvterm']['is_obsolete'] = array(
+      '#type'          => 'checkbox',
+      '#title'         => t('This term is obsolete?'),
+      '#weight'        => 3,
+    );
+    
+	  $results = tripal_core_chado_select(
+		  'db',
+		  array('db_id', 'name'),
+		  array()
+	  );
+		$dbs = array();
+  	$dbs[] = '';
+	  foreach ($results as $db) {
+		  $dbs[$db->db_id] = $db->name;
+	  }
+		$form['add_cvterm']['db_id'] = array(
+			'#type' 				=> 'select',
+			'#title' 				=> t('Database'),
+			'#description' 	=> t('All terms must be assocated with an external database. 
+													Please select the external database to associate with
+													this term'),
+			'#options'			=> $dbs,
+			'#weight'				=> 4,
+			'#required' => TRUE,
+		);
+		
+		$form['add_cvterm']['submit'] = array(
+			'#type'					=> 'submit',
+			'#value' 				=> 'Add Term',
+			'#weight'				=> 5
+		);
+		
+	} //end of if cv selected
+
+	
+  return $form;
+}
+
+/*************************************************************************
+ * Purpose: Validates the input for adding a cvterm
+ */
+function tripal_cv_add_cvterm_form_validate ($form, &$form_state) {
+  if (!empty($form_state['ahah_submission'])) {
+    return;
+  }
+  
+}
+
+/*************************************************************************
+ * Purpose: Adds terms to an existing controlled vocabulary
+ */
+function tripal_cv_add_cvterm_form_submit ($form, &$form_state) {
+  if (!empty($form_state['ahah_submission'])) {
+    return;
+  }
+  
+  // Add dbxref for cvterm
+  $dbxref_insert_values = array(
+    'db_id' => $form_state['values']['db_id'],
+    'accession' => $form_state['values']['name'],
+    'description' => 'cvterm reference',
+  );
+  $dbxref_results = tripal_core_chado_select(
+    'dbxref',
+    array('dbxref_id'),
+    $dbxref_insert_values
+  );
+  if (!$dbxref_results[0]->dbxref_id) {
+    $dbxref_insert_values['version'] = '1';
+    $dbxref_success = tripal_core_chado_insert(
+      'dbxref',
+      $dbxref_insert_values
+    );
+  } else {
+    $dbxref_success = true;
+  }
+  
+  // Add cvterm
+  if ($dbxref_success) {
+    $insert_values = array(
+      'cv_id' => $form_state['values']['cv_id'],
+      'name' => $form_state['values']['name'],
+      'definition' => $form_state['values']['definition'],
+      'dbxref_id' => $dbxref_insert_values,
+      'is_obsolete' => (string) $form_state['values']['is_obsolete'],
+      'is_relationshiptype' => (string) $form_state['values']['is_relationshiptype'],
+    );
+    $success = tripal_core_chado_insert(
+      'cvterm',
+      $insert_values
+    );
+    if ($success) {
+      drupal_set_message('Successfully Added Term to Controlled Vocabulary');
+    } else {
+      drupal_set_message('Unable to add controlled vocabulary term', 'error');
+      watchdog(
+        'tripal_cv',
+        'Cvterm Insert: Unable to insert cvterm where values: %values',
+        array('%values' => print_r($insert_values,TRUE)),
+        WATCHDOG_ERROR
+      );
+    }
+  } else {
+    drupal_set_message('Unable to add database reference for controlled vocabulary term', 'error');
+    watchdog(
+      'tripal_cv',
+      'Cvterm Insert: Unable to insert dbxref for cvterm where values: %values',
+      array('%values' => print_r($dbxref_insert_values,TRUE)),
+      WATCHDOG_ERROR
+    );
+  }  
+  return;
+}
+
+/*************************************************************************
+ * Purpose: This function gets called when the selecting of a cv from
+ *   the select list triggers it. This function simply rebuilds the form
+ *   with new information. No elements are created here
+ */
+function tripal_cv_add_cvterm_callback () {
+
+  // Retrieve the form from the cache
+  $form_state = array('storage' => NULL);
+  $form_build_id = $_POST['form_build_id'];
+  $form = form_get_cache($form_build_id, $form_state);
+	
+  // Preparing to process the form
+  $args = $form['#parameters'];
+  $form_id = array_shift($args);
+  $form_state['post'] = $form['#post'] = $_POST;
+  $form['#programmed'] = $form['#redirect'] = FALSE;
+  
+  // Sets the form_state so that the validate and submit handlers can tell
+  // when the form is submitted via AHAH
+	$form_state['ahah_submission'] = TRUE;
+
+  // Process the form with drupal_process_form. This function calls the submit 
+  // handlers, which put whatever was worthy of keeping into $form_state.
+  drupal_process_form($form_id, $form, $form_state);
+  
+  // You call drupal_rebuild_form which destroys $_POST.
+  // The form generator function is called and creates the form again but since 
+  // it knows to use $form_state, the form will be different.
+  // The new form gets cached and processed again, but because $_POST is 
+  // destroyed, the submit handlers will not be called again. 
+  $form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
+
+  // This is the only piece specific to your form
+  // Picks a piece of the form and renders it
+  // Specifcally the add cvterm fieldset and all contained fields
+  $add_cvterm_form = $form['add_cvterm'];
+  unset($add_cvterm_form['#prefix'], $add_cvterm_form['#suffix']);
+  $output = theme('status_messages') . drupal_render($add_cvterm_form);
+
+  // Final rendering callback.
+  drupal_json(array('status' => TRUE, 'data' => $output));
+}
+
+/*************************************************************************
+ * @section Ontology Loader
+ *************************************************************************/
+ 
+/*************************************************************************
+ * Purpose: Provides the form to load an already existing controlled
+ *  Vocabulary into chado
+ */
+function tripal_cv_obo_form(&$form_state = NULL){
+
+
+	// get a list of db from chado for user to choose
+	$sql = "SELECT * FROM {tripal_cv_obo} ORDER BY obo_id";
+	$results = db_query ($sql);
+
+
+	$obos = array();
+   $obos[] = '';
+	while ($obo = db_fetch_object($results)){
+		$obos[$obo->obo_id] = "$obo->name  | $obo->path";
+	}
+
+
+   $form['obo_existing'] = array(
+      '#type' =>'fieldset',
+      '#title' => t('Use a Saved Ontology OBO Reference')
+   );
+
+   $form['obo_new'] = array(
+      '#type' =>'fieldset',
+      '#title' => t('Use a New Ontology OBO Reference')
+   );
+
+
+   $form['obo_existing']['existing_instructions']= array(
+      '#value' => t('The Ontology OBO files listed in the drop down below have been automatically added upon 
+                     installation of the Tripal CV module or were added from a previous upload.  Select
+                     an OBO, then click the submit button to load the vocabulary into the database.  If the
+                     vocabularies already exist then the ontology will be updated.'),
+      '#weight'        => -1
+   );
+
+	$form['obo_existing']['obo_id'] = array(
+      '#title' => t('Ontology OBO File Reference'),
+      '#type' => 'select',
+      '#options' => $obos,
+      '#weight'        => 0
+	);
+
+   $form['obo_new']['path_instructions']= array(
+      '#value' => t('Provide the name and path for the OBO file.  If the vocabulary OBO file 
+                     is stored local to the server provide a file name. If the vocabulry is stored remotely, 
+                     provide a URL.  Only provide a URL or a local file, not both.'),
+      '#weight'        => 0
+   );
+
+   $form['obo_new']['obo_name']= array(
+      '#type'          => 'textfield',
+      '#title'         => t('New Vocabulary Name'),
+      '#description'   => t('Please provide a name for this vocabulary.  After upload, this name will appear in the drop down
+                             list above for use again later.'),
+      '#weight'        => 1
+   );
+
+
+
+   $form['obo_new']['obo_url']= array(
+      '#type'          => 'textfield',
+      '#title'         => t('Remote URL'),
+      '#description'   => t('Please enter a URL for the online OBO file.  The file will be downloaded and parsed.
+                             (e.g. http://www.obofoundry.org/ro/ro.obo'),
+      '#default_value' => $default_desc,
+      '#weight'        => 2
+   );
+   $form['obo_new']['obo_file']= array(
+      '#type'          => 'textfield',
+      '#title'         => t('Local File'),
+      '#description'   => t('Please enter the full system path for an OBO definition file, or a path within the Drupal
+                             installation (e.g. /sites/default/files/xyz.obo).  The path must be accessible to the
+                             server on which this Drupal instance is running.'),
+      '#default_value' => $default_desc,
+      '#weight'        => 3
+   );
+
+
+   $form['submit'] = array (
+     '#type'         => 'submit',
+     '#value'        => t('Submit'),
+     '#weight'       => 5,
+     '#executes_submit_callback' => TRUE,
+   );
+
+   $form['#redirect'] = 'admin/tripal/tripal_cv/obo';
+
+
+   return $form;
+}
+
 /************************************************************************
-*
-*/
+ * Purpose: The submit function for the load ontology form. It registers a
+ *   tripal job to run the obo_loader.php script
+ */
 function tripal_cv_obo_form_submit($form, &$form_state){
    global $user;
 
@@ -568,6 +902,11 @@ function tripal_cv_obo_form_submit($form, &$form_state){
 
    return '';
 }
+
+/*************************************************************************
+ * @section cvterm path management
+ *************************************************************************/
+
 /*************************************************************************
 *
 */
@@ -642,19 +981,12 @@ function tripal_cv_update_cvtermpath($cvid = NULL, $job_id = NULL) {
    return;
 }
 
-/*******************************************************************************
- *  We need to let drupal know about our theme functions and their arguments.
- *  We create theme functions to allow users of the module to customize the
- *  look and feel of the output generated in this module
- */
-function tripal_cv_theme () {
-   return array(
-      'tripal_cv_cvterm_edit' => array (
-         'arguments' => array('cvterm'),
-      ),
-   );
-}
-
+/*************************************************************************
+ * @section Miscellaneous
+ * @todo check to see if these functions are still needed and/or if they
+ *   should be moved to the api file
+ *************************************************************************/
+ 
 /*************************************************************************
 */
 function tripal_cv_get_cv_id($cv_name){
@@ -667,6 +999,7 @@ function tripal_cv_get_cv_id($cv_name){
    tripal_db_set_active($previous_db);
    return $cv->cv_id;
 }
+
 /*************************************************************************
 *
 */
@@ -682,6 +1015,7 @@ function tripal_cv_cvterm_edit($cvterm_id){
    tripal_db_set_active($previous_db);
    return theme('tripal_cv_cvterm_edit',$cvterm);
 }
+
 /*************************************************************************
 *
 */