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()