aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSilvio <silvio@socioambiental.org>2009-09-28 12:24:00 -0300
committerSilvio <silvio@socioambiental.org>2009-09-28 12:24:00 -0300
commit2cdde905f5f8692ba4bcad2bd66642663f1572b3 (patch)
tree61d58a78f6d16c40264daa7b1f48c867e6d2868f
downloadnode_truncate-2cdde905f5f8692ba4bcad2bd66642663f1572b3.tar.gz
node_truncate-2cdde905f5f8692ba4bcad2bd66642663f1572b3.tar.bz2
Initial import
-rw-r--r--.gitignore2
-rw-r--r--COPYING1
-rw-r--r--README11
-rw-r--r--node_import_truncate.info6
-rw-r--r--node_import_truncate.module130
5 files changed, 150 insertions, 0 deletions
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 @@
+<?
+// $Id$
+
+/**
+ * Implementation of hook_menu();
+ */
+function node_import_truncate_menu() {
+ $items['admin/content/node_import/truncate'] = array(
+ 'title' => '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);
+}