public function index() { if (!$this->checkAccess()) { return false; } $this->wg->out->setPageTitle(wfMsg('promote-title')); if (!$this->app->checkSkin('oasis')) { $this->wg->out->addWikiMsg('promote-error-oasis-only'); $this->skipRendering(); return true; } $this->response->addAsset('extensions/wikia/SpecialPromote/js/SpecialPromote.js'); JSMessages::enqueuePackage('SpecialPromote', JSMessages::EXTERNAL); $this->minHeaderLength = $this->helper->getMinHeaderLength(); $this->maxHeaderLength = $this->helper->getMaxHeaderLength(); $this->minDescriptionLength = $this->helper->getMinDescriptionLength(); $this->maxDescriptionLength = $this->helper->getMaxDescriptionLength(); $this->wikiHeadline = $this->helper->getWikiHeadline(); $this->wikiDesc = $this->helper->getWikiDesc(); $this->mainImage = $this->helper->getMainImage(); $this->additionalImages = $this->helper->getAdditionalImages(); $this->wikiStatus = $this->helper->getWikiStatusMessage($this->wg->CityId, $this->wg->contLang->getCode()); $cityVisualization = new CityVisualization(); $this->isCorpLang = $cityVisualization->isCorporateLang($this->wg->contLang->getCode()); }
protected function initializeSkippedWikiList() { $cityVisualization = new CityVisualization(); $corporateSites = $cityVisualization->getVisualizationWikisData(); $dbNames = array(); foreach ($corporateSites as $site) { $dbNames[] = $site['db']; } $this->dbNamesToBeSkipped = $dbNames; }
/** * Called once a file has been deleted. * * @param $file reference to the deleted file * @param $oldimage in case of the deletion of an old image, the name of the old file * @param $article in case all revisions of the file have been deleted a reference to the article associated with the file. * @see http://www.mediawiki.org/wiki/Manual:Hooks/FileDeleteComplete */ public static function onFileDeleteComplete($file, $oldimage, $page) { /** * No $page when deleting an old image ($oldimage). Nothing to do. * * @see FileDeleteForm::doDelete() */ if (!$page instanceof Page) { return true; } global $wgCityId, $wgContLang; $visualization = new CityVisualization(); $visualization->removeImageFromReviewByName($wgCityId, $page->getTitle()->getText(), $wgContLang->getCode()); $visualization->purgeWikiPromoteDataCache($wgCityId, $wgContLang->getCode()); return true; }
public function updateImageState($images, $action = '') { wfProfileIn(__METHOD__); $approvalList = array(); $rejectionList = array(); $deletionList = array(); $statsInsert = array(); $taskAdditionList = array(); $sqlWhere = array(ImageReviewStatuses::STATE_APPROVED_AND_TRANSFERRING => array(), ImageReviewStatuses::STATE_REJECTED => array(), ImageReviewStatuses::STATE_QUESTIONABLE => array()); foreach ($images as $image) { if ($image['state'] == ImageReviewStatuses::STATE_APPROVED) { //for promote Image use temporary approval state as it will be used to supervise image copy $image['state'] = ImageReviewStatuses::STATE_APPROVED_AND_TRANSFERRING; $sqlWhere[ImageReviewStatuses::STATE_APPROVED_AND_TRANSFERRING][] = "( city_id = {$image['wikiId']} AND page_id = {$image['pageId']}) "; $approvalList[] = $image; $visualization = new CityVisualization(); $targetWikiId = $visualization->getTargetWikiId($image['lang']); if (empty($taskAdditionList[$targetWikiId])) { $taskAdditionList[$targetWikiId] = array(); } if (empty($taskAdditionList[$targetWikiId][$image['wikiId']])) { $taskAdditionList[$targetWikiId][$image['wikiId']] = array(); } $taskAdditionList[$targetWikiId][$image['wikiId']][] = array('id' => $image['pageId'], 'name' => $image['name']); } elseif ($image['state'] == ImageReviewStatuses::STATE_REJECTED) { $sqlWhere[ImageReviewStatuses::STATE_REJECTED][] = "( city_id = {$image['wikiId']} AND page_id = {$image['pageId']}) "; $rejectionList[] = $image; } elseif ($image['state'] == ImageReviewStatuses::STATE_DELETED) { $sqlWhere[ImageReviewStatuses::STATE_DELETED][] = "( city_id = {$image['wikiId']} AND page_id = {$image['pageId']}) "; $deletionList[] = $image; } elseif ($image['state'] == ImageReviewStatuses::STATE_QUESTIONABLE) { $sqlWhere[ImageReviewStatuses::STATE_QUESTIONABLE][] = "( city_id = {$image['wikiId']} AND page_id = {$image['pageId']}) "; } } $statsInsert[] = array('city_id' => $image['wikiId'], 'page_id' => $image['pageId'], 'review_state' => $image['state'], 'reviewer_id' => $this->wg->user->getId()); foreach ($sqlWhere as $state => $where) { if (!empty($where)) { $db = wfGetDB(DB_MASTER, array(), $this->wg->ExternalSharedDB); $db->update('city_visualization_images', array('reviewer_id' => $this->wg->user->getId(), 'image_review_status' => $state, 'review_end = now()'), array(implode(' OR ', $where)), __METHOD__); $db->commit(); } } $this->createUploadTask($taskAdditionList); $this->saveStats($statsInsert, $sqlWhere, $action); wfProfileOut(__METHOD__); }
private function syncAdditionalImages($sourceWikiId, $sourceWikiLang, $deletedImages) { $wikiData = $this->model->getWikiData($sourceWikiId, $sourceWikiLang, $this->helper); $data = $this->getWikiCityImages($wikiData['images'], $deletedImages); if (isset($data['city_images'])) { $data['city_images'] = json_encode($data['city_images']); } return $data; }
public function removeFlag($wikiId, $flag, $corpWikiId, $langCode) { wfProfileIn(__METHOD__); /* @var $visualization CityVisualization */ $visualization = new CityVisualization(); $result = $visualization->removeFlag($wikiId, $langCode, $flag); if ($result === true) { //purge cache //wiki cache $visualization->getList($corpWikiId, $langCode, true); $memcKey = $visualization->getWikiDataCacheKey($visualization->getTargetWikiId($langCode), $wikiId, $langCode); $this->wg->Memc->set($memcKey, null); //visualization list cache $visualization->purgeVisualizationWikisListCache($corpWikiId, $langCode); wfProfileOut(__METHOD__); return true; } wfProfileOut(__METHOD__); return false; }
<td> <a href="#" class="status-official" data-id="<?php echo $wiki->city_id; ?> " data-vertical="<?php echo $wiki->city_vertical; ?> " data-flags="<?php echo CityVisualization::isOfficialWiki($wiki->city_flags); ?> " data-flag-type="<?php echo WikisModel::FLAG_OFFICIAL; ?> "> <?php echo CityVisualization::isOfficialWiki($wiki->city_flags) ? wfMessage('manage-wikia-home-wiki-list-official-yes')->text() : wfMessage('manage-wikia-home-wiki-list-official-no')->text(); ?> </a> </td> <td> <?php $i = 1; ?> <?php foreach ($collections as $collection) { ?> <label><input type="checkbox" class="collection-checkbox" value="<?php echo $collection['id']; ?> " <?php if (in_array($collection['id'], $wiki->collections)) {
/** * get data about corporate wikis * @return array */ protected function getVisualizationData() { $visualizationModel = new CityVisualization(); return $visualizationModel->getVisualizationWikisData(); }
?> </a> </td> <td> <a href="#" class="status-promoted" data-id="<?php echo $wiki->city_id; ?> " data-vertical="<?php echo $wiki->city_vertical; ?> " data-flags="<?php echo CityVisualization::isPromotedWiki($wiki->city_flags); ?> "> <?php echo CityVisualization::isPromotedWiki($wiki->city_flags) ? wfMsg('manage-wikia-home-wiki-list-blocked-yes') : wfMsg('manage-wikia-home-wiki-list-blocked-no'); ?> </a> </td> </tr> <?php } ?> </tbody> </table> <?php if (!empty($pagination)) { ?> <?php echo $pagination;
public function getWikiData($wikiId, $langCode) { $visualization = new CityVisualization(); $wikiData = $visualization->getWikiDataForPromote($wikiId, $langCode); return $this->sanitizeWikiData($wikiData); }
/** * Add wiki (wiki id) to selected collection * * @param $cityId * @param $collectionId */ public function addWikiToCollection($collectionId, $cityId) { $collection = $this->getById($collectionId); $cityVisualization = new CityVisualization(); $wikiData = $cityVisualization->getWikiDataForVisualization($cityId, $collection['lang_code']); if (empty($wikiData['main_image'])) { $status = ['value' => false, 'message' => wfMessage('manage-wikia-home-collections-add-failure-image', $wikiData['name'])->text()]; } else { if (!$this->checkWikiCollectionExists($collectionId, $cityId)) { $db = wfGetDB(DB_MASTER, array(), $this->wg->ExternalSharedDB); $insertData = ['collection_id' => $collectionId, 'city_id' => $cityId]; $db->insert(self::COLLECTIONS_CV_TABLE, $insertData); $db->commit(); $this->clearCache($collection['lang_code']); $this->clearWikiCache($cityId); $status = ['value' => true, 'message' => wfMessage('manage-wikia-home-collections-add-success')->plain()]; } else { $status = ['value' => false, 'message' => wfMessage('manage-wikia-home-collections-add-failure-already-exists')->plain()]; } } return $status; }
/** * @param string $imageName * @param string $lang * @param int $wikiId * @return GlobalFile|null */ protected function findGlobalFileImage($imageName, $lang, $wikiId) { //try to find image on lang specific corporate wiki $f = null; $visualizationModel = new CityVisualization(); $cityList = $visualizationModel->getVisualizationWikisData(); if (isset($cityList[$lang])) { $f = GlobalFile::newFromText($imageName, $cityList[$lang]['wikiId']); } else { //if image wasn't found, try to find it on wiki itself $promoImage = (new PromoImage(PromoImage::MAIN))->setCityId($wikiId); $f = $promoImage->getOriginFile(); } return $f; }
public function getWikisInVisualisationAsCSV() { wfProfileIn(__METHOD__); global $wgOut; if (!$this->checkAccess()) { wfProfileOut(__METHOD__); $this->response->setHeader('Cache-Control', 'no-cache'); throw new PermissionsException('managewikiahome'); } // get data $visualizationLang = $this->request->getVal('lang', $this->wg->contLang->getCode()); $list = $this->helper->getWikisForStaffTool($this->prepareFilterOptions($visualizationLang, [])); $collections = $this->getWikiaCollectionsModel()->getList($visualizationLang); $verticals = $this->helper->getWikiVerticals(); // output data in csv format $out = fopen('php://memory', 'w'); // header $outHeader = ['ID', 'Vertical', 'Title', 'Is blocked?', 'Is promoted?', 'Is official?']; foreach ($collections as $collection) { $outHeader[] = 'In collection: ' . $collection['name'] . '?'; } fputcsv($out, $outHeader); foreach ($list as $wiki) { $outLine = [$wiki->city_id, $verticals[$wiki->city_vertical], $wiki->city_title, CityVisualization::isBlockedWiki($wiki->city_flags) ? 1 : 0, CityVisualization::isPromotedWiki($wiki->city_flags) ? 1 : 0, CityVisualization::isOfficialWiki($wiki->city_flags) ? 1 : 0]; foreach ($collections as $collection) { $outLine[] = in_array($collection['id'], $wiki->collections) ? 1 : 0; } fputcsv($out, $outLine); } fseek($out, 0); $csv = stream_get_contents($out); fclose($out); // turn off usual rendering $wgOut->disable(); // set up headers $this->response->setFormat(WikiaResponse::FORMAT_RAW); $this->response->setHeader('Cache-Control', 'private'); $this->response->setHeader('Content-Description', 'File Transfer'); $this->response->setHeader('Content-Disposition', 'attachment; filename=ManageWikiaHomeWikisList-' . $visualizationLang . '.csv'); $this->response->setHeader('Content-Transfer-Encoding', 'binary'); $this->response->setContentType('application/octet-stream'); $this->response->setBody($csv); wfProfileOut(__METHOD__); }
/** * Get corporate wikis languages * * @return array */ public function getCorporateWikisLanguages() { $visualizationModel = new CityVisualization(); $wikisData = $visualizationModel->getVisualizationWikisData(); $regions = []; foreach ($wikisData as $wikiData) { $regions[$wikiData['lang']] = Language::getLanguageName($wikiData['lang']); } return $regions; }
protected function removalTaskHelper($imageName) { $visualization = new CityVisualization(); $content_lang = $this->wg->contLang->getCode(); //create task only for languages which have corporate wiki if ($visualization->isCorporateLang($content_lang)) { $deletion_list = array($content_lang => array($this->wg->cityId => array($imageName))); wfRunHooks('CreatePromoImageReviewTask', ['delete', $deletion_list]); } }
/** * get wiki info ( wikiname, description, url, status, images ) * @param integer $wikiId * @param string $langCode * @param WikiDataGetter $dataGetter * @return array wikiInfo */ public function getWikiInfo($wikiId, $langCode, WikiDataGetter $dataGetter) { $this->wf->ProfileIn(__METHOD__); $wikiInfo = array('name' => '', 'headline' => '', 'description' => '', 'url' => '', 'new' => 0, 'hot' => 0, 'official' => 0, 'promoted' => 0, 'blocked' => 0, 'images' => array()); if (!empty($wikiId)) { $wiki = F::build('WikiFactory', array($wikiId), 'getWikiById'); if (!empty($wiki)) { $wikiInfo['url'] = $wiki->city_url . '?redirect=no'; } $wikiData = $dataGetter->getWikiData($wikiId, $langCode); if (!empty($wikiData)) { $wikiInfo['name'] = $wikiData['name']; $wikiInfo['headline'] = $wikiData['headline']; $wikiInfo['description'] = $wikiData['description']; // wiki status $wikiInfo['new'] = intval(CityVisualization::isNewWiki($wikiData['flags'])); $wikiInfo['hot'] = intval(CityVisualization::isHotWiki($wikiData['flags'])); $wikiInfo['official'] = intval(CityVisualization::isOfficialWiki($wikiData['flags'])); $wikiInfo['promoted'] = intval(CityVisualization::isPromotedWiki($wikiData['flags'])); $wikiInfo['blocked'] = intval(CityVisualization::isBlockedWiki($wikiData['flags'])); $wikiInfo['images'] = array(); if (!empty($wikiData['main_image'])) { $wikiInfo['images'][] = $wikiData['main_image']; } $wikiData['images'] = !empty($wikiData['images']) ? (array) $wikiData['images'] : array(); // wiki images if (!empty($wikiData['images'])) { $wikiInfo['images'] = array_merge($wikiInfo['images'], $wikiData['images']); } } } $this->wf->ProfileOut(__METHOD__); return $wikiInfo; }
public function getMemcKey($wikiId, $langCode) { /** @var $visualization CityVisualization */ $visualization = new CityVisualization(); return $visualization->getWikiDataCacheKey($visualization->getTargetWikiId($langCode), $wikiId, $langCode); }
protected function checkWikiStatus($wikiId, $langCode) { $wikiStatus = ['hasImagesRejected' => false, 'hasImagesInReview' => false, 'isApproved' => false, 'isAutoApproved' => false]; WikiaLogger::instance()->debug("SpecialPromote", ['method' => __METHOD__, 'wikiId' => $wikiId, 'lang' => $langCode]); $visualization = new CityVisualization(); $wikiDataVisualization = $visualization->getWikiDataForVisualization($wikiId, $langCode); $mainImage = $this->getMainImage(); $additionalImages = $this->getAdditionalImages(); if (!empty($wikiDataVisualization['main_image'])) { $wikiStatus['isApproved'] = true; } $imageStatuses = array(); if ($mainImage) { $imageStatuses[] = $mainImage['review_status']; } if ($additionalImages) { foreach ($additionalImages as $image) { $imageStatuses[] = $image['review_status']; } } foreach ($imageStatuses as $status) { switch ($status) { case ImageReviewStatuses::STATE_REJECTED: $wikiStatus['hasImagesRejected'] = true; break; case ImageReviewStatuses::STATE_UNREVIEWED: case ImageReviewStatuses::STATE_IN_REVIEW: case ImageReviewStatuses::STATE_QUESTIONABLE: case ImageReviewStatuses::STATE_QUESTIONABLE_IN_REVIEW: $wikiStatus['hasImagesInReview'] = true; break; case ImageReviewStatuses::STATE_AUTO_APPROVED: $wikiStatus['isAutoApproved'] = true; break; } } WikiaLogger::instance()->debug("SpecialPromote", ['method' => __METHOD__, "imageStatuses" => $imageStatuses]); return $wikiStatus; }
/** * @param $params array of options * * Valid options are: * noChangeThreshold (int) -> how many days of non-changed stat cause an error */ public function __construct($params) { $this->baseDate = date(self::DATE_FORMAT); if (!empty($params['noChangeThreshold'])) { $this->noChangeThreshold = intval($params['noChangeThreshold']); } else { $this->noChangeThreshold = self::DEFAULT_NO_CHANGE_THRESHOLD; } if (!empty($params['watcherEmails'])) { $this->watcherEmails = explode(',', $params['watcherEmails']); } else { // if no emails are passed, we don't send anything $this->watcherEmails = []; } $this->dataStorage = new CorporateHomePageStatisticsStorage(); $cityVisualization = new CityVisualization(); $this->corporateWikis = $cityVisualization->getVisualizationWikisIds(); $this->collectedErrors = []; }