Skip to content
backend.py 3.49 KiB
Newer Older
Romain Bignon's avatar
Romain Bignon committed
# -*- coding: utf-8 -*-

# Copyright(C) 2010  Romain Bignon
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3 of the License.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Romain Bignon's avatar
Romain Bignon committed

# python2.5 compatibility
from __future__ import with_statement

from weboob.capabilities.bank import ICapBank, AccountNotFound, Account
Christophe Benz's avatar
Christophe Benz committed
from weboob.tools.backend import BaseBackend
from weboob.tools.value import ValuesDict, Value
Romain Bignon's avatar
Romain Bignon committed

from .browser import BNPorc

class BNPorcBackend(BaseBackend, ICapBank):
Romain Bignon's avatar
Romain Bignon committed
    NAME = 'bnporc'
    MAINTAINER = 'Romain Bignon'
Romain Bignon's avatar
Romain Bignon committed
    EMAIL = 'romain@weboob.org'
Romain Bignon's avatar
Romain Bignon committed
    VERSION = '0.4'
Romain Bignon's avatar
Romain Bignon committed
    LICENSE = 'GPLv3'
Romain Bignon's avatar
Romain Bignon committed
    DESCRIPTION = 'BNP Paribas french bank\' website'
    CONFIG = ValuesDict(Value('login',      label='Account ID'),
                        Value('password',   label='Password', masked=True),
                        Value('rotating_password',
                              label='Password to set when the allowed uses are exhausted (6 digits)',
                              default='',
                              regexp='^(\d{6}|)$'))
    BROWSER = BNPorc
Romain Bignon's avatar
Romain Bignon committed

Romain Bignon's avatar
Romain Bignon committed
    def create_default_browser(self):
        if self.config['rotating_password'].isdigit() and len(self.config['rotating_password']) == 6:
            rotating_password = self.config['rotating_password']
        else:
            rotating_password = None
        return self.create_browser(self.config['login'],
                                   self.config['password'],
                                   password_changed_cb=self._password_changed_cb,
                                   rotating_password=rotating_password)

    def _password_changed_cb(self, old, new):
        new_settings = {'password':          new,
                        'rotating_password': old,
                       }
        self.weboob.backends_config.edit_backend(self.name, self.NAME, new_settings)
Romain Bignon's avatar
Romain Bignon committed

    def iter_accounts(self):
        for account in self.browser.get_accounts_list():
            yield account

    def get_account(self, _id):
Romain Bignon's avatar
Romain Bignon committed
            raise AccountNotFound()
        with self.browser:
            account = self.browser.get_account(_id)
        if account:
            return account
Romain Bignon's avatar
Romain Bignon committed
        else:
Romain Bignon's avatar
Romain Bignon committed

        with self.browser:
            for history in self.browser.get_history(account):
                yield history
Romain Bignon's avatar
Romain Bignon committed
    def iter_operations(self, account):
        with self.browser:
            for coming in self.browser.get_coming_operations(account):
                yield coming

    def transfer(self, account, to, amount, reason=None):
        if isinstance(account, Account):
            account = account.id

        try:
            assert account.isdigit()
            assert to.isdigit()
            amount = float(amount)
        except (AssertionError, ValueError):
            raise AccountNotFound()

        with self.browser:
            return self.browser.transfer(account, to, amount, reason)