Enable filtering by action on Special:Log

This allows logs to be filtered by log actions, provided
the log type has been set as such in config.
There is an index for log actions so the queries should
be performant enough (already used by API).

Extensions can use $wgActionFilteredLogs to filter their
own logs in the same way.

Bug: T20954
Change-Id: I6a61175f9a111c03d15b4d41751c818e3a411ff6
This commit is contained in:
cenarium 2015-11-13 22:51:40 +01:00
parent d7a2302a31
commit d603a4477c
5 changed files with 137 additions and 4 deletions

View file

@ -7235,6 +7235,37 @@ $wgLogActionsHandlers = [
'upload/upload' => 'UploadLogFormatter',
];
/**
* List of log types that can be filtered by action types
*
* To each action is associated the list of log_action
* subtypes to search for, usually one, but not necessarily so
* Extensions may append to this array
* @since 1.27
*/
$wgActionFilteredLogs = [
'block' => [
'block' => [ 'block' ],
'reblock' => [ 'reblock' ],
'unblock' => [ 'unblock' ],
],
'delete' => [
'delete' => [ 'delete' ],
'restore' => [ 'restore' ],
'event' => [ 'event' ],
'revision' => [ 'revision' ],
],
'protect' => [
'protect' => [ 'protect' ],
'modify' => [ 'modify' ],
'unprotect' => [ 'unprotect' ],
],
'upload' => [
'upload' => [ 'upload' ],
'overwrite' => [ 'overwrite' ],
],
];
/**
* Maintain a log of newusers at Log/newusers?
*/

View file

