http://www.mediawiki.org/wiki/Special:Code/MediaWiki/90033

Revision: 90033
Author:   aaron
Date:     2011-06-14 03:41:36 +0000 (Tue, 14 Jun 2011)
Log Message:
-----------
*Added API to set "currently reviewing" flag for pages and diffs
*(bug 25295) Added "You are being advertised as reviewing" message to review 
form. Currently removes flag when user leaves the page or it times out. A 
[stop] button and/or heartbeats could also be used with the API (with minor 
tweaks).
*Added JS TODO note

Modified Paths:
--------------
    trunk/extensions/FlaggedRevs/FlaggedRevs.php
    trunk/extensions/FlaggedRevs/dataclasses/FRUserActivity.php
    trunk/extensions/FlaggedRevs/presentation/RevisionReviewFormUI.php
    trunk/extensions/FlaggedRevs/presentation/language/RevisionReview.i18n.php
    trunk/extensions/FlaggedRevs/presentation/modules/review.js

Added Paths:
-----------
    trunk/extensions/FlaggedRevs/api/actions/ApiReviewActivity.php

Modified: trunk/extensions/FlaggedRevs/FlaggedRevs.php
===================================================================
--- trunk/extensions/FlaggedRevs/FlaggedRevs.php        2011-06-14 03:23:47 UTC 
(rev 90032)
+++ trunk/extensions/FlaggedRevs/FlaggedRevs.php        2011-06-14 03:41:36 UTC 
(rev 90033)
@@ -329,6 +329,9 @@
 # Page review module for API
 $wgAutoloadClasses['ApiReview'] = $apiActionDir . 'ApiReview.php';
 $wgAPIModules['review'] = 'ApiReview';
+# Page review activity module for API
+$wgAutoloadClasses['ApiReviewActivity'] = $apiActionDir . 
'ApiReviewActivity.php';
+$wgAPIModules['reviewactivity'] = 'ApiReviewActivity';
 # Stability config module for API
 $wgAutoloadClasses['ApiStabilize'] = $apiActionDir . 'ApiStabilize.php';
 $wgAutoloadClasses['ApiStabilizeGeneral'] = $apiActionDir . 'ApiStabilize.php';

Added: trunk/extensions/FlaggedRevs/api/actions/ApiReviewActivity.php
===================================================================
--- trunk/extensions/FlaggedRevs/api/actions/ApiReviewActivity.php              
                (rev 0)
