| Index: trunk/extensions/PageTriage/PageTriage.php |
| — | — | @@ -78,7 +78,11 @@ |
| 79 | 79 | $wgHooks['ArticleInsertComplete'][] = 'PageTriageHooks::onArticleInsertComplete'; |
| 80 | 80 | $wgHooks['ArticleSaveComplete'][] = 'PageTriageHooks::onArticleSaveComplete'; |
| 81 | 81 | $wgHooks['UnitTestsList'][] = 'efPageTriageUnitTests'; // unit tests |
| | 82 | +$wgHooks['GetPreferences'][] = 'PageTriageHooks::onGetPreferences'; |
| | 83 | +$wgHooks['ArticleViewHeader'][] = 'PageTriageHooks::onArticleViewHeader'; |
| 82 | 84 | |
| | 85 | +$wgPageTriageMarkPatrolledLinkExpiry = 3600 * 24 * 30; // 30 days |
| | 86 | + |
| 83 | 87 | /** |
| 84 | 88 | * @param $updater DatabaseUpdater |
| 85 | 89 | * @return bool |
| — | — | @@ -144,3 +148,7 @@ |
| 145 | 149 | 'ext.pageTriage.views/ext.pageTriage.articleListItem.css' |
| 146 | 150 | ) |
| 147 | 151 | ); |
| | 152 | + |
| | 153 | +$wgResourceModules['ext.pageTriage.article'] = $ptResourceTemplate + array( |
| | 154 | + 'styles' => 'ext.pageTriage.article/ext.pageTriage.article.css', |
| | 155 | +); |
| Index: trunk/extensions/PageTriage/SpecialPageTriage.php |
| — | — | @@ -27,6 +27,11 @@ |
| 28 | 28 | $out = $this->getOutput(); |
| 29 | 29 | |
| 30 | 30 | // TODO: check user permissions, make sure they're logged in and have the pagepatrol userright |
| | 31 | + |
| | 32 | + global $wgUser; |
| | 33 | + $wgUser->setOption( 'pagetriage-lastuse', wfTimestampNow() ); |
| | 34 | + $wgUser->saveSettings(); |
| | 35 | + $wgUser->invalidateCache(); |
| 31 | 36 | |
| 32 | 37 | // Initialize variable to hold list view options |
| 33 | 38 | $opts = new FormOptions(); |
| Index: trunk/extensions/PageTriage/PageTriage.hooks.php |
| — | — | @@ -118,4 +118,51 @@ |
| 119 | 119 | $dbw->replace( 'pagetriage_page', array( 'ptrp_page_id' ), $row, __METHOD__ ); |
| 120 | 120 | } |
| 121 | 121 | |
| | 122 | + /** |
| | 123 | + * Add last time user visited the triage page to preferences. |
| | 124 | + * @param $user User object |
| | 125 | + * @param &$preferences Preferences object |
| | 126 | + */ |
| | 127 | + public static function onGetPreferences( $user, &$preferences ) { |
| | 128 | + $preferences['pagetriage-lastuse'] = array( |
| | 129 | + 'type' => 'hidden', |
| | 130 | + ); |
| | 131 | + |
| | 132 | + return true; |
| | 133 | + } |
| | 134 | + |
| | 135 | + /** |
| | 136 | + * Adds "mark as patrolled" link to articles |
| | 137 | + * |
| | 138 | + * @param &$article Article object to show link for. |
| | 139 | + * @param &$outputDone Set if there is no more output to do. |
| | 140 | + * @param &$pcache Set if you want to use the parser cache. |
| | 141 | + * @return type description |
| | 142 | + */ |
| | 143 | + public static function onArticleViewHeader( &$article, &$outputDone, &$pcache ) { |
| | 144 | + global $wgUser, $wgPageTriageMarkPatrolledLinkExpiry, $wgOut; |
| | 145 | + |
| | 146 | + $lastUse = $wgUser->getOption('pagetriage-lastuse'); |
| | 147 | + $lastUse = wfTimestamp( TS_UNIX, $lastUse ); |
| | 148 | + $now = wfTimestamp( TS_UNIX, wfTimestampNow() ); |
| | 149 | + |
| | 150 | + $periodSince = $now - $lastUse; |
| | 151 | + |
| | 152 | + if ( !$lastUse || $periodSince > $wgPageTriageMarkPatrolledLinkExpiry ) { |
| | 153 | + return true; |
| | 154 | + } |
| | 155 | + |
| | 156 | + if ( ! PageTriageUtil::doesPageNeedTriage( $article ) ) { |
| | 157 | + return true; |
| | 158 | + } |
| | 159 | + |
| | 160 | + $wgOut->addModules( array('ext.pageTriage.article') ); |
| | 161 | + |
| | 162 | + $msg = wfMessage( 'pagetriage-markpatrolled' )->parse(); |
| | 163 | + $html = Html::element( 'div', array( 'class' => 'mw-pagetriage-markpatrolled' ), $msg ); |
| | 164 | + |
| | 165 | + $wgOut->addHTML( $html ); |
| | 166 | + |
| | 167 | + return true; |
| | 168 | + } |
| 122 | 169 | } |
| Index: trunk/extensions/PageTriage/includes/PageTriageUtil.php |
| — | — | @@ -6,6 +6,34 @@ |
| 7 | 7 | class PageTriageUtil { |
| 8 | 8 | |
| 9 | 9 | /** |
| | 10 | + * Get whether or not a page needs triaging |
| | 11 | + * |
| | 12 | + * @param $article Article object |
| | 13 | + * |
| | 14 | + * @return Mixed null if the page is not in the triage system, |
| | 15 | + * otherwise whether or not the page is untriaged. |
| | 16 | + * Return convention is this way so that null and false are equivalent |
| | 17 | + * with a straight boolean test. |
| | 18 | + */ |
| | 19 | + public static function doesPageNeedTriage( $article ) { |
| | 20 | + if ( ! $article || ! $article->getId() ) { |
| | 21 | + throw new MWException( "Invalid argument to " . __METHOD__ ); |
| | 22 | + } |
| | 23 | + |
| | 24 | + $dbr = wfGetDB( DB_SLAVE ); |
| | 25 | + |
| | 26 | + $row = $dbr->selectRow( 'pagetriage_page', 'ptrp_triaged', |
| | 27 | + array( 'ptrp_page_id' => $article->getID() ) |
| | 28 | + ); |
| | 29 | + |
| | 30 | + if ( ! $row ) { |
| | 31 | + return null; |
| | 32 | + } |
| | 33 | + |
| | 34 | + return !(boolean)$row->ptrp_triaged; |
| | 35 | + } |
| | 36 | + |
| | 37 | + /** |
| 10 | 38 | * Get a list of stat for untriaged articles |
| 11 | 39 | * @return array |
| 12 | 40 | * |
| Index: trunk/extensions/PageTriage/modules/ext.pageTriage.article/ext.pageTriage.article.css |
| — | — | @@ -0,0 +1,4 @@ |
| | 2 | +.mw-pagetriage-markpatrolled { |
| | 3 | + float: right; |
| | 4 | + font-size: small; |
| | 5 | +} |
| \ No newline at end of file |
| Property changes on: trunk/extensions/PageTriage/modules/ext.pageTriage.article/ext.pageTriage.article.css |
| ___________________________________________________________________ |
| Added: svn:eol-style |
| 1 | 6 | + native |
| Index: trunk/extensions/PageTriage/PageTriage.i18n.php |
| — | — | @@ -16,6 +16,7 @@ |
| 17 | 17 | 'pagetriage' => 'Page triage', |
| 18 | 18 | 'pagetriagelist' => 'Page triage list', |
| 19 | 19 | 'pagetriage-api-invalidid' => 'The ID you provided ($1) is not valid.', |
| | 20 | + 'pagetriage-markpatrolled' => 'Unpatrolled', |
| 20 | 21 | ); |
| 21 | 22 | |
| 22 | 23 | /** |