<commit_before># -*- coding: utf-8 -*-

# Copyright(C) 2009-2011  <NAME>, <NAME>
#
# 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 <http://www.gnu.org/licenses/>.
import hashlib

from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword
from weboob.capabilities.bank import Account, TransferError
from .pages import AccountsList, LoginPage, LoginPage2, \
                   AccountHistory, TransferPage, TransferConfirmPage, \
                   BillsPage


__all__ = ['Ing']


class Ing(BaseBrowser):
    DOMAIN = 'secure.ingdirect.fr'
    PROTOCOL = 'https'
    DEBUG_HTTP = False
    #DEBUG_HTTP = True
    ENCODING = None  # refer to the HTML encoding
    PAGES = {'.*displayTRAccountSummary.*':    AccountsList,
             '.*displayLogin.jsf':             LoginPage,
             '.*displayLogin.jsf.+':           LoginPage2,
             '.*accountDetail.jsf.*':          AccountHistory,
             '.*displayTRHistorique.*':        AccountHistory,
             '.*transferManagement.jsf':       TransferPage,
             '.*onHoldTransferManagement.jsf': TransferPage,
             '.*DisplayDoTransferCommand.*':   TransferPage,
             '.*transferCreateValidation.jsf': TransferConfirmPage,
             '.*eStatement.jsf':               BillsPage
            }
    CERTHASH = "fba557b387cccc3d71ba038f9ef1de4d71541d7954744c79f6a7ff5f3cd4dc12"

    def __init__(self, *args, **kwargs):
        self.birthday = kwargs.pop('birthday', None)
        BaseBrowser.__init__(self, *args, **kwargs)

    def home(self):
        self.location('https://secure.ingdirect.fr/public/displayLogin.jsf')

    def is_logged(self):
        return not self.is_on_page(LoginPage)

    def login(self):
        assert isinstance(self.username, basestring)
        assert isinstance(self.password, basestring)
        assert isinstance(self.birthday, basestring)
        assert self.password.isdigit()
        assert self.birthday.isdigit()

        if not self.is_on_page(LoginPage):
            self.location('https://secure.ingdirect.fr/\
                           public/displayLogin.jsf')

        self.page.prelogin(self.username, self.birthday)
        self.page.login(self.password)
        if self.page.error():
            raise BrowserIncorrectPassword()

    def get_accounts_list(self):
        if not self.is_on_page(AccountsList):
            self.location('/general?command=displayTRAccountSummary')

        return self.page.get_list()

    def get_account(self, id):
        assert isinstance(id, basestring)

        if not self.is_on_page(AccountsList):
            self.location('/general?command=displayTRAccountSummary')

        l = self.page.get_list()
        for a in l:
            if a.id == id:
                return a

        return None

    def viewing_html(self):
        # To prevent unknown mimetypes sent by server, we assume we
        # are always on a HTML document.
        return True

    def get_history(self, account):
        if not isinstance(account, Account):
            account = self.get_account(account)
        # The first and the second letter of the label are the account type
        if account.label[0:2] == "CC":
            self.location('https://secure.ingdirect.fr/protected/pages/cc/accountDetail.jsf')
        elif account.label[0:2] == "LA" or account.label[0:3] == "LEO":
            # we want "displayTRHistoriqueLA" but this fucking page
            # is not directly available...
            self.location('https://secure.ingdirect.fr/general?command=goToAccount&account=%d&zone=COMPTE' % int(account._index))
        else:
            raise NotImplementedError()
        while 1:
            hashlist = []
            for transaction in self.page.get_transactions():
                while transaction.id in hashlist:
                    transaction.id = hashlib.md5(transaction.id + "1").hexdigest()
                hashlist.append(transaction.id)
                yield transaction
            if self.page.islast():
                return

            # XXX server sends an unknown mimetype, we overload viewing_html() above to
            # prevent this issue.
            self.page.next_page()

    def get_recipients(self, account):
        if not self.is_on_page(TransferPage):
            self.location('https://secure.ingdirect.fr/protected/pages/cc/transfer/transferManagement.jsf')
        if self.page.ischecked(account):
            return self.page.get_recipients()
        else:
            # It is hard to check the box and to get the real list. We try an alternative way like normal users
            self.get_history(account.id).next()
            self.location('https://secure.ingdirect.fr/general?command=DisplayDoTransferCommand')<commit_msg>fix support of several check accounts<commit_after># -*- coding: utf-8 -*-

# Copyright(C) 2009-2011  <NAME>, <NAME>
#
# 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 <http://www.gnu.org/licenses/>.
import hashlib

