From 7bcb4bcf186a94b833ddb124cc32d3d2e6e97243 Mon Sep 17 00:00:00 2001 From: Edouard Lambert Date: Mon, 11 Jul 2016 17:08:40 +0200 Subject: [PATCH] adding investments to apivie --- modules/apivie/browser.py | 26 ++++++++++++++++++-------- modules/apivie/module.py | 7 ++++++- modules/apivie/pages.py | 24 +++++++++++++++++++++++- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/modules/apivie/browser.py b/modules/apivie/browser.py index fb8775267a..0067d4cf82 100644 --- a/modules/apivie/browser.py +++ b/modules/apivie/browser.py @@ -20,7 +20,7 @@ from weboob.deprecated.browser import Browser, BrowserIncorrectPassword -from .pages import LoginPage, AccountsPage, OperationsPage +from .pages import LoginPage, AccountsPage, InvestmentsPage, OperationsPage __all__ = ['ApivieBrowser'] @@ -28,19 +28,23 @@ class ApivieBrowser(Browser): PROTOCOL = 'https' - DOMAIN = 'www.apivie.fr' ENCODING = None PAGES = { - 'https?://www.apivie.fr/': LoginPage, - 'https?://www.apivie.fr/accueil': LoginPage, - 'https?://www.apivie.fr/perte.*': LoginPage, - 'https?://www.apivie.fr/accueil-connect': AccountsPage, - 'https?://www.apivie.fr/historique-contrat.*': OperationsPage, + 'https?://[^/]+/': LoginPage, + 'https?://[^/]+/accueil': LoginPage, + 'https?://[^/]+/perte.*': LoginPage, + 'https?://[^/]+/accueil-connect': AccountsPage, + 'https?://[^/]+/synthese-contrat.*': InvestmentsPage, + 'https?://[^/]+/historique-contrat.*': OperationsPage, } + def __init__(self, website, *args, **kwargs): + self.DOMAIN = website + Browser.__init__(self, *args, **kwargs) + def home(self): - self.location('https://www.apivie.fr/accueil-connect') + self.location('https://%s/accueil-connect' % self.DOMAIN) def login(self): assert isinstance(self.username, basestring) @@ -67,6 +71,12 @@ def get_account(self, _id): except StopIteration: return None + def iter_investment(self, account): + self.location(self.buildurl('/synthese-contrat', contratId=account.id)) + + assert self.is_on_page(InvestmentsPage) + return self.page.iter_investment() + def iter_history(self, account): self.location(self.buildurl('/historique-contrat', contratId=account.id)) diff --git a/modules/apivie/module.py b/modules/apivie/module.py index 5e68c90864..56bd4e686d 100644 --- a/modules/apivie/module.py +++ b/modules/apivie/module.py @@ -40,7 +40,8 @@ class ApivieModule(Module, CapBankWealth): ValueBackendPassword('password', label='Mot de passe')) def create_default_browser(self): - return self.create_browser(self.config['login'].get(), + return self.create_browser('www.apivie.fr', + self.config['login'].get(), self.config['password'].get()) def iter_accounts(self): @@ -51,6 +52,10 @@ def get_account(self, _id): with self.browser: return self.browser.get_account(_id) + def iter_investment(self, account): + with self.browser: + return self.browser.iter_investment(account) + def iter_history(self, account): with self.browser: return self.browser.iter_history(account) diff --git a/modules/apivie/pages.py b/modules/apivie/pages.py index 4ac1e2573a..357232c0f9 100644 --- a/modules/apivie/pages.py +++ b/modules/apivie/pages.py @@ -20,9 +20,10 @@ from decimal import Decimal -from weboob.capabilities.bank import Account +from weboob.capabilities.bank import Account, Investment from weboob.deprecated.browser import Page from weboob.tools.capabilities.bank.transactions import FrenchTransaction +from weboob.browser.filters.standard import Date, CleanText class LoginPage(Page): @@ -55,6 +56,27 @@ def _get_account(self, line): return account +class InvestmentsPage(Page): + COL_LABEL = 0 + COL_CODE = 1 + COL_VALUATION = 2 + COL_PORTFOLIO_SHARE = 3 + + def iter_investment(self): + for line in self.document.xpath('//div[@class="supportTable"]//table/tbody/tr'): + tds = line.findall('td') + inv = Investment() + inv.vdate = Date(dayfirst=True).filter(CleanText().filter(self.document.xpath( \ + '//div[@id="table-evolution-contrat"]//table/tbody/tr[1]/td[1]'))) + inv.label = self.parser.tocleanstring(tds[self.COL_LABEL]) + inv.code = self.parser.tocleanstring(tds[self.COL_CODE]) + inv.valuation = Decimal(FrenchTransaction.clean_amount( \ + self.parser.tocleanstring(tds[self.COL_VALUATION]))) + inv.portfolio_share = Decimal(FrenchTransaction.clean_amount( \ + self.parser.tocleanstring(tds[self.COL_PORTFOLIO_SHARE]))) + yield inv + + class Transaction(FrenchTransaction): pass -- GitLab