/** * 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; }
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; }
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; }
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(); } }