+++ trunk/extensions/FlaggedRevs/api/actions/ApiReviewActivity.php      
2011-06-14 03:41:36 UTC (rev 90033)
@@ -0,0 +1,147 @@
+<?php
+
+/*
+ * Created on June 13, 2011
+ *
+ * API module for MediaWiki's FlaggedRevs extension
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/**
+ * API module to set the "currently reviewing" status of revisions
+ *
+ * @ingroup FlaggedRevs
+ */
+class ApiReviewActivity extends ApiBase {
+
+       /**
+        * This function does essentially the same as 
RevisionReview::AjaxReview,
+        * except that it generates the template and image parameters itself.
+        */
+       public function execute() {
+               global $wgUser;
+               $params = $this->extractRequestParams();
+               // Check basic permissions
+               if ( !$wgUser->isAllowed( 'review' ) ) {
+                       $this->dieUsage( "You don't have the right to review 
revisions.",
+                               'permissiondenied' );
+               } elseif ( $wgUser->isBlocked( false ) ) {
+                       $this->dieUsageMsg( array( 'blockedtext' ) );
+               }
+
+               $newRev = Revision::newFromId( $params['newid'] );
+               if ( !$newRev || !$newRev->getTitle() ) {
+                       $this->dieUsage( "Cannot find a revision with the 
specified ID.", 'notarget' );
+               }
+               $title = $newRev->getTitle();
+
+               $fa = FlaggedPage::getTitleInstance( $title );
+               if ( !$fa->isReviewable() ) {
+                       $this->dieUsage( "Provided page is not reviewable.", 
'notreviewable' );
+               }
+
+               $status = false;
+               if ( $params['oldid'] ) { // changes
+                       $oldRev = Revision::newFromId( $params['oldid'] );
+                       if ( !$oldRev || $oldRev->getPage() != 
$newRev->getPage() ) {
+                               $this->dieUsage( "Revisions do not belong to 
the same page.", 'notarget' );
+                       }
+                       // Mark as reviewing...
+                       if ( $params['reviewing'] ) {
+                               $status = FRUserActivity::setUserReviewingDiff(
+                                       $wgUser, $params['oldid'], 
$params['newid'] );
+                       // Unmark as reviewing...
+                       } else {
+                               $status = 
FRUserActivity::clearUserReviewingDiff(
+                                       $wgUser, $params['oldid'], 
$params['newid'] );
+                       }
+               } else {
+                       // Mark as reviewing...
+                       if ( $params['reviewing'] ) {
+                               $status = FRUserActivity::setUserReviewingPage( 
$wgUser, $newRev->getPage() );
+                       // Unmark as reviewing...
+                       } else {
+                               $status = 
FRUserActivity::clearUserReviewingPage( $wgUser, $newRev->getPage() );
+                       }
+               }
+
+               # Success in setting flag...
+               if ( $status === true ) {
+                       $this->getResult()->addValue(
+                               null, $this->getModuleName(), array( 'result' 
=> 'Success' ) );
+               # Failure...
+               } else {
+                       $this->getResult()->addValue(
+                               null, $this->getModuleName(), array( 'result' 
=> 'Failure' ) );
+               }
+       }
+
+       public function mustBePosted() {
+               return true;
+       }
+
+       public function isWriteMode() {
+               return true;
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'oldid'         => null,
+                       'newid'         => null,
+                       'reviewing' => array( ApiBase::PARAM_TYPE => array( 0, 
1 ) )
+               );
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'oldid'         => 'The old revision ID (for reviewing 
changes or pages)',
+                       'newid'         => 'The new revision ID (for reviewing 
changes only)',
+                       'reviewing' => 'Whether to advertising as reviewing or 
no longer reviewing',
+               );
+       }
+
+       public function getDescription() {
+               return 'Advertise or de-advertise yourself as reviewing an 
unreviewed page or unreviewed changes';
+       }
+
+       public function getPossibleErrors() {
+               return array_merge( parent::getPossibleErrors(), array(
+                       array( 'code' => 'notarget',
+                               'info' => 'Provided revision or page can not be 
found.' ),
+                       array( 'code' => 'notreviewable',
+                               'info' => 'Provided page is not reviewable.' ),
+                       array( 'code' => 'permissiondenied',
+                               'info' => 'Insufficient rights to set the 
activity flag.' ),
+               ) );
+       }
+
+       public function needsToken() {
+               return false;
+       }
+
+    public function getTokenSalt() {
+               return false;
+       }
+
+       protected function getExamples() {
+               return 'api.php?action=reviewactivity&pageid=12345&reviewing=1';
+       }
+
+       public function getVersion() {
+               return __CLASS__ . ': $Id$';
+       }
+}


Property changes on: 
trunk/extensions/FlaggedRevs/api/actions/ApiReviewActivity.php
___________________________________________________________________
Added: svn:keywords
   + Id
Added: svn:eol-style
   + native

Modified: trunk/extensions/FlaggedRevs/dataclasses/FRUserActivity.php
===================================================================
--- trunk/extensions/FlaggedRevs/dataclasses/FRUserActivity.php 2011-06-14 
03:23:47 UTC (rev 90032)
+++ trunk/extensions/FlaggedRevs/dataclasses/FRUserActivity.php 2011-06-14 
03:41:36 UTC (rev 90033)
@@ -90,19 +90,25 @@
        * Clear the flag for who is reviewing a page
        * @param User $user
        * @param int $pageId
+       * @return bool flag unset
        */
        public static function clearUserReviewingPage( $user, $pageId ) {
                global $wgMemc;
                $key = wfMemcKey( 'flaggedrevs', 'userReviewingPage', $pageId );
                $wgMemc->lock( $key, 4 ); // 4 sec timeout
                $val = $wgMemc->get( $key );
+               $wasSet = false;
+
                if ( is_array( $val ) && count( $val ) == 2 ) { // flag set
                        list( $u, $ts ) = $val;
                        if ( $u === $user->getName() ) {
                                $wgMemc->delete( $key );
+                               $wasSet = true;
                        }
                }
                $wgMemc->unlock( $key );
+
+               return $wasSet;
        }
 
        /*
@@ -159,18 +165,24 @@
        * @param User $user
        * @param int $oldId
        * @param int $newId
+       * @return bool flag unset
        */
        public static function clearUserReviewingDiff( $user, $oldId, $newId ) {
                global $wgMemc;
                $key = wfMemcKey( 'flaggedrevs', 'userReviewingDiff', $oldId, 
$newId );
                $wgMemc->lock( $key, 4 ); // 4 sec timeout
                $val = $wgMemc->get( $key );
+               $wasSet = false;
+
                if ( is_array( $val ) && count( $val ) == 2 ) { // flag set
                        list( $u, $ts ) = $val;
                        if ( $u === $user->getName() ) {
                                $wgMemc->delete( $key );
+                               $wasSet = true;
                        }
                }
                $wgMemc->unlock( $key );
+               
+               return $wasSet;
        }
 }

Modified: trunk/extensions/FlaggedRevs/presentation/RevisionReviewFormUI.php
===================================================================
--- trunk/extensions/FlaggedRevs/presentation/RevisionReviewFormUI.php  
2011-06-14 03:23:47 UTC (rev 90032)
+++ trunk/extensions/FlaggedRevs/presentation/RevisionReviewFormUI.php  
2011-06-14 03:41:36 UTC (rev 90033)
@@ -121,12 +121,22 @@
                } else {
                        list( $u, $ts ) = FRUserActivity::getUserReviewingPage( 
$this->rev->getPage() );
                }
-               if ( $u !== null && $u != $this->user->getName() ) {
-                       $msg = $priorRevId ? 'revreview-poss-conflict-c' : 
'revreview-poss-conflict-p';
-                       $form .= '<p><span class="fr-under-review">' .
-                               wfMsgExt( $msg, 'parseinline',
-                                       $u, $wgLang->date( $ts, true ), 
$wgLang->time( $ts, true ) ) .
-                               '</span></p>';
+               if ( $u !== null ) { // page under review...
+                       $form .= '<p><span class="fr-under-review">';
+                       if ( $u != $this->user->getName() ) { // by another 
user...
+                               $msg = $priorRevId
+                                       ? 'revreview-poss-conflict-c'
+                                       : 'revreview-poss-conflict-p';
+                               $form .= wfMsgExt( $msg, 'parseinline',
+                                       $u, $wgLang->date( $ts, true ), 
$wgLang->time( $ts, true ) );
+                       } else { // by this user...
+                               $msg = $priorRevId
+                                       ? 'revreview-adv-reviewing-c'
+                                       : 'revreview-adv-reviewing-p';
+                               $form .= wfMsgExt( $msg, 'parseinline',
+                                       $wgLang->date( $ts, true ), 
$wgLang->time( $ts, true ) );
+                       }
+                       $form .= '</span></p>';
                }
 
                if ( $disabled ) {
@@ -178,8 +188,8 @@
                # Hidden params
                $form .= Html::hidden( 'title', $reviewTitle->getPrefixedText() 
) . "\n";
                $form .= Html::hidden( 'target', 
$article->getTitle()->getPrefixedDBKey() ) . "\n";
-               $form .= Html::hidden( 'refid', $priorRevId ) . "\n";
-               $form .= Html::hidden( 'oldid', $revId ) . "\n";
+               $form .= Html::hidden( 'refid', $priorRevId, array( 'id' => 
'mw-fr-input-refid' ) ) . "\n";
+               $form .= Html::hidden( 'oldid', $revId, array( 'id' => 
'mw-fr-input-oldid' ) ) . "\n";
                $form .= Html::hidden( 'action', 'submit' ) . "\n";
                $form .= Html::hidden( 'wpEditToken', $this->user->editToken() 
) . "\n";
                $form .= Html::hidden( 'changetime', $reviewTime,

Modified: 
trunk/extensions/FlaggedRevs/presentation/language/RevisionReview.i18n.php
===================================================================
--- trunk/extensions/FlaggedRevs/presentation/language/RevisionReview.i18n.php  
2011-06-14 03:23:47 UTC (rev 90032)
+++ trunk/extensions/FlaggedRevs/presentation/language/RevisionReview.i18n.php  
2011-06-14 03:41:36 UTC (rev 90033)
@@ -63,6 +63,8 @@
        'revreview-successful2'        => '\'\'\'Revision of [[:$1|$1]] 
successfully unflagged.\'\'\'',
        'revreview-poss-conflict-p'    => '\'\'\'Warning: [[User:$1|$1]] 
started reviewing this page on $2 at $3.\'\'\'',
        'revreview-poss-conflict-c'    => '\'\'\'Warning: [[User:$1|$1]] 
started reviewing these changes on $2 at $3.\'\'\'',
+       'revreview-adv-reviewing-p'    => '\'\'\'Notice: You are being 
advertised as having started reviewing this page on $1 at $2.\'\'\'',
+       'revreview-adv-reviewing-c'    => '\'\'\'Notice: You are being 
advertised as having started reviewing these changes on $1 at $2.\'\'\'',
        'revreview-toolow'             => '\'\'\'You must rate each of the 
attributes higher than "inadequate" in order for a revision to be considered 
reviewed.\'\'\'
 
 To remove the review status of a revision, click "unaccept".

Modified: trunk/extensions/FlaggedRevs/presentation/modules/review.js
===================================================================
--- trunk/extensions/FlaggedRevs/presentation/modules/review.js 2011-06-14 
03:23:47 UTC (rev 90032)
+++ trunk/extensions/FlaggedRevs/presentation/modules/review.js 2011-06-14 
03:41:36 UTC (rev 90033)
@@ -217,6 +217,9 @@
                return false; // don't do normal non-AJAX submit
        },
        
+       /*
+       * Update form elements after AJAX review.
+       */
        'updateReviewForm': function( form, response ) {
                var msg = response.substr(6); // remove <err#> or <suc#>
                // Read new "last change time" timestamp for conflict handling
@@ -313,6 +316,37 @@
                if( diffHeaderItems && response != '' ) {
                        diffHeaderItems.innerHTML = response;
                }
+       },
+       
+       /*
+       * Flag users as "no longer reviewing"
+       */
+       'deadvertiseReviewing': function() {
+               var form = document.getElementById('mw-fr-reviewform');
+               if( form ) {
+                       var oRevId = 
document.getElementById('mw-fr-input-refid').value;
+                       var nRevId = 
document.getElementById('mw-fr-input-oldid').value;
+               } else if( location.href.indexOf('&reviewing=1') != -1 ) {
+                       var oRevId = 0;
+                       var nRevId = mw.config.get('wgCurRevisionId');
+               }
+               if ( nRevId > 0 ) {
+                       // Send GET request via AJAX!
+                       var call = jQuery.ajax({
+                               url             : wgScriptPath + '/api.php',
+                               data    : {
+                                       action          : 'reviewactivity',
+                                       oldid           : oRevId,
+                                       newid           : nRevId,
+                                       reviewing       : 0
+                               },
+                               type    : "POST",
+                               dataType: "html", // response type
+                               timeout : 2500, // don't delay user exiting
+                               async   : false
+                       });
+               }
+               return;
        }
 };
 
@@ -320,3 +354,8 @@
 FlaggedRevsReview.maybeDisableAcceptButton();
 FlaggedRevsReview.updateRatingFormColors();
 FlaggedRevsReview.enableAjaxReview();
+
+// Flag users as "no longer reviewing" on navigate-away
+// @TODO: This doesn't handle a user having the same diff open twice,
+// closing one, but reviewing in the other very well...
+window.onbeforeunload = FlaggedRevsReview.deadvertiseReviewing;


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

Reply via email to