Skip to content

Commit

Permalink
Create new Special:MyWikis page
Browse files Browse the repository at this point in the history
  • Loading branch information
AgentIsai authored Sep 20, 2024
1 parent b2949d2 commit 13a45e4
Show file tree
Hide file tree
Showing 3 changed files with 250 additions and 0 deletions.
2 changes: 2 additions & 0 deletions extension.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
}
},
"SpecialPages": {
"MyWikis": "MyWikis",
"RandomWiki": "SpecialRandomWiki",
"WikiDiscover": "SpecialWikiDiscover"
},
Expand All @@ -34,6 +35,7 @@
"AutoloadClasses": {
"WikiDiscover": "includes/WikiDiscover.php",
"WikiDiscoverRandom": "includes/WikiDiscoverRandom.php",
"SpecialMyWikis": "includes/SpecialMyWikis.php",
"SpecialRandomWiki": "includes/SpecialRandomWiki.php",
"SpecialWikiDiscover": "includes/SpecialWikiDiscover.php",
"WikiDiscoverWikisPager": "includes/WikiDiscoverWikisPager.php",
Expand Down
169 changes: 169 additions & 0 deletions includes/MyWikisWikiPager.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
<?php

use MediaWiki\MediaWikiServices;
use MediaWiki\User\UserFactory;
use Miraheze\ManageWiki\Helpers\ManageWikiSettings;
use Wikimedia\Rdbms\IReadableDatabase;

class MyWikisWikisPager extends TablePager {
/** @var string */
private $language;

/** @var string */
private $category;

/** @var string */
private $state;

/** @var WikiDiscover */
private $wikiDiscover;

/**
* @param SpecialPage $page
* @param string $language
* @param string $category
* @param string $state
*/
public function __construct( $page, $language, $category, $state ) {
$this->mDb = self::getCreateWikiDatabase();

$this->language = $language;
$this->category = $category;

$this->state = $state;

$this->wikiDiscover = new WikiDiscover();

parent::__construct( $page->getContext(), $page->getLinkRenderer() );
}

/**
* @return IReadableDatabase
*/
public static function getCreateWikiDatabase() {
$config = MediaWikiServices::getInstance()->getMainConfig();

$factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
$lb = $factory->getMainLB( $config->get( 'CreateWikiDatabase' ) );

return $lb->getMaintenanceConnectionRef( DB_REPLICA, 'cw_requests', $config->get( 'CreateWikiDatabase' ) );
}

/** @inheritDoc */
protected function getFieldNames() {
$config = MediaWikiServices::getInstance()->getMainConfig();

static $headers = null;

$headers = [
'cw_dbname' => 'wikidiscover-table-wiki',
'cw_language' => 'wikidiscover-table-language',
];

$headers += [
'cw_category' => 'wikidiscover-table-category',
'cw_timestamp' => 'wikidiscover-table-established',
];

if ( ExtensionRegistry::getInstance()->isLoaded( 'ManageWiki' ) && $this->getConfig()->get( 'WikiDiscoverUseDescriptions' ) ) {
$headers['wiki_description'] = 'wikidiscover-table-description';
}

foreach ( $headers as &$msg ) {
$msg = $this->msg( $msg )->text();
}

return $headers;
}

/** @inheritDoc */
public function formatRow( $row ) {
if ( ExtensionRegistry::getInstance()->isLoaded( 'ManageWiki' ) ) {
$manageWikiSettings = new ManageWikiSettings( $row->wiki_dbname );
if ( $manageWikiSettings->list( 'wgWikiDiscoverExclude' ) ) {
return '';
}
}

return parent::formatRow( $row );
}

/** @inheritDoc */
public function formatValue( $name, $value ) {
$row = $this->mCurrentRow;

$wikiDiscover = $this->wikiDiscover;

$wiki = $row->cw_dbname;

switch ( $name ) {
case 'cw_dbname':
$url = $wikiDiscover->getUrl( $wiki );
$name = $wikiDiscover->getSitename( $wiki );
$formatted = "<a href=\"{$url}\">{$name}</a>";
break;
case 'cw_language':
$formatted = $wikiDiscover->getLanguage( $wiki );
break;
case 'cw_private':
if ( $row->cw_category === 1 ) {
$formatted = 'Private';
} else {
$formatted = 'Public';
}
break;
case 'cw_category':
$wikiCategories = array_flip( $this->getConfig()->get( 'CreateWikiCategories' ) );
$formatted = $wikiCategories[$row->cw_category] ?? 'Uncategorised';
break;
case 'cw_timestamp':
$lang = RequestContext::getMain()->getLanguage();

$formatted = htmlspecialchars( $lang->date( wfTimestamp( TS_MW, strtotime( $row->cw_timestamp ) ) ) );
break;
default:
$formatted = "Unable to format $name";
break;
}

return $formatted;
}

/** @inheritDoc */
public function getQueryInfo() {
$config = MediaWikiServices::getInstance()->getMainConfig();

$fields = [];

$userID = $this->userFactory->newFromName( $userName )->getId();

$info = [
'tables' => [ 'cw_requests' ],
'fields' => array_merge( [ 'cw_dbname', 'cw_language', 'cw_category', 'cw_timestamp' ], $fields ),
'conds' => [
'cw_user' => $userID
],
'joins_conds' => [],
];

if ( $this->language && $this->language !== 'any' ) {
$info['conds']['cw_language'] = $this->language;
}

if ( $this->category && $this->category !== 'any' ) {
$info['conds']['cw_category'] = $this->category;
}

return $info;
}

/** @inheritDoc */
public function getDefaultSort() {
return 'cw_timestamp';
}

/** @inheritDoc */
protected function isFieldSortable( $field ) {
return $field !== 'wiki_description';
}
}
79 changes: 79 additions & 0 deletions includes/SpecialMyWikis.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
<?php

class SpecialMyWikis extends SpecialPage {

public function __construct() {
parent::__construct( 'MyWikis' );
}

/** @inheritDoc */
public function execute( $subPage ) {
$this->setHeaders();
$this->outputHeader();

$language = $this->getRequest()->getText( 'language' );
$category = $this->getRequest()->getText( 'category' );
$state = $this->getRequest()->getText( 'state' );

$stateOptions = [
'(any)' => 'any',
'Active' => 'active',
'Locked' => 'locked',
];

if ( $this->getConfig()->get( 'CreateWikiUseClosedWikis' ) ) {
$stateOptions['Closed'] = 'closed';
}

$stateOptions['Deleted'] = 'deleted';

if ( $this->getConfig()->get( 'CreateWikiUseInactiveWikis' ) ) {
$stateOptions['Inactive'] = 'inactive';
}

$formDescriptor = [
'intro' => [
'type' => 'info',
'default' => $this->msg( 'wikidiscover-header-info' )->text(),
],
'language' => [
'type' => 'language',
'options' => [ '(any)' => 'any' ],
'name' => 'language',
'label-message' => 'wikidiscover-table-language',
'default' => $language ?: 'any',
],
'category' => [
'type' => 'select',
'name' => 'category',
'label-message' => 'wikidiscover-table-category',
'options' => [ '(any)' => 'any' ] + $this->getConfig()->get( 'CreateWikiCategories' ),
'default' => $category ?: 'any',
],
'state' => [
'type' => 'select',
'name' => 'state',
'label-message' => 'wikidiscover-table-state',
'options' => $stateOptions,
'default' => $state ?: 'any',
],
];

$htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() );
$htmlForm
->setMethod( 'get' )
->setWrapperLegendMsg( 'wikidiscover-header' )
->setSubmitTextMsg( 'search' )
->prepareForm()
->displayForm( false );

$pager = new MyWikisWikisPager( $this, $language, $category, $state );

$this->getOutput()->addParserOutputContent( $pager->getFullOutput() );
}

/** @inheritDoc */
protected function getGroupName() {
return 'wikimanage';
}
}

0 comments on commit 13a45e4

Please sign in to comment.