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__);
 }