User:Pathoschild/2009 steward election statistics

From Meta, a Wikimedia project coordination wiki
Jump to: navigation, search
collected statistics page 2009 steward elections (unofficial voting statistics)
This page statistically summarizes the 2009 steward elections. See also a summary of the 2009 confirmations, and the collected statistics page.

Contents

[edit] Table

Unique participants: 1116.
Last update: 2009-02-22 01:02 (UTC)

candidate support ratio oppose reasons result
Meno25 0.963,  96.3% (157/163) elected
Erwin 0.96,  96% (192/200) elected
Kylu 0.954,  95.4% (207/217) elected
Laaknor 0.944,  94.4% (119/126) elected
Mike.lifeguard 0.884,  88.4% (258/292) elected
Leinad 0.868,  86.8% (138/159) inexperience. elected
Dorgan 0.844,  84.4% (141/167) inexperience. elected
Alexanderps 0.817,  81.7% (125/153) too much access, allegations of canvassing and misuse of checkuser tool. elected
Mardetanha 0.813,  81.3% (217/267) disputes on fawiki, fear that Iranian government will gain his access under torture. elected
putnik 0.792,  79.2% (152/192) inexperience, unanswered questions, dispute on ruwiki. failed
Avraham 0.785,  78.5% (150/191) inexperience, limited language skills. failed
Fabexplosive 0.781,  78.1% (114/146) dispute on lmowiki, allegedly executes tasks without understanding them, unanswered questions (later answered). failed
Jredmond 0.759,  75.9% (66/87) inexperience, too much access, unanswered questions (later answered). failed
PhiLiP 0.71,  71% (66/93) inexperience, copyright issues with uploads, fear that Chinese government will gain his access under torture. failed
SpeedyGonsales 0.696,  69.6% (87/125) inexperience, misunderstanding of steward role, disputes on hrwiki. failed
Mywood 0.671,  67.1% (55/82) inexperience, copyright issues with uploads. failed
EVula 0.546,  54.6% (77/141) inexperience, too much access, limited language skills, appearance of incivility. failed
avjoska 0.4,  40% (38/95) inexperience, intent of inactivity as a steward. failed
Fadesga 0.3,  30% (21/70) inexperience, no steward goals, unanswered questions. failed
Al Lemos 0.255,  25.5% (35/137) inexperience, misunderstanding of steward role. failed
Pasquale 0.19,  19% (12/63) inexperience, misunderstanding of steward role, unanswered questions, little activity. failed
Apteva 0.016,  1.6% (2/124) inexperience, prior block, lack of steward goals, misunderstanding of steward role, little activity. failed
Loco085 0.646,  64.6% (42/65) inexperience, unanswered questions. withdrawn
Cometstyles 0.598,  59.8% (76/127) alleged abuse of OTRS access, checkuser requests with insufficient reason. withdrawn
Orderinchaos 0.265,  26.5% (13/49) inexperience, limited language skills. withdrawn
Gutza 0.193,  19.3% (11/57) intent of inactivity as a steward, misunderstanding of steward role, unanswered questions. withdrawn
Chase me ladies, I'm the Cavalry 0.000,   disqualified; not identified. disqualified
Drakesketchit 0.000,   disqualified; not identified. disqualified
Fipplet 0.000,   disqualified; not identified. disqualified
Jagwar 0.000,   disqualified; not identified. disqualified
Wykypydya 0.000,   disqualified; not identified, not linked to an account meeting account requirements. disqualified

[edit] Update script

This table can be updated using the following quick-and-dirty script while editing this page; this might take several seconds, depending on your connection speed, due to the size of the page. (Anyone wishing to update it automatically with another language is free to do so.)

/*********************
** Functions
*********************/
// report to box
function ses_report(text) {
        $('stewiestats').adopt(document.createTextNode(text));
}
 
/*********************
** Initialize
*********************/
function ses_initialize() {
        // display status box
        if(!document.getElementById('stewiestats')) {
                // create box
                var box = document.createElement('pre');
                box.setAttribute('id', 'stewiestats');
                box.setAttribute('style', 'margin:1em; padding:0.5em; border:1px solid #C00;');
                box.appendChild(document.createTextNode('Loading required framework...\n'));
                editbox.parentNode.insertBefore(box, editbox.parentNode.firstChild);
 
                // jump to box
                window.location.hash = "#stewiestats";
        }
 
        // wait until WikiMooTools loaded
        if(!window.$chk) {
                setTimeout('init_update()', 500);
                return;
        }
 
        // reset box
        $('stewiestats').set({'text':'Loading required framework...\n'});
 
        // start script
        ses_fetch_page();
}
 
/*********************
** Fetch page text
*********************/
function ses_fetch_page() {
        /* update status box */
        ses_report('Fetching elections page...\n');
 
        /* grab page text */
        var request = new Request({
                url:'http://meta.wikimedia.org/wiki/Stewards/elections_2009/votes?action=render',
                method: 'GET',
                onSuccess:ses_parse_page,
                onFailure: function(xhr) {
                        ses_report('AJAX error while fetching elections page: ' + xhr.status + ' (' + xhr.statusText + ')\n');
                }
        }).send();
}
 
