Nikerabbit has uploaded a new change for review.
https://gerrit.wikimedia.org/r/59127
Change subject: Reminding functionality for sandbox
......................................................................
Reminding functionality for sandbox
Change-Id: If441f760a959626f82511d5078d48e8b8c5261be
---
M Resources.php
M Translate.php
M _autoload.php
M api/ApiTranslateSandbox.php
M resources/js/ext.translate.special.translatesandbox.js
M utils/TranslateSandbox.php
A utils/TranslateSandboxReminderJob.php
7 files changed, 199 insertions(+), 11 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Translate
refs/changes/27/59127/1
diff --git a/Resources.php b/Resources.php
index ea68c2e..e3227df 100644
--- a/Resources.php
+++ b/Resources.php
@@ -332,6 +332,7 @@
'dependencies' => array(
'mediawiki.api',
'jquery.uls.grid',
+ 'jquery.ui.dialog',
),
'messages' => array(
),
diff --git a/Translate.php b/Translate.php
index 3c22d13..58b9498 100644
--- a/Translate.php
+++ b/Translate.php
@@ -211,6 +211,7 @@
$wgJobClasses['MessageUpdateJob'] = 'MessageUpdateJob';
$wgJobClasses['MessageGroupStatesUpdaterJob'] = 'MessageGroupStatesUpdaterJob';
$wgJobClasses['TTMServerMessageUpdateJob'] = 'TTMServerMessageUpdateJob';
+$wgJobClasses['TranslateSandboxReminderJob'] = 'TranslateSandboxReminderJob';
require( "$dir/Resources.php" );
diff --git a/_autoload.php b/_autoload.php
index cefd26e..b5b5d72 100644
--- a/_autoload.php
+++ b/_autoload.php
@@ -99,6 +99,7 @@
$wgAutoloadClasses['TranslateRcFilter'] = "$dir/utils/RcFilter.php";
$wgAutoloadClasses['TranslateRegistrationStats'] =
"$dir/specials/SpecialTranslationStats.php";
$wgAutoloadClasses['TranslateSandbox'] = "$dir/utils/TranslateSandbox.php";
+$wgAutoloadClasses['TranslateSandboxReminderJob'] =
"$dir/utils/TranslateSandboxReminderJob.php";
$wgAutoloadClasses['TranslateStatsOutput'] =
"$dir/scripts/groupStatistics.php";
$wgAutoloadClasses['TranslateToolbox'] = "$dir/utils/ToolBox.php";
$wgAutoloadClasses['TranslateYaml'] = "$dir/utils/TranslateYaml.php";
diff --git a/api/ApiTranslateSandbox.php b/api/ApiTranslateSandbox.php
index 0564072..7011e97 100644
--- a/api/ApiTranslateSandbox.php
+++ b/api/ApiTranslateSandbox.php
@@ -30,6 +30,9 @@
case 'promote':
$this->doPromote();
break;
+ case 'remind':
+ $this->doRemind();
+ break;
}
}
@@ -70,7 +73,6 @@
) );
$this->getResult()->addValue( null, $this->getModuleName(),
$output );
-
}
protected function doDelete() {
@@ -101,6 +103,24 @@
}
}
+ protected function doRemind() {
+ $params = $this->extractRequestParams();
+
+ // Do validations
+ foreach ( explode( '|', 'subject|body' ) as $field ) {
+ if ( !isset( $params[$field] ) ) {
+ $this->dieUsage( "Missing parameter $field",
'missingparam' );
+ }
+ }
+
+ $user = User::newFromId( $params['userid'] );
+ try {
+ TranslateSandbox::sendReminder( $this->getUser(),
$user, $params['subject'], $params['body'] );
+ } catch ( MWException $e ) {
+ $this->dieUsage( $e->getMessage(), 'invalidparam' );
+ }
+ }
+
public function mustBePosted() {
return true;
}
@@ -126,7 +146,7 @@
public function getAllowedParams() {
return array(
'do' => array(
- ApiBase::PARAM_TYPE => array( 'create',
'delete', 'promote' ),
+ ApiBase::PARAM_TYPE => array( 'create',
'delete', 'promote', 'remind' ),
ApiBase::PARAM_REQUIRED => true,
),
'userid' => array(
@@ -137,15 +157,11 @@
ApiBase::PARAM_TYPE => 'string',
ApiBase::PARAM_REQUIRED => true,
),
- 'username' => array(
- ApiBase::PARAM_TYPE => 'string',
- ),
- 'password' => array(
- ApiBase::PARAM_TYPE => 'string',
- ),
- 'email' => array(
- ApiBase::PARAM_TYPE => 'string',
- ),
+ 'username' => array( ApiBase::PARAM_TYPE => 'string' ),
+ 'password' => array( ApiBase::PARAM_TYPE => 'string' ),
+ 'email' => array( ApiBase::PARAM_TYPE => 'string' ),
+ 'subject' => array( ApiBase::PARAM_TYPE => 'string' ),
+ 'body' => array( ApiBase::PARAM_TYPE => 'string' ),
);
}
@@ -158,6 +174,8 @@
'username' => 'Username when creating user',
'password' => 'Password when creating user',
'email' => 'Email when creating user',
+ 'subject' => 'Subject of the reminder email when
reminding',
+ 'body' => 'Body of the reminder email when reminding',
);
}
diff --git a/resources/js/ext.translate.special.translatesandbox.js
b/resources/js/ext.translate.special.translatesandbox.js
index 98dd2e6..ff22553 100644
--- a/resources/js/ext.translate.special.translatesandbox.js
+++ b/resources/js/ext.translate.special.translatesandbox.js
@@ -21,6 +21,94 @@
;
}
+ /**
+ * Gets arbitrary messages in chosen language via the API.
+ * @param {Array} names Message keys.
+ * @param {String} [language] Language to use. Defaults to English.
+ * @return {jQuery.Deferres}
+ */
+ function getMessages( names, language ) {
+ var api, req, deferred;
+
+ api = new mw.Api();
+ deferred = new $.Deferred();
+
+ req = api.post( {
+ action: 'query',
+ meta: 'allmessages',
+ ammessages: names.join( '|' ),
+ amlang: language || 'en'
+ } );
+
+ req.done( function ( data ) {
+ var i,
+ output = {};
+
+ for ( i = 0; i < data.query.allmessages.length; i++ ) {
+ output[data.query.allmessages[i].name] =
data.query.allmessages[i]['*'];
+ }
+
+ deferred.resolve( output );
+ } );
+
+ req.fail( deferred.reject );
+
+ return deferred;
+ }
+
+ /**
+ * Dialog where the user can tweak reminder email if wanted.
+ * @param {jQuery} $request
+ */
+ function reminderDialog( $request ) {
+ var $dialog, keys;
+
+ keys = ['tsb-reminder-title-generic',
'tsb-reminder-content-generic' ];
+ getMessages( keys ).done( function ( data ) {
+
+ $dialog = $( '<div class="grid">' ).append(
+ $( '<form>' ).append(
+ $( '<div class="row">' ).append(
+ $( '<div class="three columns
text-left">' ).text( "From:" ),
+ $( '<div class="nine columns">'
).text( mw.config.get( 'wgUserName' ) + ' <your email>' )
+ ),
+ $( '<div class="row">' ).append(
+ $( '<div class="three
columns">' ).text( "To:" ),
+ $( '<div class="nine columns">'
).text( $request.find( '.email' ).text() )
+ ),
+ $( '<div class="row">' ).append(
+ $( '<div class="three
columns">' ).text( "Subject:" ),
+ $( '<input class="nine columns
subject">' ).val( data['tsb-reminder-title-generic'] )
+ ),
+ $( '<div class="row">' ).append(
+ $( '<div class="three
columns">' ).text( "Body:" ),
+ $( '<textarea class="nine
columns body">' ).val( data['tsb-reminder-content-generic'] )
+ )
+ )
+ );
+
+ $dialog.dialog( {
+ autoOpen: true,
+ modal: true,
+ width: '650px',
+ buttons: {
+ "Send": function () {
+ doApiAction( {
+ userid: $request.data(
'data' ).id,
+ 'do': 'remind',
+ subject: $dialog.find(
'.subject' ).val(),
+ body: $dialog.find(
'.body' ).val()
+ } );
+ $( this ).dialog( "destroy" );
+ },
+ "Cancel": function () {
+ $( this ).dialog( "destroy" );
+ }
+ }
+ } );
+ } );
+ }
+
$( document ).ready( function () {
var $requests, $detailsPane;
@@ -55,6 +143,12 @@
} );
} ),
$( '<button>' )
+ .addClass( 'remind
button' )
+ .text( 'Send email
reminder' )
+ .on( 'click', function
() {
+ reminderDialog(
$this );
+ } ),
+ $( '<button>' )
.addClass( 'delete
destructive button' )
.text( 'Delete' )
.on( 'click', function
() {
diff --git a/utils/TranslateSandbox.php b/utils/TranslateSandbox.php
index 5e21f43..bb015f1 100644
--- a/utils/TranslateSandbox.php
+++ b/utils/TranslateSandbox.php
@@ -98,6 +98,33 @@
}
}
+ /**
+ * Sends a reminder to the user.
+ * @param User $sender
+ * @param User $target
+ * @param string $subject Subject of the email.
+ * @param string $body Body of the email.
+ * @throws MWException
+ */
+ public static function sendReminder( User $sender, User $target,
$subject, $body ) {
+ global $wgTranslateSandboxPromotedGroup, $wgNoReplyAddress;
+
+ if ( !in_array( 'translate-sandboxed', $target->getGroups(),
true ) ) {
+ throw new MWException( "Not a sandboxed user" );
+ }
+
+ $params = array(
+ 'user' => $target->getId(),
+ 'to' => $target->getEmail(),
+ 'from' => $sender->getEmail(),
+ 'replyto' => $wgNoReplyAddress,
+ 'subj' => $subject,
+ 'body' => $body,
+ );
+
+ TranslateSandboxReminderJob::newJob( $params )->insert();
+ }
+
/// Hook: UserGetRights
public static function enforcePermissions( User $user, array &$rights )
{
global $wgTranslateUseSandbox;
@@ -115,4 +142,13 @@
// Do not let other hooks add more actions
return false;
}
+
+ ///Hook: onGetPreferences
+ public static function onGetPreferences( $user, &$preferences ) {
+ $preferences['translate-sandbox-reminders'] = array(
+ 'type' => 'api',
+ );
+
+ return true;
+ }
}
diff --git a/utils/TranslateSandboxReminderJob.php
b/utils/TranslateSandboxReminderJob.php
new file mode 100644
index 0000000..56bca11
--- /dev/null
+++ b/utils/TranslateSandboxReminderJob.php
@@ -0,0 +1,37 @@
+<?php
+
+
+class TranslateSandboxReminderJob extends Job {
+ public function newJob( array $params ) {
+ return new self( Title::newMainPage(), $params );
+ }
+
+ function __construct( $title, $params, $id = 0 ) {
+ parent::__construct( __CLASS__, $title, $params, $id );
+ }
+
+ function run() {
+ $status = UserMailer::send(
+ $this->params['to'],
+ $this->params['from'],
+ $this->params['subj'],
+ $this->params['body'],
+ $this->params['replyto']
+ );
+
+ if ( $status->isOK() ) {
+ $user = User::newFromId( 'user' );
+ $reminders = $user->getOption(
'translate-sandbox-reminders' );
+ if ( $reminders ) {
+ $reminders = explode( '|', $reminders );
+ } else {
+ $reminders = array();
+ }
+ $reminders[] = wfTimestamp();
+ $user->setOption( 'translate-sandbox-reminders',
implode( '|', $reminders ) );
+ $user->saveSettings();
+ }
+
+ return $status->isOk();
+ }
+}
--
To view, visit https://gerrit.wikimedia.org/r/59127
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: If441f760a959626f82511d5078d48e8b8c5261be
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Translate
Gerrit-Branch: master
Gerrit-Owner: Nikerabbit <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits