/** * Sends a notification after adding an user. * @param User $oUser * @param Boolean $bByEmail * @return bool allow other hooked methods to be executed. Always true. */ public function onAddNewAccount($oUser, $bByEmail) { wfProfileIn('BS::' . __METHOD__); if ($oUser->isAllowed('bot')) { return true; } EchoEvent::create(array('type' => 'bs-newuser', 'extra' => array('user' => $oUser->getName(), 'username' => $oUser->getName(), 'userlink' => true, 'realname' => BsCore::getUserDisplayName($oUser)))); wfProfileOut('BS::' . __METHOD__); return true; }
/** * Adds a user based greeting to the text mail * @param Message $message * @param User $oUser * @return String */ public function userBasedDecorateIntro($message, $oUser) { $sRealname = BsCore::getUserDisplayName($oUser); $sReturn = wfMessage('bs-email-greeting-receiver')->params($oUser->getName(), $sRealname)->inLanguage($oUser->getOption('language'))->text(); return $sReturn . "\n\n" . $message->text(); }
function onSuperListBuildDataSets(&$aRows) { if (!count($aRows)) { return true; } $aPageIds = array_keys($aRows); $dbr = wfGetDB(DB_READ); $aTables = array('bs_responsible_editors', 'user'); $aJoinConditions = array('user' => array('JOIN', 're_user_id=user_id')); $sField = "re_page_id, re_position, user_id"; $sCondition = "re_page_id IN (" . implode(',', $aPageIds) . ")"; $aOptions = array('ORDER BY' => 're_page_id, re_position'); $res = $dbr->select($aTables, $sField, $sCondition, __METHOD__, $aOptions, $aJoinConditions); $aData = array(); $aUserIds = array(); while ($row = $res->fetchObject()) { $oUser = User::newFromId($row->user_id); if ($oUser === null) { continue; } $aUserIds[$row->re_page_id][] = $row->user_id; $aData[$row->re_page_id][] = '<li>' . '<a class="bs-re-superlist-editor" href="#">' . BsCore::getUserDisplayName($oUser) . '</a>' . '</li>'; } foreach ($aRows as $iKey => $aRowSet) { if (array_key_exists($iKey, $aData)) { $aRows[$iKey]['responsible_editors'] = Html::rawElement('ul', array('data-articleId' => $iKey, 'data-editorIds' => FormatJson::encode($aUserIds[$iKey])), implode('', $aData[$iKey])); } } return true; }
/** * Send email notification to next user(s) on review list. * @param BsReviewProcess $oReviewProcess Review process users should be notified for. * @return Status */ public function emailNotifyNextUsers($oReviewProcess) { $aNextUsers = $oReviewProcess->getNextUsers(); // Identify owner $oOwner = User::newFromId($oReviewProcess->getOwner()); $sOwnerRealName = BsCore::getUserDisplayName($oOwner); $oTitle = Title::newFromID($oReviewProcess->pid); $sTitleText = $oTitle->getPrefixedText(); $sLink = BsLinkProvider::makeLink($oTitle, $oTitle->getFullURL()); foreach ($aNextUsers as $aReviewer) { // dirty workaround, sometimes id comes as username if (is_numeric($aReviewer['id'])) { $oReviewer = User::newFromId($aReviewer['id']); } else { $oReviewer = User::newFromName($aReviewer['id']); } if (!BsConfig::getVarForUser('MW::Review::EmailNotifyReviewer', $oReviewer->getName())) { continue; } // Identify reviewer //PW(10.03.2015): Echo notifications $sReviewerMail = $oReviewer->getEmail(); if (!$sReviewerMail) { continue; } $sReviewerLang = $oReviewer->getOption('language'); $sSubject = wfMessage('bs-review-mail-invite-header', $sTitleText)->inLanguage($sReviewerLang)->text(); $sMsg = wfMessage('bs-review-mail-invite-body', $sOwnerRealName, $oOwner->getName(), $sTitleText)->inLanguage($sReviewerLang)->text(); $sMsg .= "\n\n" . $sLink; if ($aReviewer['comment']) { $sMsg .= "\n" . wfMessage('bs-review-mail-comment', $aReviewer['comment'])->inLanguage($sReviewerLang)->text(); } //Send mail to next user in queue BsMailer::getInstance('MW')->send($oReviewer, $sSubject, $sMsg); } }
/** * This functions resets a interupted workflow. */ function reset($sComment = '') { $dbw = wfGetDB(DB_MASTER); // Get Review-ID and owner id $res = $dbw->select('bs_review', array('rev_id', 'rev_owner'), "rev_pid=" . $this->pid, __METHOD__, array('ORDER BY' => 'rev_id DESC')); $row = $dbw->fetchRow($res); $dbw->freeResult($res); $review_id = $row['rev_id']; $owner_id = $row['rev_owner']; $tbl = $dbw->tableName('bs_review'); global $wgDBtype; if ($wgDBtype == 'oracle') { $dbw->query("UPDATE {$tbl} SET rev_startdate=to_char(SYSDATE, 'YYYYMMDDHH24MISS'), rev_enddate=to_char(SYSDATE + interval '7 days', 'YYYYMMDDHH24MISS') WHERE rev_pid={$this->pid}"); } elseif ($wgDBtype == 'postgres') { $dbw->query("UPDATE {$tbl} SET rev_startdate=to_char(current_timestamp, 'YYYYMMDDHH24MISS'), rev_enddate=to_char(current_timestamp + interval '7 days', 'YYYYMMDDHH24MISS') WHERE rev_pid={$this->pid}"); } else { $dbw->query("UPDATE {$tbl} SET rev_startdate=NOW(), rev_enddate=DATE_ADD(NOW(), INTERVAL 7 DAY) WHERE rev_pid={$this->pid}"); } $tbl = $dbw->tableName('bs_review_steps'); $aUsersVoted = array(); $iLastVotedId = 0; $iVoteAmount = 0; //Get all steps that have not been processed yet $res = $dbw->select('bs_review_steps', array('revs_user_id', 'revs_sort_id', 'revs_comment'), array('revs_status > -1', 'revs_review_id = ' . $review_id), __METHOD__, array('ORDER BY revs_sort_id')); while ($row = $dbw->fetchRow($res)) { $aUsersVoted[] = $row; $iLastVotedId = $row['revs_sort_id']; $iVoteAmount++; } $iVoteAmount++; $dbw->query("UPDATE {$tbl} SET revs_sort_id=revs_sort_id+{$iVoteAmount} WHERE revs_review_id = {$review_id} AND revs_sort_id > {$iLastVotedId}"); $dbw->query("UPDATE {$tbl} SET revs_status = -2 WHERE revs_review_id = {$review_id} AND revs_status = 1"); $dbw->query("UPDATE {$tbl} SET revs_status = -3 WHERE revs_review_id = {$review_id} AND revs_status = 0"); $data = array('revs_review_id' => $review_id, 'revs_user_id' => $owner_id, 'revs_status' => -1, 'revs_sort_id' => ++$iLastVotedId, 'revs_comment' => "<u>" . BsCore::getUserDisplayName() . ": </u>" . $sComment); foreach ($this->_aInjections as $oInjection) { $oInjection->createStepDefault($data); } $dbw->insert('bs_review_steps', $data); //Append the unprocessed steps to the list of steps $lastUserId = 0; foreach ($aUsersVoted as $aUser) { if ($aUser['revs_user_id'] == $lastUserId) { continue; } $lastUserId = $aUser['revs_user_id']; $lastInitialComment = $aUser['revs_comment']; //We remove the contributed parts of the comment and leave only //the initial part. Hacky hacky hacky... $matches = array(); preg_match('#.*?/em>(.*?) ⇒.*?#si', $lastInitialComment, $matches); if (isset($matches[1])) { $lastInitialComment = trim($matches[1]); } $data = array('revs_review_id' => $review_id, 'revs_user_id' => $aUser['revs_user_id'], 'revs_status' => -1, 'revs_sort_id' => ++$iLastVotedId, 'revs_comment' => $lastInitialComment); foreach ($this->_aInjections as $oInjection) { $oInjection->createStepDefault($data); } $dbw->insert('bs_review_steps', $data); } }
/** * Callback from preg_replace, replaces the mention with a link to the user page * @param array $sMatch * @return String The link to the user page */ public static function replaceUsernameInMessage($sMatch) { $oUser = User::newFromName($sMatch[1]); return Linker::link($oUser->getUserPage(), BsCore::getUserDisplayName($oUser)); }