Completed
Branch master (a9d73a)
by
unknown
30:07
created

SpecialBlockList::getBlockListPager()   D

Complexity

Conditions 12
Paths 224

Size

Total Lines 52
Code Lines 33

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 12
eloc 33
c 1
b 0
f 0
nc 224
nop 0
dl 0
loc 52
rs 4.9614

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * Implements Special:BlockList
4
 *
5
 * This program is free software; you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation; either version 2 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License along
16
 * with this program; if not, write to the Free Software Foundation, Inc.,
17
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18
 * http://www.gnu.org/copyleft/gpl.html
19
 *
20
 * @file
21
 * @ingroup SpecialPage
22
 */
23
24
/**
25
 * A special page that lists existing blocks
26
 *
27
 * @ingroup SpecialPage
28
 */
29
class SpecialBlockList extends SpecialPage {
30
	protected $target;
31
32
	protected $options;
33
34
	function __construct() {
35
		parent::__construct( 'BlockList' );
36
	}
37
38
	/**
39
	 * Main execution point
40
	 *
41
	 * @param string $par Title fragment
42
	 */
43
	public function execute( $par ) {
44
		$this->setHeaders();
45
		$this->outputHeader();
46
		$out = $this->getOutput();
47
		$lang = $this->getLanguage();
48
		$out->setPageTitle( $this->msg( 'ipblocklist' ) );
49
		$out->addModuleStyles( [ 'mediawiki.special' ] );
50
51
		$request = $this->getRequest();
52
		$par = $request->getVal( 'ip', $par );
53
		$this->target = trim( $request->getVal( 'wpTarget', $par ) );
54
55
		$this->options = $request->getArray( 'wpOptions', [] );
56
57
		$action = $request->getText( 'action' );
58
59
		if ( $action == 'unblock' || $action == 'submit' && $request->wasPosted() ) {
60
			# B/C @since 1.18: Unblock interface is now at Special:Unblock
61
			$title = SpecialPage::getTitleFor( 'Unblock', $this->target );
62
			$out->redirect( $title->getFullURL() );
63
64
			return;
65
		}
66
67
		# setup BlockListPager here to get the actual default Limit
68
		$pager = $this->getBlockListPager();
69
70
		# Just show the block list
71
		$fields = [
72
			'Target' => [
73
				'type' => 'user',
74
				'label-message' => 'ipaddressorusername',
75
				'tabindex' => '1',
76
				'size' => '45',
77
				'default' => $this->target,
78
			],
79
			'Options' => [
80
				'type' => 'multiselect',
81
				'options-messages' => [
82
					'blocklist-userblocks' => 'userblocks',
83
					'blocklist-tempblocks' => 'tempblocks',
84
					'blocklist-addressblocks' => 'addressblocks',
85
					'blocklist-rangeblocks' => 'rangeblocks',
86
				],
87
				'flatlist' => true,
88
			],
89
			'Limit' => [
90
				'type' => 'limitselect',
91
				'label-message' => 'table_pager_limit_label',
92
				'options' => [
93
					$lang->formatNum( 20 ) => 20,
94
					$lang->formatNum( 50 ) => 50,
95
					$lang->formatNum( 100 ) => 100,
96
					$lang->formatNum( 250 ) => 250,
97
					$lang->formatNum( 500 ) => 500,
98
				],
99
				'name' => 'limit',
100
				'default' => $pager->getLimit(),
101
			],
102
		];
103
		$context = new DerivativeContext( $this->getContext() );
104
		$context->setTitle( $this->getPageTitle() ); // Remove subpage
105
		$form = HTMLForm::factory( 'ooui', $fields, $context );
106
		$form->setMethod( 'get' );
107
		$form->setWrapperLegendMsg( 'ipblocklist-legend' );
108
		$form->setSubmitTextMsg( 'ipblocklist-submit' );
109
		$form->setSubmitProgressive();
110
		$form->prepareForm();
111
112
		$form->displayForm( '' );
113
		$this->showList( $pager );
114
	}
115
116
	/**
117
	 * Setup a new BlockListPager instance.
118
	 * @return BlockListPager
119
	 */
120
	protected function getBlockListPager() {
121
		$conds = [];
122
		# Is the user allowed to see hidden blocks?
123
		if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
124
			$conds['ipb_deleted'] = 0;
125
		}
126
127
		if ( $this->target !== '' ) {
128
			list( $target, $type ) = Block::parseTarget( $this->target );
129
130
			switch ( $type ) {
131
				case Block::TYPE_ID:
132
				case Block::TYPE_AUTO:
133
					$conds['ipb_id'] = $target;
134
					break;
135
136
				case Block::TYPE_IP:
137
				case Block::TYPE_RANGE:
138
					list( $start, $end ) = IP::parseRange( $target );
139
					$conds[] = wfGetDB( DB_SLAVE )->makeList(
140
						[
141
							'ipb_address' => $target,
142
							Block::getRangeCond( $start, $end )
143
						],
144
						LIST_OR
145
					);
146
					$conds['ipb_auto'] = 0;
147
					break;
148
149
				case Block::TYPE_USER:
150
					$conds['ipb_address'] = $target->getName();
151
					$conds['ipb_auto'] = 0;
152
					break;
153
			}
154
		}
155
156
		# Apply filters
157
		if ( in_array( 'userblocks', $this->options ) ) {
158
			$conds['ipb_user'] = 0;
159
		}
160
		if ( in_array( 'tempblocks', $this->options ) ) {
161
			$conds['ipb_expiry'] = 'infinity';
162
		}
163
		if ( in_array( 'addressblocks', $this->options ) ) {
164
			$conds[] = "ipb_user != 0 OR ipb_range_end > ipb_range_start";
165
		}
166
		if ( in_array( 'rangeblocks', $this->options ) ) {
167
			$conds[] = "ipb_range_end = ipb_range_start";
168
		}
169
170
		return new BlockListPager( $this, $conds );
171
	}
