diff --git a/weboob/backends/creditmutuel/__init__.py b/weboob/backends/creditmutuel/__init__.py new file mode 100644 index 00000000..cd691d5d --- /dev/null +++ b/weboob/backends/creditmutuel/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Julien Veyssier +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +from .backend import CreditMutuelBackend + +__all__ = ['CreditMutuelBackend'] diff --git a/weboob/backends/creditmutuel/backend.py b/weboob/backends/creditmutuel/backend.py new file mode 100644 index 00000000..c5a472a8 --- /dev/null +++ b/weboob/backends/creditmutuel/backend.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Julien Veyssier +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +from weboob.capabilities.bank import ICapBank, AccountNotFound +from weboob.tools.backend import BaseBackend +from weboob.tools.value import ValuesDict, Value + +from .browser import CreditMutuelBrowser + + +__all__ = ['CreditMutuelBackend'] + + +class CreditMutuelBackend(BaseBackend, ICapBank): + NAME = 'creditmutuel' + MAINTAINER = 'Julien Veyssier' + EMAIL = 'julien.veyssier@aiur.fr' + VERSION = '0.1' + DESCRIPTION = 'Crédit Mutuel french bank' + LICENSE = 'GPLv3' + CONFIG = ValuesDict(Value('login', label='Account ID', regexp='^\d{1,13}\w$'), + Value('password', label='Password of account', masked=True)) + BROWSER = CreditMutuelBrowser + + def create_default_browser(self): + return self.create_browser( self.config['login'], self.config['password']) + + def iter_accounts(self): + for account in self.browser.get_accounts_list(): + yield account + + def get_account(self, _id): + if not _id.isdigit(): + raise AccountNotFound() + account = self.browser.get_account(_id) + if account: + return account + else: + raise AccountNotFound() + + def iter_operations(self, account): + """ TODO Not supported yet """ + #print "not supppppp" + return iter([]) + + def iter_history(self, account): + """ TODO Not supported yet """ + return iter([]) diff --git a/weboob/backends/creditmutuel/browser.py b/weboob/backends/creditmutuel/browser.py new file mode 100644 index 00000000..366a6ec9 --- /dev/null +++ b/weboob/backends/creditmutuel/browser.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Julien Veyssier +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword + +from .pages import LoginPage, LoginErrorPage, AccountsPage + + +__all__ = ['CreditMutuelBrowser'] + + +# Browser +class CreditMutuelBrowser(BaseBrowser): + PROTOCOL = 'https' + DOMAIN = 'www.creditmutuel.fr' + ENCODING = 'iso-8859-1' + USER_AGENT = BaseBrowser.USER_AGENTS['wget'] + PAGES = {'https://www.creditmutuel.fr/groupe/fr/index.html': LoginPage, + 'https://www.creditmutuel.fr/groupe/fr/identification/default.cgi': LoginErrorPage, + 'https://www.creditmutuel.fr/cmdv/fr/banque/situation_financiere.cgi': AccountsPage + } + + def __init__(self, *args, **kwargs): + BaseBrowser.__init__(self, *args, **kwargs) + + def is_logged(self): + return self.page and not self.is_on_page(LoginPage) + + def login(self): + assert isinstance(self.username, basestring) + assert isinstance(self.password, basestring) + + if not self.is_on_page(LoginPage): + self.location('https://www.creditmutuel.fr/', no_login=True) + + self.page.login( self.username, self.password) + + if not self.is_logged() or self.is_on_page(LoginErrorPage): + raise BrowserIncorrectPassword() + + def get_accounts_list(self): + if not self.is_on_page(AccountsPage): + self.home() + return self.page.get_list() + + def get_account(self, id): + assert isinstance(id, basestring) + + l = self.get_accounts_list() + for a in l: + if a.id == id: + return a + + return None + + #def get_coming_operations(self, account): + # if not self.is_on_page(AccountComing) or self.page.account.id != account.id: + # self.location('/NS_AVEEC?ch4=%s' % account.link_id) + # return self.page.get_operations() diff --git a/weboob/backends/creditmutuel/pages.py b/weboob/backends/creditmutuel/pages.py new file mode 100644 index 00000000..9534b70f --- /dev/null +++ b/weboob/backends/creditmutuel/pages.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Julien Veyssier +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +from weboob.tools.browser import BasePage +from weboob.capabilities.bank import Account + +class LoginPage(BasePage): + def login(self, login, passwd): + self.browser.select_form(nr=0) + self.browser['_cm_user'] = login + self.browser['_cm_pwd'] = passwd + self.browser.submit() + +class LoginErrorPage(BasePage): + pass + +class AccountsPage(BasePage): + def get_list(self): + l = [] + + for tr in self.document.getiterator('tr'): + first_td = tr.getchildren()[0] + if first_td.attrib.get('class', '') == 'i g' or first_td.attrib.get('class', '') == 'p g': + account = Account() + account.label = first_td.find('a').text + account.link_id = first_td.find('a').get('href', '') + account.id = first_td.find('a').text.split(' ')[0]+first_td.find('a').text.split(' ')[1] + s = tr.getchildren()[2].text + balance = u'' + for c in s: + if c.isdigit(): + balance += c + if c == ',': + balance += '.' + account.balance = float(balance) + l.append(account) + #raise NotImplementedError() + return l diff --git a/weboob/backends/creditmutuel/test.py b/weboob/backends/creditmutuel/test.py new file mode 100644 index 00000000..e03036cb --- /dev/null +++ b/weboob/backends/creditmutuel/test.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010 Julien Veyssier +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +from weboob.tools.test import BackendTest + +class CreditMutuelTest(BackendTest): + BACKEND = 'crmut' + + def test_crmut(self): + list(self.backend.iter_accounts())