示例#1
0
    /**
     * 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&nbsp;&nbsp;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);
    }
示例#2
0
 /** 
  * 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;
     }
 }
示例#3
0
 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;
 }