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

Revision: 84637
Author:   tparscal
Date:     2011-03-23 21:52:41 +0000 (Wed, 23 Mar 2011)
Log Message:
-----------
Fixes more issues in r84535
* User rating expiration is now based on user ratings
* When no ratings are current, the API still shows the user ratings if they 
exist
* Made the user interface respond to user ratings independent of totals

Modified Paths:
--------------
    trunk/extensions/ArticleFeedback/api/ApiQueryArticleFeedback.php
    
trunk/extensions/ArticleFeedback/modules/jquery.articleFeedback/jquery.articleFeedback.js

Modified: trunk/extensions/ArticleFeedback/api/ApiQueryArticleFeedback.php
===================================================================
--- trunk/extensions/ArticleFeedback/api/ApiQueryArticleFeedback.php    
2011-03-23 21:45:32 UTC (rev 84636)
+++ trunk/extensions/ArticleFeedback/api/ApiQueryArticleFeedback.php    
2011-03-23 21:52:41 UTC (rev 84637)
@@ -13,7 +13,6 @@
                
                $this->addTables( array( 'article_feedback_pages', 
'article_feedback_ratings' ) );
                $this->addFields( array(
-                       'aap_page_id',
                        'MAX(aap_revision) as aap_revision',
                        'SUM(aap_total) as aap_total',
                        'SUM(aap_count) as aap_count',
@@ -32,59 +31,74 @@
                $this->addOption( 'GROUP BY', 'aap_rating_id' );
                $this->addOption( 'LIMIT', count( $wgArticleFeedbackRatings ) );
 
+               // Rating counts and totals
                $res = $this->select( __METHOD__ );
-
-               if ( $params['userrating'] ) {
-                       $userRatings = $this->getUserRatings( $params );
-               }
-
-               $ratings = array();
-
-               $userRatedArticle = false;
-
-               $rev = null;
+               $ratings = array( $params['pageid'] => array( 'pageid' => 
$params['pageid'] ) );
                foreach ( $res as $i => $row ) {
-                       // All the revs and pageIds will be the same for all 
rows, these are shortcuts
-                       $pageId = $row->aap_page_id;
-                       // This is special however, because we need this data 
later for expired calculation
-                       $rev = $row->aap_revision;
-
-                       if ( !isset( $ratings[$pageId] ) ) {
-                               $page = array(
-                                       'pageid' => $pageId,
-                                       'revid' => $rev,
-                               );
-
-                               if ( $params['userrating'] ) {
-                                       if ( isset( 
$userRatings[$i]['expertise'] ) ) {
-                                               $page['expertise'] = 
$userRatings[$i]['expertise'];
-                                       }
-                               }
-
-                               $ratings[$pageId] = $page;
+                       if ( !isset( $ratings[$params['pageid']] ) ) {
+                               $ratings[$params['pageid']]['revid'] = 
$row->aap_revision;
                        }
-
-                       $thisRow = array(
+                       if ( !isset( $ratings[$params['pageid']]['ratings'] ) ) 
{
+                               $ratings[$params['pageid']]['ratings'] = 
array();
+                       }
+                       $ratings[$params['pageid']]['ratings'][] = array(
                                'ratingid' => $row->aap_rating_id,
                                'ratingdesc' => $row->aar_rating,
                                'total' => $row->aap_total,
                                'count' => $row->aap_count,
                        );
-
-                       if ( $params['userrating'] && isset( 
$userRatings[$i]['value'] ) ) {
-                               $thisRow['userrating'] = 
$userRatings[$i]['value'];
-
-                               $userRatedArticle = true;
+               }
+               
+               // User ratings
+               $ratings[$params['pageid']]['status'] = 'current';
+               if ( $params['userrating'] ) {
+                       $userRatings = $this->getUserRatings( $params );
+                       if ( isset( $ratings[$params['pageid']]['ratings'] ) ) {
+                               // Valid ratings already exist
+                               foreach ( 
$ratings[$params['pageid']]['ratings'] as $i => $rating ) {
+                                       // Rating value
+                                       
$ratings[$params['pageid']]['ratings'][$i]['userrating'] =
+                                               
$userRatings[$rating['ratingid']]['value'];
+                                       // Expertise
+                                       if ( !isset( 
$ratings[$params['pageid']]['expertise'] ) ) {
+                                               
$ratings[$params['pageid']]['expertise'] =
+                                                       
$userRatings[$rating['ratingid']]['expertise'];
+                                       }
+                                       // Expiration
+                                       if ( 
$userRatings[$rating['ratingid']]['revision'] < $revisionLimit ) {
+                                               
$ratings[$params['pageid']]['status'] = 'expired';
+                                       }
+                               }
+                       } else {
+                               // No valid ratings exist
+                               if ( count( $userRatings ) ) {
+                                       $ratings[$params['pageid']]['status'] = 
'expired';
+                               }
+                               foreach ( $userRatings as $ratingId => 
$userRating ) {
+                                       // Revision
+                                       if ( !isset( 
$ratings[$params['pageid']]['revid'] ) ) {
+                                               
$ratings[$params['pageid']]['revid'] = $userRating['revision'];
+                                       }
+                                       // Ratings
+                                       if ( !isset( 
$ratings[$params['pageid']]['ratings'] ) ) {
+                                               
$ratings[$params['pageid']]['ratings'] = array();
+                                       }
+                                       // Rating value
+                                       
$ratings[$params['pageid']]['ratings'][] = array(
+                                               'ratingid' => $ratingId,
+                                               'ratingdesc' => 
$userRating['text'],
+                                               'total' => 0,
+                                               'count' => 0,
+                                               'userrating' => 
$userRating['value'],
+                                       );
+                                       // Expertise
+                                       if ( !isset( 
$ratings[$params['pageid']]['expertise'] ) ) {
+                                               
$ratings[$params['pageid']]['expertise'] = $userRating['expertise'];
+                                       }
+                               }
                        }
-
-                       $ratings[$pageId]['ratings'][] = $thisRow;
                }
 
-               // Ratings can only be expired if the user has rated before
-               if ( $params['userrating'] && $userRatedArticle ) {
-                       $ratings[$params['pageid']]['status'] = $rev >= 
$revisionLimit ? 'current' : 'expired';
-               }
-
                foreach ( $ratings as $rat ) {
                        $result->setIndexedTagName( $rat['ratings'], 'r' );
                        $result->addValue( array( 'query', 
$this->getModuleName() ), null, $rat );
@@ -107,11 +121,16 @@
                        $token = $params['anontoken'];
                }
 
-               $dbr = wfGetDb( DB_SLAVE );
-               $res = $dbr->select(
-                       array( 'article_feedback', 
'article_feedback_properties' ),
-                       array( 'aa_rating_id', 'aa_rating_value', 
'afp_value_text' ),
+               $res = $this->getDB()->select(
+                       array( 'article_feedback', 
'article_feedback_properties', 'article_feedback_ratings' ),
                        array(
+                               'aa_rating_id',
+                               'aar_rating',
+                               'aa_revision',
+                               'aa_rating_value',
+                               'afp_value_text'
+                       ),
+                       array(
                                'aa_page_id' => $pageId,
                                'aa_rating_id' => $wgArticleFeedbackRatings,
                                'aa_user_id' => $wgUser->getId(),
@@ -121,21 +140,26 @@
                                'ORDER BY' => 'aa_revision DESC',
                                'LIMIT' => count( $wgArticleFeedbackRatings )
                        ),
-                       array( 'article_feedback_properties' => array(
-                               'LEFT JOIN', array(
-                                       'afp_revision=aa_revision',
-                                       'afp_user_text=aa_user_text',
-                                       
'afp_user_anon_token=aa_user_anon_token',
-                                       'aa_user_anon_token' => $token,
-                                       'afp_key' => 'expertise',
-                               )
-                       ) )
+                       array(
+                               'article_feedback_properties' => array(
+                                       'LEFT JOIN', array(
+                                               'afp_revision=aa_revision',
+                                               'afp_user_text=aa_user_text',
+                                               
'afp_user_anon_token=aa_user_anon_token',
+                                               'aa_user_anon_token' => $token,
+                                               'afp_key' => 'expertise',
+                                       )
+                               ),
+                               'article_feedback_ratings' => array( 'LEFT 
JOIN', array( 'aar_id=aa_rating_id' ) )
+                       )
                );
                $ratings = array();
                foreach ( $res as $row ) {
                        $ratings[$row->aa_rating_id] = array(
                                'value' => $row->aa_rating_value,
-                               'expertise' => $row->afp_value_text
+                               'expertise' => $row->afp_value_text,
+                               'revision' => $row->aa_revision,
+                               'text' => $row->aar_rating,
                        );
                }
                return $ratings;
@@ -150,8 +174,7 @@
        protected function getRevisionLimit( $pageId ) {
                global $wgArticleFeedbackRatingLifetime;
 
-               $dbr = wfGetDb( DB_SLAVE );
-               $revision = $dbr->selectField(
+               $revision = $this->getDB()->selectField(
                        'revision',
                        'rev_id',
                        array( 'rev_page' => $pageId ),

Modified: 
trunk/extensions/ArticleFeedback/modules/jquery.articleFeedback/jquery.articleFeedback.js
===================================================================
--- 
trunk/extensions/ArticleFeedback/modules/jquery.articleFeedback/jquery.articleFeedback.js
   2011-03-23 21:45:32 UTC (rev 84636)
+++ 
trunk/extensions/ArticleFeedback/modules/jquery.articleFeedback/jquery.articleFeedback.js
   2011-03-23 21:52:41 UTC (rev 84637)
@@ -247,6 +247,7 @@
                                                                }
                                                        }
                                                }
+                                               // Report
                                                if ( typeof ratingData === 
'undefined' || ratingData.total == 0 ) {
                                                        // Setup in "no 
ratings" mode
                                                        $(this)
@@ -258,9 +259,7 @@
                                                                        .end()
                                                                .find( 
'.articleFeedback-rating-count' )
                                                                        .text( 
mw.msg( 'articlefeedback-report-empty' ) )
-                                                                       .end()
-                                                               .find( 'input' )
-                                                                       .attr( 
'checked', false );
+                                                                       .end();
                                                } else {
                                                        // Setup using 
ratingData
                                                        var average = 
ratingData.total / ratingData.count;
@@ -276,11 +275,24 @@
                                                                        .text( 
mw.msg(
                                                                                
'articlefeedback-report-ratings', ratingData.count
                                                                        ) )
-                                                                       .end()
-                                                               .find( 
'input[value="' + ratingData.userrating + '"]' )
+                                                                       .end();
+                                               }
+                                               // Form
+                                               if ( typeof 
ratingData.userrating !== 'undefined' ) {
+                                                       if ( 
ratingData.userrating === 0 ) {
+                                                               $(this)
+                                                                       .find( 
'input' )
+                                                                       .attr( 
'checked', false );
+                                                       } else {
+                                                               $(this)
+                                                                       .find( 
'input[value="' + ratingData.userrating + '"]' )
                                                                        .attr( 
'checked', true );
-                                                       // If any ratings 
exist, make sure expertise is enabled so users can suppliment their ratings.
-                                                       
$.articleFeedback.fn.enableExpertise( context.$ui.find( 
'.articleFeedback-expertise' ) );
+                                                       }
+                                                       // If any ratings 
exist, make sure expertise is enabled so users can
+                                                       // suppliment their 
ratings.
+                                                       
$.articleFeedback.fn.enableExpertise(
+                                                               
context.$ui.find( '.articleFeedback-expertise' )
+                                                       );
                                                }
                                                
$.articleFeedback.fn.updateRating.call( $(this) );
                                        } );


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

Reply via email to