Issue #2015149 by dagmar, Jo Fitzgerald, hanoii, pritish.kumar, Pol, Lendude, damiankloip, nicolas.rafaelli, alansaviolobo, Psikik, yoroy, dawehner, alexpott, catch, jibran: Replace dblog recent log entries with a view

8.4.x
Nathaniel Catchpole 2017-06-20 13:29:48 +01:00
parent 6d68ffd476
commit c99c526c6d
8 changed files with 878 additions and 5 deletions

View File

@ -0,0 +1,712 @@
langcode: en
status: true
dependencies:
module:
- dblog
- user
id: watchdog
label: Watchdog
module: views
description: 'Recent log messages'
tag: ''
base_table: watchdog
base_field: wid
core: 8.x
display:
default:
display_plugin: default
id: default
display_title: Master
position: 0
display_options:
access:
type: perm
options:
perm: 'access site reports'
cache:
type: none
options: { }
query:
type: views_query
options:
disable_sql_rewrite: false
distinct: false
replica: false
query_comment: ''
query_tags: { }
exposed_form:
type: basic
options:
submit_button: Filter
reset_button: true
reset_button_label: Reset
exposed_sorts_label: 'Sort by'
expose_sort_order: false
sort_asc_label: Asc
sort_desc_label: Desc
pager:
type: mini
options:
items_per_page: 50
offset: 0
id: 0
total_pages: null
expose:
items_per_page: false
items_per_page_label: 'Items per page'
items_per_page_options: '5, 10, 25, 50'
items_per_page_options_all: false
items_per_page_options_all_label: '- All -'
offset: false
offset_label: Offset
tags:
previous:
next:
style:
type: table
options:
grouping: { }
row_class: '{{ type }} {{ severity }}'
default_row_class: true
override: true
sticky: false
caption: ''
summary: ''
description: ''
columns:
nothing: nothing
wid: wid
severity: severity
type: type
timestamp: timestamp
message: message
name: name
link: link
info:
nothing:
sortable: false
default_sort_order: asc
align: ''
separator: ''
empty_column: false
responsive: priority-medium
wid:
sortable: false
default_sort_order: asc
align: ''
separator: ''
empty_column: false
responsive: priority-low
severity:
sortable: false
default_sort_order: asc
align: ''
separator: ''
empty_column: false
responsive: priority-low
type:
sortable: true
default_sort_order: asc
align: ''
separator: ''
empty_column: false
responsive: priority-medium
timestamp:
sortable: true
default_sort_order: desc
align: ''
separator: ''
empty_column: false
responsive: priority-low
message:
sortable: false
default_sort_order: asc
align: ''
separator: ''
empty_column: false
responsive: priority-high
name:
sortable: true
default_sort_order: asc
align: ''
separator: ''
empty_column: false
responsive: priority-medium
link:
align: ''
separator: ''
empty_column: false
responsive: priority-low
default: timestamp
empty_table: false
row:
type: fields
fields:
nothing:
id: nothing
table: views
field: nothing
relationship: none
group_type: group
admin_label: Icon
label: ''
exclude: false
alter:
alter_text: true
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: icon
element_label_type: ''
element_label_class: ''
element_label_colon: false
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: false
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: false
plugin_id: custom
wid:
id: wid
table: watchdog
field: wid
relationship: none
group_type: group
admin_label: ''
label: WID
exclude: true
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
plugin_id: standard
severity:
id: severity
table: watchdog
field: severity
relationship: none
group_type: group
admin_label: ''
label: Severity
exclude: true
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
machine_name: false
plugin_id: machine_name
type:
id: type
table: watchdog
field: type
relationship: none
group_type: group
admin_label: ''
label: Type
exclude: false
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
plugin_id: standard
timestamp:
id: timestamp
table: watchdog
field: timestamp
relationship: none
group_type: group
admin_label: ''
label: Date
exclude: false
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
date_format: short
custom_date_format: ''
timezone: ''
plugin_id: date
message:
id: message
table: watchdog
field: message
relationship: none
group_type: group
admin_label: ''
label: Message
exclude: false
alter:
alter_text: false
text: ''
make_link: true
path: 'admin/reports/dblog/event/{{ wid }}'
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: '{{ message }}'
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 56
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: true
trim: true
preserve_tags: ''
html: true
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
replace_variables: true
plugin_id: dblog_message
name:
id: name
table: users_field_data
field: name
relationship: uid
group_type: group
admin_label: ''
label: User
exclude: false
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
click_sort_column: value
type: user_name
settings:
link_to_entity: true
group_column: value
group_columns: { }
group_rows: true
delta_limit: 0
delta_offset: 0
delta_reversed: false
delta_first_last: false
multi_type: separator
separator: ', '
field_api_classes: false
entity_type: user
entity_field: name
plugin_id: field
link:
id: link
table: watchdog
field: link
relationship: none
group_type: group
admin_label: ''
label: Operations
exclude: false
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
plugin_id: dblog_operations
filters:
type:
id: type
table: watchdog
field: type
relationship: none
group_type: group
admin_label: ''
operator: in
value: { }
group: 1
exposed: true
expose:
operator_id: type_op
label: Type
description: ''
use_operator: false
operator: type_op
identifier: type
required: false
remember: false
multiple: true
remember_roles:
authenticated: authenticated
anonymous: '0'
administrator: '0'
reduce: false
is_grouped: false
group_info:
label: ''
description: ''
identifier: ''
optional: true
widget: select
multiple: false
remember: false
default_group: All
default_group_multiple: { }
group_items: { }
plugin_id: dblog_types
severity:
id: severity
table: watchdog
field: severity
relationship: none
group_type: group
admin_label: ''
operator: in
value: { }
group: 1
exposed: true
expose:
operator_id: severity_op
label: Severity
description: ''
use_operator: false
operator: severity_op
identifier: severity
required: false
remember: false
multiple: true
remember_roles:
authenticated: authenticated
anonymous: '0'
administrator: '0'
reduce: false
is_grouped: false
group_info:
label: ''
description: ''
identifier: ''
optional: true
widget: select
multiple: false
remember: false
default_group: All
default_group_multiple: { }
group_items: { }
plugin_id: in_operator
sorts:
timestamp:
id: timestamp
table: watchdog
field: timestamp
order: DESC
entity_type: null
entity_field: null
plugin_id: date
relationship: none
group_type: group
admin_label: ''
exposed: false
expose:
label: ''
granularity: second
title: 'Recent log messages'
header: { }
footer: { }
empty:
area:
id: area
table: views
field: area
relationship: none
group_type: group
admin_label: ''
empty: true
tokenize: false
content:
value: 'No log messages available.'
format: basic_html
plugin_id: text
relationships:
uid:
id: uid
table: watchdog
field: uid
relationship: none
group_type: group
admin_label: User
required: false
plugin_id: standard
arguments: { }
display_extenders: { }
filter_groups:
operator: AND
groups:
1: AND
css_class: admin-dblog
cache_metadata:
max-age: 0
contexts:
- 'languages:language_content'
- 'languages:language_interface'
- url
- url.query_args
- user.permissions
tags: { }
page:
display_plugin: page
id: page
display_title: Page
position: 1
display_options:
display_extenders: { }
path: admin/reports/dblog
cache_metadata:
max-age: 0
contexts:
- 'languages:language_content'
- 'languages:language_interface'
- url
- url.query_args
- user.permissions
tags: { }

View File

@ -13,6 +13,7 @@ use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\views\ViewEntityInterface;
use Drupal\views\ViewExecutable;
/**
* Implements hook_help().
@ -187,3 +188,12 @@ function dblog_view_presave(ViewEntityInterface $view) {
$view->set('display', $displays);
}
}
/**
* Implements hook_views_pre_render().
*/
function dblog_views_pre_render(ViewExecutable $view) {
if (isset($view) && ($view->storage->get('base_table') == 'watchdog')) {
$view->element['#attached']['library'][] = 'dblog/drupal.dblog';
}
}

View File

@ -0,0 +1,35 @@
<?php
/**
* @file
* Post update functions for the Database Logging module.
*/
use Drupal\Core\Config\FileStorage;
use Drupal\Core\Config\InstallStorage;
use Drupal\views\Entity\View;
/**
* Replace 'Recent log messages' with a view.
*/
function dblog_post_update_convert_recent_messages_to_view() {
// Only create if the views module is enabled and the watchdog view doesn't
// exist.
if (\Drupal::moduleHandler()->moduleExists('views')) {
if (!View::load('watchdog')) {
// Save the watchdog view to config.
$module_handler = \Drupal::moduleHandler();
$optional_install_path = $module_handler->getModule('dblog')->getPath() . '/' . InstallStorage::CONFIG_OPTIONAL_DIRECTORY;
$storage = new FileStorage($optional_install_path);
\Drupal::entityTypeManager()
->getStorage('view')
->create($storage->read('views.view.watchdog'))
->save();
return t('The watchdog view has been created.');
}
return t("The watchdog view already exists and was not replaced. To replace the 'Recent log messages' with a view, rename the watchdog view and uninstall and install the 'Database Log' module");
}
}

View File

