# -*- coding: utf-8 -*- # Copyright(C) 2014 Budget Insight # # This file is part of weboob. # # weboob is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # weboob 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 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 datetime import date from weboob.exceptions import BrowserIncorrectPassword from weboob.browser import LoginBrowser, URL, need_login from weboob.tools.date import new_date from .pages import ( LoginPage, ClientPage, OperationsPage, ChoicePage, CreditHome, CreditAccountPage, CreditHistory, LastHistoryPage, ) __all__ = ['OneyBrowser'] class OneyBrowser(LoginBrowser): BASEURL = 'https://www.oney.fr' login = URL(r'/site/s/login/login.html', LoginPage) choice = URL(r'/site/s/multimarque/choixsite.html', ChoicePage) choice_portal = URL(r'/site/s/login/loginidentifiant.html') client = URL(r'/oney/client', ClientPage) operations = URL(r'/oney/client', OperationsPage) card_page = URL(r'/oney/client\?task=Synthese&process=SyntheseMultiCompte&indexSelectionne=(?P\d+)') credit_home = URL(r'/site/s/detailcompte/detailcompte.html', CreditHome) credit_info = URL(r'/site/s/detailcompte/ongletdetailcompte.html', CreditAccountPage) credit_hist = URL(r'/site/s/detailcompte/exportoperations.html', CreditHistory) last_hist = URL(r'/site/s/detailcompte/ongletdernieresoperations.html', LastHistoryPage) has_oney = False has_other = False card_name = None def do_login(self): self.session.cookies.clear() self.login.go() self.page.login(self.username, self.password) if self.choice.is_here(): self.has_other = self.has_oney = True elif self.credit_home.is_here(): self.has_other = True elif self.client.is_here(): self.has_oney = True else: raise BrowserIncorrectPassword() @need_login def go_site(self, site): if site == 'oney': if ( self.credit_home.is_here() or self.credit_info.is_here() or self.credit_hist.is_here() or self.last_hist.is_here() ): self.choice.go() assert self.choice.is_here() if self.choice.is_here(): self.choice_portal.go(data={'selectedSite': 'ONEY_HISTO'}) elif site == 'other': if self.client.is_here() or self.operations.is_here(): self.do_login() assert self.choice.is_here() if self.choice.is_here(): self.choice_portal.go(data={'selectedSite': 'ONEY'}) @need_login def get_accounts_list(self): accounts = [] if self.has_other: self.go_site('other') self.credit_home.stay_or_go() self.card_name = self.page.get_name() self.credit_info.go() accounts.append(self.page.get_account()) if self.has_oney: self.go_site('oney') self.client.stay_or_go() accounts.extend(self.page.iter_accounts()) return accounts def _build_hist_form(self): form = {} d = date.today() form['jourDebut'] = '1' form['moisDebut'] = '1' form['anneeDebut'] = '2016' form['jourFin'] = str(d.day) form['moisFin'] = str(d.month) form['anneeFin'] = str(d.year) form['typeOpe'] = 'deux' form['formatFichier'] = 'xls' # or pdf... great choice return form @need_login def iter_history(self, account): self.go_site(account._site) if account._site == 'oney': if account._num: self.card_page.go(acc_num=account._num) post = {'task': 'Synthese', 'process': 'SyntheseCompte', 'taskid': 'Releve'} self.operations.go(data=post) for tr in self.page.iter_transactions(seen=set()): yield tr elif account._site == 'other': if self.last_hist.go().has_transactions(): self.credit_hist.go(params=self._build_hist_form()) d = date.today().replace(day=1) # TODO is it the right date? for tr in self.page.iter_history(): if new_date(tr.date) < d: yield tr @need_login def iter_coming(self, account): self.go_site(account._site) if account._site == 'oney': if account._num: self.card_page.go(acc_num=account._num) post = {'task': 'OperationRecente', 'process': 'OperationRecente', 'taskid': 'OperationRecente'} self.operations.go(data=post) for tr in self.page.iter_transactions(seen=set()): yield tr elif account._site == 'other': if self.last_hist.go().has_transactions(): self.credit_hist.go(params=self._build_hist_form()) d = date.today().replace(day=1) # TODO is it the right date? for tr in self.page.iter_history(): if new_date(tr.date) >= d: yield tr