172
173
	/**
174
	 * Show the list of blocked accounts matching the actual filter.
175
	 * @param BlockListPager $pager The BlockListPager instance for this page
176
	 */
177
	protected function showList( BlockListPager $pager ) {
178
		$out = $this->getOutput();
179
180
		# Check for other blocks, i.e. global/tor blocks
181
		$otherBlockLink = [];
182
		Hooks::run( 'OtherBlockLogLink', [ &$otherBlockLink, $this->target ] );
183
184
		# Show additional header for the local block only when other blocks exists.
185
		# Not necessary in a standard installation without such extensions enabled
186
		if ( count( $otherBlockLink ) ) {
187
			$out->addHTML(
188
				Html::element( 'h2', [], $this->msg( 'ipblocklist-localblock' )->text() ) . "\n"
189
			);
190
		}
191
192
		if ( $pager->getNumRows() ) {
193
			$out->addParserOutputContent( $pager->getFullOutput() );
194
		} elseif ( $this->target ) {
195
			$out->addWikiMsg( 'ipblocklist-no-results' );
196
		} else {
197
			$out->addWikiMsg( 'ipblocklist-empty' );
198
		}
199
200
		if ( count( $otherBlockLink ) ) {
201
			$out->addHTML(
202
				Html::rawElement(
203
					'h2',
204
					[],
205
					$this->msg( 'ipblocklist-otherblocks', count( $otherBlockLink ) )->parse()
206
				) . "\n"
207
			);
208
			$list = '';
209
			foreach ( $otherBlockLink as $link ) {
210
				$list .= Html::rawElement( 'li', [], $link ) . "\n";
211
			}
212
			$out->addHTML( Html::rawElement(
213
				'ul',
214
				[ 'class' => 'mw-ipblocklist-otherblocks' ],
215
				$list
216
			) . "\n" );
217
		}
218
	}
219
220
	protected function getGroupName() {
221
		return 'users';
222
	}
223
}
224