From 1ea36a7c82bcebd4a0bffd51bdef703243dd0b53 Mon Sep 17 00:00:00 2001 From: Florent Date: Thu, 20 Feb 2014 16:12:53 +0100 Subject: [PATCH] First implementation of colisprive module (CapParcel) --- modules/colisprive/__init__.py | 24 ++++++++++++++++ modules/colisprive/backend.py | 40 ++++++++++++++++++++++++++ modules/colisprive/browser.py | 41 +++++++++++++++++++++++++++ modules/colisprive/pages.py | 52 ++++++++++++++++++++++++++++++++++ 4 files changed, 157 insertions(+) create mode 100644 modules/colisprive/__init__.py create mode 100644 modules/colisprive/backend.py create mode 100644 modules/colisprive/browser.py create mode 100644 modules/colisprive/pages.py diff --git a/modules/colisprive/__init__.py b/modules/colisprive/__init__.py new file mode 100644 index 00000000..27e92c23 --- /dev/null +++ b/modules/colisprive/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2014 Florent Fourcot +# +# 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 ColispriveBackend + + +__all__ = ['ColispriveBackend'] diff --git a/modules/colisprive/backend.py b/modules/colisprive/backend.py new file mode 100644 index 00000000..4c7a3fca --- /dev/null +++ b/modules/colisprive/backend.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2014 Florent Fourcot +# +# 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.parcel import ICapParcel +from weboob.tools.backend import BaseBackend + +from .browser import ColispriveBrowser + +__all__ = ['ColispriveBackend'] + + +class ColispriveBackend(BaseBackend, ICapParcel): + NAME = 'colisprive' + DESCRIPTION = u'Colisprive parcel tracking website' + MAINTAINER = u'Florent Fourcot' + EMAIL = 'weboob@flo.fourcot.fr' + VERSION = '0.i' + LICENSE = 'AGPLv3+' + + BROWSER = ColispriveBrowser + + def get_parcel_tracking(self, _id): + with self.browser: + return self.browser.get_tracking_info(_id) diff --git a/modules/colisprive/browser.py b/modules/colisprive/browser.py new file mode 100644 index 00000000..e0130a2a --- /dev/null +++ b/modules/colisprive/browser.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2014 Florent Fourcot +# +# 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.json import json +from weboob.tools.browser import BaseBrowser, BrowserBanned +from .pages import TrackPage + + +__all__ = ['ColispriveBrowser'] + + +class ColispriveBrowser(BaseBrowser): + PROTOCOL = 'https' + DOMAIN = 'www.colisprive.com' + ENCODING = 'utf8' + + PAGES = {'https://www.colisprive.com/moncolis/pages/detailColis.aspx.*': TrackPage, + } + + def get_tracking_info(self, _id): + self.location('https://www.colisprive.com/moncolis/pages/detailColis.aspx?numColis=%s' % _id) + if not self.is_on_page(TrackPage): + return None + + return self.page.get_info(_id) diff --git a/modules/colisprive/pages.py b/modules/colisprive/pages.py new file mode 100644 index 00000000..cf13619d --- /dev/null +++ b/modules/colisprive/pages.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2014 Florent Fourcot +# +# 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 datetime import date +from weboob.tools.browser import BasePage +from weboob.capabilities.parcel import Parcel, Event + + +__all__ = ['TrackPage'] + + +class TrackPage(BasePage): + def get_info(self, _id): + p = Parcel(_id) + + statustr = self.document.xpath('//tr[@class="bandeauText"]')[0] + status = self.parser.tocleanstring(statustr.xpath('td')[1]) + + p.info = status + + p.history = [] + for i, tr in enumerate(self.document.xpath('//div[@class="mainbloc4Evt"]//tr')): + tds = tr.findall('td') + try: + if tds[0].attrib['class'] != "titrestatutdate2": + continue + except: + continue + + ev = Event(i) + ev.location = None + ev.activity = self.parser.tocleanstring(tds[1]) + ev.date = date(*reversed([int(x) for x in self.parser.tocleanstring(tds[0]).split('/')])) + p.history.append(ev) + + return p