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());
 }
 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__);
 }
Beispiel #3
0
 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]);
     }
 }