#!/usr/bin/python -tt # -*- coding: utf-8 -*- # Copyright 2009-2012 Michal Sadowski (sq6jnx at hamradio dot pl) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # import urllib2 import re import json import logging import base64 import subprocess from sr0wx_module import SR0WXModule class ImgwPodestSq9atk(SR0WXModule): """Klasa przetwarza dane informujące o przekroczeniach stanów rzek w regionie.""" def __init__(self, wodowskazy): self.__wodowskazy = wodowskazy self.__logger = logging.getLogger(__name__) def zaladujWybraneWodowskazy(s): global wodowskazy s.__logger.info("::: Pobieram dane o wodowskazach...") try: jsonData = json.dumps(s.__wodowskazy, separators=(',', ':')) b64data = base64.urlsafe_b64encode(jsonData) proc = subprocess.Popen("php imgw_podest_sq9atk.php "+b64data, shell=True, stdout=subprocess.PIPE) dane = proc.stdout.read() s.__logger.info("::: Przetwarzam...") wodowskazy = json.loads(dane) except: s.__logger.info("Nie udało się pobrać danych o wodowskazach!") def bezpiecznaNazwa(s, nazwa): return unicode(nazwa, 'utf-8').lower().\ replace(u'ą',u'a_').replace(u'ć',u'c_').\ replace(u'ę',u'e_').replace(u'ł',u'l_').\ replace(u'ń',u'n_').replace(u'ó',u'o_').\ replace(u'ś',u's_').replace(u'ź',u'z_').\ replace(u'ż',u'z_').replace(u' ',u'_').\ replace(u'-',u'_').replace(u'(',u'').\ replace(u')',u'') def pobierzDaneWodowskazu(s, wodowskaz): global wodowskazy if '.' in wodowskaz: wodowskaz = wodowskaz.split('.')[1] dane = wodowskazy[wodowskaz] # omijanie zrypanych wodowskazów #elif dane['poziom_alarmowy'] == None: # stan = "" #elif dane['poziom_ostrzegawczy'] == None: # stan = "" if dane['stan_cm'] > dane['poziom_alarmowy']: stan = "alarmowy" elif dane['stan_cm'] > dane['poziom_ostrzegawczy']: stan = "ostrzegawczy" else: stan = "" if dane['tendencja'] == 1: tendencja = "tendencja_wzrostowa" elif dane['tendencja'] == -1: tendencja = "tendencja_spadkowa" else: tendencja = "" return {'numer': wodowskaz, 'nazwa': dane['nazwa'].strip().encode("utf-8"), 'nazwa_org': dane['nazwa'].lower().encode("utf-8"), 'rzeka': dane['rzeka'].strip().encode("utf-8"), 'stan': dane['stan_cm'], 'przekroczenieStanu': stan, # 'przekroczenieStanuStan': stan, 'tendencja': tendencja } def get_data(s): stanyOstrzegawcze = {} stanyAlarmowe = {} zaladowaneRegiony = [] s.zaladujWybraneWodowskazy() for wodowskaz in s.__wodowskazy: region = wodowskaz.split('.')[0] if region not in zaladowaneRegiony: zaladowaneRegiony.append(region) #w = s.pobierzDaneWodowskazu(wodowskaz) try: w = s.pobierzDaneWodowskazu(wodowskaz) rzeka = w['rzeka'] w['rzeka'] = s.bezpiecznaNazwa(w['rzeka']) w['nazwa'] = s.bezpiecznaNazwa(w['nazwa']) if w['przekroczenieStanu'] == 'ostrzegawczy': s.__logger.info("::: Stan ostrzegawczy: " + wodowskaz + " - " + rzeka + ' - ' + w['nazwa_org']) if not stanyOstrzegawcze.has_key(w['rzeka']): stanyOstrzegawcze[w['rzeka']] = [w['nazwa']+ ' ' + w['tendencja'] + ' _ '] else: stanyOstrzegawcze[w['rzeka']].append(w['nazwa']+ ' ' + w['tendencja'] + ' _ ') elif w['przekroczenieStanu'] == 'alarmowy': s.__logger.info("::: Stan alarmowy: "+ wodowskaz+" - " + rzeka + ' - ' + w['nazwa_org']) if not stanyAlarmowe.has_key(w['rzeka']): stanyAlarmowe[w['rzeka']] = [w['nazwa']+ ' ' + w['tendencja'] + ' _ '] else: stanyAlarmowe[w['rzeka']].append(w['nazwa']+ ' ' + w['tendencja'] + ' _ ') else: a=1 #s.__logger.info("Przetwarzam wodowskaz: " + wodowskaz + " - " + rzeka + ' - ' + w['nazwa_org']) except: s.__logger.info("::: Brak danych!!! "+ wodowskaz ) pass if stanyOstrzegawcze!={} or stanyAlarmowe!={}: message = ' _ komunikat_hydrologiczny_imgw _ ' if stanyAlarmowe!={}: message +=' przekroczenia_stanow_alarmowych ' for rzeka in sorted(stanyAlarmowe.keys()): message +=' rzeka %s wodowskaz %s '%(rzeka, \ " wodowskaz ".join(sorted(stanyAlarmowe[rzeka])),) if stanyOstrzegawcze!={}: message += '_ przekroczenia_stanow_ostrzegawczych ' for rzeka in sorted(stanyOstrzegawcze.keys()): message += 'rzeka %s wodowskaz %s '%(format(rzeka), \ " wodowskaz ".join([format(w) for w in sorted(stanyOstrzegawcze[rzeka])]),) message += ' ' else: message = ' ' s.__logger.info("::: Przekazuję przetworzone dane...\n") return { "message": message, "source": "imgw", }