From 96033a3a89f421e1c3509146e4c30938530e8a46 Mon Sep 17 00:00:00 2001 From: Romain Bignon Date: Tue, 11 Jun 2013 00:00:09 +0200 Subject: [PATCH] add module chronopost --- modules/chronopost/__init__.py | 24 ++++++++++++++ modules/chronopost/backend.py | 41 +++++++++++++++++++++++ modules/chronopost/browser.py | 45 ++++++++++++++++++++++++++ modules/chronopost/pages.py | 59 ++++++++++++++++++++++++++++++++++ modules/chronopost/test.py | 28 ++++++++++++++++ 5 files changed, 197 insertions(+) create mode 100644 modules/chronopost/__init__.py create mode 100644 modules/chronopost/backend.py create mode 100644 modules/chronopost/browser.py create mode 100644 modules/chronopost/pages.py create mode 100644 modules/chronopost/test.py diff --git a/modules/chronopost/__init__.py b/modules/chronopost/__init__.py new file mode 100644 index 00000000..838501d8 --- /dev/null +++ b/modules/chronopost/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2013 Romain Bignon +# +# This file is part of weboob. +# +# weboob is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# weboob is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + + +from .backend import ChronopostBackend + + +__all__ = ['ChronopostBackend'] diff --git a/modules/chronopost/backend.py b/modules/chronopost/backend.py new file mode 100644 index 00000000..7b90e069 --- /dev/null +++ b/modules/chronopost/backend.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2013 Romain Bignon +# +# This file is part of weboob. +# +# weboob is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# weboob is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + + +from weboob.capabilities.tracking import ICapPackageTracking +from weboob.tools.backend import BaseBackend + +from .browser import ChronopostBrowser + + +__all__ = ['ChronopostBackend'] + + +class ChronopostBackend(BaseBackend, ICapPackageTracking): + NAME = 'chronopost' + DESCRIPTION = u'Chronopost website' + MAINTAINER = u'Romain Bignon' + EMAIL = 'romain@weboob.org' + VERSION = '0.g' + + BROWSER = ChronopostBrowser + + def track_package(self, id): + with self.browser: + return self.browser.get_tracking_info(id) diff --git a/modules/chronopost/browser.py b/modules/chronopost/browser.py new file mode 100644 index 00000000..38ba6a4e --- /dev/null +++ b/modules/chronopost/browser.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2013 Romain Bignon +# +# This file is part of weboob. +# +# weboob is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# weboob is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + +from weboob.tools.browser import BaseBrowser + +from .pages import IndexPage, TrackPage + + +__all__ = ['ChronopostBrowser'] + + +class ChronopostBrowser(BaseBrowser): + PROTOCOL = 'http' + DOMAIN = 'www.chronopost.fr' + ENCODING = None + + PAGES = { + 'http://www.chronopost.fr/transport-express/livraison-colis': IndexPage, + 'http://www.chronopost.fr/transport-express/livraison-colis/cache/offonce/accueil/suivi.*': TrackPage, + } + + def get_tracking_info(self, _id): + self.home() + + assert self.is_on_page(IndexPage) + self.page.track_package(_id) + + assert self.is_on_page(TrackPage) + return self.page.get_info(_id) diff --git a/modules/chronopost/pages.py b/modules/chronopost/pages.py new file mode 100644 index 00000000..d8140888 --- /dev/null +++ b/modules/chronopost/pages.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2013 Romain Bignon +# +# This file is part of weboob. +# +# weboob is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# weboob is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + + +import re +from dateutil.parser import parse as parse_date + +from weboob.capabilities.tracking import Package, Location +from weboob.capabilities import NotAvailable +from weboob.tools.browser import BasePage + + +__all__ = ['IndexPage', 'TrackPage'] + + +class IndexPage(BasePage): + def track_package(self, _id): + self.browser.select_form(predicate=lambda form: form.attrs.get('id', '') == 'suivreEnvoi') + self.browser['chronoNumbers'] = _id.encode('utf-8') + self.browser.submit() + +class TrackPage(BasePage): + def get_info(self, id): + p = Package(id) + p.arrival = NotAvailable + p.history = [] + + for i, tr in enumerate(self.document.xpath('//table[@class="tabListeEnvois"]//tr')): + tds = tr.findall('td') + if len(tds) < 3: + continue + + loc = Location(i) + loc.name = unicode(tds[1].text) + loc.activity = unicode(tds[1].find('br').tail) + if tds[-1].text is not None: + loc.activity += ', ' + self.parser.tocleanstring(tds[-1]) + date = re.sub('[a-z]+', '', self.parser.tocleanstring(tds[0])).strip() + date = re.sub('(\d+)/(\d+)/(\d+)', r'\3-\2-\1', date) + loc.date = parse_date(date) + p.history.append(loc) + + return p diff --git a/modules/chronopost/test.py b/modules/chronopost/test.py new file mode 100644 index 00000000..dd57db62 --- /dev/null +++ b/modules/chronopost/test.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2013 Romain Bignon +# +# This file is part of weboob. +# +# weboob is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# weboob is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + + +from weboob.tools.test import BackendTest + + +class ChronopostTest(BackendTest): + BACKEND = 'chronopost' + + def test_chronopost(self): + raise NotImplementedError()