factorization to be more browser2 aware

This commit is contained in:
Romain Bignon 2014-03-19 13:51:01 +01:00
commit 971c36c68b

View file

@ -17,9 +17,8 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with weboob. If not, see <http://www.gnu.org/licenses/>. # along with weboob. If not, see <http://www.gnu.org/licenses/>.
from datetime import datetime, date, time
from weboob.tools.browser2.page import HTMLPage, method, ListElement, ItemElement from weboob.tools.browser2.page import HTMLPage, method, ListElement, ItemElement
from weboob.tools.browser2.filters import Env from weboob.tools.browser2.filters import Env, CleanText, Regexp, Attr, Date, Map
from weboob.capabilities.gauge import Gauge, GaugeMeasure, GaugeSensor from weboob.capabilities.gauge import Gauge, GaugeMeasure, GaugeSensor
from weboob.capabilities.base import NotAvailable, NotLoaded from weboob.capabilities.base import NotAvailable, NotLoaded
@ -37,20 +36,38 @@ class ListPage(HTMLPage):
class item(ItemElement): class item(ItemElement):
klass = Gauge klass = Gauge
forecasts = {'pf_gerade.png': u'stable',
'pf_unten.png': u'Go down',
'pf_oben.png': u'Go up',
}
alarmlevel = {"as1.gif": u"Alarmstufe 1", "as2.gif": u"Alarmstufe 2", alarmlevel = {"as1.gif": u"Alarmstufe 1", "as2.gif": u"Alarmstufe 2",
"as3.gif": u"Alarmstufe 3", "as4.gig": u"Alarmstufe 4", "as3.gif": u"Alarmstufe 3", "as4.gig": u"Alarmstufe 4",
"qua_grau.gif": u"No alarm function", "p_gruen.gif": u"", "qua_grau.gif": u"No alarm function", "p_gruen.gif": u"",
"qua_weiss.gif": u"no data", "as0.gif": u"", "qua_weiss.gif": u"no data", "as0.gif": u"",
"MNW.gif": u""} "MNW.gif": u""}
obj_id = Env('id') obj_id = CleanText(Env('id'))
obj_name = Env('name') obj_name = CleanText(Env('name'), "'")
obj_city = Env('city') obj_city = Regexp(Attr('name'), '^([^\s]+).*')
obj_object = Env('object') obj_object = Env('object')
obj_sensors = Env('sensors')
def init_sensor(self, _id, name, unit, value, forecast, alarm, date): def parse(self, el):
sensor = GaugeSensor("%s-%s" % (_id, name.lower())) div = el.getparent()
img = div.find('.//img').attrib['src'].split('/')[1]
data = unicode(el.attrib['onmouseover']) \
.strip('pegelein(').strip(')').replace(",'", ",").split("',")
self.env['id'] = data[7].strip()
self.env['name'] = data[0]
self.env['object'] = data[1]
self.env['datetime'] = data[2]
self.env['levelvalue'] = data[3]
self.env['flowvalue'] = data[4]
self.env['forecast'] = data[5]
self.env['alarm'] = img
def add_sensor(self, sensors, name, unit, value, forecast, alarm, date):
sensor = GaugeSensor("%s-%s" % (self.obj.id, name.lower()))
sensor.name = name sensor.name = name
sensor.unit = unit sensor.unit = unit
sensor.forecast = forecast sensor.forecast = forecast
@ -58,62 +75,26 @@ class ListPage(HTMLPage):
lastvalue.alarm = alarm lastvalue.alarm = alarm
try: try:
lastvalue.level = float(value) lastvalue.level = float(value)
except: except ValueError:
lastvalue.level = NotAvailable lastvalue.level = NotAvailable
lastvalue.date = date lastvalue.date = date
sensor.lastvalue = lastvalue sensor.lastvalue = lastvalue
sensor.history = NotLoaded sensor.history = NotLoaded
sensor.gaugeid = unicode(_id) sensor.gaugeid = self.obj.id
return sensor sensors.append(sensor)
def parse(self, el):
div = el.getparent()
img = div.find('.//img').attrib['src'].split('/')[1]
data = el.attrib['onmouseover'] \
.strip('pegelein(').strip(')').replace(",'", ",").split("',")
self.env['id'] = data[7].strip()
self.env['name'] = unicode(data[0].strip("'"))
self.env['city'] = self.env['name'].split(' ')[0]
self.env['object'] = unicode(data[1])
def obj_sensors(self):
sensors = [] sensors = []
try:
datenumbers = data[2].split(' ')[0].split(".")
timenumbers = data[2].split(' ')[1].split(":")
lastdate = date(*reversed([int(x) for x in datenumbers]))
lasttime = time(*[int(x) for x in timenumbers])
lastdate = datetime.combine(lastdate, lasttime)
except:
lastdate = NotAvailable
bildforecast = data[5] lastdate = Date(Regexp(Env('datetime'), r'(\d+)\.(\d+)\.(\d+) (\d+):(\d+)', r'\3-\2-\1 \4:\5'))(self)
if bildforecast == "pf_gerade.png": forecast = Map(Env('forecast'), self.forecasts, default=NotAvailable)(self)
forecast = u"stable" alarm = Map(Env('alarm'), self.alarmlevel, default=u'')(self)
elif bildforecast == "pf_unten.png":
forecast = u"Go down"
elif bildforecast == "pf_oben.png":
forecast = u"Go up"
else:
forecast = NotAvailable
try: self.add_sensor(sensors, u"Level", u"cm", self.env['levelvalue'], forecast, alarm, lastdate)
alarm = self.alarmlevel[img] self.add_sensor(sensors, u"Flow", u"m3/s", self.env['flowvalue'], forecast, alarm, lastdate)
except KeyError:
alarm = u""
levelsensor = self.init_sensor(self.env['id'], u"Level", return sensors
u"cm", data[3], forecast,
alarm, lastdate)
sensors.append(levelsensor)
flowsensor = self.init_sensor(self.env['id'], u"Flow",
u"m3/s", data[4], forecast,
alarm, lastdate)
sensors.append(flowsensor)
self.env['sensors'] = sensors
class HistoryPage(HTMLPage): class HistoryPage(HTMLPage):
@ -125,30 +106,17 @@ class HistoryPage(HTMLPage):
klass = GaugeMeasure klass = GaugeMeasure
verif = re.compile("\d\d.\d\d.\d+ \d\d:\d\d") verif = re.compile("\d\d.\d\d.\d+ \d\d:\d\d")
obj_date = Env('date')
obj_level = Env('level')
obj_id = None
def condition(self): def condition(self):
if self.verif.match(self.el[0].text_content()): return self.verif.match(self.el[0].text_content())
return True
return False
def parse(self, line): obj_id = None
leveldate = date(*reversed([int(x) obj_date = Date(Regexp(CleanText('.'), r'(\d+)\.(\d+)\.(\d+) (\d+):(\d+)', r'\3-\2-\1 \4:\5'))
for x in line[0].text_content().split(' ')[0].split(".")]))
leveltime = time(*[int(x)
for x in line[0].text_content().split(' ')[1].split(":")])
self.env['date'] = datetime.combine(leveldate, leveltime)
if self.env['sensor'].name == u"Level": sensor_types = [u'Level', u'Flow']
try: def obj_level(self):
self.env['level'] = float(line[1].text_content()) index = self.sensor_types.index(self.env['sensor'].name) + 1
except: try:
self.env['level'] = NotAvailable return float(self.el[index].text_content())
elif self.env['sensor'].name == u"Flow": except ValueError:
try: return NotAvailable
self.env['level'] = float(line[2].text_content())
except:
self.env['level'] = NotAvailable
# TODO: history.alarm # TODO: history.alarm