[vlille] adapt to browser2
This commit is contained in:
parent
b03881de24
commit
22209d0020
3 changed files with 109 additions and 101 deletions
|
|
@ -19,6 +19,7 @@
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from weboob.tools.backend import BaseBackend
|
from weboob.tools.backend import BaseBackend
|
||||||
|
from weboob.capabilities.base import find_object
|
||||||
from weboob.capabilities.gauge import ICapGauge, GaugeSensor, Gauge, SensorNotFound
|
from weboob.capabilities.gauge import ICapGauge, GaugeSensor, Gauge, SensorNotFound
|
||||||
|
|
||||||
from .browser import VlilleBrowser
|
from .browser import VlilleBrowser
|
||||||
|
|
@ -47,11 +48,9 @@ class VlilleBackend(BaseBackend, ICapGauge):
|
||||||
|
|
||||||
def iter_sensors(self, gauge, pattern=None):
|
def iter_sensors(self, gauge, pattern=None):
|
||||||
if not isinstance(gauge, Gauge):
|
if not isinstance(gauge, Gauge):
|
||||||
gauge = self._get_gauge_by_id(gauge)
|
gauge = find_object(self.iter_gauges(), id=gauge, error=SensorNotFound)
|
||||||
if gauge is None:
|
|
||||||
raise SensorNotFound()
|
|
||||||
|
|
||||||
gauge.sensors = self.browser.get_station_infos(gauge)
|
gauge = self.browser.get_station_infos(gauge).next()
|
||||||
if pattern is None:
|
if pattern is None:
|
||||||
for sensor in gauge.sensors:
|
for sensor in gauge.sensors:
|
||||||
yield sensor
|
yield sensor
|
||||||
|
|
@ -68,11 +67,13 @@ class VlilleBackend(BaseBackend, ICapGauge):
|
||||||
raise SensorNotFound()
|
raise SensorNotFound()
|
||||||
return sensor.lastvalue
|
return sensor.lastvalue
|
||||||
|
|
||||||
|
"""
|
||||||
def _get_gauge_by_id(self, id):
|
def _get_gauge_by_id(self, id):
|
||||||
for gauge in self.browser.get_station_list():
|
for gauge in self.browser.get_station_list():
|
||||||
if id == gauge.id:
|
if id == gauge.id:
|
||||||
return gauge
|
return gauge
|
||||||
return None
|
return None
|
||||||
|
"""
|
||||||
|
|
||||||
def _get_sensor_by_id(self, id):
|
def _get_sensor_by_id(self, id):
|
||||||
reSensorId = re.search('(\d+)-((bikes|attach|status))', id, re.IGNORECASE)
|
reSensorId = re.search('(\d+)-((bikes|attach|status))', id, re.IGNORECASE)
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
|
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
from weboob.tools.browser import BaseBrowser
|
from weboob.tools.browser2 import PagesBrowser, URL
|
||||||
|
|
||||||
from .pages import ListStationsPage, InfoStationPage
|
from .pages import ListStationsPage, InfoStationPage
|
||||||
|
|
||||||
|
|
@ -26,23 +26,14 @@ from .pages import ListStationsPage, InfoStationPage
|
||||||
__all__ = ['VlilleBrowser']
|
__all__ = ['VlilleBrowser']
|
||||||
|
|
||||||
|
|
||||||
class VlilleBrowser(BaseBrowser):
|
class VlilleBrowser(PagesBrowser):
|
||||||
PROTOCOL = 'http'
|
|
||||||
DOMAIN = 'www.vlille.fr/stations'
|
|
||||||
ENCODING = None
|
|
||||||
|
|
||||||
PAGES = {
|
BASEURL = 'http://www.vlille.fr'
|
||||||
'%s://%s/les-stations-vlille.aspx' % (PROTOCOL, DOMAIN): ListStationsPage,
|
list_page = URL('/stations/les-stations-vlille.aspx', ListStationsPage)
|
||||||
'%s://%s/xml-station.aspx\?borne=.*' % (PROTOCOL, DOMAIN): InfoStationPage,
|
info_page = URL('/stations/xml-station.aspx\?borne=(?P<idgauge>.*)', InfoStationPage)
|
||||||
'%s://%s/xml-stations.aspx' % (PROTOCOL, DOMAIN): ListStationsPage,
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_station_list(self):
|
def get_station_list(self):
|
||||||
if not self.is_on_page(ListStationsPage):
|
return self.list_page.go().get_station_list()
|
||||||
self.location('%s://%s/les-stations-vlille.aspx' % (self.PROTOCOL, self.DOMAIN))
|
|
||||||
#self.location(u'%s://%s/xml-stations.aspx' % (self.PROTOCOL, self.DOMAIN))
|
|
||||||
return self.page.get_station_list()
|
|
||||||
|
|
||||||
def get_station_infos(self, gauge):
|
def get_station_infos(self, gauge):
|
||||||
self.location('%s://%s/xml-station.aspx?borne=%s' % (self.PROTOCOL, self.DOMAIN, gauge.id))
|
return self.info_page.go(idgauge=gauge.id).get_station_infos(obj=gauge)
|
||||||
return self.page.get_station_infos(gauge.id)
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,9 @@
|
||||||
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
|
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
from weboob.tools.browser import BasePage
|
from weboob.tools.browser2.page import HTMLPage, XMLPage, method, ListElement, ItemElement, TableElement
|
||||||
|
from weboob.tools.browser2.filters import CleanText, TableCell, Filter
|
||||||
|
|
||||||
from weboob.capabilities.gauge import Gauge, GaugeMeasure, GaugeSensor
|
from weboob.capabilities.gauge import Gauge, GaugeMeasure, GaugeSensor
|
||||||
from weboob.capabilities.base import NotLoaded
|
from weboob.capabilities.base import NotLoaded
|
||||||
import datetime
|
import datetime
|
||||||
|
|
@ -27,86 +29,100 @@ import re
|
||||||
__all__ = ['InfoStationPage', 'ListStationsPage']
|
__all__ = ['InfoStationPage', 'ListStationsPage']
|
||||||
|
|
||||||
|
|
||||||
class InfoStationPage(BasePage):
|
class LastDateFilter(Filter):
|
||||||
def _create_bikes_sensor(self, value, gauge_id, last_update, adresse):
|
def filter(self, last_update):
|
||||||
levelbikes = GaugeSensor(gauge_id + '-bikes')
|
|
||||||
levelbikes.name = u'Bikes'
|
|
||||||
levelbikes.address = u'%s' % adresse
|
|
||||||
lastvalue = GaugeMeasure()
|
|
||||||
lastvalue.level = float(value)
|
|
||||||
lastvalue.date = last_update
|
|
||||||
if lastvalue.level < 1:
|
|
||||||
lastvalue.alarm = u'Empty station'
|
|
||||||
levelbikes.lastvalue = lastvalue
|
|
||||||
levelbikes.history = NotLoaded
|
|
||||||
levelbikes.gaugeid = gauge_id
|
|
||||||
return levelbikes
|
|
||||||
|
|
||||||
def _create_attach_sensor(self, value, gauge_id, last_update, adresse):
|
|
||||||
levelattach = GaugeSensor(gauge_id + '-attach')
|
|
||||||
levelattach.name = u'Attach'
|
|
||||||
levelattach.address = u'%s' % adresse
|
|
||||||
lastvalue = GaugeMeasure()
|
|
||||||
if lastvalue.level < 1:
|
|
||||||
lastvalue.alarm = u'Full station'
|
|
||||||
lastvalue.level = float(value)
|
|
||||||
lastvalue.date = last_update
|
|
||||||
levelattach.lastvalue = lastvalue
|
|
||||||
levelattach.history = NotLoaded
|
|
||||||
levelattach.gaugeid = gauge_id
|
|
||||||
return levelattach
|
|
||||||
|
|
||||||
def _create_status_sensor(self, value, gauge_id, last_update, adresse):
|
|
||||||
levelstatus = GaugeSensor(gauge_id + '-status')
|
|
||||||
levelstatus.name = u'Status'
|
|
||||||
levelstatus.address = u'%s' % adresse
|
|
||||||
lastvalue = GaugeMeasure()
|
|
||||||
status = float(value)
|
|
||||||
if status == 0:
|
|
||||||
status = 1
|
|
||||||
else:
|
|
||||||
status = -1
|
|
||||||
if lastvalue.level < 1:
|
|
||||||
lastvalue.alarm = u'Not available station'
|
|
||||||
lastvalue.level = float(status)
|
|
||||||
lastvalue.date = last_update
|
|
||||||
levelstatus.lastvalue = lastvalue
|
|
||||||
levelstatus.history = NotLoaded
|
|
||||||
levelstatus.gaugeid = gauge_id
|
|
||||||
return levelstatus
|
|
||||||
|
|
||||||
def _get_last_update(self, last_update):
|
|
||||||
return datetime.datetime.now() - datetime.timedelta(seconds=int(re.match(r'\d+', last_update).group(0)))
|
return datetime.datetime.now() - datetime.timedelta(seconds=int(re.match(r'\d+', last_update).group(0)))
|
||||||
|
|
||||||
def get_station_infos(self, gauge_id):
|
|
||||||
|
|
||||||
last_update = self._get_last_update(self.parser.select(self.document.getroot(), 'lastupd', 1).text)
|
class InfoStationPage(XMLPage):
|
||||||
sensors = []
|
@method
|
||||||
|
class get_station_infos(ListElement):
|
||||||
|
item_xpath = "."
|
||||||
|
|
||||||
adresse = self.parser.select(self.document.getroot(), 'adress', 1).text
|
class item(ItemElement):
|
||||||
|
klass = Gauge
|
||||||
|
|
||||||
sensors.append(self._create_bikes_sensor(self.parser.select(self.document.getroot(), 'bikes', 1).text, gauge_id, last_update, adresse))
|
def _create_bikes_sensor(self, value, gauge_id, last_update, adresse):
|
||||||
|
levelbikes = GaugeSensor(gauge_id + '-bikes')
|
||||||
|
levelbikes.name = u'Bikes'
|
||||||
|
levelbikes.address = u'%s' % adresse
|
||||||
|
lastvalue = GaugeMeasure()
|
||||||
|
lastvalue.level = float(value)
|
||||||
|
lastvalue.date = last_update
|
||||||
|
if lastvalue.level < 1:
|
||||||
|
lastvalue.alarm = u'Empty station'
|
||||||
|
levelbikes.lastvalue = lastvalue
|
||||||
|
levelbikes.history = NotLoaded
|
||||||
|
levelbikes.gaugeid = gauge_id
|
||||||
|
return levelbikes
|
||||||
|
|
||||||
sensors.append(self._create_attach_sensor(self.parser.select(self.document.getroot(), 'attachs', 1).text, gauge_id, last_update, adresse))
|
def _create_attach_sensor(self, value, gauge_id, last_update, adresse):
|
||||||
|
levelattach = GaugeSensor(gauge_id + '-attach')
|
||||||
|
levelattach.name = u'Attach'
|
||||||
|
levelattach.address = u'%s' % adresse
|
||||||
|
lastvalue = GaugeMeasure()
|
||||||
|
if lastvalue.level < 1:
|
||||||
|
lastvalue.alarm = u'Full station'
|
||||||
|
lastvalue.level = float(value)
|
||||||
|
lastvalue.date = last_update
|
||||||
|
levelattach.lastvalue = lastvalue
|
||||||
|
levelattach.history = NotLoaded
|
||||||
|
levelattach.gaugeid = gauge_id
|
||||||
|
return levelattach
|
||||||
|
|
||||||
sensors.append(self._create_status_sensor(self.parser.select(self.document.getroot(), 'status', 1).text, gauge_id, last_update, adresse))
|
def _create_status_sensor(self, value, gauge_id, last_update, adresse):
|
||||||
|
levelstatus = GaugeSensor(gauge_id + '-status')
|
||||||
|
levelstatus.name = u'Status'
|
||||||
|
levelstatus.address = u'%s' % adresse
|
||||||
|
lastvalue = GaugeMeasure()
|
||||||
|
status = float(value)
|
||||||
|
if status == 0:
|
||||||
|
status = 1
|
||||||
|
else:
|
||||||
|
status = -1
|
||||||
|
if lastvalue.level < 1:
|
||||||
|
lastvalue.alarm = u'Not available station'
|
||||||
|
lastvalue.level = float(status)
|
||||||
|
lastvalue.date = last_update
|
||||||
|
levelstatus.lastvalue = lastvalue
|
||||||
|
levelstatus.history = NotLoaded
|
||||||
|
levelstatus.gaugeid = gauge_id
|
||||||
|
return levelstatus
|
||||||
|
|
||||||
return sensors
|
def parse(self, el):
|
||||||
|
self.obj = self.env['obj']
|
||||||
|
|
||||||
|
def obj_sensors(self):
|
||||||
|
sensors = []
|
||||||
|
last_update = LastDateFilter(CleanText('lastupd'))(self)
|
||||||
|
adresse = CleanText('adress')(self)
|
||||||
|
sensors.append(self._create_bikes_sensor(CleanText('bikes')(self),
|
||||||
|
self.env['idgauge'],
|
||||||
|
last_update, adresse))
|
||||||
|
sensors.append(self._create_attach_sensor(CleanText('attachs')(self),
|
||||||
|
self.env['idgauge'],
|
||||||
|
last_update, adresse))
|
||||||
|
sensors.append(self._create_status_sensor(CleanText('status')(self),
|
||||||
|
self.env['idgauge'],
|
||||||
|
last_update, adresse))
|
||||||
|
return sensors
|
||||||
|
|
||||||
|
|
||||||
class ListStationsPage(BasePage):
|
class ListStationsPage(HTMLPage):
|
||||||
def get_station_list(self):
|
@method
|
||||||
gauges = []
|
class get_station_list(TableElement):
|
||||||
|
item_xpath = "//table[@id='ctl00_Contenu_ListeStations1_ListViewStations_itemPlaceholderContainer']/tr"
|
||||||
|
head_xpath = "//table[@id='ctl00_Contenu_ListeStations1_ListViewStations_itemPlaceholderContainer']/tr/th/@id"
|
||||||
|
|
||||||
trs = self.document.getroot().xpath('//table[@id="ctl00_Contenu_ListeStations1_ListViewStations_itemPlaceholderContainer"]/tr')
|
col_id = 'ctl00_Contenu_ListeStations1_ListViewStations_Th1'
|
||||||
|
col_name = 'ctl00_Contenu_ListeStations1_ListViewStations_Th2'
|
||||||
|
col_city = 'ctl00_Contenu_ListeStations1_ListViewStations_Th9'
|
||||||
|
|
||||||
for tr in trs:
|
class item(ItemElement):
|
||||||
if not ('id' in tr.attrib):
|
klass = Gauge
|
||||||
tds = self.parser.select(tr, 'td/span', method='xpath')
|
condition = lambda self: (len(self.el.xpath('td/span')) > 4 and not ('id' in self.el.attrib))
|
||||||
if len(tds) > 4:
|
|
||||||
gauge = Gauge(int(tds[0].text))
|
obj_id = CleanText(TableCell('id'))
|
||||||
gauge.name = u'%s' % tds[1].text
|
obj_name = CleanText(TableCell('name'))
|
||||||
gauge.city = u'%s' % tds[3].text
|
obj_city = CleanText(TableCell('city'))
|
||||||
gauge.object = u'vLille'
|
obj_object = u'vLille'
|
||||||
gauges.append(gauge)
|
|
||||||
return gauges
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue