diff --git a/modules/fortuneo/__init__.py b/modules/fortuneo/__init__.py index d0c8b64a..19c1ccba 100644 --- a/modules/fortuneo/__init__.py +++ b/modules/fortuneo/__init__.py @@ -20,4 +20,4 @@ from .backend import FortuneoBackend -__all__ = ['SocieteGeneraleBackend'] +__all__ = ['FortuneoBackend'] diff --git a/modules/fortuneo/backend.py b/modules/fortuneo/backend.py index ddb85799..b04b4e51 100644 --- a/modules/fortuneo/backend.py +++ b/modules/fortuneo/backend.py @@ -38,8 +38,8 @@ class FortuneoBackend(BaseBackend, ICapBank): VERSION = '0.c' LICENSE = 'AGPLv3+' DESCRIPTION = u'Fortuneo French bank website' - CONFIG = BackendConfig(ValueBackendPassword('login', label='Account ID', masked=False), - ValueBackendPassword('password', label='Password')) + CONFIG = BackendConfig(ValueBackendPassword('login', label='Account ID', masked=False, required=True), + ValueBackendPassword('password', label='Password', required=True)) BROWSER = Fortuneo def create_default_browser(self): @@ -51,15 +51,17 @@ class FortuneoBackend(BaseBackend, ICapBank): yield account def get_account(self, _id): - #pass - #if not _id.isdigit(): - # raise AccountNotFound() + # _id = "fortuneo" + #print "DEBUG\n\n\n", _id, "DEBUG\n\n\n" + if not _id.isdigit(): + raise AccountNotFound() with self.browser: account = self.browser.get_account(_id) + print "DEBUG 2\n\n\n", account, "\n\n\nEND DEBUG 2" if account: return account else: - raise AccountNotFound() + raise AccountNotFound() def iter_history(self, account): pass diff --git a/modules/fortuneo/browser.py b/modules/fortuneo/browser.py index 4f427953..fa4a51e4 100644 --- a/modules/fortuneo/browser.py +++ b/modules/fortuneo/browser.py @@ -14,37 +14,41 @@ # 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, BrowserIncorrectPassword -from .pages.accounts_list import AccountsList, AccountHistory -from .pages.login import LoginPage, BadLoginPage +from .pages.accounts_list import AccountHistory #AccountsList, IndexPage +from .pages.login import LoginPage #, BadLoginPage __all__ = ['Fortuneo'] - +# https://www.fortuneo.fr/fr/prive/mes-comptes/livret/consulter-situation/consulter-solde.jsp?COMPTE_ACTIF=FT00991337 class Fortuneo(BaseBrowser): DOMAIN_LOGIN = 'www.fortuneo.fr' DOMAIN = 'www.fortuneo.fr' PROTOCOL = 'https' ENCODING = None # refer to the HTML encoding PAGES = { - '.*identification.jsp.*': LoginPage, + '.*identification.jsp.*': LoginPage, + #'.*/prive/default.jsp.*': IndexPage, + #'.*/prive/default.jsp.*': AccountsList, + '.*/prive/default.jsp.*': AccountHistory, #'https://www.fortuneo.fr/fr/identification.jsp': BadLoginPage, - '.*/prive/default.jsp.*': AccountsList, - '.*/prive/mes-comptes/livret/consulter-situation/consulter-solde.jsp.*': AccountHistory, + #'.*/prive/mes-comptes/livret/consulter-situation/consulter-solde\.jsp.*': AccountsList, + #'.*/prive/mes-comptes/livret/consulter-situation/consulter-solde\.jsp.*': AccountHistory, } def __init__(self, *args, **kwargs): BaseBrowser.__init__(self, *args, **kwargs) def home(self): - self.location('https://' + self.DOMAIN_LOGIN + '/fr/identification.jsp') - #self.location('https://' + self.DOMAIN_LOGIN + '/fr/prive/default.jsp?ANav=1') + self.location('/fr/prive/identification.jsp') + #self.location('https://' + self.DOMAIN_LOGIN + '/fr/identification.jsp') #self.location('https://' + self.DOMAIN_LOGIN + '/fr/prive/mes-comptes/synthese-tous-comptes.jsp') def is_logged(self): @@ -60,13 +64,13 @@ class Fortuneo(BaseBrowser): self.page.login(self.username, self.password) - if self.is_on_page(LoginPage) or \ - self.is_on_page(BadLoginPage): - raise BrowserIncorrectPassword() + #if self.is_on_page(LoginPage) or \ + # self.is_on_page(BadLoginPage): + # raise BrowserIncorrectPassword() def get_accounts_list(self): if not self.is_on_page(AccountsList): - self.location('/fr/prive/mes-comptes/synthese-globale/synthese-tous-comptes.jsp') + self.location('/fr/prive/default.jsp?ANav=1') #self.location('') return self.page.get_list() @@ -74,13 +78,14 @@ class Fortuneo(BaseBrowser): def get_account(self, id): assert isinstance(id, basestring) - #if not self.is_on_page(AccountsList): - # self.location('/fr/prive/default.jsp?ANav=1') + if not self.is_on_page(AccountsList): + self.location('/fr/prive/default.jsp?ANav=1') - l = self.page.get_list() - for a in l: - if a.id == id: - return a + print "\n\n\n", self.page, "\n\n\n" + #l = self.page.get_list() + #for a in l: + # if a.id == id: + # return a return None diff --git a/modules/fortuneo/pages/accounts_list.py b/modules/fortuneo/pages/accounts_list.py index a072ea7b..67303b70 100644 --- a/modules/fortuneo/pages/accounts_list.py +++ b/modules/fortuneo/pages/accounts_list.py @@ -17,7 +17,7 @@ # You should have received a copy of the GNU Affero General Public License # along with weboob. If not, see . - +# AccountsList, IndexPage from urlparse import parse_qs, urlparse from lxml.etree import XML from cStringIO import StringIO @@ -29,57 +29,69 @@ from weboob.tools.capabilities.bank.transactions import FrenchTransaction from weboob.tools.browser import BasePage, BrokenPageError -__all__ = ['AccountsList', 'AccountHistory'] +#__all__ = ['IndexPage', 'AccountsList', 'AccountHistory'] +__all__ = ['AccountHistory'] -class AccountsList(BasePage): - def on_loaded(self): - pass +#class IndexPage(BasePage): +# def on_loaded(self): +# pass +# +# def get_list(self): +# l = [] +# account.label = "test" +# account.id = "Livret +" +# account.balance = "20" +# account._link_id = "https://www.fortuneo.fr/fr/prive/default.jsp?ANav=1" +# l.append(account) +# return l - def get_list(self): - l = [] - #for el in self.document.xpath('//table[@id="tableauComptesTitEtCotit"]/tbody/'): - #l.append('test') - #l.append('Livret +') - #l.append('20') - #l.append('https://www.fortuneo.fr/fr/prive/mes-comptes/livret/caracteristiques-mon-compte/?COMPTE_ACTIF=FT00654224521421145') - account.label = "test" - account.id = "Livret +" - account.balance = "20" - account._link_id = "https://www.fortuneo.fr/fr/prive/mes-comptes/livret/caracteristiques-mon-compte/?COMPTE_ACTIF=FT00654224521421145" - l.append(account) - #for tr in self.document.getiterator('tr'): - # if 'LGNTableRow' in tr.attrib.get('class', '').split(): - # account = Account() - # for td in tr.getiterator('td'): - # if td.attrib.get('headers', '') == 'TypeCompte': - # a = td.find('a') - # account.label = unicode(a.find("span").text) - # account._link_id = a.get('href', '') +#class AccountsList(BasePage): +# def on_loaded(self): +# pass +# +# def get_list(self): +# #print "DEBUG self.document="+self.document +# account = [] +# account.append('test') +# account.append('Livret +') +# account.append('20') +# account.append('https://www.fortuneo.fr/fr/prive/default.jsp?ANav=1') +# return account +# #account.append(account) +# #for el in self.document.xpath('//table[@id="tableauComptesTitEtCotit"]/tbody/'): +# #l.append(account) +# ##for tr in self.document.getiterator('tr'): +# ## if 'LGNTableRow' in tr.attrib.get('class', '').split(): +# ## account = Account() +# ## for td in tr.getiterator('td'): +# ## if td.attrib.get('headers', '') == 'TypeCompte': +# ## a = td.find('a') +# ## account.label = unicode(a.find("span").text) +# ## account._link_id = a.get('href', '') +# +# ## elif td.attrib.get('headers', '') == 'NumeroCompte': +# ## id = td.text +# ## id = id.replace(u'\xa0','') +# ## account.id = id +# +# ## elif td.attrib.get('headers', '') == 'Libelle': +# ## pass +# +# ## elif td.attrib.get('headers', '') == 'Solde': +# ## balance = td.find('div').text +# ## if balance != None: +# ## balance = balance.replace(u'\xa0','').replace(',','.') +# ## account.balance = Decimal(balance) +# ## else: +# ## account.balance = Decimal(0) +# +# ## l.append(account) +# +# #return l - # elif td.attrib.get('headers', '') == 'NumeroCompte': - # id = td.text - # id = id.replace(u'\xa0','') - # account.id = id - - # elif td.attrib.get('headers', '') == 'Libelle': - # pass - - # elif td.attrib.get('headers', '') == 'Solde': - # balance = td.find('div').text - # if balance != None: - # balance = balance.replace(u'\xa0','').replace(',','.') - # account.balance = Decimal(balance) - # else: - # account.balance = Decimal(0) - - # l.append(account) - - return l - -class Transaction(FrenchTransaction): - print "DEBUG a implementer" - pass +#class Transaction(FrenchTransaction): +# pass #PATTERNS = [(re.compile(r'^CARTE \w+ RETRAIT DAB.* (?P
\d{2})/(?P\d{2}) (?P\d+)H(?P\d+) (?P.*)'), # FrenchTransaction.TYPE_WITHDRAWAL), # (re.compile(r'^(?PCARTE) \w+ (?P
\d{2})/(?P\d{2}) (?P.*)'), @@ -97,8 +109,9 @@ class Transaction(FrenchTransaction): # ] class AccountHistory(BasePage): + get_list = [1, 2, 3, 4] def get_part_url(self): - print "DEBUG a implementer" + print "DEBUG AccountHistory.get_part_url a implementer" pass #for script in self.document.getiterator('script'): # if script.text is None: @@ -110,35 +123,35 @@ class AccountHistory(BasePage): #raise BrokenPageError('Unable to find link to history part') - def iter_transactions(self): - print "DEBUG a implementer" - pass - #url = self.get_part_url() - #while 1: - # d = XML(self.browser.readurl(url)) - # el = d.xpath('//dataBody')[0] - # s = StringIO(el.text) - # doc = self.browser.get_document(s) + #def iter_transactions(self): + # print "DEBUG iter_transactions a implementer" + # pass + # #url = self.get_part_url() + # #while 1: + # # d = XML(self.browser.readurl(url)) + # # el = d.xpath('//dataBody')[0] + # # s = StringIO(el.text) + # # doc = self.browser.get_document(s) - # for tr in self._iter_transactions(doc): - # yield tr + # # for tr in self._iter_transactions(doc): + # # yield tr - # el = d.xpath('//dataHeader')[0] - # if int(el.find('suite').text) != 1: - # return + # # el = d.xpath('//dataHeader')[0] + # # if int(el.find('suite').text) != 1: + # # return - # url = urlparse(url) - # p = parse_qs(url.query) - # url = self.browser.buildurl(url.path, n10_nrowcolor=0, - # operationNumberPG=el.find('operationNumber').text, - # operationTypePG=el.find('operationType').text, - # pageNumberPG=el.find('pageNumber').text, - # sign=p['sign'][0], - # src=p['src'][0]) + # # url = urlparse(url) + # # p = parse_qs(url.query) + # # url = self.browser.buildurl(url.path, n10_nrowcolor=0, + # # operationNumberPG=el.find('operationNumber').text, + # # operationTypePG=el.find('operationType').text, + # # pageNumberPG=el.find('pageNumber').text, + # # sign=p['sign'][0], + # # src=p['src'][0]) def _iter_transactions(self, doc): - print "DEBUG a implementer" + print "DEBUG _iter_transactions a implementer" pass #for i, tr in enumerate(self.parser.select(doc.getroot(), 'tr')): # t = Transaction(i) diff --git a/modules/fortuneo/pages/login.py b/modules/fortuneo/pages/login.py index 44542fcb..81f1454e 100644 --- a/modules/fortuneo/pages/login.py +++ b/modules/fortuneo/pages/login.py @@ -95,5 +95,8 @@ class LoginPage(BasePage): # self.browser.submit() -class BadLoginPage(BasePage): - pass +#class BadLoginPage(BasePage): + + #print "DEBUG BasePage" +# import sys + #sys.exit(1)