From c284a248427669e5fb58600a19556f2384651acb Mon Sep 17 00:00:00 2001 From: Romain Bignon Date: Wed, 13 Jul 2011 15:12:17 +0200 Subject: [PATCH] ability to set an arrival or a departure time --- weboob/backends/transilien/backend.py | 4 ++-- weboob/backends/transilien/browser.py | 4 ++-- .../backends/transilien/pages/departures.py | 2 +- weboob/backends/transilien/pages/roadmap.py | 21 ++++++++++++++++++- weboob/capabilities/travel.py | 13 +++++++++++- 5 files changed, 37 insertions(+), 7 deletions(-) diff --git a/weboob/backends/transilien/backend.py b/weboob/backends/transilien/backend.py index b75aebac..2a4c7b78 100644 --- a/weboob/backends/transilien/backend.py +++ b/weboob/backends/transilien/backend.py @@ -50,9 +50,9 @@ class TransilienBackend(BaseBackend, ICapTravel): departure.plateform = d['plateform'] yield departure - def iter_roadmap(self, departure, arrival): + def iter_roadmap(self, departure, arrival, filters): with self.browser: - roadmap = self.browser.get_roadmap(departure, arrival) + roadmap = self.browser.get_roadmap(departure, arrival, filters) for s in roadmap['steps']: step = RoadStep(s['id']) diff --git a/weboob/backends/transilien/browser.py b/weboob/backends/transilien/browser.py index 47905895..8c82859c 100644 --- a/weboob/backends/transilien/browser.py +++ b/weboob/backends/transilien/browser.py @@ -54,11 +54,11 @@ class Transilien(BaseBrowser): return self.page.iter_routes() - def get_roadmap(self, departure, arrival): + def get_roadmap(self, departure, arrival, filters): self.location('/web/site/accueil/etat-trafic/chercher-itineraire/lang/en') assert self.is_on_page(RoadmapSearchPage) - self.page.search(departure, arrival) + self.page.search(departure, arrival, filters.departure_time, filters.arrival_time) assert self.is_on_page(RoadmapConfirmPage) self.page.confirm() diff --git a/weboob/backends/transilien/pages/departures.py b/weboob/backends/transilien/pages/departures.py index aa26d008..7461de05 100644 --- a/weboob/backends/transilien/pages/departures.py +++ b/weboob/backends/transilien/pages/departures.py @@ -49,7 +49,7 @@ class DeparturesPage(BasePage): try : time = datetime.datetime.combine(datetime.date.today(), datetime.time(*[int(x) for x in time.split(':')])) except ValueError: - self.logger.warning('Unable to parse datetime') + self.logger.warning('Unable to parse datetime "%s"' % time) yield {'type': to_unicode(code_mission), 'time': time, diff --git a/weboob/backends/transilien/pages/roadmap.py b/weboob/backends/transilien/pages/roadmap.py index 93be2801..ddfc8dbf 100644 --- a/weboob/backends/transilien/pages/roadmap.py +++ b/weboob/backends/transilien/pages/roadmap.py @@ -21,18 +21,37 @@ import re import datetime +from weboob.capabilities.travel import RoadmapError from weboob.tools.browser import BasePage from weboob.tools.misc import to_unicode +from weboob.tools.mech import ClientForm __all__ = ['RoadmapPage'] class RoadmapSearchPage(BasePage): - def search(self, departure, arrival): + def search(self, departure, arrival, departure_time, arrival_time): self.browser.select_form('formHiRecherche') self.browser['lieuDepart'] = departure.encode('utf-8') self.browser['lieuArrivee'] = arrival.encode('utf-8') + + time = None + if departure_time: + self.browser['typeHeure'] = ['1'] + time = departure_time + elif arrival_time: + self.browser['typeHeure'] = ['-1'] + time = arrival_time + + if time: + try: + self.browser['jour'] = ['%d' % time.day] + self.browser['mois'] = ['%02d/%d' % (time.month, time.year)] + self.browser['heure'] = ['%02d' % time.hour] + self.browser['minutes'] = ['%02d' % (time.minute - (time.minute%5))] + except ClientForm.ItemNotFoundError: + raise RoadmapError('Unable to establish a roadmap with %s time at "%s"' % ('departure' if departure_time else 'arrival', time)) self.browser.submit() class RoadmapConfirmPage(BasePage): diff --git a/weboob/capabilities/travel.py b/weboob/capabilities/travel.py index 7d70413c..b46186dc 100644 --- a/weboob/capabilities/travel.py +++ b/weboob/capabilities/travel.py @@ -61,6 +61,16 @@ class RoadStep(CapBaseObject): self.add_field('arrival', unicode) self.add_field('duration', timedelta) +class RoadmapError(Exception): + pass + +class RoadmapFilters(CapBaseObject): + def __init__(self): + CapBaseObject.__init__(self, '') + + self.add_field('departure_time', datetime) + self.add_field('arrival_time', datetime) + class ICapTravel(IBaseCap): def iter_station_search(self, pattern): """ @@ -81,12 +91,13 @@ class ICapTravel(IBaseCap): """ raise NotImplementedError() - def iter_roadmap(self, departure, arrival): + def iter_roadmap(self, departure, arrival, filters): """ Get a roadmap. @param departure [str] name of departure station @param arrival [str] name of arrival station + @param filters [RoadmapFilters] filters on search @return [iter(RoadStep)] steps of roadmap """ raise NotImplementedError()