From df851554633cd8de61b9842baa54135f60ff8fff Mon Sep 17 00:00:00 2001 From: Florent Date: Fri, 28 Mar 2014 13:23:53 +0100 Subject: [PATCH] Support market accounts with browser2 --- modules/ing/backend.py | 8 +++--- modules/ing/browser.py | 19 +++++++------- modules/ing/pages/titre.py | 51 ++++++++++++++++---------------------- 3 files changed, 34 insertions(+), 44 deletions(-) diff --git a/modules/ing/backend.py b/modules/ing/backend.py index 9291066d..8e7d6a23 100644 --- a/modules/ing/backend.py +++ b/modules/ing/backend.py @@ -99,11 +99,9 @@ class INGBackend(BaseBackend, ICapBank, ICapBill): return self.browser.transfer(account, recipient, amount, reason) def iter_investment(self, account): - with self.browser: - if not isinstance(account, Account): - account = self.get_account(account) - for investment in self.browser.get_investments(account): - yield investment + if not isinstance(account, Account): + account = self.get_account(account) + return self.browser.get_investments(account) def iter_subscription(self): for subscription in self.browser.get_subscriptions(): diff --git a/modules/ing/browser.py b/modules/ing/browser.py index 5df0216f..6045ffc2 100644 --- a/modules/ing/browser.py +++ b/modules/ing/browser.py @@ -53,6 +53,7 @@ class IngBrowser(LoginBrowser): starttitre = URL('/general\?command=goToAccount&zone=COMPTE', TitrePage) titrepage = URL('https://bourse.ingdirect.fr/priv/portefeuille-TR.php', TitrePage) titrehistory = URL('https://bourse.ingdirect.fr/priv/compte.php\?ong=3', TitreHistory) + titrerealtime = URL('https://bourse.ingdirect.fr/streaming/compteTempsReelCK.php', TitrePage) # CapBill @@ -104,8 +105,8 @@ class IngBrowser(LoginBrowser): if not isinstance(account, Account): account = self.get_account(account) if account.type == Account.TYPE_MARKET: - for tr in self.get_history_titre(account): - yield tr + for result in self.get_history_titre(account): + yield result return elif account.type != Account.TYPE_CHECKING and\ account.type != Account.TYPE_SAVINGS: @@ -190,7 +191,7 @@ class IngBrowser(LoginBrowser): def go_investments(self, account): if self.where != "start": - self.location(self.accountspage) + self.accountspage.go() data = {"AJAX:EVENTS_COUNT": 1, "AJAXREQUEST": "_viewRoot", "ajaxSingle": "index:setAccount", @@ -200,23 +201,23 @@ class IngBrowser(LoginBrowser): "javax.faces.ViewState": account._jid, "cptnbr": account._id } - self.location(self.accountspage, urllib.urlencode(data)) - self.location('https://secure.ingdirect.fr/general?command=goToAccount&zone=COMPTE') - self.where = "titre" + self.accountspage.go(data=data) - self.location(self.titrepage) + self.starttitre.go() + self.where = "titre" + self.titrepage.go() def get_investments(self, account): if account.type != Account.TYPE_MARKET: raise NotImplementedError() self.go_investments(account) - self.location('https://bourse.ingdirect.fr/streaming/compteTempsReelCK.php') + self.titrerealtime.go() return self.page.iter_investments() def get_history_titre(self, account): self.go_investments(account) - self.location('https://bourse.ingdirect.fr/priv/compte.php?ong=3') + self.titrehistory.go() return self.page.iter_history() def get_subscriptions(self): diff --git a/modules/ing/pages/titre.py b/modules/ing/pages/titre.py index a6a9d913..e77de9a5 100644 --- a/modules/ing/pages/titre.py +++ b/modules/ing/pages/titre.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright(C) 2013 Florent Fourcot +# Copyright(C) 2013-2014 Florent Fourcot # # This file is part of weboob. # @@ -19,35 +19,34 @@ from decimal import Decimal -from datetime import date from weboob.capabilities.bank import Investment -from weboob.tools.browser import BasePage +from weboob.tools.browser2.page import RawPage, HTMLPage, method, ListElement, ItemElement +from weboob.tools.browser2.filters import CleanDecimal, CleanText, Date from weboob.tools.capabilities.bank.transactions import FrenchTransaction __all__ = ['TitrePage'] + class Transaction(FrenchTransaction): pass -class TitrePage(BasePage): - def on_loaded(self): - pass +class TitrePage(RawPage): def iter_investments(self): # We did not get some html, but something like that (XX is a quantity, YY a price): # message='[...] #popup=2{6{E:ALO{PAR{{reel{695{380{ALSTOM REGROUPT#XX#YY,YY €#YY,YY €#1 YYY,YY €#-YYY,YY €#-42,42%#-0,98 %#42,42 %#|1|AXA#cotationValeur.php?val=E:CS&pl=6&nc=1& #popup=2{6{E:CS{PAR{{reel{695{380{AXA#XX#YY,YY €#YY,YYY €#YYY,YY €#YY,YY €#3,70%#42,42 %#42,42 %#|1|blablablab #cotationValeur.php?val=P:CODE&pl=6&nc=1& # [...] - lines = self.document.split("popup=2") + lines = self.doc.split("popup=2") lines.pop(0) for line in lines: columns = line.split('#') code = columns[0].split('{')[2] invest = Investment(code) - invest.code = code - invest.label = columns[0].split('{')[-1] + invest.code = unicode(code) + invest.label = unicode(columns[0].split('{')[-1]) invest.quantity = int(columns[1]) invest.unitprice = Decimal(FrenchTransaction.clean_amount(columns[2])) invest.unitvalue = Decimal(FrenchTransaction.clean_amount(columns[3])) @@ -56,26 +55,18 @@ class TitrePage(BasePage): yield invest -class TitreHistory(BasePage): - def on_loaded(self): - pass - def iter_history(self): - try: - table = self.document.xpath('//table[@class="datas retour"]')[0] - except IndexError: - return # noop +class TitreHistory(HTMLPage): + @method + class iter_history(ListElement): + item_xpath = '//table[@class="datas retour"]/tr' - trs = table.xpath('tr') - trs.pop(0) - trs.pop(-1) - for tr in trs: - td = tr.xpath('td') - op = Transaction(1) - textraw = td[3].text_content() - if len(td[2].xpath('a')) > 0: - textraw += u" " + td[2].xpath('a')[0].text_content() - amount = op.clean_amount(td[6].text_content()) - op.parse(date(*reversed([int(x) for x in td[1].text_content().split('/')])), raw = textraw) - op.amount = Decimal(amount) - yield op + class item(ItemElement): + klass = Transaction + + def condition(self): + return len(self.el.xpath('td[@class="impaire"]')) > 0 + + obj_raw = Transaction.Raw('td[4] | td[3]/a') + obj_date = Date(CleanText('td[2]'), dayfirst=True) + obj_amount = CleanDecimal('td[7]')