new backend 'cragr' (for Credit Agricole bank)

This commit is contained in:
Romain Bignon 2010-04-06 19:31:38 +02:00
commit 4faeea1959
6 changed files with 272 additions and 0 deletions

View file

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
"""
Copyright(C) 2010 Romain Bignon
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 CragrBackend

View file

@ -0,0 +1,68 @@
# -*- coding: utf-8 -*-
"""
Copyright(C) 2010 Romain Bignon
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.backend import Backend
from weboob.capabilities.bank import ICapBank, AccountNotFound
from .browser import Cragr
class CragrBackend(Backend, ICapBank):
NAME = 'cragr'
MAINTAINER = 'Romain Bignon'
EMAIL = 'romain@peerfuse.org'
VERSION = '1.0'
LICENSE = 'GPLv3'
CONFIG = {'login': Backend.ConfigField(description='Account ID'),
'password': Backend.ConfigField(description='Password of account', is_masked=True),
'website': Backend.ConfigField(description='What website to use', default='m.lefil.com'),
}
browser = None
def need_browser(func):
def inner(self, *args, **kwargs):
if not self.browser:
self.browser = Cragr(self.config['website'], self.config['login'], self.config['password'])
return func(self, *args, **kwargs)
return inner
@need_browser
def iter_accounts(self):
for account in self.browser.get_accounts_list():
yield account
@need_browser
def get_account(self, _id):
try:
_id = long(_id)
except ValueError:
raise AccountNotFound()
else:
account = self.browser.get_account(_id)
if account:
return account
else:
raise AccountNotFound()
@need_browser
def iter_operations(self, account):
""" Not supported yet """
return iter([])

View file

@ -0,0 +1,77 @@
# -*- coding: utf-8 -*-
"""
Copyright(C) 2009-2010 Romain Bignon
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 Browser, BrowserIncorrectPassword
from weboob.backends.cragr import pages
# Browser
class Cragr(Browser):
PROTOCOL = 'https'
ENCODING = 'utf-8'
USER_AGENT = 'Wget/1.11.4'
is_logging = False
def __init__(self, website, *args, **kwargs):
self.DOMAIN = website
self.PAGES = {'https://%s/' % website: pages.LoginPage,
'https://%s/.*\.c.*' % website: pages.AccountList,
}
Browser.__init__(self, *args, **kwargs)
def home(self):
self.location('https://m.lefil.com/')
def is_logged(self):
return not self.is_on_page(pages.LoginPage) or self.is_logging
def login(self):
assert isinstance(self.username, (str,unicode))
assert isinstance(self.password, (str,unicode))
if not self.is_on_page(pages.LoginPage):
self.home()
self.is_logging = True
self.page.login(self.username, self.password)
if self.is_on_page(pages.LoginPage):
raise BrowserIncorrectPassword()
self.is_logging = False
def get_accounts_list(self):
if not self.is_on_page(pages.AccountsList):
self.home()
return self.page.get_list()
def get_account(self, id):
assert isinstance(id, (int, long))
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(pages.AccountComing) or self.page.account.id != account.id:
# self.location('/NS_AVEEC?ch4=%s' % account.link_id)
# return self.page.get_operations()

View file

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
"""
Copyright(C) 2010 Romain Bignon
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 .accounts_list import AccountsList
from .login import LoginPage

View file

@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
"""
Copyright(C) 2010 Romain Bignon
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 Account
from weboob.tools.browser import BasePage
class AccountsList(BasePage):
def loaded(self):
pass
def get_list(self):
l = []
for div in self.document.getiterator('div'):
if div.attrib.get('class', '') == 'dv' and div.getchildren()[0].tag == 'a':
a = div.getchildren()[0]
account = Account()
account.setLabel(a.text.strip())
account.setID(long(a.getchildren('br')[0].tail.strip()))
balance = a.getchildren('span')[0].getchildren('span')[0].getchildren('b')[0].text
balance = balance.replace(',', '.').replace(u' ', '').replace(u'', '')
account.setBalance(float(balance))
return l

View file

@ -0,0 +1,45 @@
# -*- coding: utf-8 -*-
"""
Copyright(C) 2010 Romain Bignon
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.
"""
import ClientForm
from weboob.tools.browser import BasePage
class LoginPage(BasePage):
def loaded(self):
pass
def login(self, login, password):
self.browser.select_form()
try:
self.browser['numero'] = login
self.browser['code'] = password
except ClientForm.ControlNotFoundError:
try:
self.browser['userLogin'] = login
self.browser['userPassword'] = password
except ClientForm.ControlNotFoundError:
print 'WTF'
return
self.browser.submit()
class ConfirmPage(BasePage):
pass