jenkins-bot has submitted this change and it was merged.

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(-)

Approvals:
  Siebrand: Looks good to me, approved
  jenkins-bot: Verified



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..6070f5d 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.Deferred}
+        */
+       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: merged
Gerrit-Change-Id: If441f760a959626f82511d5078d48e8b8c5261be
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/Translate
Gerrit-Branch: master
Gerrit-Owner: Nikerabbit <[email protected]>
Gerrit-Reviewer: Amire80 <[email protected]>
Gerrit-Reviewer: Siebrand <[email protected]>
Gerrit-Reviewer: jenkins-bot

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to