@ -40,6 +40,11 @@ class LogEventsList extends ContextSource {
*/
protected $showTagEditUI;
/**
* @var array
*/
protected $allowedActions = null;
/**
* Constructor.
* The first two parameters used to be $skin and $out, but now only a context
@ -74,9 +79,10 @@ class LogEventsList extends ContextSource {
* @param int $month Month
* @param array $filter
* @param string $tagFilter Tag to select by default
* @param string $action
*/
public function showOptions( $types = [], $user = '', $page = '', $pattern = '', $year = 0,
$month = 0, $filter = null, $tagFilter = ''
$month = 0, $filter = null, $tagFilter = '', $action = null
) {
global $wgScript, $wgMiserMode;
@ -113,6 +119,11 @@ class LogEventsList extends ContextSource {
$html .= Xml::tags( 'p', null, $this->getFilterLinks( $filter ) );
}
// Action filter
if ( $action !== null ) {
$html .= Xml::tags( 'p', null, $this->getActionSelector( $types, $action ) );
}
// Submit button
$html .= Xml::submitButton( $this->msg( 'logeventslist-submit' )->text() );
@ -287,6 +298,41 @@ class LogEventsList extends ContextSource {
return '';
}
/**
* Drop down menu for selection of actions that can be used to filter the log
* @param array $types
* @param string $action
* @return string
* @since 1.27
*/
private function getActionSelector( $types, $action ) {
if ( $this->allowedActions === null || !count( $this->allowedActions ) ) {
return '';
}
$html = '';
$html .= xml::label( wfMessage( 'log-action-filter-' . $types[0] )->text(),
'action-filter-' .$types[0] ) . "\n";
$select = new XmlSelect( 'subtype' );
$select->addOption( wfMessage( 'log-action-filter-all' )->text(), '' );
foreach ( $this->allowedActions as $value ) {
$msgKey = 'log-action-filter-' . $types[0] . '-' . $value;
$select->addOption( wfMessage( $msgKey )->text(), $value );
}
$select->setDefault( $action );
$html .= $select->getHtml();
return $html;
}
/**
* Sets the action types allowed for log filtering
* To one action type may correspond several log_actions
* @param array $actions
* @since 1.27
*/
public function setAllowedActions( $actions ) {
$this->allowedActions = $actions;
}
/**
* @return string
*/

View file

@ -49,6 +49,7 @@ class SpecialLog extends SpecialPage {
$opts->add( 'offset', '' );
$opts->add( 'dir', '' );
$opts->add( 'offender', '' );
$opts->add( 'subtype', '' );
// Set values
$opts->fetchValuesFromRequest( $this->getRequest() );
@ -167,6 +168,26 @@ class SpecialLog extends SpecialPage {
null,
LogEventsList::USE_CHECKBOXES
);
$action = '';
// Allow to filter the log by actions
$type = $opts->getValue( 'type' );
if ( $type !== '' ) {
$actions = $this->getConfig()->get( 'ActionFilteredLogs' );
if ( isset( $actions[$type] ) ) {
// log type can be filtered by actions
$loglist->setAllowedActions( array_keys( $actions[$type] ) );
$action = $opts->getValue( 'subtype' );
if ( $action !== '' && isset( $actions[$type][$action] ) ) {
// add condition to query
$extraConds['log_action'] = $actions[$type][$action];
} else {
// no action or invalid action
$action = '';
}
}
}
$pager = new LogPager(
$loglist,
$opts->getValue( 'type' ),
@ -195,7 +216,8 @@ class SpecialLog extends SpecialPage {
$pager->getYear(),
$pager->getMonth(),
$pager->getFilterParams(),
$opts->getValue( 'tagfilter' )
$opts->getValue( 'tagfilter' ),
$action
);
# Insert list

View file

@ -4029,5 +4029,22 @@
"sessionprovider-generic": "$1 sessions",
"sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-based sessions",
"sessionprovider-nocookies": "Cookies may be disabled. Ensure you have cookies enabled and start again.",
"randomrootpage": "Random root page"
"randomrootpage": "Random root page",
"log-action-filter-block": "Type of block:",
"log-action-filter-delete": "Type of deletion:",
"log-action-filter-protect": "Type of protection:",
"log-action-filter-upload": "Type of upload:",
"log-action-filter-all": "All",
"log-action-filter-block-block": "Block",
"log-action-filter-block-reblock": "Block modification",
"log-action-filter-block-unblock": "Unblock",
"log-action-filter-delete-delete": "Page deletion",
"log-action-filter-delete-restore": "Page undeletion",
"log-action-filter-delete-event": "Log deletion",
"log-action-filter-delete-revision": "Revision deletion",
"log-action-filter-protect-protect": "Protection",
"log-action-filter-protect-modify": "Protection modification",
"log-action-filter-protect-unprotect": "Unprotection",
"log-action-filter-upload-upload": "New upload",
"log-action-filter-upload-overwrite": "Reupload"
}

View file

@ -4205,5 +4205,22 @@
"sessionprovider-generic": "Used to create a generic session type description when one isn't provided via the proper message. Should be phrased to make sense when added to a message such as {{msg-mw|cannotloginnow-text}}.\n\nParameters:\n* $1 - PHP classname.",
"sessionprovider-mediawiki-session-cookiesessionprovider": "Description of the sessions provided by the CookieSessionProvider class, which use HTTP cookies. Should be phrased to make sense when added to a message such as {{msg-mw|cannotloginnow-text}}.",
"sessionprovider-nocookies": "Used to inform the user that sessions may be missing due to lack of cookies.",
"randomrootpage": "{{doc-special|RandomRootPage}}"
"randomrootpage": "{{doc-special|RandomRootPage}}",
"log-action-filter-block": "Which type of action to filter for in this log",
"log-action-filter-delete": "Which type of action to filter for in this log",
"log-action-filter-protect": "Which type of action to filter for in this log",
"log-action-filter-upload": "Which type of action to filter for in this log",
"log-action-filter-all": "All types of action are allowed",
"log-action-filter-block-block": "Action to filter for in this log",
"log-action-filter-block-reblock": "Action to filter for in this log",
"log-action-filter-block-unblock": "Action to filter for in this log",
"log-action-filter-delete-delete": "Action to filter for in this log",
"log-action-filter-delete-restore": "Action to filter for in this log",
"log-action-filter-delete-event": "Action to filter for in this log",
"log-action-filter-delete-revision": "Action to filter for in this log",
"log-action-filter-protect-protect": "Action to filter for in this log",
"log-action-filter-protect-modify": "Action to filter for in this log",
"log-action-filter-protect-unprotect": "Action to filter for in this log",
"log-action-filter-upload-upload": "Action to filter for in this log",
"log-action-filter-upload-overwrite": "Action to filter for in this log"
}