from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword
from weboob.capabilities.bank import Account, TransferError
from .pages import AccountsList, LoginPage, LoginPage2, \
                   AccountHistory, TransferPage, TransferConfirmPage, \
                   BillsPage


__all__ = ['Ing']


class Ing(BaseBrowser):
    DOMAIN = 'secure.ingdirect.fr'
    PROTOCOL = 'https'
    DEBUG_HTTP = False
    #DEBUG_HTTP = True
    ENCODING = None  # refer to the HTML encoding
    PAGES = {'.*displayTRAccountSummary.*':    AccountsList,
             '.*displayLogin.jsf':             LoginPage,
             '.*displayLogin.jsf.+':           LoginPage2,
             '.*accountDetail.jsf.*':          AccountHistory,
             '.*displayTRHistorique.*':        AccountHistory,
             '.*transferManagement.jsf':       TransferPage,
             '.*onHoldTransferManagement.jsf': TransferPage,
             '.*DisplayDoTransferCommand.*':   TransferPage,
             '.*transferCreateValidation.jsf': TransferConfirmPage,
             '.*eStatement.jsf':               BillsPage
            }
    CERTHASH = "fba557b387cccc3d71ba038f9ef1de4d71541d7954744c79f6a7ff5f3cd4dc12"

    def __init__(self, *args, **kwargs):
        self.birthday = kwargs.pop('birthday', None)
        BaseBrowser.__init__(self, *args, **kwargs)

    def home(self):
        self.location('https://secure.ingdirect.fr/public/displayLogin.jsf')

    def is_logged(self):
        return not self.is_on_page(LoginPage)

    def login(self):
        assert isinstance(self.username, basestring)
        assert isinstance(self.password, basestring)
        assert isinstance(self.birthday, basestring)
        assert self.password.isdigit()
        assert self.birthday.isdigit()

        if not self.is_on_page(LoginPage):
            self.location('https://secure.ingdirect.fr/\
                           public/displayLogin.jsf')

        self.page.prelogin(self.username, self.birthday)
        self.page.login(self.password)
        if self.page.error():
            raise BrowserIncorrectPassword()

    def get_accounts_list(self):
        if not self.is_on_page(AccountsList):
            self.location('/general?command=displayTRAccountSummary')

        return self.page.get_list()

    def get_account(self, id):
        assert isinstance(id, basestring)

        if not self.is_on_page(AccountsList):
            self.location('/general?command=displayTRAccountSummary')

        l = self.page.get_list()
        for a in l:
            if a.id == id:
                return a

        return None

    def viewing_html(self):
        # To prevent unknown mimetypes sent by server, we assume we
        # are always on a HTML document.
        return True

    def get_history(self, account):
        if not isinstance(account, Account):
            account = self.get_account(account)
        # The first and the second letter of the label are the account type
        if account.label[0:2] == "CC":
            self.location('https://secure.ingdirect.fr/protected/pages/cc/accountDetail.jsf?account=%s' % int(account._index))
        elif account.label[0:2] == "LA" or account.label[0:3] == "LEO":
            # we want "displayTRHistoriqueLA" but this fucking page
            # is not directly available...
            self.location('https://secure.ingdirect.fr/general?command=goToAccount&account=%d&zone=COMPTE' % int(account._index))
        else:
            raise NotImplementedError()
        while 1:
            hashlist = []
            for transaction in self.page.get_transactions():
                while transaction.id in hashlist:
                    transaction.id = hashlib.md5(transaction.id + "1").hexdigest()
                hashlist.append(transaction.id)
                yield transaction
            if self.page.islast():
                return

            # XXX server sends an unknown mimetype, we overload viewing_html() above to
            # prevent this issue.
            self.page.next_page()

    def get_recipients(self, account):
        if not self.is_on_page(TransferPage):
            self.location('https://secure.ingdirect.fr/protected/pages/cc/transfer/transferManagement.jsf')
        if self.page.ischecked(account):
            return self.page.get_recipients()
        else:
            # It is hard to check the box and to get the real list. We try an alternative way like normal users
            self.get_history(account.id).next()
            self.location('https://secure.ingdirect.fr/general?command=DisplayDoTransferCommand')
{'fraction_non_alphanumeric': 0.09818181818181818, 'fraction_numerical': 0.01062937062937063, 'mean_word_length': 2.4104928457869637, 'pattern_counts': {'":': 4, '<': 9, '<?xml version=': 0, '>': 9, 'https://': 12, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4189821', 'n_tokens_mistral': 3051, 'n_tokens_neox': 2916, 'n_words': 785}