/**
  * Load the deletion queue item for a given deletion discussion page.
  * @param $page Article object of the deletion discussion page.
  */
 static function newFromDiscussion($page)
 {
     $item = new DeleteQueueItem();
     $dbr = wfGetDB(DB_SLAVE);
     $row = $dbr->selectRow('delete_queue', '*', array('dq_discussionpage' => $page->mTitle->getArticleID()), __METHOD__);
     if (!$row) {
         return null;
     }
     wfDebugLog('deletequeue', "Got delete_queue row for discussion page " . $page->mTitle->getArticleID());
     $item->loadFromRow($row);
     return $item;
 }
 public static function onArticleViewHeader(&$article)
 {
     global $wgOut, $wgLang;
     if ($article->mTitle->getNamespace() == NS_DELETION) {
         $dqi = DeleteQueueItem::newFromDiscussion($article);
         if (!$dqi->isQueued()) {
             break;
         }
         $wgOut->addWikiMsg('deletequeue-deletediscuss-discussionpage', $dqi->getArticle()->mTitle->getPrefixedText(), count($dqi->getEndorsements()), count($dqi->getObjections()));
     }
     $dqi = DeleteQueueItem::newFromArticle($article);
     if (!($queue = $dqi->getQueue())) {
         return true;
     }
     $options = array("deletequeue-page-{$queue}");
     $options[] = $dqi->getReason();
     $expiry = wfTimestamp(TS_UNIX, $dqi->getExpiry());
     $options[] = $wgLang->timeanddate($expiry);
     $options[] = $wgLang->date($expiry);
     $options[] = $wgLang->time($expiry);
     if ($queue == 'deletediscuss') {
         $options[] = $dqi->getDiscussionPage()->mTitle->getPrefixedText();
     }
     call_user_func_array(array($wgOut, 'addWikiMsg'), $options);
     return true;
 }
 function formatRow($row)
 {
     static $sk = null;
     if (is_null($sk)) {
         global $wgUser;
         $sk = $wgUser->getSkin();
     }
     $a = Article::newFromID($row->dq_page);
     $t = $a->mTitle;
     $dqi = DeleteQueueItem::newFromArticle($a);
     $dqi->loadFromRow($row);
     $queue = $dqi->getQueue();
     global $wgLang;
     if ($dqi->getQueue() == 'deletediscuss') {
         $discusspage = $sk->makeKnownLinkObj($dqi->getDiscussionPage()->mTitle);
     } else {
         $discusspage = '';
     }
     if ($row->dq_expiry > $row->dq_timestamp) {
         $expirestr = $wgLang->timeanddate($row->dq_expiry);
     } else {
         $expirestr = '';
     }
     $tr = '';
     $tr .= Xml::tags('td', null, $sk->makeKnownLinkObj($t, $t->getPrefixedText()));
     $tr .= Xml::element('td', null, wfMsg("deletequeue-queue-{$queue}"));
     $tr .= Xml::tags('td', null, $sk->makeKnownLinkObj($t, $dqi->formatVoteCount(), 'action=delviewvotes'));
     $tr .= Xml::element('td', null, $expirestr);
     $tr .= Xml::tags('td', null, $discusspage);
     return Xml::tags('tr', null, $tr) . "\n";
 }
 function show($params)
 {
     global $wgOut, $wgUser, $wgLang;
     $dqi = DeleteQueueItem::newFromId($params[1]);
     if (!$dqi) {
         $wgOut->setPageTitle(wfMsg('deletequeue-case-no-case-title'));
         $wgOut->addWikiMsg('deletequeue-case-no-case', $params[1]);
         return;
     }
     $wgOut->setPageTitle(wfMsg('deletequeue-case-title'));
     $wgOut->addWikiMsg('deletequeue-case-intro');
     if (wfTimestamp(TS_UNIX, $dqi->getExpiry()) < time() && $wgUser->isAllowed($dqi->getQueue() . '-review')) {
         $wgOut->addWikiMsg('deletequeue-case-needs-review', $this->getTitle("case/" . $params[1] . "/review"));
     }
     // Show basic data
     $sk = $wgUser->getSkin();
     $fields = array();
     $fields['deletequeue-case-page'] = $sk->link($this->getTitle());
     $fields['deletequeue-case-reason'] = DeleteQueueInterface::formatReason(null, $dqi->getReason());
     $expiry = $dqi->getExpiry();
     if ($expiry) {
         $fields['deletequeue-case-expiry'] = $wgLang->timeanddate($expiry);
     }
     $fields['deletequeue-case-votes'] = $dqi->formatVoteCount();
     $wgOut->addHTML(Xml::element('h2', null, wfMsg('deletequeue-case-details')) . Xml::buildForm($fields) . Xml::element('h2', null, wfMsg('deletequeue-case-votes')));
     $article = $dqi->getArticle();
     $this->showVotes($article, $dqi);
 }
 /**
  * Process the 'delvote' action.
  * @param Article $article The article to endorse/object to deletion of.
  */
 public function process($article)
 {
     global $wgRequest, $wgOut, $wgUser;
     $errs = $article->mTitle->getUserPermissionsErrors('deletequeue-vote', $wgUser);
     if (count($errs) > 0) {
         $wgOut->showPermissionsErrorPage($errs);
         return;
     }
     $dqi = DeleteQueueItem::newFromArticle($article);
     $wgOut->setPageTitle(wfMsg('deletequeue-vote-title', $article->mTitle->getPrefixedText()));
     // Load form data
     $token = $wgRequest->getVal('wpEditToken');
     $action = $wgRequest->getVal('wpVote');
     $comments = $wgRequest->getText('wpComments');
     if ($wgUser->matchEditToken($token) && in_array($action, array('endorse', 'object'))) {
         $dqi->addVote($action, $comments);
         if ($action == 'object' && $dqi->getQueue() == 'prod') {
             $dbw = wfGetDB(DB_MASTER);
             $dbw->begin();
             $dqi->setQueue('deletediscuss', $dqi->getReason());
             $lp = new LogPage('delete');
             $lp->addEntry('requeue', $article->mTitle, $comments, array(wfMsgForContent('deletequeue-queue-prod'), wfMsgForContent("deletequeue-queue-deletediscuss")));
             $dbw->commit();
             $wgOut->addWikiMsg('deletequeue-vote-requeued', wfMsgNoTrans('deletequeue-queue-deletediscuss'));
         } else {
             $wgOut->addWikiMsg("deletequeue-vote-success-{$action}");
         }
         return;
     }
     $wgOut->addWikiMsg('deletequeue-vote-text', $article->mTitle->getPrefixedText(), $dqi->getReason());
     // Add main form.
     $fields = array();
     $options = Xml::tags('p', null, Xml::radioLabel(wfMsg('deletequeue-vote-endorse'), 'wpVote', 'endorse', 'mw-deletequeue-vote-endorse'));
     $options .= Xml::tags('p', null, Xml::radioLabel(wfMsg('deletequeue-vote-object'), 'wpVote', 'object', 'mw-deletequeue-vote-object'));
     $fields['deletequeue-vote-action'] = $options;
     $fields['deletequeue-vote-reason'] = Xml::input('wpComments', 45, $comments);
     $article_id = $article->getId();
     $title = $this->getTitle("vote/{$article_id}");
     $form = Xml::buildForm($fields, 'deletequeue-vote-submit') . Html::Hidden('wpEditToken', $wgUser->editToken()) . Html::Hidden('title', $title->getPrefixedText());
     $form = Xml::tags('form', array('action' => $title->getLocalURL(), 'method' => 'POST'), $form);
     $form = Xml::fieldset(wfMsg('deletequeue-vote-legend'), $form);
     $wgOut->addHTML($form);
 }
 /**
 * Determines which queues can be sent to in review.
 * @return Array First element is a simple list of ENABLED queues,
 	second is a list, key is queue name, value is a message explaining why
 	(already passed through wfMsg). Queues in neither are not displayed.
 */
 public function availableActions($user = null)
 {
     $article = $this->mArticle;
     $dqi = DeleteQueueItem::newFromArticle($article);
     $queue = $dqi->getQueue();
     if ($user === null) {
         global $wgUser;
         $user = $wgUser;
     }
     $enabled = array();
     $disabled = array();
     $userRoles = $dqi->getUserRoles($user);
     $descriptiveRoles = array_map(array('DeleteQueueItem', 'getRoleDescription'), $userRoles);
     $descriptiveRolesText = implode(", ", $descriptiveRoles);
     $enabled[] = 'endorse';
     $enabled[] = 'object';
     // Speedy deletion
     if ($queue == 'speedy') {
         // All are unlocked if user is authed.
         $enabled = array('delete', 'requeue-prod', 'requeue-deletediscuss', 'dequeue');
     } elseif ($queue == 'prod') {
         // Escalation by anybody
         $enabled[] = 'requeue-deletediscuss';
         $enabled[] = 'dequeue';
         $expiry = $dqi->getExpiry();
         $hasExpired = time() > $expiry ? true : false;
         // Handling of 'delete'
         if (!$hasExpired) {
             // Hasn't expired yet, don't let them delete it.
             $disabled['delete'] = wfMsgExt('deletequeue-actiondisabled-notexpired', array('parseinline'));
         } elseif (count($userRoles)) {
             // Tell them they're involved.
             $disabled['delete'] = wfMsgExt('deletequeue-actiondisabled-involved', array('parseinline'), array($descriptiveRolesText));
         } else {
             // Allow uninvolved admins to delete expired prods
             $enabled[] = 'delete';
         }
     } elseif ($queue == 'deletediscuss') {
         $expiry = $dqi->getExpiry();
         $hasExpired = time() > $expiry ? true : false;
         if (!$hasExpired) {
             // Hasn't expired yet, don't let them delete it.
             $disabled['delete'] = wfMsgExt('deletequeue-actiondisabled-notexpired', array('parseinline'));
         } elseif (count($userRoles)) {
             // Tell them they're involved.
             $disabled['delete'] = wfMsgExt('deletequeue-actiondisabled-involved', array('parseinline'), array($descriptiveRolesText));
         } else {
             // An uninvolved admin wants to delete an expired proposed deletion.
             $enabled[] = 'delete';
         }
         $enabled[] = 'dequeue';
     }
     return array($enabled, $disabled);
 }
 /**
  * Attempt to submit the propose deletion form.
  * @param $article Article object.
  * @param $action The action (speedynom, prod, etc)
  * @return Boolean Whether or not the submission was successful.
  */
 public function trySubmit($article, $queue)
 {
     global $wgUser, $wgOut, $wgRequest;
     $token = $wgRequest->getText('wpEditToken');
     if (!$wgUser->matchEditToken($token)) {
         return false;
     }
     // Import form data.
     $reason1 = $wgRequest->getText('wpReason');
     $reason2 = $wgRequest->getText('wpExtra');
     $reason = DeleteQueueInterface::formatReason($reason1, $reason2);
     // Allow hooks to terminate
     $error = '';
     if (!wfRunHooks('AbortDeleteQueueNominate', array($wgUser, $article, $queue, $reason, &$error))) {
         $wgOut->addWikitext($error);
         return false;
     }
     // Transaction
     $dbw = wfGetDB(DB_MASTER);
     $dbw->begin();
     // Set in database.
     $dqi = DeleteQueueItem::newFromArticle($article);
     if ($dqi->getQueue()) {
         $dbw->rollback();
         $wgOut->addWikiMsg('deletequeue-nom-alreadyqueued');
         return false;
     }
     $dqi->setQueue($queue, $reason);
     $dqi->addRole('nominator');
     $log = new LogPage('delete');
     $log->addEntry("nominate", $article->mTitle, $reason, wfMsgNoTrans('deletequeue-queue-' . $queue));
     $dbw->commit();
     $wgOut->redirect($article->mTitle->getLocalUrl());
     return true;
 }