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__); }
public function getMemcKey($wikiId, $langCode) { /** @var $visualization CityVisualization */ $visualization = new CityVisualization(); return $visualization->getWikiDataCacheKey($visualization->getTargetWikiId($langCode), $wikiId, $langCode); }
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; }
public function saveVisualizationData($data, $langCode) { global $wgEnableUploads; wfProfileIn(__METHOD__); if (empty($wgEnableUploads)) { throw new Exception('promote-upload-image-uploads-disabled'); } $cityId = $this->wg->cityId; $files = array('additionalImages' => array()); $promoImages = array(); $visualizationModel = new CityVisualization(); $isCorpLang = $visualizationModel->isCorporateLang($langCode); foreach ($data as $fileType => $dataContent) { switch ($fileType) { case 'mainImageName': $fileName = $dataContent; // uploaded fileName that matches through infer type, means that // file was not really uploaded, and was already present in DB // FIXME: this mechanism is hacky, it should be more durable than string matching $promoMainImage = PromoImage::fromPathname($fileName); if ($promoMainImage->isType(PromoImage::MAIN)) { //check if file exists on current wiki $file = GlobalFile::newFromText($promoMainImage->getPathname(), $cityId); if ($file->exists()) { array_push($promoImages, $promoMainImage); } } else { $promoMainImage = new PromoImage(PromoImage::MAIN, $this->wg->DBname); $promoMainImage->processUploadedFile($fileName); array_push($promoImages, $promoMainImage); } break; case 'additionalImagesNames': $additionalImagesNames = $dataContent; $additionalImages = $this->saveAdditionalFiles($additionalImagesNames); $promoImages = array_merge($promoImages, $additionalImages); break; case 'headline': $headline = $dataContent; break; case 'description': $description = $dataContent; break; } } //attempt to cleanup if there used to be a promo main image if (empty($promoMainImage)) { $promoMainImage = new PromoImage(PromoImage::MAIN, $this->wg->DBname); if ($promoMainImage->corporateFileByLang($this->wg->ContLanguageCode)->exists()) { $promoMainImage->deleteImageFromCorporate(); } } $updateData = array('city_lang_code' => $langCode, 'city_headline' => $headline, 'city_description' => $description); $additionalImageNames = array(); $modifiedImageNames = array(); foreach ($promoImages as $promoImage) { if ($promoImage->isType(PromoImage::MAIN)) { if (!$promoImage->wasRemoved()) { $updateData['city_main_image'] = $promoImage->getPathname(); } else { $updateData['city_main_image'] = null; } } else { if (!$promoImage->wasRemoved()) { array_push($additionalImageNames, $promoImage->getPathname()); } } if ($promoImage->isFileChanged() and !$promoImage->wasRemoved()) { array_push($modifiedImageNames, $promoImage->getPathname()); } } $updateData['city_images'] = json_encode($additionalImageNames); WikiaLogger::instance()->debug("SpecialPromote", ['method' => __METHOD__, 'files' => $files, 'data' => $data, 'updateData' => $updateData, 'cityId' => $cityId]); $visualizationModel->saveVisualizationData($cityId, $updateData, $langCode); if (!empty($modifiedImageNames)) { $imageReviewState = $isCorpLang ? ImageReviewStatuses::STATE_UNREVIEWED : ImageReviewStatuses::STATE_AUTO_APPROVED; $visualizationModel->saveImagesForReview($cityId, $langCode, $modifiedImageNames, $imageReviewState); } $visualizationModel->updateWikiPromoteDataCache($cityId, $langCode, $updateData); // clear memcache so it's visible on site after edit $helper = new WikiGetDataForVisualizationHelper(); $corpWikiId = $visualizationModel->getTargetWikiId($langCode); // wiki info cache $this->wg->memc->delete($helper->getMemcKey($cityId, $langCode)); $this->wg->memc->delete((new WikiGetDataForPromoteHelper())->getMemcKey($cityId, $langCode)); $this->wg->memc->delete((new WikiGetDataForPromoteHelper())->getImagesMemcKey($cityId, $langCode)); // wiki list cache $this->wg->memc->delete($visualizationModel->getVisualizationWikisListDataCacheKey($corpWikiId, $langCode)); // batches cache $this->wg->memc->delete($visualizationModel->getVisualizationBatchesCacheKey($corpWikiId, $langCode)); wfProfileOut(__METHOD__); }