Browse Source

Jobs: Added Views Integration and new default view

Lacey Sanderson 11 years ago
parent
commit
9350baa59b

+ 73 - 41
tripal_core/includes/jobs.inc

@@ -7,27 +7,59 @@
  */
 
 /**
- *
+ * Provides a landing page for tripal jobs admin
+ */
+function tripal_jobs_admin_view() {
+  $output = '';
+
+  // set the breadcrumb
+  $breadcrumb = array();
+  $breadcrumb[] = l('Home', '<front>');
+  $breadcrumb[] = l('Administration', 'admin');
+  $breadcrumb[] = l('Tripal', 'admin/tripal');
+  $breadcrumb[] = l('Jobs', 'admin/tripal/tripal_jobs');
+  drupal_set_breadcrumb($breadcrumb);
+
+  // Add the view
+  $view = views_embed_view('tripal_core_admin_jobs','default');
+  if (isset($view)) {
+    $output .= $view;
+  }
+  else {
+    $output .= '<p>The Tripal Jobs management system uses primarily views to provide an '
+      . 'administrative interface. Currently one or more views needed for this '
+      . 'administrative interface are disabled. <strong>Click each of the following links to '
+      . 'enable the pertinent views</strong>:</p>';
+    $output .= '<ul>';
+      $output .= '<li>'.l('Jobs View', 'admin/tripal/tripal_jobs/views/jobs/enable').'</li>';
+    $output .= '</ul>';
+  }
+
+  return $output;
+}
+
+/**
+ * NO LONGER USED: REPLACED BY VIEW
  * @ingroup tripal_core
  */
 function tripal_jobs_report_form($form, &$form_state = NULL) {
   $form = array();
 
-  // set the default values 
+  // set the default values
   $default_status = '';
   $default_job_name = '';
   if (array_key_exists('values', $form_state)) {
     $default_status = array_key_exists('job_status', $form_state['values']) ? $form_state['values']['job_status'] : '';
     $default_job_name = array_key_exists('job_name', $form_state['values']) ? $form_state['values']['job_name'] : '';
   }
-  
+
   if (!$default_status and array_key_exists('tripal_job_filter', $_SESSION)) {
     $job_status = array_key_exists('job_status', $_SESSION['tripal_job_filter']) ? $_SESSION['tripal_job_filter']['job_status'] : '';
   }
   if (!$default_job_name and array_key_exists('tripal_job_filter', $_SESSION)) {
     $default_job_name = array_key_exists('job_name', $_SESSION['tripal_job_filter']) ? $_SESSION['tripal_job_filter']['job_name'] : '';
   }
-  
+
 
   $form['job_status'] = array(
     '#type'          => 'select',
@@ -46,7 +78,7 @@ function tripal_jobs_report_form($form, &$form_state = NULL) {
     '#type'          => 'textfield',
     '#title'         => t('Filter by Job Name'),
     '#description'   => t('The jobs will be filtered if text provided is contained in the job name'),
-    '#default_value' => $default_job_name,        
+    '#default_value' => $default_job_name,
   );
 
   $form['submit'] = array(
@@ -60,10 +92,10 @@ function tripal_jobs_report_form($form, &$form_state = NULL) {
  * @ingroup tripal_core
  */
 function tripal_jobs_report_form_submit($form, &$form_state = NULL) {
-  
+
   $job_status = $form_state['values']['job_status'];
   $job_name = $form_state['values']['job_name'];
-  
+
   $_SESSION['tripal_job_filter']['job_status'] = $job_status;
   $_SESSION['tripal_job_filter']['job_name'] = $job_name;
 }
@@ -80,7 +112,7 @@ function tripal_jobs_report() {
   // run the following function which will
   // change the status of jobs that have errored out
   tripal_jobs_check_running();
-  
+
   $job_status = '';
   $job_name = '';
   if (array_key_exists('tripal_job_filter', $_SESSION)) {
@@ -95,9 +127,9 @@ function tripal_jobs_report() {
       TJ.status as job_status, TJ,submit_date,TJ.start_time,
       TJ.end_time,TJ.priority,U.name as username
     FROM {tripal_jobs} TJ
-      INNER JOIN {users} U on TJ.uid = U.uid 
-    WHERE 1=1 
-  ";  
+      INNER JOIN {users} U on TJ.uid = U.uid
+    WHERE 1=1
+  ";
   $args = array();
   if ($job_status) {
     $sql .= "AND TJ.status = :status ";
@@ -108,9 +140,9 @@ function tripal_jobs_report() {
     $args[':job_name'] = "%$job_name%";
   }
   $sql .= " ORDER BY job_id DESC ";
-  
+
   // create the SQL that returns the total number of records
-  $count_sql = "SELECT count(*) as total FROM ($sql) as t1";  
+  $count_sql = "SELECT count(*) as total FROM ($sql) as t1";
   $result = db_query($count_sql, $args);
   $total_jobs = $result->fetchObject();
 
@@ -118,16 +150,16 @@ function tripal_jobs_report() {
   $num_per_page = 25;
   $page = pager_find_page();
   pager_default_initialize($total_jobs->total, $num_per_page);
-  
+
   // get results
   $pager_sql = "$sql LIMIT  :number OFFSET :offset";
   $args[':number'] = $num_per_page;
   $args[':offset'] = $num_per_page * $page;
   $jobs = db_query($pager_sql, $args);
-  
-  
+
+
   // iterate through the jobs and build the table rows
-  $rows = array();  
+  $rows = array();
   foreach ($jobs as $job) {
     $submit = tripal_jobs_get_submit_date($job);
     $start = tripal_jobs_get_start_time($job);
@@ -149,8 +181,8 @@ function tripal_jobs_report() {
       "$cancel_link $rerun_link $view_link",
     );
   }
-  
-  // the header for the jobs table  
+
+  // the header for the jobs table
   $header = array(
     'Job ID',
     'User',
@@ -162,21 +194,21 @@ function tripal_jobs_report() {
     'Action'
   );
   $table = array(
-    'header' => $header, 
-    'rows' => $rows, 
-    'attributes' => array(), 
+    'header' => $header,
+    'rows' => $rows,
+    'attributes' => array(),
     'sticky' => FALSE,
     'caption' => '',
-    'colgroups' => array(), 
-    'empty' => 'No jobs have been submitted', 
+    'colgroups' => array(),
+    'empty' => 'No jobs have been submitted',
   );
-    
+
   // create the report page
   $output = "Waiting jobs are executed first by priority level (the lower the " .
             "number the higher the priority) and second by the order they " .
             "were entered";
   $report_form = drupal_get_form('tripal_jobs_report_form');
-  $output .= drupal_render($report_form);   
+  $output .= drupal_render($report_form);
   $output .= theme_table($table);
   $output .= theme('pager');
   return $output;
@@ -191,7 +223,7 @@ function tripal_jobs_report() {
  *   The HTML describing the indicated job
  * @ingroup tripal_core
  */
-function tripal_jobs_view($job_id) { 
+function tripal_jobs_view($job_id) {
   // get the job record
   $sql =
     "SELECT TJ.job_id,TJ.uid,TJ.job_name,TJ.modulename,TJ.progress,
@@ -224,26 +256,26 @@ function tripal_jobs_view($job_id) {
     $job->arguments = $args;
   }
   // generate the list of arguments for display
-  $arguments = '';  
+  $arguments = '';
   foreach ($job->arguments as $key => $value) {
      $arguments .= "$key: $value<br>";
-  } 
-  
+  }
+
   // build the links
   $links  = l('Return to jobs list', "admin/tripal/tripal_jobs/") . ' | ' .
   $links .= l('Re-run this job', "admin/tripal/tripal_jobs/rerun/" . $job->job_id) . ' | ';
   if ($job->start_time == 0 and $job->end_time == 0) {
     $links .= l('Cancel this job', "admin/tripal/tripal_jobs/cancel/" . $job->job_id) . ' | ';
   }
-  
+
   // make our start and end times more legible
   $job->submit_date = tripal_jobs_get_submit_date($job);
   $job->start_time = tripal_jobs_get_start_time($job);
   $job->end_time = tripal_jobs_get_end_time($job);
-  
+
   // construct the table headers
   $header = array('Detail', 'Value');
-  
+
   // construct the table rows
   $rows[] = array('Job Description', $job->job_name);
   $rows[] = array('Submitting Module', $job->modulename);
@@ -258,17 +290,17 @@ function tripal_jobs_view($job_id) {
   $rows[] = array('Error Message', $job->error_msg);
   $rows[] = array('Priority', $job->priority);
   $rows[] = array('Submitting User', $job->username);
-  
+
   $table = array(
-    'header' => $header, 
-    'rows' => $rows, 
-    'attributes' => array(), 
+    'header' => $header,
+    'rows' => $rows,
+    'attributes' => array(),
     'sticky' => FALSE,
     'caption' => '',
-    'colgroups' => array(), 
-    'empty' => '', 
-  );    
-  
+    'colgroups' => array(),
+    'empty' => '',
+  );
+
   $output = '<p>' . substr($links, 0, -2) . '</p>'; // remove trailing |
   $output .= theme_table($table);
   return $output;

+ 3 - 0
tripal_core/theme/tripal_core_jobs_help.tpl.php

@@ -0,0 +1,3 @@
+<p>The Tripal Jobs Management System provides a framework for Biological jobs to be run
+via the command-line in order to eliminate the problems associated with long running
+jobs in the web browser (ie: timeout errors).</p>

+ 3 - 1
tripal_core/tripal_core.info

@@ -4,4 +4,6 @@ core = 7.x
 project = tripal_core
 package = Tripal
 version = 7.x-2.0-beta1
-configure = admin/tripal
+configure = admin/tripal
+
+dependencies[] = views

+ 38 - 3
tripal_core/tripal_core.module

@@ -63,11 +63,11 @@ function tripal_core_init() {
   // add javascript files
   drupal_add_js(drupal_get_path('module', 'tripal_core') . '/theme/js/tripal.js');
   drupal_add_css(drupal_get_path('module', 'tripal_core') . '/theme/css/tripal.css');
-  
+
 
   // create the 'tripal' controlled volcabulary in chado but only if it doesn't already exist, and
   // only if the chado database is present.
-  if (tripal_core_is_chado_installed()) {    
+  if (tripal_core_is_chado_installed()) {
 
     // make sure the current version of chado is set
     tripal_core_set_chado_version();
@@ -194,11 +194,20 @@ function tripal_core_menu() {
   $items['admin/tripal/tripal_jobs'] = array(
     'title' => 'Jobs',
     'description' => 'Jobs managed by Tripal',
-    'page callback' => 'tripal_jobs_report',
+    'page callback' => 'tripal_jobs_admin_view',
     'access arguments' => array('access administration pages'),
     'type' => MENU_NORMAL_ITEM,
     'weight' => -10
   );
+  $items['admin/tripal/tripal_jobs/help'] = array(
+    'title' => 'Help',
+    'description' => 'Help for the tripal job management system',
+    'page callback' => 'theme',
+    'page arguments' => array('tripal_core_job_help'),
+    'access arguments' => array('access administration pages'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 10
+  );
   $items['admin/tripal/tripal_jobs/cancel/%'] = array(
     'title' => 'Jobs',
     'description' => 'Cancel a pending job',
@@ -223,6 +232,13 @@ function tripal_core_menu() {
     'access arguments' => array('access administration pages'),
     'type' => MENU_CALLBACK,
   );
+  $items['admin/tripal/tripal_jobs/views/jobs/enable'] = array(
+    'title' => 'Enable Jobs Administrative View',
+    'page callback' => 'tripal_views_admin_enable_view',
+    'page arguments' => array('tripal_core_admin_jobs', 'admin/tripal/tripal_jobs'),
+    'access arguments' => array('access administration pages'),
+    'type' => MENU_CALLBACK,
+  );
 
   // Materialized Views
   $items['admin/tripal/schema/mviews'] = array(
@@ -357,6 +373,11 @@ function tripal_core_theme() {
     'theme_sequence_combo' => array(
       'render element' => 'element',
     ),
+    'tripal_core_jobs_help' => array(
+      'template' => 'tripal_core_jobs_help',
+      'variables' =>  array(NULL),
+      'path' => drupal_get_path('module', 'tripal_core') . '/theme'
+    ),
   );
 }
 
@@ -415,3 +436,17 @@ function tripal_core_coder_ignore() {
     'line prefix' => drupal_get_path('module', 'tripal_core'),
   );
 }
+
+/**
+ * Implements hook_views_api()
+ * Purpose: Essentially this hook tells drupal that there is views support for
+ *  for this module which then includes tripal_db.views.inc where all the
+ *  views integration code is
+ *
+ * @ingroup tripal_organism
+ */
+function tripal_core_views_api() {
+  return array(
+    'api' => 3.0,
+  );
+}

+ 291 - 0
tripal_core/tripal_core.views.inc

@@ -0,0 +1,291 @@
+<?php
+
+/**
+ * Describe various Tripal Core systems to Views
+ *   for the creation of administrative views
+ */
+function tripal_core_views_data() {
+  $data = array();
+
+  // Job Management System
+  $data =   tripal_core_views_data_jobs($data);
+
+  // Custom Tables Management
+  $data = tripal_core_views_data_custom_tables($data);
+
+  return $data;
+}
+
+/**
+ * Provides the data array for the tripal job management system
+ *
+ * @param $data
+ *   Previously generated tripal_core views data array
+ * return
+ *   $data array with job management system described
+ */
+function tripal_core_views_data_jobs($data) {
+
+  $data['tripal_jobs']['table']['group'] = t('Tripal Jobs');
+  $data['tripal_jobs']['table']['base'] = array(
+    'field' => 'job_id', // This is the identifier field for the view.
+    'title' => t('Tripal Jobs'),
+    'help' => t('The Job Management system for Tripal.'),
+    'weight' => -10,
+  );
+
+  // Job ID
+  $data['tripal_jobs']['job_id'] = array(
+    'title' => t('Job ID'),
+    'help' => t('The job primary key.'),
+    'field' => array(
+      'handler' => 'views_handler_field_numeric',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+
+  // User ID: Submitter
+  $data['tripal_jobs']['uid'] = array(
+    'title' => t('Job Submitter'),
+    'help' => t('The user who submitted the job.'),
+    'relationship' => array(
+      'base' => 'user', // The name of the table to join with.
+      'base field' => 'uid', // The name of the field on the joined table.
+      'handler' => 'views_handler_relationship',
+      'label' => t('Submitting User'),
+      'title' => t('Submitting User'),
+      'help' => t('The user who submitted the job'),
+    ),
+  );
+
+  // Job Name
+  $data['tripal_jobs']['job_name'] = array(
+    'title' => t('Job Name'),
+    'help' => t('The name of the job.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+      'click sortable' => TRUE, // This is use by the table display plugin.
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_string',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_string',
+    ),
+  );
+
+  // Module Name
+  $data['tripal_jobs']['modulename'] = array(
+    'title' => t('Module Name'),
+    'help' => t('The name of the module that submitted the job.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+      'click sortable' => TRUE, // This is use by the table display plugin.
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_string',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_string',
+    ),
+  );
+
+  // Callback
+  $data['tripal_jobs']['callback'] = array(
+    'title' => t('Callback'),
+    'help' => t('The callback executed when the job runs.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+      'click sortable' => TRUE, // This is use by the table display plugin.
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_string',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_string',
+    ),
+  );
+
+  // Arguments
+  $data['tripal_jobs']['arguments'] = array(
+    'title' => t('Arguements'),
+    'help' => t('Any arguements passed to the callback.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+      'click sortable' => TRUE, // This is use by the table display plugin.
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_string',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_string',
+    ),
+  );
+
+  // Progress
+  $data['tripal_jobs']['progress'] = array(
+    'title' => t('Progress'),
+    'help' => t('The current progress of the job.'),
+    'field' => array(
+      'handler' => 'views_handler_field_numeric',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+
+  // Status
+  $data['tripal_jobs']['status'] = array(
+    'title' => t('Status'),
+    'help' => t('The current status of the job.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+      'click sortable' => TRUE, // This is use by the table display plugin.
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_string',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_string',
+    ),
+  );
+
+  // Submit Data
+  $data['tripal_jobs']['submit_date'] = array(
+    'title' => t('Submit Date'),
+    'help' => t('The date the job was submitted.'),
+    'field' => array(
+      'handler' => 'views_handler_field_date',
+      'click sortable' => TRUE,
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort_date',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_date',
+    ),
+  );
+
+  // Start Time
+  $data['tripal_jobs']['start_time'] = array(
+    'title' => t('Start Time'),
+    'help' => t('The time the job started.'),
+    'field' => array(
+      'handler' => 'views_handler_field_date',
+      'click sortable' => TRUE,
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort_date',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_date',
+    ),
+  );
+
+  // End Time
+  $data['tripal_jobs']['end_time'] = array(
+    'title' => t('End Time'),
+    'help' => t('The time the job ended.'),
+    'field' => array(
+      'handler' => 'views_handler_field_date',
+      'click sortable' => TRUE,
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort_date',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_date',
+    ),
+  );
+
+  // Error Message
+  $data['tripal_jobs']['error_msg'] = array(
+    'title' => t('Error Message '),
+    'help' => t('A short description of any error the job might have had.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+      'click sortable' => TRUE, // This is use by the table display plugin.
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_string',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_string',
+    ),
+  );
+
+  // Unix Pid of the job
+  $data['tripal_jobs']['pid'] = array(
+    'title' => t('Job PID'),
+    'help' => t('The Unix PID of the job.'),
+    'field' => array(
+      'handler' => 'views_handler_field_numeric',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+
+  // Priority
+  $data['tripal_jobs']['priority'] = array(
+    'title' => t('Priority'),
+    'help' => t('The priority of this job.'),
+    'field' => array(
+      'handler' => 'views_handler_field_numeric',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+
+  return $data;
+}
+
+/**
+ * Provides the data array for the tripal custom tables management
+ *
+ * @param $data
+ *   Previously generated tripal_core views data array
+ * return
+ *   $data array with custom tables management described
+ */
+function tripal_core_views_data_custom_tables($data) {
+
+  return $data;
+}

+ 286 - 0
tripal_core/tripal_core.views_default.inc

@@ -0,0 +1,286 @@
+<?php
+
+/**
+ *
+ * @ingroup tripal_core_views
+ */
+function tripal_core_views_default_views() {
+  $views = array();
+
+  $view = tripal_core_admin_defaultview_jobs();
+  $views[$view->name] = $view;
+
+  return $views;
+}
+
+function tripal_core_admin_defaultview_jobs() {
+
+  $view = new view();
+  $view->name = 'tripal_core_admin_jobs';
+  $view->description = 'DO NOT DISABLE';
+  $view->tag = 'tripal admin';
+  $view->base_table = 'tripal_jobs';
+  $view->human_name = 'Jobs Admin';
+  $view->core = 7;
+  $view->api_version = '3.0';
+  $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+  /* Display: Master */
+  $handler = $view->new_display('default', 'Master', 'default');
+  $handler->display->display_options['title'] = 'Jobs';
+  $handler->display->display_options['use_more_always'] = FALSE;
+  $handler->display->display_options['access']['type'] = 'none';
+  $handler->display->display_options['cache']['type'] = 'none';
+  $handler->display->display_options['query']['type'] = 'views_query';
+  $handler->display->display_options['exposed_form']['type'] = 'basic';
+  $handler->display->display_options['exposed_form']['options']['submit_button'] = 'Filter';
+  $handler->display->display_options['pager']['type'] = 'full';
+  $handler->display->display_options['pager']['options']['items_per_page'] = '25';
+  $handler->display->display_options['style_plugin'] = 'table';
+  $handler->display->display_options['style_options']['columns'] = array(
+    'job_id' => 'job_id',
+    'job_name' => 'job_name',
+    'submit_date' => 'submit_date',
+    'start_time' => 'start_time',
+    'end_time' => 'end_time',
+    'nothing' => 'nothing',
+    'priority' => 'priority',
+    'progress' => 'progress',
+    'status' => 'status',
+    'nothing_2' => 'nothing_2',
+    'nothing_3' => 'nothing_3',
+    'nothing_1' => 'nothing_1',
+  );
+  $handler->display->display_options['style_options']['default'] = 'job_id';
+  $handler->display->display_options['style_options']['info'] = array(
+    'job_id' => array(
+      'sortable' => 1,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'job_name' => array(
+      'sortable' => 1,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'submit_date' => array(
+      'sortable' => 0,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'start_time' => array(
+      'sortable' => 0,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'end_time' => array(
+      'sortable' => 0,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'nothing' => array(
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'priority' => array(
+      'sortable' => 1,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'progress' => array(
+      'sortable' => 1,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'status' => array(
+      'sortable' => 1,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'nothing_2' => array(
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'nothing_3' => array(
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'nothing_1' => array(
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+  );
+  /* Header: Global: Text area */
+  $handler->display->display_options['header']['area']['id'] = 'area';
+  $handler->display->display_options['header']['area']['table'] = 'views';
+  $handler->display->display_options['header']['area']['field'] = 'area';
+  $handler->display->display_options['header']['area']['label'] = 'Description';
+  $handler->display->display_options['header']['area']['empty'] = TRUE;
+  $handler->display->display_options['header']['area']['content'] = '<p>Waiting jobs are executed first by priority level (the lower the number the higher the priority) and second by the order they were entered.</p>';
+  $handler->display->display_options['header']['area']['format'] = 'filtered_html';
+  /* Field: Tripal Jobs: Job ID */
+  $handler->display->display_options['fields']['job_id']['id'] = 'job_id';
+  $handler->display->display_options['fields']['job_id']['table'] = 'tripal_jobs';
+  $handler->display->display_options['fields']['job_id']['field'] = 'job_id';
+  $handler->display->display_options['fields']['job_id']['label'] = '';
+  $handler->display->display_options['fields']['job_id']['element_class'] = 'extra-short-column';
+  $handler->display->display_options['fields']['job_id']['element_label_class'] = 'extra-short-column';
+  $handler->display->display_options['fields']['job_id']['element_label_colon'] = FALSE;
+  $handler->display->display_options['fields']['job_id']['separator'] = '';
+  /* Field: Tripal Jobs: Job Name */
+  $handler->display->display_options['fields']['job_name']['id'] = 'job_name';
+  $handler->display->display_options['fields']['job_name']['table'] = 'tripal_jobs';
+  $handler->display->display_options['fields']['job_name']['field'] = 'job_name';
+  $handler->display->display_options['fields']['job_name']['alter']['make_link'] = TRUE;
+  $handler->display->display_options['fields']['job_name']['alter']['path'] = 'admin/tripal/tripal_jobs/view/[job_id]';
+  /* Field: Tripal Jobs: Submit Date */
+  $handler->display->display_options['fields']['submit_date']['id'] = 'submit_date';
+  $handler->display->display_options['fields']['submit_date']['table'] = 'tripal_jobs';
+  $handler->display->display_options['fields']['submit_date']['field'] = 'submit_date';
+  $handler->display->display_options['fields']['submit_date']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['submit_date']['date_format'] = 'long';
+  /* Field: Tripal Jobs: Start Time */
+  $handler->display->display_options['fields']['start_time']['id'] = 'start_time';
+  $handler->display->display_options['fields']['start_time']['table'] = 'tripal_jobs';
+  $handler->display->display_options['fields']['start_time']['field'] = 'start_time';
+  $handler->display->display_options['fields']['start_time']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['start_time']['date_format'] = 'long';
+  /* Field: Tripal Jobs: End Time */
+  $handler->display->display_options['fields']['end_time']['id'] = 'end_time';
+  $handler->display->display_options['fields']['end_time']['table'] = 'tripal_jobs';
+  $handler->display->display_options['fields']['end_time']['field'] = 'end_time';
+  $handler->display->display_options['fields']['end_time']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['end_time']['date_format'] = 'long';
+  /* Field: Global: Custom text */
+  $handler->display->display_options['fields']['nothing']['id'] = 'nothing';
+  $handler->display->display_options['fields']['nothing']['table'] = 'views';
+  $handler->display->display_options['fields']['nothing']['field'] = 'nothing';
+  $handler->display->display_options['fields']['nothing']['label'] = 'Dates';
+  $handler->display->display_options['fields']['nothing']['alter']['text'] = 'Submitted: [submit_date]<br />
+  Started: [start_time]<br />
+  Ended: [end_time]';
+  /* Field: Tripal Jobs: Priority */
+  $handler->display->display_options['fields']['priority']['id'] = 'priority';
+  $handler->display->display_options['fields']['priority']['table'] = 'tripal_jobs';
+  $handler->display->display_options['fields']['priority']['field'] = 'priority';
+  $handler->display->display_options['fields']['priority']['element_class'] = 'short-column';
+  $handler->display->display_options['fields']['priority']['element_label_class'] = 'short-column';
+  $handler->display->display_options['fields']['priority']['separator'] = '';
+  /* Field: Tripal Jobs: Progress */
+  $handler->display->display_options['fields']['progress']['id'] = 'progress';
+  $handler->display->display_options['fields']['progress']['table'] = 'tripal_jobs';
+  $handler->display->display_options['fields']['progress']['field'] = 'progress';
+  $handler->display->display_options['fields']['progress']['element_class'] = 'short-column';
+  $handler->display->display_options['fields']['progress']['element_label_class'] = 'short-column';
+  $handler->display->display_options['fields']['progress']['separator'] = '';
+  $handler->display->display_options['fields']['progress']['suffix'] = '%';
+  /* Field: Tripal Jobs: Status */
+  $handler->display->display_options['fields']['status']['id'] = 'status';
+  $handler->display->display_options['fields']['status']['table'] = 'tripal_jobs';
+  $handler->display->display_options['fields']['status']['field'] = 'status';
+  $handler->display->display_options['fields']['status']['element_class'] = 'short-column';
+  $handler->display->display_options['fields']['status']['element_label_class'] = 'short-column';
+  /* Field: Global: Custom text */
+  $handler->display->display_options['fields']['nothing_2']['id'] = 'nothing_2';
+  $handler->display->display_options['fields']['nothing_2']['table'] = 'views';
+  $handler->display->display_options['fields']['nothing_2']['field'] = 'nothing';
+  $handler->display->display_options['fields']['nothing_2']['label'] = 'Re-run Link';
+  $handler->display->display_options['fields']['nothing_2']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['nothing_2']['alter']['text'] = 'Re-run';
+  $handler->display->display_options['fields']['nothing_2']['alter']['make_link'] = TRUE;
+  $handler->display->display_options['fields']['nothing_2']['alter']['path'] = 'admin/tripal/tripal_jobs/rerun/[job_id]';
+  /* Field: Global: Custom text */
+  $handler->display->display_options['fields']['nothing_3']['id'] = 'nothing_3';
+  $handler->display->display_options['fields']['nothing_3']['table'] = 'views';
+  $handler->display->display_options['fields']['nothing_3']['field'] = 'nothing';
+  $handler->display->display_options['fields']['nothing_3']['label'] = 'Cancel link';
+  $handler->display->display_options['fields']['nothing_3']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['nothing_3']['alter']['text'] = 'Cancel';
+  $handler->display->display_options['fields']['nothing_3']['alter']['make_link'] = TRUE;
+  $handler->display->display_options['fields']['nothing_3']['alter']['path'] = 'admin/tripal/tripal_jobs/cancel/[job_id]';
+  /* Field: Global: Custom text */
+  $handler->display->display_options['fields']['nothing_1']['id'] = 'nothing_1';
+  $handler->display->display_options['fields']['nothing_1']['table'] = 'views';
+  $handler->display->display_options['fields']['nothing_1']['field'] = 'nothing';
+  $handler->display->display_options['fields']['nothing_1']['label'] = 'Action';
+  $handler->display->display_options['fields']['nothing_1']['alter']['text'] = '[nothing_2]<br />
+  [nothing_3]';
+  $handler->display->display_options['fields']['nothing_1']['element_class'] = 'short-column';
+  $handler->display->display_options['fields']['nothing_1']['element_label_class'] = 'short-column';
+  /* Filter criterion: Tripal Jobs: Job Name */
+  $handler->display->display_options['filters']['job_name']['id'] = 'job_name';
+  $handler->display->display_options['filters']['job_name']['table'] = 'tripal_jobs';
+  $handler->display->display_options['filters']['job_name']['field'] = 'job_name';
+  $handler->display->display_options['filters']['job_name']['operator'] = 'contains';
+  $handler->display->display_options['filters']['job_name']['exposed'] = TRUE;
+  $handler->display->display_options['filters']['job_name']['expose']['operator_id'] = 'job_name_op';
+  $handler->display->display_options['filters']['job_name']['expose']['label'] = 'Job Name Contains';
+  $handler->display->display_options['filters']['job_name']['expose']['operator'] = 'job_name_op';
+  $handler->display->display_options['filters']['job_name']['expose']['identifier'] = 'job_name';
+  $handler->display->display_options['filters']['job_name']['expose']['remember_roles'] = array(
+    2 => '2',
+    1 => 0,
+    3 => 0,
+  );
+  /* Filter criterion: Tripal Jobs: Module Name */
+  $handler->display->display_options['filters']['modulename']['id'] = 'modulename';
+  $handler->display->display_options['filters']['modulename']['table'] = 'tripal_jobs';
+  $handler->display->display_options['filters']['modulename']['field'] = 'modulename';
+  $handler->display->display_options['filters']['modulename']['exposed'] = TRUE;
+  $handler->display->display_options['filters']['modulename']['expose']['operator_id'] = 'modulename_op';
+  $handler->display->display_options['filters']['modulename']['expose']['label'] = 'Submitting Module';
+  $handler->display->display_options['filters']['modulename']['expose']['operator'] = 'modulename_op';
+  $handler->display->display_options['filters']['modulename']['expose']['identifier'] = 'modulename';
+  $handler->display->display_options['filters']['modulename']['expose']['remember_roles'] = array(
+    2 => '2',
+    1 => 0,
+    3 => 0,
+  );
+  /* Filter criterion: Tripal Jobs: Status */
+  $handler->display->display_options['filters']['status']['id'] = 'status';
+  $handler->display->display_options['filters']['status']['table'] = 'tripal_jobs';
+  $handler->display->display_options['filters']['status']['field'] = 'status';
+  $handler->display->display_options['filters']['status']['exposed'] = TRUE;
+  $handler->display->display_options['filters']['status']['expose']['operator_id'] = 'status_op';
+  $handler->display->display_options['filters']['status']['expose']['label'] = 'Job Status';
+  $handler->display->display_options['filters']['status']['expose']['operator'] = 'status_op';
+  $handler->display->display_options['filters']['status']['expose']['identifier'] = 'status';
+  $handler->display->display_options['filters']['status']['expose']['remember_roles'] = array(
+    2 => '2',
+    1 => 0,
+    3 => 0,
+  );
+
+  /* Display: Page */
+  $handler = $view->new_display('page', 'Page', 'page');
+  $handler->display->display_options['path'] = 'admin/tripal/tripal_jobs/jobs';
+  $handler->display->display_options['menu']['type'] = 'default tab';
+  $handler->display->display_options['menu']['title'] = 'Jobs';
+  $handler->display->display_options['menu']['description'] = 'Jobs managed by Tripal';
+  $handler->display->display_options['menu']['weight'] = '-10';
+  $handler->display->display_options['menu']['context'] = 0;
+  $handler->display->display_options['menu']['context_only_inline'] = 0;
+  $handler->display->display_options['tab_options']['weight'] = '0';
+
+  return $view;
+}

+ 5 - 0
tripal_views/theme/tripal_views_admin_views.css

@@ -67,6 +67,11 @@ th.views-field {
   word-wrap: break-word;
 }
 
+td.views-field.extra-short-column, th.views-field.extra-short-column {
+  width: 25px;
+  word-wrap: break-word;
+}
+
 td.views-field.short-column, th.views-field.short-column {
   width: 75px;
   word-wrap: break-word;