/** * Execute special page. Only available to wikihow staff. */ public function execute() { global $wgRequest, $wgOut, $wgUser, $wgLang; $user = $wgUser->getName(); $userGroups = $wgUser->getGroups(); $extraUsers = array('Gersh'); if ($wgUser->isBlocked() || !in_array('staff', $userGroups) && !in_array($user, $extraUsers)) { $wgOut->setRobotpolicy('noindex,nofollow'); $wgOut->errorpage('nosuchspecialpage', 'nospecialpagetext'); return; } if ($wgRequest->wasPosted()) { // handle more URLs at once ini_set('memory_limit', '512M'); set_time_limit(0); ignore_user_abort(true); $wgOut->setArticleBodyOnly(true); $dbr = wfGetDB(DB_SLAVE); $action = $wgRequest->getVal('action', ''); self::$discardThreshold = $wgRequest->getInt('discard-threshold', 0); $dataType = $wgRequest->getVal('data-type'); $pageList = $wgRequest->getVal('pages-list', ''); $domain = $wgRequest->getVal('domain', 'bt'); $pageList = Misc::getUrlDecodedData($pageList); $urls = self::parseURLlist($pageList); if (empty($urls)) { $result = array('result' => '<i>ERROR: no URLs given</i><br/>'); print json_encode($result); return; } if ('reset' == substr($action, 0, 5)) { if ('reset' == $action) { // both www and mobile foreach (self::$domains as $domain => $foo) { $html .= self::resetStats($urls, $domain); } } else { // just one domain $domain = substr($action, -2); $html = self::resetStats($urls, $domain); } self::resetVarnishes($urls); self::mailUserResetDone($wgUser, $urls); } elseif ('fetch' == $action) { $html = ''; if ($dataType == 'csv') { self::outputCSV($urls); return; } else { foreach (self::$domains as $domain => $foo) { $html .= self::fetchStats($urls, $domain); } } } else { $html = 'ERROR: unknown action'; } $result = array('result' => $html); print json_encode($result); return; } $wgOut->setHTMLTitle('Admin - Bounce Tests (Stu) - wikiHow'); $defaultDiscardThreshold = self::$discardThreshold; $domain_opts = ''; foreach (self::$domains as $domain => $label) { $domain_opts .= "<option value=\"{$domain}\">{$label}</option>\n"; } $specialPage = $this->specialPage; $tmpl = <<<EOHTML <script src="/extensions/wikihow/common/download.jQuery.js"></script> <form id="admin-form" method="post" action="/Special:{$specialPage}"> <div style="font-size: 16px; letter-spacing: 2px; margin-bottom: 15px;"> \tFetch or Reset Bounce Timer (Stu) Stats </div> <div style="font-size: 13px; margin-bottom: 10px; border: 1px solid #dddddd; padding: 10px;"> \t<div> \t\tViews discard threshold: <input id="discard-threshold" type="text" size="4" name="discard-threshold" value="{$defaultDiscardThreshold}" /> \t\t<!-- \t\t Domain \t\t<select name="domain" id="pages-domains"> \t\t<option value="all">All</option> \t\t{$domain_opts} \t\t</select> \t\t//--> \t</div> \t<div style="margin-top: 5px;"> \t\t<input type="radio" name="data-type" value="summary" checked> Summary</input> \t\t<input type="radio" name="data-type" value="csv"> CSV</input> \t</div> </div> <div style="font-size: 13px; margin: 20px 0 7px 0;"> \tEnter a list of URL(s) such as <code style="font-weight: bold;">http://www.wikihow.com/Lose-Weight-Fast</code> to which this tool will apply. One per line. </div> <textarea id="pages-list" name="pages-list" type="text" rows="10" cols="70"></textarea><br/> <button id="pages-fetch" disabled="disabled" style="padding: 5px;">fetch stats</button> <button id="pages-resetbt" disabled="disabled" style="padding: 5px;">reset www</button> <button id="pages-resetmb" disabled="disabled" style="padding: 5px;">reset mobile</button> <button id="pages-reset" disabled="disabled" style="padding: 5px;">reset all</button> <br/> <br/> <div id="pages-result"> </div> </form> <script> (function(\$) { \tfunction doServerAction(action) { \t\tvar dataType = \$('input:radio[name=data-type]:checked').val(); \t\tvar url = '/Special:{$specialPage}/views.csv?action=' + action + '&data-type=' + dataType; \t\tif ('summary' == dataType) { \t\t\tvar form = \$('#admin-form').serializeArray(); \t\t\t\$('#pages-result').html('loading ...'); \t\t\tvar finished = false; \t\t\t\$.post(url, \t\t\t\tform, \t\t\t\tfunction(data) { \t\t\t\t\tfinished = true; \t\t\t\t\t\$('#pages-result').html(data['result']); \t\t\t\t\t\$('#pages-list').focus(); \t\t\t\t}, \t\t\t\t'json') \t\t\t\t.complete(function () { \t\t\t\t\tif (!finished) { \t\t\t\t\t\t\$('#pages-result').html('Server call is taking too long. Wait for an email.'); \t\t\t\t\t} \t\t\t\t}); \t\t} else { // csv \t\t\tvar form = 'pages-list=' + encodeURIComponent(\$('#pages-list').val()); \t\t\t\$.download(url, form); \t\t} \t} \t\$(document).ready(function() { \t\t\$('#pages-resetbt, #pages-resetmb, #pages-reset, #pages-fetch') \t\t\t.prop('disabled', false) \t\t\t.click(function () { \t\t\t\tvar action = \$(this).attr('id').replace(/^pages-/, ''); \t\t\t\tvar answer = true; \t\t\t\tif ('reset' == action.substring(0,5)) { \t\t\t\t\tvar count = \$('#pages-list').val().split(/\\n/).length; \t\t\t\t\tvar domain = 'www'; \t\t\t\t\tif ('resetmb'==action) domain='mobile'; \t\t\t\t\telse if ('reset'==action) domain='all domains'; \t\t\t\t\tanswer = confirm('Are you sure you want to reset data for approx. ' + count + ' URL(s) on ' + domain + '?'); \t\t\t\t} \t\t\t\tif (answer) { \t\t\t\t\tdoServerAction(action); \t\t\t\t} \t\t\t\treturn false; \t\t\t}); \t\t/* \t\t\$('#pages-allcheck') \t\t\t.click(function() { \t\t\t\tif (\$(this).prop('checked')){ \t\t\t\t\t\$('#pages-reset').prop('disabled',false); \t\t\t\t}else{ \t\t\t\t\t\$('#pages-reset').prop('disabled',true); \t\t\t\t} \t\t\t}); \t\t\$('#pages-domains') \t\t\t.change(function(){ \t\t\t\tif (\$(this).attr('value')=='all'){ \t\t\t\t\t\$('#pages-reset').prop('disabled',true); \t\t\t\t\t\$('#pages-allcheck').prop('disabled',false); \t\t\t\t\t\$('#pages-check').css('color',''); \t\t\t\t}else{ \t\t\t\t\t\$('#pages-reset').prop('disabled',false); \t\t\t\t\t\$('#pages-allcheck').prop('disabled',true).prop('checked',false); \t\t\t\t\t\$('#pages-check').css('color','#ccc'); \t\t\t\t} \t\t\t\t\$('#pages-result').html(''); \t\t\t}); \t\t*/ \t\t\$('#pages-list') \t\t\t.focus(); \t}); })(jQuery); </script> EOHTML; $wgOut->addHTML($tmpl); }
/** * Get a bunch of pages from STU, and put them into the database */ function getPages($pages, $domain) { $ret = AdminBounceTests::doBounceQuery(array('select' => '*', 'from' => $domain, 'pages' => $pages)); $data = $ret['results']; $didInsert = false; if (is_array($data)) { $sql = 'insert ignore into ' . self::STU_TABLE . '(page, domain, k, v) values'; $first = true; foreach ($data as $page => $datum) { if (is_array($datum)) { foreach ($datum as $k => $v) { if ($first) { $first = false; } else { $sql .= ","; } $sql .= "(" . $this->dbw->addQuotes($page) . "," . $this->dbw->addQuotes($domain) . "," . $this->dbw->addQuotes($k) . "," . $this->dbw->addQuotes($v) . ")\n"; $this->pagesProcessed++; print $page . "\t" . $domain . "\t" . $k . "\t" . $v . "\n"; } } } // Only do insert if we have the data if (!$first) { if ($this->dryRun) { print $sql; } else { $this->dbw->query($sql, __METHOD__); } return true; } else { return false; } } else { return false; } }
private function extractStats(&$data, $label) { $headers = array('0-10s', '3+m'); $stats = array(); foreach ($data as $page => $datum) { AdminBounceTests::computePercentagesForCSV($datum, ''); if (isset($datum['0-10s'])) { $stats['ti_stu_10s_percentage_' . $label] = $datum['0-10s']; } if ($label != 'mobile' && isset($datum['3+m'])) { $stats['ti_stu_3min_percentage_' . $label] = $datum['3+m']; } if (isset($datum['__'])) { $stats['ti_stu_views_' . $label] = $datum['__']; } break; // should only be one record } return $stats; }