Example #1
0
 /**
  * Creates data provider instance with search query applied
  *
  * @param array $params
  *
  * @return ActiveDataProvider
  */
 public function search($params)
 {
     $query = WeatherAlert::find();
     $query->joinWith(['userReadAlerts.weatherAlert']);
     $dataProvider = new ActiveDataProvider(['query' => $query]);
     $dataProvider->setSort(['attributes' => ['id', 'magnitude', 'event', 'date', 'severity', 'stormName' => ['asc' => ['id' => SORT_ASC], 'desc' => ['id' => SORT_DESC], 'label' => 'Storm Name', 'default' => SORT_ASC]]]);
     $this->load($params);
     if (!$this->validate()) {
         // uncomment the following line if you do not want to any records when validation fails
         // $query->where('0=1');
         return $dataProvider;
     }
     $query->andFilterWhere(['id' => $this->id, 'magnitude' => $this->magnitude, 'identifier' => $this->identifier]);
     $query->andFilterWhere(['like', 'severity', $this->severity]);
     $query->andFilterWhere(['=', 'WeatherAlert.type', $this->type]);
     $query->andFilterWhere(['=', 'WeatherAlert.event', $this->event]);
     $query->andFilterWhere(['=', 'WeatherAlert.status', WeatherAlert::STATUS_ACTUAL]);
     //        var_dump(time() - Yii::$app->params['timePeriodForRecentAlerts']*3600);die;
     $timePeriodForAlert = $this->type == 0 ? Yii::$app->params['timePeriodForRecentPreAlerts'] : Yii::$app->params['timePeriodForRecentPostAlerts'];
     //        if ($this->type == 1) {
     //            var_dump($timePeriodForAlert);die;
     //        }
     $query->andFilterWhere(['>', 'WeatherAlert.date', time() - $timePeriodForAlert * 3600]);
     //        $query->addSelect('COUNT(UserReadAlerts.User_id)');
     //        $query->andFilterWhere(['=', 'UserReadAlerts.User_id', Yii::$app->user->id]);
     //        $query->andFilterWhere(['=', 'UserReadAlerts.WeatherAlert_id', $this->id]);
     //        if (!Yii::$app->request->isPjax) {
     //
     //        }
     $query->orderBy(['WeatherAlert.date' => SORT_DESC]);
     //        $query->orderBy(['UserReadAlerts.User_id'=>'DESC']);
     $query->groupBy(['WeatherAlert.id']);
     return $dataProvider;
 }
Example #2
0
 public function getUnreadAlertsCount($type)
 {
     $query = new Query();
     $ids = [];
     $timePeriodForAlert = $type == 0 ? Yii::$app->params['timePeriodForRecentPreAlerts'] : Yii::$app->params['timePeriodForRecentPostAlerts'];
     $allAlerts = WeatherAlert::find()->where(['type' => $type, 'status' => WeatherAlert::STATUS_ACTUAL])->andFilterWhere(['>', 'date', time() - $timePeriodForAlert * 3600])->all();
     foreach ($allAlerts as $alert) {
         $ids[] = $alert->id;
     }
     //        var_dump($ids);die;
     //        $readedAlerts = UserReadAlerts::find()->andFilterWhere(['in','WeatherAlert_id',implode(',',$ids)])->all();
     $readedAlerts = UserReadAlerts::find()->where(['WeatherAlert_id' => $ids, 'User_id' => Yii::$app->user->id])->count();
     return count($ids) - (int) $readedAlerts;
 }
Example #3
0
 private function _performRelatedAlertsLoop($alert)
 {
     $stormPath = array();
     $relatedAlert = models\WeatherAlert::find()->where(['identifier' => $alert->updates])->one();
     $needToPerformLoop = true;
     while ($needToPerformLoop) {
         $stormPath[] = $this->_getAlertCoordinates($relatedAlert);
         if ($relatedAlert->updates) {
             $relatedAlert = models\WeatherAlert::find()->where(['identifier' => $relatedAlert->updates])->one();
         } else {
             $needToPerformLoop = false;
         }
     }
     return $stormPath;
 }
Example #4
0
 public function parseAtomFeed()
 {
     $url = Yii::$app->params['AtomFeedParser']['url'];
     $startTime = time();
     $needToUpdateCAP = false;
     try {
         $atomGeneralInformation = Yii::$app->CAPParser->getAtomGeneralContent($url);
         $atomEntriesContent = Yii::$app->CAPParser->getEntriesContent($url);
         if (!isset($atomGeneralInformation['updated']) || !isset($atomGeneralInformation['id'])) {
             throw new Exception("Can't parse AtomFeed file by given URL");
         }
         $processedFeedsModel = new models\ProcessedATOMFeeds();
         $processedFeedsModelSearch = new models\ProcessedATOMFeedsSearch();
         $atomRecordInDb = $processedFeedsModelSearch->findOne(['feedURL' => $atomGeneralInformation['id']]);
         if (!$atomRecordInDb) {
             //We don't have records at all for this file
             $processedFeedsModel->updated = helpers\DateTimeHelper::createUnixtimeFromDate($atomGeneralInformation['updated']);
             $processedFeedsModel->feedURL = $atomGeneralInformation['id'];
             $processedFeedsModel->save();
             $this->consoleLog('Added ProcessedATOMFeeds Record, id - ' . $processedFeedsModel->feedURL . ', updated - ' . helpers\DateTimeHelper::createDateFromUnixtime($processedFeedsModel->updated) . '(' . $atomGeneralInformation['updated'] . ')');
             $needToUpdateCAP = true;
         } else {
             if ($atomRecordInDb->updated != helpers\DateTimeHelper::createUnixtimeFromDate($atomGeneralInformation['updated'])) {
                 $this->consoleLog('We need to update records in WeatherAlert and WeatherAlertArea tables.Updated time in the database -' . helpers\DateTimeHelper::createDateFromUnixtime($atomRecordInDb->updated) . ', from file - ' . $atomGeneralInformation['updated'] . ' (' . helpers\DateTimeHelper::createDateFromUnixtime(helpers\DateTimeHelper::createUnixtimeFromDate($atomGeneralInformation['updated'])) . ')');
                 $atomRecordInDb->updated = helpers\DateTimeHelper::createUnixtimeFromDate($atomGeneralInformation['updated']);
                 $atomRecordInDb->save();
                 $needToUpdateCAP = true;
             }
         }
         if (!$needToUpdateCAP) {
             $this->consoleLog('We DON\'T need to update records in WeatherAlert and WeatherAlertArea tables.');
         }
         if ($needToUpdateCAP) {
             //change 1 to $needToUpdateCAP
             foreach ($atomEntriesContent['entries'] as $entry) {
                 $entryContent = $this->_getCapAreaInformationInDatabse($entry);
                 if ($entryContent) {
                     // Now we try to find this alert and check if we have it already in our database
                     $alertModel = models\WeatherAlert::find()->where(['identifier' => $entryContent['identifier'], 'date' => helpers\DateTimeHelper::createUnixtimeFromDate($entryContent['date'])])->one();
                     if (!$alertModel) {
                         $alertModel = new models\WeatherAlert();
                     } else {
                         $this->skippedAlertsCount++;
                         $this->consoleLog('One alert entry skipped (Information about this alert is actual in our database, ID = ' . $alertModel->id . ')');
                         continue;
                     }
                     $alertModel->attributes = $entryContent;
                     $alertModel->date = helpers\DateTimeHelper::createUnixtimeFromDate($alertModel->date);
                     $alertModel->save();
                     $this->consoleLog('One alert entry added (ID: ' . $alertModel->id . ')');
                     $this->addedAlertsCount++;
                     if ($alertModel->updates) {
                         //WE need to change status of old alert
                         //TODO: this part of code should be checked on real data
                         $alertModel = models\WeatherAlert::find()->where(['identifier' => $alertModel->updates])->one();
                         $alertModel->status = models\WeatherAlert::STATUS_UPDATED;
                         $alertModel->save();
                     }
                     $weatherAlertAreaModel = new models\WeatherAlertArea();
                     $weatherAlertAreaModel->WeatherAlert_id = $alertModel->id;
                     $weatherAlertAreaModel->save();
                     if (isset($entryContent['polygon']['0'])) {
                         $coordinatePairs = explode(' ', $entryContent['polygon']['0']);
                         foreach ($coordinatePairs as $pair) {
                             $areaDefinitionModel = new models\AreaDefinition();
                             $areaDefinitionModel->WeatherAlertArea_id = $weatherAlertAreaModel->id;
                             $latLonFromPair = explode(',', $pair);
                             $areaDefinitionModel->latitude = $latLonFromPair[0];
                             $areaDefinitionModel->longitude = $latLonFromPair[1];
                             $areaDefinitionModel->save();
                         }
                     }
                     if (isset($entryContent['circle']['0'])) {
                         $coordinatePair = explode(' ', $entryContent['polygon']['0']);
                         $areaDefinitionModel = new models\AreaDefinition();
                         $areaDefinitionModel->WeatherAlertArea_id = $weatherAlertAreaModel->id;
                         $latLonFromPair = explode(',', $coordinatePair);
                         $areaDefinitionModel->latitude = $latLonFromPair[0];
                         $areaDefinitionModel->longitude = $latLonFromPair[1];
                         $areaDefinitionModel->radius = $coordinatePair[1];
                         $areaDefinitionModel->save();
                     }
                 }
             }
         }
         $endTime = time();
         $this->consoleLog('Start date - ' . date('Y-m-d\\TH:i:s', $startTime));
         $this->consoleLog('End date - ' . date('Y-m-d\\TH:i:s', $endTime));
         $this->consoleLog('Execution Time - ' . ($endTime - $startTime) . ' seconds.');
         $this->consoleLog('Count of added alerts - ' . $this->addedAlertsCount);
         $this->consoleLog('Count of skipped alerts - ' . $this->skippedAlertsCount);
         $atomGeneralInformation = array_merge(['start' => date('Y-m-d\\TH:i:s', $startTime), 'end' => date('Y-m-d\\TH:i:s', $endTime)], $atomGeneralInformation);
         $atomGeneralInformation['entries'] = isset($atomEntriesContent['entries']) ? $atomEntriesContent['entries'] : [];
         return $atomGeneralInformation;
     } catch (\Exception $e) {
         $this->consoleLog('Process ERROR -  ' . $e->getMessage());
         Yii::$app->end();
     }
 }