@ -0,0 +1,40 @@
<?php
namespace Drupal\dblog\Tests\Update;
use Drupal\system\Tests\Update\UpdatePathTestBase;
/**
* Ensures that update hook that creates the watchdog view ran sucessfully.
*
* @group Update
*/
class DblogRecentLogsUsingViewsUpdateTest extends UpdatePathTestBase {
/**
* {@inheritdoc}
*/
protected function setDatabaseDumpFiles() {
$this->databaseDumpFiles = [
__DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.bare.standard.php.gz',
];
}
/**
* Ensures that update hook is run for dblog module.
*/
public function testUpdate() {
// Make sure the watchog view doesn't exist before the updates.
$view = \Drupal::entityTypeManager()->getStorage('view')->load('watchdog');
$this->assertNull($view);
$this->runUpdates();
// Ensure the watchdog view is present after run updates.
$view = \Drupal::entityTypeManager()->getStorage('view')->load('watchdog');
$displays = $view->get('display');
$this->assertIdentical($displays['page']['display_options']['path'], 'admin/reports/dblog', 'Recent logs message view exists.');
}
}

View File

@ -253,10 +253,10 @@ class DbLogTest extends BrowserTestBase {
*/
protected function filterLogsEntries($type = NULL, $severity = NULL) {
$edit = [];
if (!is_null($type)) {
if (isset($type)) {
$edit['type[]'] = $type;
}
if (!is_null($severity)) {
if (isset($severity)) {
$edit['severity[]'] = $severity;
}
$this->drupalPostForm(NULL, $edit, t('Filter'));
@ -283,6 +283,12 @@ class DbLogTest extends BrowserTestBase {
$this->assertText(t('Recent log messages'), 'DBLog report was displayed');
}
$this->drupalGet('admin/reports/dblog/confirm');
$this->assertResponse($response);
if ($response == 200) {
$this->assertText(t('Are you sure you want to delete the recent logs?'), 'DBLog clear logs form was displayed');
}
// View the database log page-not-found report page.
$this->drupalGet('admin/reports/page-not-found');
$this->assertResponse($response);
@ -804,7 +810,7 @@ class DbLogTest extends BrowserTestBase {
$this->drupalGet('admin/reports/dblog');
$this->assertResponse(200);
// Make sure HTML tags are filtered out.
$this->assertRaw('title="alert(&#039;foo&#039;);Lorem ipsum dolor sit amet, consectetur adipiscing &amp; elit. Entry #0">&lt;script&gt;alert(&#039;foo&#039;);&lt;/script&gt;Lorem ipsum dolor sit…</a>');
$this->assertRaw('title="alert(&#039;foo&#039;);Lorem');
$this->assertNoRaw("<script>alert('foo');</script>");
// Make sure HTML tags are filtered out in admin/reports/dblog/event/ too.

View File

@ -0,0 +1,70 @@
<?php
namespace Drupal\Tests\dblog\Functional;
use Drupal\filter\Entity\FilterFormat;
/**
* Generate events and verify dblog entries; verify user access to log reports
* based on permissions. Using the dblog UI generated by a View.
*
* @see Drupal\dblog\Tests\DbLogTest
*
* @group dblog
*/
class DbLogViewsTest extends DbLogTest {
/**
* Modules to enable.
*
* @var array
*/
public static $modules = ['dblog', 'node', 'forum', 'help', 'block', 'views'];
/**
* {@inheritdoc}
*/
protected function getLogsEntriesTable() {
return $this->xpath('.//table[contains(@class, "views-view-table")]/tbody/tr');
}
/**
* {@inheritdoc}
*/
protected function filterLogsEntries($type = NULL, $severity = NULL) {
$query = [];
if (isset($type)) {
$query['type[]'] = $type;
}
if (isset($severity)) {
$query['severity[]'] = $severity;
}
$this->drupalGet('admin/reports/dblog', ['query' => $query]);
}
/**
* {@inheritdoc}
*/
public function testDBLogAddAndClear() {
// Is necesary to create the basic_html format because if absent after
// delete the logs, a new log entry is created indicating that basic_html
// format do not exists.
$basic_html_format = FilterFormat::create([
'format' => 'basic_html',
'name' => 'Basic HTML',
'filters' => [
'filter_html' => [
'status' => 1,
'settings' => [
'allowed_html' => '<p> <br> <strong> <a> <em>',
],
],
],
]);
$basic_html_format->save();
parent::testDBLogAddAndClear();
}
}

View File

@ -65,7 +65,7 @@ class MigrateUpgrade6Test extends MigrateUpgradeTestBase {
'user' => 7,
'user_role' => 6,
'menu_link_content' => 4,
'view' => 14,
'view' => 15,
'date_format' => 11,
'entity_form_display' => 19,
'entity_form_mode' => 1,

View File

@ -66,7 +66,7 @@ class MigrateUpgrade7Test extends MigrateUpgradeTestBase {
'user' => 4,
'user_role' => 3,
'menu_link_content' => 7,
'view' => 14,
'view' => 15,
'date_format' => 11,
'entity_form_display' => 18,
'entity_form_mode' => 1,