https://www.mediawiki.org/wiki/Special:Code/MediaWiki/113451
Revision: 113451
Author: bsitu
Date: 2012-03-09 02:10:43 +0000 (Fri, 09 Mar 2012)
Log Message:
-----------
PageTriage new tables, getMetaData API and database access file
Modified Paths:
--------------
trunk/extensions/PageTriage/PageTriage.php
Added Paths:
-----------
trunk/extensions/PageTriage/api/ApiPageTriageGetMetadata.php
trunk/extensions/PageTriage/includes/
trunk/extensions/PageTriage/includes/ArticleMetadata.php
trunk/extensions/PageTriage/sql/PageTriagePage.sql
trunk/extensions/PageTriage/sql/PageTriagePageTags.sql
trunk/extensions/PageTriage/sql/PageTriageTags.sql
Modified: trunk/extensions/PageTriage/PageTriage.php
===================================================================
--- trunk/extensions/PageTriage/PageTriage.php 2012-03-09 01:45:44 UTC (rev
113450)
+++ trunk/extensions/PageTriage/PageTriage.php 2012-03-09 02:10:43 UTC (rev
113451)
@@ -51,11 +51,18 @@
$wgAutoloadClasses['SpecialPageTriage'] = $dir . 'SpecialPageTriage.php';
$wgSpecialPages['PageTriage'] = 'SpecialPageTriage';
$wgSpecialPageGroups['PageTriage'] = 'changes';
+$wgAutoloadClasses['ArticleMetadata'] = $dir . 'includes/ArticleMetadata.php';
$wgAutoloadClasses['ApiQueryPageTriage'] = $dir . 'api/ApiQueryPageTriage.php';
+$wgAutoloadClasses['ApiPageTriageGetMetadata'] = $dir .
'api/ApiPageTriageGetMetadata.php';
+// custom exceptions
+$wgAutoloadClasses['MWArticleMetadataMissingPageIdException'] = $dir .
'includes/ArticleMetadata.php';
+$wgAutoloadClasses['MWArticleMetadataMetaDataOutofBoundException'] = $dir .
'includes/ArticleMetadata.php';
+
// api modules
$wgAPIModules['pagetriage'] = 'ApiQueryPageTriage';
+$wgAPIModules['pagetriagegetmetadata'] = 'ApiPageTriageGetMetadata';
$wgHooks['LoadExtensionSchemaUpdates'][] = 'efPageTriageSchemaUpdates';
@@ -75,9 +82,15 @@
$updater->addExtensionTable( 'pagetriage',
"$base/PageTriage.sql" );
}
}
+ $updater->addExtensionTable( 'pagetriage_tags', $base .
'/PageTriageTags.sql' );
+ $updater->addExtensionTable( 'pagetriage_page_tags', $base .
'/PageTriagePageTags.sql' );
+ $updater->addExtensionTable( 'pagetriage_page', $base .
'/PageTriagePage.sql' );
+
return true;
}
+$wgPageTriagePageIdPerRequest = 20;
+
// Register ResourceLoader modules
$wgResourceModules['ext.pageTriage.core'] = array(
'localBasePath' => dirname( __FILE__ ),
Added: trunk/extensions/PageTriage/api/ApiPageTriageGetMetadata.php
===================================================================
--- trunk/extensions/PageTriage/api/ApiPageTriageGetMetadata.php
(rev 0)
+++ trunk/extensions/PageTriage/api/ApiPageTriageGetMetadata.php
2012-03-09 02:10:43 UTC (rev 113451)
@@ -0,0 +1,60 @@
+<?php
+
+class ApiPageTriageGetMetadata extends ApiBase {
+
+ public function execute() {
+ global $wgPageTriagePageIdPerRequest;
+
+ $params = $this->extractRequestParams();
+
+ if ( count( $params['page_id'] ) >
$wgPageTriagePageIdPerRequest ) {
+ $this->dieUsage( 'Too many pages in the request',
'exceed-page-limit' );
+ }
+
+ $articleMetadata = new ArticleMetadata( );
+ $metaData = $articleMetadata->getMetadata( $params['page_id'] );
+
+ $result = array( 'result' => 'success', 'page' => $metaData );
+ $this->getResult()->addValue( null, $this->getModuleName(),
$result );
+ }
+
+ public function needsToken() {
+ return true;
+ }
+
+ public function getTokenSalt() {
+ return '';
+ }
+
+ public function getAllowedParams() {
+ return array(
+ 'page_id' => array(
+ ApiBase::PARAM_REQUIRED => true,
+ ApiBase::PARAM_TYPE => 'integer',
+ ApiBase::PARAM_ISMULTI => true,
+ ),
+ );
+ }
+
+ public function mustBePosted() {
+ return true;
+ }
+
+ public function isWriteMode() {
+ return true;
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiPageTriageGetMetadata.php $';
+ }
+
+ public function getParamDescription() {
+ return array(
+ 'page_id' => 'The list of articles for which metadata
is obtained',
+ );
+ }
+
+ public function getDescription() {
+ return 'Get metadata for a list of articles';
+ }
+}
Property changes on:
trunk/extensions/PageTriage/api/ApiPageTriageGetMetadata.php
___________________________________________________________________
Added: svn:eol-style
+ native
Added: trunk/extensions/PageTriage/includes/ArticleMetadata.php
===================================================================
--- trunk/extensions/PageTriage/includes/ArticleMetadata.php
(rev 0)
+++ trunk/extensions/PageTriage/includes/ArticleMetadata.php 2012-03-09
02:10:43 UTC (rev 113451)
@@ -0,0 +1,422 @@
+<?php
+
+class ArticleMetadata {
+
+ protected $mPageId;
+
+ /**
+ * @param $pageId array - list of page id
+ */
+ public function __construct( $pageId = array() ) {
+ if ( !$pageId ) {
+ throw new MWArticleMetadataMissingPageIdException(
'Missing page id' );
+ }
+
+ $this->mPageId = $pageId;
+ }
+
+ /**
+ * Compile the metadata for an article, should be triggered on article
save
+ * @return array|bool
+ */
+ public function compileMetadata( ) {
+ $metaData = array();
+
+ //Start the data compilation
+ if ( $this->compileArticleBasicData( $metaData ) ) {
+ $this->compileUserBasicData( $metaData );
+ $this->compileDeletionTagData( $metaData );
+
+ $tags = self::getValidTags();
+ $dbw = wfGetDB( DB_MASTER );
+ foreach ( $metaData as $pageId => $data ) {
+ $this->setMetadataToCache( $pageId, $data );
+ //Make sure either all or none metadata for a
single page_id
+ $dbw->begin();
+ foreach ( $data as $key => $val) {
+ if ( isset( $tags[$key] ) ) {
+ $row = array (
+ 'ptrpt_page_id' =>
$pageId,
+ 'ptrpt_tag_id' =>
$tags[$key],
+ 'ptrpt_value' => $val
+ );
+ }
+ $dbw->replace( 'pagetriage_page_tags',
array( 'ptrpt_page_id', 'ptrpt_tag_id' ), $row, __METHOD__ );
+ }
+ $dbw->commit();
+ }
+ }
+
+ return $metaData;
+ }
+
+ /**
+ * Flush the metadata in cache
+ * @param $pageId - page id to be flushed, if null is provided, all
+ * page id in $this->mPageId will be flushed
+ */
+ protected function flushMetadataFromCache( $pageId = null ) {
+ global $wgMemc;
+
+ $keyPrefix = $this->memcKeyPrefix();
+ if ( is_null( $pageId ) ) {
+ foreach ( $this->mPageId as $pageId ) {
+ $wgMemc->delete( $keyPrefix . '-' . $pageId );
+ }
+ } else {
+ $wgMemc->delete( $keyPrefix . '-' . $pageId );
+ }
+ }
+
+ /**
+ * Set the metadata to cache
+ */
+ protected function setMetadataToCache( $pageId, $singleData ) {
+ global $wgMemc;
+
+ $this->flushMetadataFromCache( $pageId );
+ $wgMemc->set( $this->memcKeyPrefix() . '-' . $pageId,
$singleData );
+ }
+
+ /**
+ * Get the metadata from cache
+ * @param $pageId - the page id to get the cache data for, if null is
provided
+ * all page id in $this->mPageId will be obtained
+ */
+ protected function getMetadataFromCache( $pageId = null ) {
+ global $wgMemc;
+
+ $keyPrefix = $this->memcKeyPrefix();
+
+ if ( is_null( $pageId ) ) {
+ $metaData = array();
+ foreach ( $this->mPageId as $pageId ) {
+ $metaDataCache = $wgMemc->get( $keyPrefix . '-'
. $pageId );
+ if ( $metaDataCache !== false ) {
+ $metaData[$pageId] = $metaDataCache;
+ }
+ }
+ return $metaData;
+ } else {
+ return $wgMemc->get( $keyPrefix . '-' . $pageId );;
+ }
+ }
+
+ /**
+ * Return the prefix of memcache key for article metadata
+ * @return string
+ */
+ protected function memcKeyPrefix() {
+ return wfMemcKey( 'article', 'metadata' );
+ }
+
+ /**
+ * Get the metadata for a single or list of articles
+ * @return array
+ */
+ public function getMetadata() {
+ $articles = $this->mPageId;
+ $metaData = $this->getMetadataFromCache();
+
+ foreach ( $articles as $key => $pageId ) {
+ if ( isset( $metaData[$pageId] ) ) {
+ unset( $articles[$key] );
+ }
+ }
+
+ // Articles with no metadata after cache attempt
+ if ( $articles ) {
+ $dbr = wfGetDB( DB_SLAVE );
+
+ $res = $dbr->select(
+ array( 'pagetriage_page_tags',
'pagetriage_tags' ),
+ array( 'ptrpt_page_id',
'ptrt_tag_name', 'ptrpt_value' ),
+ array( 'ptrpt_page_id' => $articles,
'ptrpt_tag_id = ptrt_tag_id' ),
+ __METHOD__
+ );
+
+ $pageData = array();
+ foreach ( $res as $row ) {
+
$pageData[$row->ptrpt_page_id][$row->ptrt_tag_name] = $row->ptrpt_value;
+ }
+
+ foreach ( $pageData as $pageId => $val ) {
+ $this->setMetadataToCache( $pageId, $val );
+ }
+ $metaData += $pageData;
+
+ // Double check articles with no metadata yet, maybe we
do not want to do this on the fly since
+ // compiling page especially multipla pages at the same
request is quite expensive
+ // @todo discuss this
+ foreach ( $articles as $key => $pageId ) {
+ if ( isset( $metaData[$pageId] ) ) {
+ unset( $articles[$key] );
+ }
+ }
+ if ( $articles ) {
+ $self = new ArticleMetadata( $articles );
+ $metaData += $self->compileMetadata( $articles
);
+ }
+ }
+
+ return $metaData;
+ }
+
+ /**
+ * Return a list of valid metadata
+ * @return array
+ */
+ public static function getValidTags() {
+ static $tags = array();
+
+ if ( count( $tags ) > 0 ) {
+ return $tags;
+ }
+
+ $dbr = wfGetDB( DB_SLAVE );
+
+ $res = $dbr->select(
+ array( 'pagetriage_tags' ),
+ array( 'ptrt_tag_id', 'ptrt_tag_name' ),
+ array( ),
+ __METHOD__
+ );
+
+ foreach ( $res as $row ) {
+ $tags[$row->ptrt_tag_name] = $row->ptrt_tag_id;
+ }
+
+ return $tags;
+ }
+
+ /**
+ * Get a list of untriaged articles based on the search criteria
+ * @param $criteria array - list of tags for the filter
+ * @param $offset string
+ * @param $backwards bool - flag to check whether to get data backward
+ *
+ * @Todo - Pass a range for timestamp to avoid full index scan
+ */
+ public static function getUnTriagedArticleByMetadata( $criteria =
array(), $offset = '', $backwards = false ) {
+ global $wgPageTriagePageIdPerRequest;
+
+ $tags = self::getValidTags();
+
+ if ( count( $criteria ) > count( $tags ) ) {
+ throw new MWArticleMetadataMetaDataOutofBoundException(
'Invalid search criteria are provided' );
+ }
+
+ $dbr = wfGetDB( DB_SLAVE );
+
+ $table = array( 'pagetriage_page', 'page' );
+
+ $tagConds = '';
+ $tagCount = 0;
+ // Check for valid tags and construct tag query
+ foreach ( $criteria as $key => $val ) {
+ if ( isset( $tags[$key] ) ) {
+ if ( $tagConds ) {
+ $tagConds .= ' OR ';
+ }
+ $tagConds .= " ( ptrpt_tag_id = " . $tags[$key]
. " AND ptrpt_value = " . $dbr->addQuotes( $val ) . " ) ";
+ $tagCount++;
+ }
+ }
+
+ $conds = array( 'ptrp_page_id = page_id', 'ptrp_triaged' => '0'
);
+
+ if ( $offset ) {
+ $arr = explode( '|', $offset, 2 );
+ $ts = $dbr->addQuotes( $dbr->timestamp( $arr[0] ) );
+ $id = isset( $arr[1] ) ? intval( $arr[1] ) : 0;
+ $op = $backwards ? '<' : '>';
+ $conds[] = "ptrp_timestamp $op $ts OR (ptrp_timestamp =
$ts AND ptrp_id $op= $id)";
+ }
+
+ $desc = $backwards ? 'DESC' : '';
+ $opts = array( 'LIMIT' => $wgPageTriagePageIdPerRequest + 1,
"ORDER BY ptrp_timestamp $desc ptrp_id $desc" );
+
+ if ( $tagCount ) {
+ $conds[] = '(' . $tagConds . ')';
+ $conds[] = 'ptrpt_page_id = ptrp_page_id';
+ $opts['GROUP BY'] = 'ptrpt_page_id';
+ $opts['HAVING'] = 'COUNT(ptrpt_tag_id) = ' . $tagCount;
+ $table[] = 'pagetriage_page_tags';
+ }
+
+ $res = $dbr->select(
+ $table,
+ array( 'ptrp_page_id' ),
+ $conds,
+ __METHOD__,
+ $opts
+ );
+
+ return iterator_to_array( $res );
+ }
+
+ /**
+ * Compile article basic data like title, number of bytes
+ */
+ protected function compileArticleBasicData( &$metaData ) {
+ global $wgLang;
+
+ $dbr = wfGetDB( DB_SLAVE );
+
+ $res = $dbr->select(
+ array( 'page', 'revision' ),
+ array( 'page_id', 'page_namespace',
'page_title', 'page_len', 'COUNT(rev_id) AS rev_count', 'MIN(rev_timestamp) AS
creation_date' ),
+ array( 'page_id' => $this->mPageId, 'page_id =
rev_page'),
+ __METHOD__,
+ array ( 'GROUP BY' => 'page_id' )
+ );
+ foreach ( $res as $row ) {
+ $title = Title::makeTitle( $row->page_namespace,
$row->page_title );
+ $metaData[$row->page_id]['page_len'] = $row->page_len;
+ $metaData[$row->page_id]['creation_date'] =
$row->creation_date;
+ $metaData[$row->page_id]['rev_count'] = $row->rev_count;
+ $metaData[$row->page_id]['title'] =
$title->getPrefixedText();
+ }
+ // Remove any non-existing page_id from $this->mPageId
+ foreach ( $this->mPageId as $key => $pageId ) {
+ if ( !isset( $metaData[$pageId] ) ) {
+ unset($this->mPageId[$key]);
+ }
+ }
+ if ( !$this->mPageId ) {
+ return false;
+ }
+
+ $res = $dbr->select(
+ array( 'page', 'pagelinks' ),
+ array( 'page_id', 'COUNT(pl_from) AS linkcount'
),
+ array( 'page_id' => $this->mPageId,
'page_namespace = pl_namespace', 'page_title = pl_title' ),
+ __METHOD__,
+ array ( 'GROUP BY' => 'page_id' )
+ );
+ foreach ( $res as $row ) {
+ $metaData[$row->page_id]['linkcount'] = $row->linkcount;
+ }
+ foreach ( $this->mPageId as $pageId ) {
+ if ( !isset( $metaData[$row->page_id]['linkcount'] ) ) {
+ $metaData[$row->page_id]['linkcount'] = '0';
+ }
+ }
+
+ $res = $dbr->select(
+ array( 'page', 'categorylinks' ),
+ array( 'page_id', 'COUNT(cl_to) AS
category_count' ),
+ array( 'page_id' => $this->mPageId, 'page_id =
cl_from' ),
+ __METHOD__,
+ array ( 'GROUP BY' => 'page_id' )
+ );
+ foreach ( $res as $row ) {
+ $metaData[$row->page_id]['category_count'] =
$row->category_count;
+ }
+ foreach ( $this->mPageId as $pageId ) {
+ if ( !isset( $metaData[$pageId]['category_count'] ) ) {
+ $metaData[$pageId]['category_count'] = '0';
+ }
+ }
+
+ $res = $dbr->select(
+ array( 'text', 'revision', 'page',
'pagetriage_page' ),
+ array( 'page_id', 'old_text', 'ptrp_triaged' ),
+ array( 'page_id' => $this->mPageId, 'page_id =
rev_page', 'rev_text_id = old_id' ),
+ __METHOD__,
+ array(),
+ array( 'pagetriage_page' => array( 'LEFT JOIN',
'page_id = ptrp_page_id' ) )
+ );
+
+ foreach ( $res as $row ) {
+ $metaData[$row->page_id]['snippet'] =
$wgLang->truncate( $row->old_text, 150 );
+ $metaData[$row->page_id]['patrol_status'] =
$row->ptrp_triaged ? $row->ptrp_triaged : '0';
+ }
+
+ return true;
+ }
+
+ /**
+ * Compile user basic data like username for the author
+ * @param $metaData array
+ */
+ protected function compileUserBasicData( &$metaData ) {
+ $dbr = wfGetDB( DB_SLAVE );
+
+ $res = $dbr->select(
+ array( 'revision' ),
+ array( 'MIN(rev_id) AS rev_id' ),
+ array( 'rev_page' => $this->mPageId ),
+ __METHOD__,
+ array( 'GROUP BY' => 'rev_page' )
+ );
+
+ $revId = array();
+
+ foreach ( $res as $row ) {
+ $revId[] = $row->rev_id;
+ }
+
+ $res = $dbr->select(
+ array( 'revision', 'user' ),
+ array( 'rev_page AS page_id', 'user_id',
'user_name', 'user_real_name', 'user_registration', 'user_editcount' ),
+ array( 'rev_id' => $revId, 'rev_user = user_id'
),
+ __METHOD__,
+ array()
+ );
+
+ foreach ( $res as $row ) {
+ $user = User::newFromRow( $row );
+ $metaData[$row->page_id]['user_name'] =
$user->getName();
+ $metaData[$row->page_id]['user_editcount'] =
$user->getEditCount();
+ $metaData[$row->page_id]['user_creation_date'] =
wfTimestamp( TS_MW, $user->getRegistration() );
+ $metaData[$row->page_id]['user_autoconfirmed'] =
$user->isAllowed( 'autoconfirmed' );
+ $metaData[$row->page_id]['user_block_status'] =
$user->isBlocked() ? '1' : '0';
+ }
+ }
+
+ /**
+ * Compile the deletion tag data
+ * @param $metaData array
+ */
+ protected function compileDeletionTagData( &$metaData ) {
+ $dbr = wfGetDB( DB_SLAVE );
+
+ $deletionTags = array (
+ 'All_articles_proposed_for_deletion' => 'prod_status',
+ 'BLP_articles_proposed_for_deletion' =>
'blp_prod_status',
+ 'Candidates_for_speedy_deletion' => 'csd_status',
+ 'Articles_for_deletion' => 'afd_status'
+ );
+
+ $res = $dbr->select(
+ array( 'categorylinks' ),
+ array( 'cl_from AS page_id', 'cl_to' ),
+ array( 'cl_from' => $this->mPageId, 'cl_to' =>
array_keys( $deletionTags ) ),
+ __METHOD__
+ );
+
+ foreach ( $res as $row ) {
+ $metaData[$row->page_id][$deletionTags[$row->cl_to]] =
'1';
+ }
+
+ // Fill in 0 for page not tagged with any of these status
+ // Subtract from category_count
+ foreach ( $this->mPageId as $pageId ) {
+ foreach ( $deletionTags as $status ) {
+ if ( !isset( $metaData[$pageId][$status] ) ) {
+ $metaData[$pageId][$status] = '0';
+ } else {
+ $metaData[$pageId]['category_count'] -=
1;
+ }
+ }
+
+ if ( $metaData[$pageId]['category_count'] < 0 ) {
+ $metaData[$pageId]['category_count'] = '0';
+ }
+ }
+ }
+}
+
+class MWArticleMetadataMissingPageIdException extends MWException {}
+class MWArticleMetadataMetaDataOutofBoundException extends MWException {}
Property changes on: trunk/extensions/PageTriage/includes/ArticleMetadata.php
___________________________________________________________________
Added: svn:eol-style
+ native
Added: trunk/extensions/PageTriage/sql/PageTriagePage.sql
===================================================================
--- trunk/extensions/PageTriage/sql/PageTriagePage.sql
(rev 0)
+++ trunk/extensions/PageTriage/sql/PageTriagePage.sql 2012-03-09 02:10:43 UTC
(rev 113451)
@@ -0,0 +1,10 @@
+-- Store the list of articles to be triaged or being triaged already
+CREATE TABLE /*_*/pagetriage_page (
+ ptrp_id int unsigned NOT NULL PRIMARY KEY auto_increment,
+ ptrp_page_id int unsigned NOT NULL,
+ ptrp_triaged tinyint unsigned not null default 0,
+ ptrp_timestamp varbinary(14) NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/ptrp_page_id ON /*_*/pagetriage_page (ptrp_page_id);
+CREATE INDEX /*i*/ptrp_timestamp_triaged_id ON /*_*/pagetriage_page
(ptrp_triaged, ptrp_timestamp, ptrp_id);
Property changes on: trunk/extensions/PageTriage/sql/PageTriagePage.sql
___________________________________________________________________
Added: svn:eol-style
+ native
Added: trunk/extensions/PageTriage/sql/PageTriagePageTags.sql
===================================================================
--- trunk/extensions/PageTriage/sql/PageTriagePageTags.sql
(rev 0)
+++ trunk/extensions/PageTriage/sql/PageTriagePageTags.sql 2012-03-09
02:10:43 UTC (rev 113451)
@@ -0,0 +1,9 @@
+-- Store the metadata for article to be triaged
+CREATE TABLE /*_*/pagetriage_page_tags (
+ ptrpt_page_id int unsigned NOT NULL,
+ ptrpt_tag_id int unsigned NOT NULL,
+ ptrpt_value varbinary(255) NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/ptrpt_page_tag_id ON /*_*/pagetriage_page_tags
(ptrpt_page_id,ptrpt_tag_id);
+CREATE INDEX /*i*/ptrpt_tag_id_value ON /*_*/pagetriage_page_tags
(ptrpt_tag_id,ptrpt_value);
Property changes on: trunk/extensions/PageTriage/sql/PageTriagePageTags.sql
___________________________________________________________________
Added: svn:eol-style
+ native
Added: trunk/extensions/PageTriage/sql/PageTriageTags.sql
===================================================================
--- trunk/extensions/PageTriage/sql/PageTriageTags.sql
(rev 0)
+++ trunk/extensions/PageTriage/sql/PageTriageTags.sql 2012-03-09 02:10:43 UTC
(rev 113451)
@@ -0,0 +1,28 @@
+-- Article metadata types
+CREATE TABLE /*_*/pagetriage_tags (
+ ptrt_tag_id int unsigned NOT NULL PRIMARY KEY auto_increment,
+ ptrt_tag_name varbinary(20) NOT NULL,
+ ptrt_tag_desc varbinary(255) NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/ptrt_tag_id ON /*_*/pagetriage_tags (ptrt_tag_name);
+
+INSERT INTO pagetriage_tags (ptrt_tag_name, ptrt_tag_desc)
+VALUES
+('title', 'Article title'),
+('linkcount', 'Number of inbound links'),
+('category_count', 'Category mapping count'),
+('csd_status', 'CSD status'),
+('prod_status', 'PROD status'),
+('blp_prod_status', 'BLP PROD status'),
+('afd_status', 'AFD status'),
+('patrol_status', 'Already review/triaged'),
+('rev_count', 'Number of edits to the article'),
+('page_len', 'Number of bytes of article'),
+('creation_date', 'Article creation date'),
+('snippet', 'Beginning of article snippet'),
+('user_name', 'User name'),
+('user_editcount', 'User total edit'),
+('user_creation_date', 'User registration date'),
+('user_autoconfirmed', 'Check if user is autoconfirmed' ),
+('user_block_status', 'User block status');
Property changes on: trunk/extensions/PageTriage/sql/PageTriageTags.sql
___________________________________________________________________
Added: svn:eol-style
+ native
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs