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