diff --git a/modules/paypal/backend.py b/modules/paypal/backend.py index 3cfb3cf9..6080a9b0 100644 --- a/modules/paypal/backend.py +++ b/modules/paypal/backend.py @@ -47,8 +47,7 @@ class PaypalBackend(BaseBackend, ICapBank): self.config['password'].get()) def iter_accounts(self): - for account in self.browser.get_accounts(): - yield account + return self.browser.get_accounts().itervalues() def get_account(self, _id): with self.browser: diff --git a/modules/paypal/browser.py b/modules/paypal/browser.py index 6c04dd8f..e098acfb 100644 --- a/modules/paypal/browser.py +++ b/modules/paypal/browser.py @@ -56,12 +56,12 @@ class Paypal(BaseBrowser): raise BrowserIncorrectPassword() def get_accounts(self): - yield self.get_account(u"1") + if not self.is_on_page(AccountPage): + self.location('/en/cgi-bin/webscr?cmd=_account&nav=0.0') + + return self.page.get_accounts() def get_account(self, _id): - if _id != u"1": - return None - if not self.is_on_page(AccountPage): self.location('/en/cgi-bin/webscr?cmd=_account&nav=0.0') diff --git a/modules/paypal/pages.py b/modules/paypal/pages.py index 37d7eb55..5879ddc4 100644 --- a/modules/paypal/pages.py +++ b/modules/paypal/pages.py @@ -19,7 +19,7 @@ from decimal import Decimal -from weboob.tools.browser import BasePage +from weboob.tools.browser import BasePage, BrokenPageError from weboob.capabilities.bank import Account from weboob.tools.capabilities.bank.transactions import FrenchTransaction @@ -40,29 +40,55 @@ class LoginPage(BasePage): class AccountPage(BasePage): def get_account(self, _id): - assert _id == u"1" # Only one "account" supported for now - - account = Account() - account.id = _id - account.label = unicode(self.browser.username) - account.type = Account.TYPE_CHECKING + return self.get_accounts().get(_id) + def get_accounts(self): + accounts = {} content = self.document.xpath('//div[@id="main"]//div[@class="col first"]')[0] + # Total currency balance. # If there are multiple currencies, this balance is all currencies # converted to the main currency. - balance = content.xpath('//h3/span[@class="balance"]')[0].text_content().strip() - account.balance = clean_amount(balance) - account.currency = account.get_currency(balance) + balance = content.xpath('.//h3/span[@class="balance"]')[0].text_content().strip() + + # Primary currency account + primary_account = Account() + primary_account.type = Account.TYPE_CHECKING + primary_account.balance = clean_amount(balance) + primary_account.currency = Account.get_currency(balance) + primary_account.id = unicode(primary_account.currency) + primary_account.label = u'%s %s*' % (self.browser.username, balance.split()[-1]) + accounts[primary_account.id] = primary_account + + # The following code will only work if the user enabled multiple currencies. + balance = content.xpath('.//div[@class="body"]//ul/li[@class="balance"]/span') + table = content.xpath('.//table[@id="balanceDetails"]//tbody//tr') + + # sanity check + if bool(balance) is not bool(table): + raise BrokenPageError('Unable to find all required multiple currency entries') # Primary currency balance. # If the user enabled multiple currencies, we get this one instead. # An Account object has only one currency; secondary currencies should be other accounts. - balance = content.xpath('//div[@class="body"]//ul/li[@class="balance"]/span') if balance: balance = balance[0].text_content().strip() - account.balance = clean_amount(balance) + primary_account.balance = clean_amount(balance) # The primary currency of the "head balance" is the same; ensure we got the right one - assert account.currency == account.get_currency(balance) + assert primary_account.currency == primary_account.get_currency(balance) - return account + for row in table: + balance = row.xpath('.//td')[-1].text_content().strip() + account = Account() + account.type = Account.TYPE_CHECKING + account.balance = clean_amount(balance) + account.currency = Account.get_currency(balance) + account.id = unicode(account.currency) + account.label = u'%s %s' % (self.browser.username, balance.split()[-1]) + if account.id == primary_account.id: + assert account.balance == primary_account.balance + assert account.currency == primary_account.currency + elif account.currency: + accounts[account.id] = account + + return accounts