* @ingroup SpecialPage
*/
+use MediaWiki\Block\DatabaseBlock;
+
/**
* A special page that lists existing blocks
*
protected $options;
+ protected $blockType;
+
function __construct() {
parent::__construct( 'BlockList' );
}
public function execute( $par ) {
$this->setHeaders();
$this->outputHeader();
+ $this->addHelpLink( 'Help:Blocking_users' );
$out = $this->getOutput();
$out->setPageTitle( $this->msg( 'ipblocklist' ) );
$out->addModuleStyles( [ 'mediawiki.special' ] );
$this->target = trim( $request->getVal( 'wpTarget', $par ) );
$this->options = $request->getArray( 'wpOptions', [] );
+ $this->blockType = $request->getVal( 'blockType' );
$action = $request->getText( 'action' );
'Options' => [
'type' => 'multiselect',
'options-messages' => [
- 'blocklist-userblocks' => 'userblocks',
'blocklist-tempblocks' => 'tempblocks',
+ 'blocklist-indefblocks' => 'indefblocks',
+ 'blocklist-userblocks' => 'userblocks',
'blocklist-addressblocks' => 'addressblocks',
'blocklist-rangeblocks' => 'rangeblocks',
],
'flatlist' => true,
],
- 'Limit' => [
- 'type' => 'limitselect',
- 'label-message' => 'table_pager_limit_label',
- 'options' => $pager->getLimitSelectList(),
- 'name' => 'limit',
- 'default' => $pager->getLimit(),
- ],
];
+
+ if ( $this->getConfig()->get( 'EnablePartialBlocks' ) ) {
+ $fields['BlockType'] = [
+ 'type' => 'select',
+ 'label-message' => 'blocklist-type',
+ 'options' => [
+ $this->msg( 'blocklist-type-opt-all' )->escaped() => '',
+ $this->msg( 'blocklist-type-opt-sitewide' )->escaped() => 'sitewide',
+ $this->msg( 'blocklist-type-opt-partial' )->escaped() => 'partial',
+ ],
+ 'name' => 'blockType',
+ 'cssclass' => 'mw-field-block-type',
+ ];
+ }
+
+ $fields['Limit'] = [
+ 'type' => 'limitselect',
+ 'label-message' => 'table_pager_limit_label',
+ 'options' => $pager->getLimitSelectList(),
+ 'name' => 'limit',
+ 'default' => $pager->getLimit(),
+ 'cssclass' => $this->getConfig()->get( 'EnablePartialBlocks' ) ?
+ 'mw-field-limit mw-has-field-block-type' :
+ 'mw-field-limit',
+ ];
+
$context = new DerivativeContext( $this->getContext() );
$context->setTitle( $this->getPageTitle() ); // Remove subpage
$form = HTMLForm::factory( 'ooui', $fields, $context );
*/
protected function getBlockListPager() {
$conds = [];
+ $db = $this->getDB();
# Is the user allowed to see hidden blocks?
if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
$conds['ipb_deleted'] = 0;
}
if ( $this->target !== '' ) {
- list( $target, $type ) = Block::parseTarget( $this->target );
+ list( $target, $type ) = DatabaseBlock::parseTarget( $this->target );
switch ( $type ) {
- case Block::TYPE_ID:
- case Block::TYPE_AUTO:
+ case DatabaseBlock::TYPE_ID:
+ case DatabaseBlock::TYPE_AUTO:
$conds['ipb_id'] = $target;
break;
- case Block::TYPE_IP:
- case Block::TYPE_RANGE:
+ case DatabaseBlock::TYPE_IP:
+ case DatabaseBlock::TYPE_RANGE:
list( $start, $end ) = IP::parseRange( $target );
- $conds[] = wfGetDB( DB_REPLICA )->makeList(
+ $conds[] = $db->makeList(
[
'ipb_address' => $target,
- Block::getRangeCond( $start, $end )
+ DatabaseBlock::getRangeCond( $start, $end )
],
LIST_OR
);
$conds['ipb_auto'] = 0;
break;
- case Block::TYPE_USER:
+ case DatabaseBlock::TYPE_USER:
$conds['ipb_address'] = $target->getName();
$conds['ipb_auto'] = 0;
break;
if ( in_array( 'userblocks', $this->options ) ) {
$conds['ipb_user'] = 0;
}
- if ( in_array( 'tempblocks', $this->options ) ) {
- $conds['ipb_expiry'] = 'infinity';
- }
if ( in_array( 'addressblocks', $this->options ) ) {
$conds[] = "ipb_user != 0 OR ipb_range_end > ipb_range_start";
}
$conds[] = "ipb_range_end = ipb_range_start";
}
+ $hideTemp = in_array( 'tempblocks', $this->options );
+ $hideIndef = in_array( 'indefblocks', $this->options );
+ if ( $hideTemp && $hideIndef ) {
+ // If both types are hidden, ensure query doesn't produce any results
+ $conds[] = '1=0';
+ } elseif ( $hideTemp ) {
+ $conds['ipb_expiry'] = $db->getInfinity();
+ } elseif ( $hideIndef ) {
+ $conds[] = "ipb_expiry != " . $db->addQuotes( $db->getInfinity() );
+ }
+
+ if ( $this->blockType === 'sitewide' ) {
+ $conds['ipb_sitewide'] = 1;
+ } elseif ( $this->blockType === 'partial' ) {
+ $conds['ipb_sitewide'] = 0;
+ }
+
return new BlockListPager( $this, $conds );
}
protected function getGroupName() {
return 'users';
}
+
+ /**
+ * Return a IDatabase object for reading
+ *
+ * @return IDatabase
+ */
+ protected function getDB() {
+ return wfGetDB( DB_REPLICA );
+ }
}