Index: vr_list/vr_list.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/vr/vr_list/vr_list.admin.inc,v
retrieving revision 1.1.2.14
diff -u -p -r1.1.2.14 vr_list.admin.inc
--- vr_list/vr_list.admin.inc	11 Jun 2010 16:22:38 -0000	1.1.2.14
+++ vr_list/vr_list.admin.inc	9 Jul 2010 15:40:56 -0000
@@ -520,4 +520,15 @@ function vr_list_member_map_submit($form
     // A new view has been selected for this field map.  Clear stale settings.
     variable_set('vr_list_view_map_' . $list->id, $values['field_map']);
   }  
+}
+
+/**
+ * Allow administrators to push local data to VerticalResponse withouth
+ * launching a campaign.
+ * 
+ * Push local data to VerticalResponse.
+ */
+function vr_list_push($list) {
+  $lists = array($list->id);
+  vr_list_update_batch($lists);
 }
\ No newline at end of file
Index: vr_list/vr_list.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/vr/vr_list/vr_list.module,v
retrieving revision 1.1.2.9
diff -u -p -r1.1.2.9 vr_list.module
--- vr_list/vr_list.module	22 Jun 2010 17:10:16 -0000	1.1.2.9
+++ vr_list/vr_list.module	9 Jul 2010 15:40:56 -0000
@@ -56,6 +56,16 @@ function vr_list_menu() {
     'file' => 'vr_list.admin.inc',
     'type' => MENU_LOCAL_TASK,
     );
+  $items['admin/build/vr/list/%vr_list/list-push'] = array(
+    'title' => t('Push Local Data'),
+    'description' => t('Push local list data to VerticalResponse'),
+    'page callback' => 'vr_list_push',
+    'page arguments' => array(4),
+    'access callback' => 'vr_list_push_access',
+    'access arguments' => array(4),
+    'file' => 'vr_list.admin.inc',
+    'type' => MENU_LOCAL_TASK,
+    );
   $items['admin/build/vr/list/%vr_list/edit/%vr_list_member'] = array(
     'load arguments' => array(4),
     'title' => t('Edit Member'),
@@ -81,6 +91,23 @@ function vr_list_menu() {
 }
 
 /**
+ * Access callback for vr_list_push(), user must have 'administer VerticalResponse' 
+ * permission and a field map must be defined for the given list.
+ * 
+ * @param object
+ *  a VerticalResponse list object.
+ * @return bool
+ *  TRUE if access is granted, FALSE if it is denied.
+ */
+function vr_list_push_access($list) {
+  $map = variable_get('vr_list_view_' . $list->id, NULL);
+  if (user_access('administer VerticalResponse') AND !empty($map)) {
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/**
  * Title callback for general list management pages.
  * 
  * @param string
@@ -289,7 +316,7 @@ function vr_list_table_sort($header, $co
  * @param int
  *  campaign id from VerticalResponse
  */
-function vr_list_update_batch($lists, $campaign) {
+function vr_list_update_batch($lists, $campaign = NULL) {
   foreach ($lists as $list_id) {
     $operations[] = array(
       '_vr_list_update',
@@ -303,6 +330,13 @@ function vr_list_update_batch($lists, $c
     'progress_message' => t('Processed @current out of @total.'),
     );
   batch_set($batch);
+  // Campaign will be empty if the administrator is simply pushing
+  // local data to VerticalResponse and NOT launching a campaign.
+  // In that case batch_process needs to be invoked with a redirect destination.
+  if (empty($campaign)) {
+    $list_id = reset($lists);
+    batch_process('admin/build/vr/list/' . $list_id . '/edit');
+  }
 }
 
 /**
@@ -355,7 +389,7 @@ function _vr_list_update($list_id, $camp
  * "Finished" callback for batch list update.
  */
 function vr_list_update_finish($success, $results, $operations) {
-  if ($success) {
+  if ($success AND !empty($results['campaign'])) {
     drupal_set_message('Drupal has updated the selected VerticalResponse mailing lists 
       according to defined field maps.');
     $param['campaign_id'] = $results['campaign']->id;
@@ -365,6 +399,9 @@ function vr_list_update_finish($success,
     drupal_set_message($message);
     watchdog('VerticalResponse', $message, array(), WATCHDOG_INFO);
   }
+  elseif ($success AND empty($results['campaign'])) {
+    drupal_set_message('Local list information has been pushed to VerticalResponse.');
+  }
   else {
     $error_operation = reset($operations);
     $message = t('An error occurred while processing %error_operation with arguments: @arguments', array('%error_operation' => $error_operation[0], '@arguments' => print_r($error_operation[1], TRUE)));
