diff --git a/modules/cmso/par/browser.py b/modules/cmso/par/browser.py index 7cead4cac3c077ea9c51b456a927e52d303e2afd..0d628a24d04ccb1e6fd41b7e24d8681f3c7134e6 100644 --- a/modules/cmso/par/browser.py +++ b/modules/cmso/par/browser.py @@ -330,11 +330,15 @@ def iter_accounts(self): self.accounts_list.append(a) return self.accounts_list - def _go_market_history(self): - content = self.market.go(json={'place': 'SITUATION_PORTEFEUILLE'}).text - self.location(json.loads(content)['urlSSO']) - - return self.market.go(website=self.website, action='historiquePortefeuille') + def _go_market_history(self, action): + # the website won't let us go on market page if we don't do this call before (it raises a 403) + self.redirect_insurance.go() + try: + url_before_market_history = json.loads(self.market.go(json={'place': 'SITUATION_PORTEFEUILLE'}).text)['urlSSO'] + except KeyError: + raise AssertionError('unable to get url to reach to be able to go on market page') + self.location(url_before_market_history) + return self.market.go(website=self.website, action=action) @retry((ClientError, ServerError)) @need_login @@ -355,7 +359,7 @@ def iter_history(self, account): yield tr return elif account.type in (Account.TYPE_PEA, Account.TYPE_MARKET): - self._go_market_history() + self._go_market_history('historiquePortefeuille') if not self.page.go_account(account.label, account._owner): return @@ -417,10 +421,12 @@ def iter_coming(self, account): return [] comings = [] - if not hasattr(account, '_index'): # No _index, we can't get coming return [] + elif account.type in (Account.TYPE_PEA, Account.TYPE_MARKET): + # will prevent a further 403 + self.redirect_insurance.go() self.history.go(json={"index": account._index}, page="pendingListOperations") # There is no ids for comings, so no check for duplicates for key in self.page.get_keys(): @@ -450,10 +456,7 @@ def iter_investment(self, account): return [] return self.location(url).page.iter_investment() elif account.type in (Account.TYPE_MARKET, Account.TYPE_PEA): - data = {"place": "SITUATION_PORTEFEUILLE"} - response = self.market.go(json=data) - self.location(json.loads(response.text)['urlSSO']) - self.market.go(website=self.website, action="situationPortefeuille") + self._go_market_history('situationPortefeuille') if self.page.go_account(account.label, account._owner): return self.page.iter_investment() return [] @@ -465,10 +468,7 @@ def iter_market_orders(self, account): if account.type not in (Account.TYPE_MARKET, Account.TYPE_PEA): return - data = {"place": "SITUATION_PORTEFEUILLE"} - response = self.market.go(json=data) - self.location(json.loads(response.text)['urlSSO']) - self.market.go(website=self.website, action="carnetOrdre") + self._go_market_history('carnetOrdre') if self.page.go_account(account.label, account._owner): orders_list_url = self.url error_message = self.page.get_error_message() diff --git a/modules/cmso/par/pages.py b/modules/cmso/par/pages.py index a9113742a0abac5c41d71fc2915382e2c7fa6265..f5ca2e3f70cec68eccdd249f0f240c27fb8d6683 100644 --- a/modules/cmso/par/pages.py +++ b/modules/cmso/par/pages.py @@ -38,7 +38,7 @@ ) from weboob.browser.filters.json import Dict from weboob.browser.filters.html import Attr, Link, TableCell, AbsoluteLink -from weboob.browser.exceptions import ServerError, ClientError +from weboob.browser.exceptions import ServerError from weboob.capabilities.bank import Account, Loan, AccountOwnership from weboob.capabilities.wealth import Investment, MarketOrder, MarketOrderDirection, MarketOrderType from weboob.capabilities.contact import Advisor @@ -289,16 +289,7 @@ def obj_ownership(self): def get_market_number(self): label = Field('label')(self) - # sometimes this call raises a ClientError. it does not really disconnect the browser - # in order to prevent a new login attempt from the browser and a reset of the iter_accounts - # we handle the exception here - try: - page = self.page.browser._go_market_history() - except ClientError as e: - if e.response.status_code == 403: - self.logger.warning("unable to retrieve market number for account with label %s", label) - return NotAvailable - raise + page = self.page.browser._go_market_history('historiquePortefeuille') return page.get_account_id(label, Field('_owner')(self)) def get_lifenumber(self):