/*********************
** Count unique participants
*********************/
function ses_count_participants(text) {
        ses_report('Counting unique participants... ');
 
        var links = text.match(/title="User:[^\/"]+/ig);
        var names = {};
        var count = 0;
 
        if(links) {
                for(var i=0, len=links.length; i<len; i++) {
                        var name = links[i].match(/User:(.+)/)[1];
                        if(!names[name]) {
                                names[name] = 1;
                                count++;
                        }
                }
        }
 
        ses_report(count + '\n');
        editbox.value = editbox.value.replace(/(<span id="ses_count">).*?(<\/span>)/, '$1' + count + '$2');
}
 
/*********************
** Extract data from page
*********************/
function ses_parse_page(text, xml) {
        /* update status box */
        ses_report('Extracting data...\n');
 
        // strip out cruft
        text = text.replace(/^[\s\S]+?<table id="toc"[\s\S]+?<\/table>/, '');           // introduction, TOC, etc
        text = text.replace(/^(<h2.+?<\/h2>)[\s\S]+?<h3[\s\S]+?(<h3)/mg, '$1\n$2');     // statements, 'questions' header
        text = text.replace(/<ul>[\s\S]+?<\/ul>/g, '');                                 // threaded bullets
        text = text.replace(/^(<(?:h2|h3|li).+\n*)|^.+\n*/mg, '$1');                    // everything else except headers and list items
        text = text.replace(/^<h(\d)>.*<span class="mw-headline">.*?>\s*([^<>]+?)\s*<.+<\/h\1>/mg, '<h$1>$2</h$1>');    // simplify headers
 
        // count participants
        ses_count_participants(text);
 
        // data
        var names    = [];      // all candidate names
        var votes    = [];      // all section titles
        var counts   = {};      // vote counts per section per candidate
        var name     = '';      // current candidate name
        var vote     = '';      // current section ('Yes', 'No', 'Neutral')
 
        // parse text
        text    = text.split('\n');
        var len = text.length;
        var line;
        for(var i=0; i<len; i++) {
                line = text[i];
 
                // li: new vote
                if(line.match('<li')) {
                        counts[name][vote]++;
                }
                // h3: new vote section
                else if(line.match('<h3')) {
                        vote = line.match(/<h3>(.+)<\/h3>/)[1];
                        votes.push(vote);
                        counts[name][vote] = 0;
                }
                // h2: new candidate
                else if(line.match('<h2')) {
                        name = line.match(/<h2>(.+)<\/h2>/)[1];
                        names.push(name);
                        counts[name] = {};
                }
        }
 
        // update table
        ses_gen_table(names, votes, counts);
}
 
/*********************
** Return formatted date
*********************/
function ses_get_date() {
        // zero pad
        function zero_pad(num) {
                if(num<10)
                        num = '0' + num;
                return num;
        }
 
        // generate string
        var d = new Date();
        var str = d.getUTCFullYear() + '-' + zero_pad(d.getUTCMonth()+1) + '-' + zero_pad(d.getUTCDate()) + ' '
                + zero_pad(d.getUTCHours()) + ':' + zero_pad(d.getUTCMinutes()) + ' (UTC)';
        return str;
}
 
/*********************
** Update table
*********************/
function ses_gen_table(names, votes, counts) {
        /* update status box */
        ses_report('Generating updated table...\n');
 
        /***************
        ** Variables
        ***************/
        // constants
        var len = names.length; // number of candidates
        var yes = votes[0];     // title of support headers
        var no  = votes[1];     // title of oppose headers
        // data
        var rows = {};          // all template texts
        var ratios = {};        // all support ratios
        var sorted = [];        // candidate names, sorted by ratio
        // other
        var text = editbox.value;
 
        /***************
        ** Regex to match candidate row template
        ***************/
        function reg_candidate_template(name) {
                return new RegExp('{{user[^}]+name *= *' + name + '[^}]+}}', 'mi');
        }
 
        /***************
        ** Fetch & update rows
        ***************/
        for(var i=0; i<len; i++) {
                // grab text
                var name = names[i];
                var row  = text.match(reg_candidate_template(name)).toString();
 
                // update
                row = row.replace(/(support *=).*/, '$1 ' + counts[name][yes]);
                row = row.replace(/(oppose *=).*/, '$1 ' + counts[name][no]);
 
                // store
                rows[name]   = row;
                ratios[name] = counts[name][yes]/(counts[name][yes]+counts[name][no]);
        }
 
        /***************
        ** Sort rows
        ***************/
        for(var i=0; i<len; i++) {
                var name  = names[i];
                var ratio = counts[name][yes]/(counts[name][yes]+counts[name][no]);
 
                // insert into sorted position
                for(var x=0; x<=sorted.length; x++) {
                        // end of array, just stick it in
                        if(x==sorted.length) {
                                sorted.push(name);
                                break;
                        }
                        else if(ratios[name]>ratios[sorted[x]]) {
                                sorted.splice(x, 0, name);
                                break;
                        }
                }
        }
 
        /***************
        ** Update text
        ***************/
        // date
        text = text.replace(/(<span id="ses_date">).*?(<\/span>)/, '$1' + ses_get_date() + '$2');
 
        // rows
        var str = '';
        for(var i=0; i<len; i++)
                str += rows[sorted[i]] + '\n';
        text = text.replace(/(<!--ses-start-->)[\s\S]+?(<!--ses-end-->)/i, '$1\n' + str + '$2');
 
        // text
        editbox.value = text;
 
        /* update status box */
        ses_report('Done.');
}
ses_initialize();
Personal tools
Namespaces

Variants
Actions
Navigation
Community
Beyond the Web
Print/export
Toolbox