diff --git a/weboob/backends/bnporc/backend.py b/weboob/backends/bnporc/backend.py index 79e87072f066c20d7c563b727de5be3864ff0e50..5111991cd866be59d19f644eccb4bf6a2fac922b 100644 --- a/weboob/backends/bnporc/backend.py +++ b/weboob/backends/bnporc/backend.py @@ -21,7 +21,7 @@ # python2.5 compatibility from __future__ import with_statement -from weboob.capabilities.bank import ICapBank, AccountNotFound, Account +from weboob.capabilities.bank import ICapBank, AccountNotFound, Account, Recipient from weboob.tools.backend import BaseBackend from weboob.tools.value import ValuesDict, Value @@ -86,6 +86,13 @@ def iter_operations(self, account): for coming in self.browser.get_coming_operations(account): yield coming + def iter_transfer_recipients(self, ignored): + for account in self.browser.get_transfer_accounts().itervalues(): + recipient = Recipient() + recipient.id = account.id + recipient.label = account.label + yield recipient + def transfer(self, account, to, amount, reason=None): if isinstance(account, Account): account = account.id diff --git a/weboob/backends/bnporc/browser.py b/weboob/backends/bnporc/browser.py index 4c54df8f8df09fed884a6299d42c2c608746bc58..29b628b4e0be38e1665c6f63587f1c78531ff857 100644 --- a/weboob/backends/bnporc/browser.py +++ b/weboob/backends/bnporc/browser.py @@ -133,10 +133,18 @@ def get_coming_operations(self, account): self.location('/NS_AVEDT?ch4=%s' % account.link_id) return self.page.get_operations() + def get_transfer_accounts(self): + if not self.is_on_page(pages.TransferPage): + self.location('/NS_VIRDF') + + assert self.is_on_page(pages.TransferPage) + return self.page.get_accounts() + def transfer(self, from_id, to_id, amount, reason=None): if not self.is_on_page(pages.TransferPage): self.location('/NS_VIRDF') + accounts = self.page.get_accounts() self.page.transfer(from_id, to_id, amount, reason) if not self.is_on_page(pages.TransferCompletePage): @@ -144,7 +152,7 @@ def transfer(self, from_id, to_id, amount, reason=None): transfer = Transfer(self.page.get_id()) transfer.amount = amount - transfer.origin = from_id - transfer.recipient = to_id + transfer.origin = accounts[from_id].label + transfer.recipient = accounts[to_id].label transfer.date = datetime.now() return transfer diff --git a/weboob/backends/bnporc/pages/transfer.py b/weboob/backends/bnporc/pages/transfer.py index 663e36d0bd8a4f94fd168edcbc9ab733f3780971..fb1d665d8be7d8e5734c4eba283b66ce37f1e084 100644 --- a/weboob/backends/bnporc/pages/transfer.py +++ b/weboob/backends/bnporc/pages/transfer.py @@ -21,39 +21,58 @@ import re from weboob.tools.browser import BasePage +from weboob.tools.ordereddict import OrderedDict from weboob.capabilities.bank import TransferError __all__ = ['TransferPage', 'TransferConfirmPage', 'TransferCompletePage'] +class Account(object): + def __init__(self, id, label, send_checkbox, receive_checkbox): + self.id = id + self.label = label + self.send_checkbox = send_checkbox + self.receive_checkbox = receive_checkbox + class TransferPage(BasePage): - def transfer(self, from_id, to_id, amount, reason): - self.browser.select_form(nr=0) - from_found = False - to_found = False + def get_accounts(self): + accounts = OrderedDict() for table in self.document.getiterator('table'): if table.attrib.get('cellspacing') == '2': for tr in table.cssselect('tr.hdoc1, tr.hdotc1'): tds = tr.findall('td') id = tds[1].text.replace(u'\xa0', u'') - if id == from_id: - if tds[4].find('input') is None: - raise TransferError("Unable to make a transfer from %s" % from_id) - self.browser['C1'] = [tds[4].find('input').attrib['value']] - from_found = True - elif id == to_id: - if tds[5].find('input') is None: - raise TransferError("Unable to make a transfer to %s" % from_id) - self.browser['C2'] = [tds[5].find('input').attrib['value']] - to_found = True - - if not from_found: + label = tds[0].text + if label is None and tds[0].find('nobr') is not None: + label = tds[0].find('nobr').text + send_checkbox = tds[4].find('input').attrib['value'] if tds[4].find('input') is not None else None + receive_checkbox = tds[5].find('input').attrib['value'] if tds[5].find('input') is not None else None + account = Account(id, label, send_checkbox, receive_checkbox) + accounts[id] = account + return accounts + + def transfer(self, from_id, to_id, amount, reason): + accounts = self.get_accounts() + + try: + sender = accounts[from_id] + except KeyError: raise TransferError('Account %s not found' % from_id) - if not to_found: + try: + recipient = accounts[to_id] + except KeyError: raise TransferError('Recipient %s not found' % to_id) + if sender.send_checkbox is None: + raise TransferError('Unable to make a transfer from %s' % sender.label) + if recipient.receive_checkbox is None: + raise TransferError('Unable to make a transfer to %s' % recipient.label) + + self.browser.select_form(nr=0) + self.browser['C1'] = [sender.send_checkbox] + self.browser['C2'] = [recipient.receive_checkbox] self.browser['T6'] = str(amount).replace('.', ',') if reason: self.browser['T5'] = reason