From 011dcc96881048ab317be477dd50a664a66efc98 Mon Sep 17 00:00:00 2001 From: Romain Bignon Date: Wed, 18 Apr 2012 00:55:23 +0200 Subject: [PATCH] use uniq IDs for accounts --- modules/creditmutuel/backend.py | 2 -- modules/creditmutuel/browser.py | 19 +++++++------------ modules/creditmutuel/pages.py | 28 +++++++++++++++++++--------- 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/modules/creditmutuel/backend.py b/modules/creditmutuel/backend.py index 961469e2..1b1373ce 100644 --- a/modules/creditmutuel/backend.py +++ b/modules/creditmutuel/backend.py @@ -50,8 +50,6 @@ class CreditMutuelBackend(BaseBackend, ICapBank): yield account def get_account(self, _id): - if not _id.isdigit(): - raise AccountNotFound() account = self.browser.get_account(_id) if account: return account diff --git a/modules/creditmutuel/browser.py b/modules/creditmutuel/browser.py index 1bba3d09..2f352b2d 100644 --- a/modules/creditmutuel/browser.py +++ b/modules/creditmutuel/browser.py @@ -22,7 +22,8 @@ from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword from weboob.capabilities.bank import Transfer, TransferError from datetime import datetime -from .pages import LoginPage, LoginErrorPage, AccountsPage, UserSpacePage, OperationsPage, InfoPage, TransfertPage +from .pages import LoginPage, LoginErrorPage, AccountsPage, UserSpacePage, \ + OperationsPage, NoOperationsPage, InfoPage, TransfertPage __all__ = ['CreditMutuelBrowser'] @@ -34,12 +35,13 @@ class CreditMutuelBrowser(BaseBrowser): 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/.*/fr/identification/default.cgi': LoginErrorPage, 'https://www.creditmutuel.fr/.*/fr/banque/situation_financiere.cgi': AccountsPage, 'https://www.creditmutuel.fr/.*/fr/banque/espace_personnel.aspx': UserSpacePage, 'https://www.creditmutuel.fr/.*/fr/banque/mouvements.cgi.*': OperationsPage, 'https://www.creditmutuel.fr/.*/fr/banque/nr/nr_devbooster.aspx.*': OperationsPage, 'https://www.creditmutuel.fr/.*/fr/banque/operations_carte\.cgi.*': OperationsPage, + 'https://www.creditmutuel.fr/.*/fr/banque/arrivees\.asp.*': NoOperationsPage, 'https://www.creditmutuel.fr/.*/fr/banque/BAD.*': InfoPage, 'https://www.creditmutuel.fr/.*/fr/banque/.*Vir.*': TransfertPage } @@ -50,7 +52,7 @@ class CreditMutuelBrowser(BaseBrowser): #self.currentSubBank = None def is_logged(self): - return self.page and not self.is_on_page(LoginPage) + return self.page and not self.is_on_page(LoginPage) and not self.is_on_page(LoginErrorPage) def home(self): return self.location('https://www.creditmutuel.fr/groupe/fr/index.html') @@ -102,16 +104,9 @@ class CreditMutuelBrowser(BaseBrowser): self.location(page_url) else: self.location('https://%s/%s/fr/banque/%s' % (self.DOMAIN, self.currentSubBank, page_url)) - #for page_operation in self.page.get_history(operations_count): - # operations_count += 1 - # yield page_operation - ## FONCTIONNE - #for op in self.page.get_history(): - # yield op - - ## FONTIONNE - #return self.page.get_history() + if not self.is_on_page(OperationsPage): + break for op in self.page.get_history(): l_ret.append(op) diff --git a/modules/creditmutuel/pages.py b/modules/creditmutuel/pages.py index 1afad71d..c2526e04 100644 --- a/modules/creditmutuel/pages.py +++ b/modules/creditmutuel/pages.py @@ -18,6 +18,7 @@ # along with weboob. If not, see . +from urlparse import urlparse, parse_qs from decimal import Decimal import re @@ -30,7 +31,7 @@ class LoginPage(BasePage): self.browser.select_form(nr=0) self.browser['_cm_user'] = login self.browser['_cm_pwd'] = passwd - self.browser.submit() + self.browser.submit(nologin=True) class LoginErrorPage(BasePage): pass @@ -46,23 +47,30 @@ class UserSpacePage(BasePage): class AccountsPage(BasePage): def get_list(self): - l = [] + ids = set() 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') \ and first_td.find('a') is not None: account = Account() - account.label = u"%s"%first_td.find('a').text.strip().lstrip(' 0123456789') + account.label = u"%s"%first_td.find('a').text.strip().lstrip(' 0123456789').capitalize() account._link_id = first_td.find('a').get('href', '') if account._link_id.startswith('POR_SyntheseLst'): continue - account.id = first_td.find('a').text.split(' ')[0]+first_td.find('a').text.split(' ')[1] - - if not account.id.isdigit(): + url = urlparse(account._link_id) + p = parse_qs(account._link_id) + if not 'rib' in p: continue + account.id = p['rib'][0] + + if account.id in ids: + continue + + ids.add(account.id) + s = tr.getchildren()[2].text if s.strip() == "": s = tr.getchildren()[1].text @@ -73,9 +81,7 @@ class AccountsPage(BasePage): if c == ',': balance += '.' account.balance = Decimal(balance) - l.append(account) - #raise NotImplementedError() - return l + yield account def next_page_url(self): """ TODO pouvoir passer à la page des comptes suivante """ @@ -149,3 +155,7 @@ class OperationsPage(BasePage): def next_page_url(self): """ TODO pouvoir passer à la page des opérations suivantes """ return 0 + +class NoOperationsPage(OperationsPage): + def get_history(self): + return iter([])