summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Translate/scripts/translator-stats.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Translate/scripts/translator-stats.php')
-rw-r--r--www/wiki/extensions/Translate/scripts/translator-stats.php131
1 files changed, 131 insertions, 0 deletions
diff --git a/www/wiki/extensions/Translate/scripts/translator-stats.php b/www/wiki/extensions/Translate/scripts/translator-stats.php
new file mode 100644
index 00000000..1847f46d
--- /dev/null
+++ b/www/wiki/extensions/Translate/scripts/translator-stats.php
@@ -0,0 +1,131 @@
+<?php
+/**
+ * Script to gather translator stats.
+ *
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @file
+ */
+
+// Standard boilerplate to define $IP
+if ( getenv( 'MW_INSTALL_PATH' ) !== false ) {
+ $IP = getenv( 'MW_INSTALL_PATH' );
+} else {
+ $dir = __DIR__;
+ $IP = "$dir/../../..";
+}
+require_once "$IP/maintenance/Maintenance.php";
+
+class TS extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = 'Script to gather translator stats in tsv format. ' .
+ 'You can further process the output with translate-stats-process.php';
+ }
+
+ public function execute() {
+ global $wgDisableUserGroupExpiry;
+
+ $dbr = wfGetDB( DB_REPLICA );
+ $users = $dbr->select(
+ [ 'user', 'user_groups' ],
+ [
+ 'user_name',
+ 'user_registration',
+ 'user_editcount',
+ 'ug_group',
+ ],
+ [
+ 'user_registration is not null'
+ ],
+ __METHOD__,
+ [
+ 'ORDER BY' => 'user_id ASC',
+ ],
+ [
+ 'user_groups' => [
+ 'LEFT JOIN',
+ [
+ 'user_id=ug_user',
+ 'ug_group' => 'translator',
+ ( isset( $wgDisableUserGroupExpiry ) && !$wgDisableUserGroupExpiry ) ?
+ 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ) :
+ ''
+ ]
+ ]
+ ]
+ );
+
+ echo "username\tregistration ts\tedit count\tis translator?\tpromoted ts\tmethod\n";
+
+ $rejected = $dbr->select(
+ [ 'logging' ],
+ [
+ 'log_title',
+ 'log_timestamp',
+ ],
+ [
+ 'log_type' => 'translatorsandbox',
+ 'log_action' => 'rejected',
+ ],
+ __METHOD__
+ );
+
+ foreach ( $rejected as $r ) {
+ echo "{$r->log_title}\t{$r->log_timestamp}\t0\t\t\tsandbox\n";
+ }
+
+ foreach ( $users as $u ) {
+ $logs = $dbr->select(
+ 'logging',
+ [
+ 'log_type',
+ 'log_action',
+ 'log_timestamp',
+ 'log_params',
+ ],
+ [
+ 'log_title' => $u->user_name,
+ 'log_type' => [ 'rights', 'translatorsandbox' ],
+ ],
+ __METHOD__,
+ [
+ 'ORDER BY' => 'log_id ASC',
+ ]
+ );
+
+ $promoted = null;
+ $method = 'normal';
+ foreach ( $logs as $log ) {
+ if ( $log->log_action === 'promoted' ) {
+ $promoted = $log->log_timestamp;
+ $method = 'sandbox';
+ break;
+ } elseif ( $log->log_action === 'rights' ) {
+ Wikimedia\suppressWarnings();
+ $data = unserialize( $log->log_params );
+ Wikimedia\restoreWarnings();
+ if ( $data === false ) {
+ $lines = explode( "\n", $log->log_params );
+ if ( strpos( $lines[1], 'translator' ) !== false ) {
+ $promoted = $log->log_timestamp;
+ break;
+ }
+ } elseif (
+ isset( $data['5::newgroups'] ) &&
+ in_array( 'translator', $data['5::newgroups'] )
+ ) {
+ $promoted = $log->log_timestamp;
+ break;
+ }
+ }
+ }
+
+ echo "{$u->user_name}\t{$u->user_registration}\t{$u->user_editcount}" .
+ "\t{$u->ug_group}\t{$promoted}\t{$method}\n";
+ }
+ }
+}
+
+$maintClass = TS::class;
+require_once RUN_MAINTENANCE_IF_MAIN;