diff --git a/feeds.install b/feeds.install index 8f351e1..8cde246 100644 --- a/feeds.install +++ b/feeds.install @@ -248,6 +248,76 @@ function feeds_schema() { 'timestamp' => array('timestamp'), ), ); + $schema['feeds_log'] = array( + 'description' => 'Table that contains logs of feeds events.', + 'fields' => array( + 'flid' => array( + 'type' => 'serial', + 'not null' => TRUE, + 'description' => 'Primary Key: Unique feeds event ID.', + ), + 'id' => array( + 'type' => 'varchar', + 'length' => 128, + 'not null' => TRUE, + 'default' => '', + 'description' => 'The id of the importer that logged the event.', + ), + 'feed_nid' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'description' => 'Node id of the source, if available.', + ), + 'log_time' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + 'description' => 'Unix timestamp of when event occurred.', + ), + 'request_time' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + 'description' => 'Unix timestamp of the request when the event occurred.', + ), + 'type' => array( + 'type' => 'varchar', + 'length' => 64, + 'not null' => TRUE, + 'default' => '', + 'description' => 'Type of log message, for example "feeds_import"."', + ), + 'message' => array( + 'type' => 'text', + 'not null' => TRUE, + 'size' => 'big', + 'description' => 'Text of log message to be passed into the t() function.', + ), + 'variables' => array( + 'type' => 'blob', + 'not null' => TRUE, + 'size' => 'big', + 'description' => 'Serialized array of variables that match the message string and that is passed into the t() function.', + ), + 'severity' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + 'size' => 'tiny', + 'description' => 'The severity level of the event; ranges from 0 (Emergency) to 7 (Debug)', + ), + ), + 'primary key' => array('flid'), + 'indexes' => array( + 'id' => array('id'), + 'id_feed_nid' => array('id', 'feed_nid'), + 'request_time' => array('request_time'), + 'log_time' => array('log_time'), + 'type' => array('type'), + ), + ); return $schema; } @@ -621,3 +691,81 @@ function feeds_update_6014() { return $ret; } + +/** + * Add feeds_log table. + */ +function feeds_update_6015() { + $schema = array( + 'description' => 'Table that contains logs of feeds events.', + 'fields' => array( + 'flid' => array( + 'type' => 'serial', + 'not null' => TRUE, + 'description' => 'Primary Key: Unique feeds event ID.', + ), + 'id' => array( + 'type' => 'varchar', + 'length' => 128, + 'not null' => TRUE, + 'default' => '', + 'description' => 'The id of the importer that logged the event.', + ), + 'feed_nid' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'description' => 'Node id of the source, if available.', + ), + 'log_time' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + 'description' => 'Unix timestamp of when event occurred.', + ), + 'request_time' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + 'description' => 'Unix timestamp of the request when the event occurred.', + ), + 'type' => array( + 'type' => 'varchar', + 'length' => 64, + 'not null' => TRUE, + 'default' => '', + 'description' => 'Type of log message, for example "feeds_import"."', + ), + 'message' => array( + 'type' => 'text', + 'not null' => TRUE, + 'size' => 'big', + 'description' => 'Text of log message to be passed into the t() function.', + ), + 'variables' => array( + 'type' => 'blob', + 'not null' => TRUE, + 'size' => 'big', + 'description' => 'Serialized array of variables that match the message string and that is passed into the t() function.', + ), + 'severity' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + 'size' => 'tiny', + 'description' => 'The severity level of the event; ranges from 0 (Emergency) to 7 (Debug)', + ), + ), + 'primary key' => array('flid'), + 'indexes' => array( + 'id' => array('id'), + 'id_feed_nid' => array('id', 'feed_nid'), + 'request_time' => array('request_time'), + 'log_time' => array('log_time'), + 'type' => array('type'), + ), + ); + db_create_table($ret, 'feeds_log', $schema); + return array(); +} \ No newline at end of file diff --git a/feeds.module b/feeds.module index 3b3255f..86a91d5 100644 --- a/feeds.module +++ b/feeds.module @@ -37,6 +37,7 @@ function feeds_cron() { feeds_reschedule(FALSE); return; } + db_query('DELETE FROM {feeds_log} WHERE request_time < %d', $_SERVER['REQUEST_TIME'] - 604800); } /** @@ -69,7 +70,7 @@ function feeds_source_import($job) { // Do nothing. } catch (Exception $e) { - watchdog('feeds_source_import()', $e->getMessage(), array(), WATCHDOG_ERROR); + $source->log('import', $e->getMessage(), array(), WATCHDOG_ERROR); } $source->schedule(); } @@ -154,65 +155,69 @@ function feeds_forms() { * Implementation of hook_menu(). */ function feeds_menu() { - // Register a callback for all feed configurations that are not attached to a content type. $items = array(); + $items['import'] = array( + 'title' => 'Import', + 'page callback' => 'feeds_page', + 'access callback' => 'feeds_page_access', + 'file' => 'feeds.pages.inc', + ); + $items['import/%'] = array( + 'title callback' => 'feeds_importer_title', + 'title arguments' => array(1), + 'page callback' => 'drupal_get_form', + 'page arguments' => array('feeds_import_form', 1), + 'access callback' => 'feeds_access', + 'access arguments' => array('import', 1), + 'file' => 'feeds.pages.inc', + ); + $items['import/%/import'] = array( + 'title' => 'Import', + 'type' => MENU_DEFAULT_LOCAL_TASK, + 'weight' => -10, + ); + $items['import/%/delete-items'] = array( + 'title' => 'Delete items', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('feeds_delete_tab_form', 1), + 'access callback' => 'feeds_access', + 'access arguments' => array('clear', 1), + 'file' => 'feeds.pages.inc', + 'type' => MENU_LOCAL_TASK, + ); + $items['import/%/template'] = array( + 'page callback' => 'feeds_importer_template', + 'page arguments' => array(1), + 'access callback' => 'feeds_access', + 'access arguments' => array('import', 1), + 'file' => 'feeds.pages.inc', + 'type' => MENU_CALLBACK, + ); + $items['node/%node/import'] = array( + 'title' => 'Import', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('feeds_import_tab_form', 1), + 'access callback' => 'feeds_access', + 'access arguments' => array('import', 1), + 'file' => 'feeds.pages.inc', + 'type' => MENU_LOCAL_TASK, + 'weight' => 10, + ); + $items['node/%node/delete-items'] = array( + 'title' => 'Delete items', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('feeds_delete_tab_form', NULL, 1), + 'access callback' => 'feeds_access', + 'access arguments' => array('clear', 1), + 'file' => 'feeds.pages.inc', + 'type' => MENU_LOCAL_TASK, + 'weight' => 11, + ); + // @todo Eliminate this step and thus eliminate clearing menu cache when + // manipulating importers. foreach (feeds_importer_load_all() as $importer) { - if (empty($importer->config['content_type'])) { - $items['import/'. $importer->id] = array( - 'title' => $importer->config['name'], - 'page callback' => 'drupal_get_form', - 'page arguments' => array('feeds_import_form', 1), - 'access callback' => 'feeds_access', - 'access arguments' => array('import', $importer->id), - 'file' => 'feeds.pages.inc', - ); - $items['import/'. $importer->id .'/import'] = array( - 'title' => 'Import', - 'type' => MENU_DEFAULT_LOCAL_TASK, - 'weight' => -10, - ); - $items['import/'. $importer->id .'/delete-items'] = array( - 'title' => 'Delete items', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('feeds_delete_tab_form', 1), - 'access callback' => 'feeds_access', - 'access arguments' => array('clear', $importer->id), - 'file' => 'feeds.pages.inc', - 'type' => MENU_LOCAL_TASK, - ); - } - else { - $items['node/%node/import'] = array( - 'title' => 'Import', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('feeds_import_tab_form', 1), - 'access callback' => 'feeds_access', - 'access arguments' => array('import', 1), - 'file' => 'feeds.pages.inc', - 'type' => MENU_LOCAL_TASK, - 'weight' => 10, - ); - $items['node/%node/delete-items'] = array( - 'title' => 'Delete items', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('feeds_delete_tab_form', NULL, 1), - 'access callback' => 'feeds_access', - 'access arguments' => array('clear', 1), - 'file' => 'feeds.pages.inc', - 'type' => MENU_LOCAL_TASK, - 'weight' => 11, - ); - } $items += $importer->fetcher->menuItem(); } - if (count($items)) { - $items['import'] = array( - 'title' => 'Import', - 'page callback' => 'feeds_page', - 'access callback' => 'feeds_page_access', - 'file' => 'feeds.pages.inc', - ); - } return $items; } @@ -224,6 +229,14 @@ function feeds_importer_load($id) { } /** + * Title callback. + */ +function feeds_importer_title($id) { + $importer = feeds_importer($id); + return $importer->config['name']; +} + +/** * Implementation of hook_theme(). */ function feeds_theme() { @@ -282,6 +295,15 @@ function feeds_page_access() { } /** + * Implements hook_exit(). + */ +function feeds_exit() { + if (ctools_static('feeds_log_error', FALSE)) { + watchdog('feeds', 'Feeds reported errors, visit the Feeds log for details.', array(), WATCHDOG_ERROR, 'admin/reports/dblog/feeds'); + } +} + +/** * Implementation of hook_views_api(). */ function feeds_views_api() { @@ -395,15 +417,31 @@ function feeds_nodeapi(&$node, $op, $form) { $node_feeds = NULL; break; case 'delete': - $source = feeds_source($importer_id, $node->nid); - if (!empty($source->importer->processor->config['delete_with_source'])) { - feeds_batch_set(t('Deleting'), 'clear', $importer_id, $node->nid); - } - // Remove attached source. - $source->delete(); + break; } } + + if($op == 'delete') { + // Make sure we don't leave any orphans behind: If feeds_get_importer_id + // didn't find the id check manually in case the importer was deleted. + if (!$importer_id) { + $query = db_query('SELECT id FROM {feeds_source} WHERE feed_nid = %d', $node->nid); + $importer_id = db_result($query); + } + + if ($importer_id) { + $source = feeds_source($importer_id, $node->nid); + if (!empty($source->importer->processor->config['delete_with_source'])) { + feeds_batch_set(t('Deleting'), 'clear', $importer_id, $node->nid); + } + // Remove attached source. + $source->delete(); + } + + } + + } /** @@ -556,6 +594,30 @@ function feeds_batch($method, $importer_id, $feed_nid = 0, &$context) { } /** + * Writes to feeds log. + */ +function feeds_log($importer_id, $feed_nid, $type, $message, $variables = array(), $severity = WATCHDOG_NOTICE) { + if ($severity < WATCHDOG_NOTICE) { + $error = &ctools_static('feeds_log_error', FALSE); + $error = TRUE; + } + db_query( + "INSERT INTO {feeds_log} + (id, feed_nid, log_time, request_time, type, message, variables, severity) + VALUES + ('%s', %d, %d, %d, '%s', '%s', '%s', %d)", + $importer_id, + $feed_nid, + time(), + $_SERVER['REQUEST_TIME'], + $type, + $message, + serialize($variables), + $severity + ); +} + +/** * @} */ diff --git a/includes/FeedsSource.inc b/includes/FeedsSource.inc index 09ccf66..95eeef9 100644 --- a/includes/FeedsSource.inc +++ b/includes/FeedsSource.inc @@ -357,4 +357,11 @@ class FeedsSource extends FeedsConfigurable { } } } + + /** + * Writes to feeds log. + */ + public function log($type, $message, $variables = array(), $severity = WATCHDOG_NOTICE) { + feeds_log($this->id, $this->feed_nid, $type, $message, $variables, $severity); + } } diff --git a/plugins/FeedsNodeProcessor.inc b/plugins/FeedsNodeProcessor.inc index bea7921..5c81f47 100644 --- a/plugins/FeedsNodeProcessor.inc +++ b/plugins/FeedsNodeProcessor.inc @@ -68,7 +68,12 @@ class FeedsNodeProcessor extends FeedsProcessor { } catch (Exception $e) { drupal_set_message($e->getMessage(), 'warning'); - watchdog('feeds', $e->getMessage(), array(), WATCHDOG_WARNING); + $message = $e->getMessage(); + $message .= '

Original item

'; + $message .= '
' . var_export($item, TRUE) . '
'; + $message .= '

Node

'; + $message .= '
' . var_export($node, TRUE) . '
'; + $source->log('import', $message, array(), WATCHDOG_ERROR); } } diff --git a/views/feeds.views.inc b/views/feeds.views.inc index 9f5523d..bec78f2 100644 --- a/views/feeds.views.inc +++ b/views/feeds.views.inc @@ -170,6 +170,142 @@ function feeds_views_data() { 'help' => t('Argument on a Feeds Item\'s import date field.'), ), ); + /** + * Expose feeds_log table to views. + */ + $data['feeds_log']['table'] = array( + 'group' => 'Feeds log', + 'base' => array( + 'field' => 'flid', + 'title' => 'Feeds log', + 'help' => 'Logs events during importing, clearing, expiry.', + ), + ); + $data['feeds_log']['id'] = array( + 'title' => 'Importer id', + 'help' => 'The id of an importer.', + 'field' => array( + 'handler' => 'feeds_views_handler_field', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + 'allow empty' => TRUE, + 'help' => 'Filter on an importer id.', + ), + 'argument' => array( + 'handler' => 'feeds_views_handler_argument_importer_id', + 'help' => 'Filter on an importer id.', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + 'help' => 'Sort by importer id.', + ), + 'relationship' => array( + 'title' => t('Importer'), + 'help' => t('Relate a log entry to its importer if available.'), + 'label' => t('Importer'), + 'base' => 'feeds_importer', + 'base field' => 'id', + ), + ); + $data['feeds_log']['importer_name'] = array( + 'real field' => 'id', + 'title' => 'Importer name', + 'help' => 'The human readable name of an importer.', + 'field' => array( + 'handler' => 'feeds_views_handler_field_importer_name', + ), + ); + $data['feeds_log']['feed_nid'] = array( + 'title' => 'Feed node id', + 'help' => 'Contains the node id of a feed node if the feed\'s configuration is attached to a content type, otherwise contains 0.', + 'field' => array( + 'handler' => 'feeds_views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + 'allow empty' => TRUE, + 'help' => 'Filter on a Feeds Source\'s feed_nid field.', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_numeric', + 'numeric' => TRUE, + 'validate type' => 'nid', + 'help' => 'Argument on a Feeds Source\'s feed_nid field.', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + 'help' => 'Sort Feeds Source\'s feed_nid field.', + ), + 'relationship' => array( + 'title' => t('Feed node'), + 'help' => t('Relate a log entry to its feed node if available.'), + 'label' => t('Feed node'), + 'base' => 'node', + 'base field' => 'nid', + ), + ); + $data['feeds_log']['log_time'] = array( + 'title' => t('Log time'), + 'help' => t('The time of the event.'), + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + ); + $data['feeds_log']['request_time'] = array( + 'title' => t('Request time'), + 'help' => t('The time of the page request of an event.'), + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + ); + $data['feeds_log']['message'] = array( + 'title' => 'Log message', + 'help' => 'The message logged by the event.', + 'field' => array( + 'handler' => 'feeds_views_handler_field_log_message', + 'click sortable' => FALSE, + 'additional fields' => array( + 'variables', + ), + ), + ); + $data['feeds_log']['severity'] = array( + 'title' => 'Severity', + 'help' => 'The severity of the event logged.', + 'field' => array( + 'handler' => 'feeds_views_handler_field_severity', + 'click sortable' => FALSE, + ), + 'filter' => array( + 'handler' => 'feeds_views_handler_filter_severity', + 'allow empty' => TRUE, + 'help' => 'Filter on the severity of a log message.', + ), + ); + $data['feeds_log']['table']['join'] = array( + 'node' => array( + 'left_field' => 'nid', + 'field' => 'feed_nid', + 'type' => 'LEFT', + ), + ); return $data; } @@ -183,9 +319,27 @@ function feeds_views_handlers() { ), 'handlers' => array( // field handlers + 'feeds_views_handler_argument_importer_id' => array( + 'parent' => 'views_handler_argument_string', + ), + 'feeds_views_handler_field_importer_name' => array( + 'parent' => 'views_handler_field', + ), + 'feeds_views_handler_field_log_message' => array( + 'parent' => 'views_handler_field', + ), + 'feeds_views_handler_field_severity' => array( + 'parent' => 'views_handler_field', + ), 'feeds_views_handler_field_source' => array( 'parent' => 'views_handler_field', ), + 'feeds_views_handler_field_severity' => array( + 'parent' => 'views_handler_field', + ), + 'feeds_views_handler_filter_severity' => array( + 'parent' => 'views_handler_filter_in_operator', + ), ), ); } diff --git a/views/feeds.views_default.inc b/views/feeds.views_default.inc new file mode 100644 index 0000000..53a4e88 --- /dev/null +++ b/views/feeds.views_default.inc @@ -0,0 +1,424 @@ +name = 'feeds_log'; + $view->description = 'Feeds log displays for overview, standalone importers and feed nodes.'; + $view->tag = 'Feeds'; + $view->view_php = ''; + $view->base_table = 'feeds_log'; + $view->is_cacheable = FALSE; + $view->api_version = 2; + $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ + $handler = $view->new_display('default', 'Defaults', 'default'); + $handler->override_option('fields', array( + 'log_time' => array( + 'id' => 'log_time', + 'table' => 'feeds_log', + 'field' => 'log_time', + 'alter' => array( + 'alter_text' => 0, + 'make_link' => 0, + 'absolute' => 0, + 'trim' => 0, + 'word_boundary' => 1, + 'ellipsis' => 1, + 'strip_tags' => 0, + 'html' => 0, + ), + 'hide_empty' => 0, + 'empty_zero' => 0, + 'date_format' => 'custom', + 'custom_date_format' => 'Y-m-d H:i:s', + ), + 'request_time' => array( + 'id' => 'request_time', + 'table' => 'feeds_log', + 'field' => 'request_time', + 'alter' => array( + 'alter_text' => 0, + 'make_link' => 0, + 'absolute' => 0, + 'trim' => 0, + 'word_boundary' => 1, + 'ellipsis' => 1, + 'strip_tags' => 0, + 'html' => 0, + ), + 'hide_empty' => 0, + 'empty_zero' => 0, + 'date_format' => 'custom', + 'custom_date_format' => 'Y-m-d H:i:s', + ), + 'message' => array( + 'id' => 'message', + 'table' => 'feeds_log', + 'field' => 'message', + 'label' => 'Message', + 'hide_empty' => 0, + 'empty_zero' => 0, + ), + 'severity' => array( + 'id' => 'severity', + 'table' => 'feeds_log', + 'field' => 'severity', + 'hide_empty' => 0, + 'empty_zero' => 0, + ), + )); + $handler->override_option('sorts', array( + 'log_time' => array( + 'order' => 'DESC', + 'granularity' => 'second', + 'id' => 'log_time', + 'table' => 'feeds_log', + 'field' => 'log_time', + 'relationship' => 'none', + ), + )); + $handler->override_option('arguments', array( + 'id' => array( + 'default_action' => 'empty', + 'style_plugin' => 'default_summary', + 'style_options' => array(), + 'wildcard' => 'all', + 'wildcard_substitution' => 'All', + 'title' => '', + 'breadcrumb' => '', + 'default_argument_type' => 'fixed', + 'default_argument' => '', + 'validate_type' => 'none', + 'validate_fail' => 'empty', + 'glossary' => 0, + 'limit' => '0', + 'case' => 'none', + 'path_case' => 'none', + 'transform_dash' => 0, + 'id' => 'id', + 'table' => 'feeds_log', + 'field' => 'id', + 'validate_user_argument_type' => 'uid', + 'validate_user_roles' => array( + '2' => 0, + '6' => 0, + '5' => 0, + '3' => 0, + '4' => 0, + '7' => 0, + ), + 'relationship' => 'none', + 'default_options_div_prefix' => '', + 'default_argument_fixed' => '', + 'default_argument_user' => 0, + 'default_argument_php' => '', + 'validate_argument_node_type' => array( + 'billing' => 0, + 'client_info' => 0, + 'dr' => 0, + 'npdn_info' => 0, + 'page' => 0, + 'story' => 0, + 'webform' => 0, + ), + 'validate_argument_node_access' => 0, + 'validate_argument_nid_type' => 'nid', + 'validate_argument_vocabulary' => array( + '1' => 0, + '2' => 0, + '3' => 0, + '4' => 0, + '5' => 0, + '6' => 0, + '7' => 0, + '8' => 0, + '9' => 0, + '10' => 0, + '11' => 0, + '12' => 0, + ), + 'validate_argument_type' => 'tid', + 'validate_argument_transform' => 0, + 'validate_user_restrict_roles' => 0, + 'validate_argument_php' => '', + ), + )); + $handler->override_option('filters', array( + 'feed_nid' => array( + 'id' => 'feed_nid', + 'table' => 'feeds_log', + 'field' => 'feed_nid', + 'value' => array( + 'value' => '0', + ), + ), + 'severity' => array( + 'operator' => 'in', + 'value' => array(), + 'group' => '0', + 'exposed' => TRUE, + 'expose' => array( + 'use_operator' => 0, + 'operator' => 'severity_op', + 'identifier' => 'severity', + 'label' => 'Severity', + 'optional' => 0, + 'single' => 0, + 'remember' => 0, + 'reduce' => 0, + ), + 'id' => 'severity', + 'table' => 'feeds_log', + 'field' => 'severity', + 'relationship' => 'none', + ), + )); + $handler->override_option('access', array( + 'type' => 'perm', + 'perm' => 'administer feeds', + )); + $handler->override_option('cache', array( + 'type' => 'none', + )); + $handler->override_option('empty', 'There are no log messages.'); + $handler->override_option('empty_format', '1'); + $handler->override_option('items_per_page', 50); + $handler->override_option('use_pager', '1'); + $handler->override_option('style_plugin', 'table'); + $handler->override_option('style_options', array( + 'grouping' => '', + 'override' => 1, + 'sticky' => 0, + 'order' => 'asc', + 'columns' => array( + 'log_time' => 'log_time', + 'request_time' => 'request_time', + 'message' => 'message', + 'severity' => 'severity', + ), + 'info' => array( + 'log_time' => array( + 'sortable' => 0, + 'separator' => '', + ), + 'request_time' => array( + 'sortable' => 0, + 'separator' => '', + ), + 'message' => array( + 'separator' => '', + ), + 'severity' => array( + 'separator' => '', + ), + ), + 'default' => '-1', + )); + $handler = $view->new_display('page', 'Standalone importer page', 'page_1'); + $handler->override_option('path', 'import/%/log'); + $handler->override_option('menu', array( + 'type' => 'tab', + 'title' => 'Log', + 'description' => '', + 'weight' => '0', + 'name' => 'navigation', + )); + $handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'description' => '', + 'weight' => 0, + 'name' => 'navigation', + )); + $handler = $view->new_display('page', 'Feed node page', 'page_2'); + $handler->override_option('arguments', array( + 'feed_nid' => array( + 'id' => 'feed_nid', + 'table' => 'feeds_log', + 'field' => 'feed_nid', + 'default_action' => 'not found', + 'style_plugin' => 'default_summary', + 'default_argument_type' => 'fixed', + 'break_phrase' => 0, + 'not' => 0, + ), + )); + $handler->override_option('filters', array( + 'severity' => array( + 'operator' => 'in', + 'value' => array(), + 'group' => '0', + 'exposed' => TRUE, + 'expose' => array( + 'use_operator' => 0, + 'operator' => 'severity_op', + 'identifier' => 'severity', + 'label' => 'Severity', + 'optional' => 0, + 'single' => 0, + 'remember' => 0, + 'reduce' => 0, + ), + 'id' => 'severity', + 'table' => 'feeds_log', + 'field' => 'severity', + 'override' => array( + 'button' => 'Use default', + ), + 'relationship' => 'none', + ), + )); + $handler->override_option('path', 'node/%/log'); + $handler->override_option('menu', array( + 'type' => 'tab', + 'title' => 'Log', + 'description' => '', + 'weight' => '12', + 'name' => 'navigation', + )); + $handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'description' => '', + 'weight' => 0, + 'name' => 'navigation', + )); + $handler = $view->new_display('page', 'All entries', 'page_3'); + $handler->override_option('relationships', array( + 'feed_nid' => array( + 'id' => 'feed_nid', + 'table' => 'feeds_log', + 'field' => 'feed_nid', + ), + )); + $handler->override_option('fields', array( + 'log_time' => array( + 'id' => 'log_time', + 'table' => 'feeds_log', + 'field' => 'log_time', + 'alter' => array( + 'alter_text' => 0, + 'make_link' => 0, + 'absolute' => 0, + 'trim' => 0, + 'word_boundary' => 1, + 'ellipsis' => 1, + 'strip_tags' => 0, + 'html' => 0, + ), + 'hide_empty' => 0, + 'empty_zero' => 0, + 'date_format' => 'custom', + 'custom_date_format' => 'Y-m-d H:i:s', + ), + 'request_time' => array( + 'id' => 'request_time', + 'table' => 'feeds_log', + 'field' => 'request_time', + 'alter' => array( + 'alter_text' => 0, + 'make_link' => 0, + 'absolute' => 0, + 'trim' => 0, + 'word_boundary' => 1, + 'ellipsis' => 1, + 'strip_tags' => 0, + 'html' => 0, + ), + 'hide_empty' => 0, + 'empty_zero' => 0, + 'date_format' => 'custom', + 'custom_date_format' => 'Y-m-d H:i:s', + ), + 'message' => array( + 'id' => 'message', + 'table' => 'feeds_log', + 'field' => 'message', + 'label' => 'Message', + 'hide_empty' => 0, + 'empty_zero' => 0, + ), + 'severity' => array( + 'id' => 'severity', + 'table' => 'feeds_log', + 'field' => 'severity', + 'hide_empty' => 0, + 'empty_zero' => 0, + ), + 'importer_name' => array( + 'id' => 'importer_name', + 'table' => 'feeds_log', + 'field' => 'importer_name', + 'label' => 'Importer', + 'hide_empty' => 0, + 'empty_zero' => 0, + 'link' => '2', + ), + 'title' => array( + 'id' => 'title', + 'table' => 'node', + 'field' => 'title', + 'relationship' => 'feed_nid', + 'label' => 'Feed node', + 'alter' => array( + 'alter_text' => 0, + 'make_link' => 0, + 'absolute' => 0, + 'trim' => 1, + 'max_length' => '40', + 'word_boundary' => 1, + 'ellipsis' => 1, + 'strip_tags' => 0, + 'html' => 0, + ), + 'hide_empty' => 0, + 'empty_zero' => 0, + 'link_to_node' => 1, + ), + )); + $handler->override_option('arguments', array()); + $handler->override_option('filters', array( + 'severity' => array( + 'id' => 'severity', + 'table' => 'feeds_log', + 'field' => 'severity', + 'exposed' => TRUE, + 'expose' => array( + 'operator' => 'severity_op', + 'label' => 'Severity', + 'use_operator' => FALSE, + 'identifier' => 'severity', + 'reduce' => 0, + ), + ), + )); + $handler->override_option('title', 'Feeds log'); + $handler->override_option('path', 'admin/reports/feeds'); + $handler->override_option('menu', array( + 'type' => 'normal', + 'title' => 'Feeds log', + 'description' => 'Review log messages of imports and subscriptions to feeds.', + 'weight' => '0', + 'name' => 'management', + )); + $handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'description' => '', + 'weight' => 0, + 'name' => 'navigation', + )); + + $views[$view->name] = $view; + + return $views; +} diff --git a/views/feeds_views_handler_argument_importer_id.inc b/views/feeds_views_handler_argument_importer_id.inc new file mode 100644 index 0000000..9415812 --- /dev/null +++ b/views/feeds_views_handler_argument_importer_id.inc @@ -0,0 +1,24 @@ +argument_validated)) { + return $this->argument_validated; + } + $this->argument_validated = FALSE; + if (in_array($arg, feeds_enabled_importers())) { + $this->argument_validated = TRUE; + } + return $this->argument_validated; + } +} diff --git a/views/feeds_views_handler_field_importer_name.inc b/views/feeds_views_handler_field_importer_name.inc new file mode 100644 index 0000000..9b16cdf --- /dev/null +++ b/views/feeds_views_handler_field_importer_name.inc @@ -0,0 +1,63 @@ + 0); + return $options; + } + + /** + * Overrides parent::options_form(). + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $options = array( + 0 => t('Do not link'), + 1 => t('Link to configuration form'), + 2 => t('Link to standalone form'), + ); + $form['link'] = array( + '#type' => 'radios', + '#title' => t('Link importer name'), + '#description' => t('If "Link to standalone form" is used, only importers that use a standalone form will be linked.'), + '#default_value' => isset($this->options['link']) ? $this->options['link'] : FALSE, + '#options' => $options, + ); + } + + /** + * Overrides parent::render(). + */ + function render($values) { + try { + $importer = feeds_importer($values->{$this->field_alias})->existing(); + if ($this->options['link'] == 1) { + return l($importer->config['name'], 'admin/structure/feeds/' . $importer->id); + } + elseif ($this->options['link'] == 2 && empty($importer->config['content_type'])) { + return l($importer->config['name'], 'import/' . $importer->id); + } + return check_plain($importer->config['name']); + } + catch (Exception $e) { + return t('Missing importer'); + } + } + + /** + * Disallows advanced rendering. + */ + function allow_advanced_render() { + return FALSE; + } +} diff --git a/views/feeds_views_handler_field_log_message.inc b/views/feeds_views_handler_field_log_message.inc new file mode 100644 index 0000000..6fcdeea --- /dev/null +++ b/views/feeds_views_handler_field_log_message.inc @@ -0,0 +1,25 @@ +{$this->field_alias}; + $variables = unserialize($values->{$this->aliases['variables']}); + return t($message, $variables); + } + + /** + * Disallow advanced rendering. + */ + function allow_advanced_render() { + return FALSE; + } +} diff --git a/views/feeds_views_handler_field_severity.inc b/views/feeds_views_handler_field_severity.inc new file mode 100644 index 0000000..c4bdf07 --- /dev/null +++ b/views/feeds_views_handler_field_severity.inc @@ -0,0 +1,25 @@ +{$this->field_alias}; + $levels = watchdog_severity_levels(); + return $levels[$value]; + } + + /** + * Disallow advanced rendering. + */ + function allow_advanced_render() { + return FALSE; + } +} diff --git a/views/feeds_views_handler_filter_severity.inc b/views/feeds_views_handler_filter_severity.inc new file mode 100644 index 0000000..4d9b949 --- /dev/null +++ b/views/feeds_views_handler_filter_severity.inc @@ -0,0 +1,13 @@ +value_title = t('Severity'); + $this->value_options = watchdog_severity_levels(); + } +}