From 2cdde905f5f8692ba4bcad2bd66642663f1572b3 Mon Sep 17 00:00:00 2001 From: Silvio Date: Mon, 28 Sep 2009 12:24:00 -0300 Subject: Initial import --- .gitignore | 2 + COPYING | 1 + README | 11 ++++ node_import_truncate.info | 6 ++ node_import_truncate.module | 130 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 150 insertions(+) create mode 100644 .gitignore create mode 100644 COPYING create mode 100644 README create mode 100644 node_import_truncate.info create mode 100644 node_import_truncate.module diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d54e6df --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Ignore any vim temp file +*.swp diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..3ca27fc --- /dev/null +++ b/COPYING @@ -0,0 +1 @@ +TODO: Choose License. diff --git a/README b/README new file mode 100644 index 0000000..a256566 --- /dev/null +++ b/README @@ -0,0 +1,11 @@ +Node Import Truncate +==================== + +This module adds a final step at the Node Import form so users +can choose whether to erase all nodes of a given content type +before importing new data into it. + +It might be useful in cases like users periodically importing +a CSV spreadsheet with new as well old content: this module can +erase all previous imported data to avoid duplicate content in +the database. diff --git a/node_import_truncate.info b/node_import_truncate.info new file mode 100644 index 0000000..c7628a0 --- /dev/null +++ b/node_import_truncate.info @@ -0,0 +1,6 @@ +; $Id$ +name = Node Import Truncate +description = Allow to truncate a content type before importing data. +package = Development +core = 6.x +dependencies[] = node_import diff --git a/node_import_truncate.module b/node_import_truncate.module new file mode 100644 index 0000000..7d5abf9 --- /dev/null +++ b/node_import_truncate.module @@ -0,0 +1,130 @@ + 'Despesas - Mass deletion', + 'description' => 'Mass deletion page.', + 'page callback' => 'node_import_truncate_page', + 'access arguments' => array('administer nodes'), + 'type' => MENU_CALLBACK, + ); + return $items; +} + +/** + * Menu callback. + */ +function node_import_truncate_page($taskid = null) { + $output = t('Choose whether to delete older content.'); + $output .= drupal_get_form('node_import_truncate_form', $taskid); + return $output; +} + +/** + * Mass deletion form. + */ +function node_import_truncate_form(&$form_state, $taskid = null) { + $form['taskid'] = array( + '#type' => 'value', + '#value' => $taskid, + ); + $form['mass_delete'] = array( + '#type' => 'checkbox', + '#title' => t('Pre-import mass deletion'), + '#description' => t('Delete old content before importing new data.'), + ); + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Submit'), + ); + return $form; +} + +/** + * Handle post-validation form-submission. + */ +function node_import_truncate_form_submit($form, &$form_state) { + $mass_delete = $form_state['values']['mass_delete']; + + if (isset($form_state['values']['taskid']['#value'])) { + $taskid = $form_state['values']['taskid']['#value']; + $redirect = 'admin/content/node_import/' . $taskid; + } else { + $redirect = null; + } + + if ($mass_delete == 1) { + + $task = node_import_load($taskid); + $type = ereg_replace('.*:', '', $task['type']); + $batch = array( + 'title' => t('Deleting old data.'), + 'operations' => array( + array('node_import_truncate', array($type)), + ), + 'finished' => 'node_import_truncate_callback', + ); + + batch_set($batch); + batch_process($redirect); + } else { + drupal_goto($redirect); + } +} + +/** + * Implementation of hook_node_import_task(); + * + * As the user is probably adding a spreadsheet containing + * old and new content, we need to make sure to remove all + * previous content to prevent duplicate data in the + * database. + */ +function node_import_truncate_node_import_task($task, $op) { + if ($op == 'insert') { + drupal_goto('admin/content/node_import/truncate/' . $task['taskid']); + } +} + +/** + * Mass deletion of content. + */ +function node_import_truncate($type, &$context) { + $type = 'WHERE type = "' . $type . '"'; + if (empty($context['sandbox'])) { + $context['sandbox']['progress'] = 0; + $context['sandbox']['current_node'] = 0; + $context['sandbox']['max'] = db_result(db_query('SELECT COUNT(DISTINCT nid) FROM {node} ' . $type)); + } + $limit = 5; + $result = db_query_range('SELECT nid FROM {node} ' . $type, $context['sandbox']['current_node'], 0, $limit); + while ($row = db_fetch_array($result)) { + $node = node_delete($row['nid'], NULL, TRUE); + $context['sandbox']['progress']++; + $context['sandbox']['current_node'] = $node->nid; + $context['results'][] = $node->nid .' : '. $node->title; + $context['message'] = $node->title; + } + if ($context['sandbox']['progress'] != $context['sandbox']['max']) { + $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max']; + } +} + +/** + * Callback for node_import_truncate(); + */ +function node_import_truncate_callback($success, $results, $operations) { + if ($success) { + if ($results > 0) { + $message = format_plural(count($results), t('One old post processed.'), t('@count old posts processed.')); + } + } + else { + $message = t('Finished with an error.'); + } + drupal_set_message($message); +} -- cgit v1.2.3