convert to browser2

This commit is contained in:
Romain Bignon 2014-03-22 16:06:13 +01:00
commit 014234576e
3 changed files with 61 additions and 81 deletions

View file

@ -45,13 +45,10 @@ class AlloRestoBackend(BaseBackend, ICapBank):
self.config['password'].get()) self.config['password'].get())
def iter_accounts(self): def iter_accounts(self):
with self.browser: return self.browser.get_accounts_list()
for account in self.browser.get_accounts_list():
yield account
def get_account(self, _id): def get_account(self, _id):
with self.browser: account = self.browser.get_account(_id)
account = self.browser.get_account(_id)
if account: if account:
return account return account
@ -59,10 +56,8 @@ class AlloRestoBackend(BaseBackend, ICapBank):
raise AccountNotFound() raise AccountNotFound()
def iter_history(self, account): def iter_history(self, account):
with self.browser: return self.browser.get_history(account)
return self.browser.get_history(account)
def iter_coming(self, account): def iter_coming(self, account):
with self.browser: return self.browser.get_coming(account)
return self.browser.get_coming(account)

View file

@ -18,7 +18,8 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>. # along with weboob. If not, see <http://www.gnu.org/licenses/>.
from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword from weboob.tools.browser2 import LoginBrowser, URL, need_login
from weboob.tools.browser import BrowserIncorrectPassword
from .pages import LoginPage, AccountsPage from .pages import LoginPage, AccountsPage
@ -26,58 +27,40 @@ from .pages import LoginPage, AccountsPage
__all__ = ['AlloRestoBrowser'] __all__ = ['AlloRestoBrowser']
class AlloRestoBrowser(BaseBrowser): class AlloRestoBrowser(LoginBrowser):
DOMAIN = 'www.alloresto.fr' BASEURL = 'http://www.alloresto.fr'
PROTOCOL = 'http'
ENCODING = 'utf-8'
PAGES = {'http://www.alloresto.fr/identification-requise.*': LoginPage,
'http://www.alloresto.fr/chez-moi/releve-compte-miams': AccountsPage,
}
def is_logged(self): login = URL('/identification-requise.*', LoginPage)
return self.page is not None and not self.is_on_page(LoginPage) accounts = URL('/chez-moi/releve-compte-miams', AccountsPage)
def home(self): def do_login(self):
self.go_on_accounts_list()
def login(self):
assert isinstance(self.username, basestring) assert isinstance(self.username, basestring)
assert isinstance(self.password, basestring) assert isinstance(self.password, basestring)
if not self.is_on_page(LoginPage): self.accounts.stay_or_go()
self.location('http://www.alloresto.fr/identification-requise', no_login=True)
self.page.login(self.username, self.password) self.page.login(self.username, self.password)
if not self.is_logged(): if self.login.is_here():
raise BrowserIncorrectPassword() raise BrowserIncorrectPassword()
def go_on_accounts_list(self): @need_login
self.location('http://www.alloresto.fr/chez-moi/releve-compte-miams')
def get_accounts_list(self): def get_accounts_list(self):
if not self.is_on_page(AccountsPage): return self.accounts.stay_or_go().iter_accounts()
self.go_on_accounts_list()
return self.page.get_list()
@need_login
def get_account(self, id): def get_account(self, id):
assert isinstance(id, basestring) assert isinstance(id, basestring)
l = self.get_accounts_list() for a in self.get_accounts_list():
for a in l:
if a.id == id: if a.id == id:
return a return a
return None return None
@need_login
def get_history(self, account): def get_history(self, account):
if not self.is_on_page(AccountsPage): return self.accounts.stay_or_go().get_transactions(type='consommable')
self.go_on_accounts_list()
return self.page.get_transactions()
@need_login
def get_coming(self, account): def get_coming(self, account):
if not self.is_on_page(AccountsPage): return self.accounts.stay_or_go().get_transactions(type='acquisition')
self.go_on_accounts_list()
return self.page.get_transactions('acquisition')

View file

@ -21,7 +21,8 @@
import datetime import datetime
from decimal import Decimal from decimal import Decimal
from weboob.tools.browser import BasePage from weboob.tools.browser2.page import HTMLPage, LoggedPage, method, ItemElement
from weboob.tools.browser2.filters import CleanDecimal, CleanText, Filter, TableCell
from weboob.capabilities.bank import Account from weboob.capabilities.bank import Account
from weboob.tools.capabilities.bank.transactions import FrenchTransaction as Transaction from weboob.tools.capabilities.bank.transactions import FrenchTransaction as Transaction
@ -29,46 +30,47 @@ from weboob.tools.capabilities.bank.transactions import FrenchTransaction as Tra
__all__ = ['LoginPage', 'AccountsPage'] __all__ = ['LoginPage', 'AccountsPage']
class LoginPage(BasePage): class LoginPage(HTMLPage):
def login(self, username, password): def login(self, username, password):
self.browser.select_form(nr=0) form = self.get_form(nr=1)
self.browser['uname'] = username.encode(self.browser.ENCODING) form['uname'] = username
self.browser['pass'] = password.encode(self.browser.ENCODING) form['pass'] = password
self.browser.submit(nologin=True) form.submit()
class AccountsPage(BasePage): class AccountsPage(LoggedPage, HTMLPage):
def get_list(self): @method
a = Account() class iter_accounts(ItemElement):
a.id = '0' def __call__(self):
a.label = u'Compte miams' return self
a.balance = Decimal(self.parser.tocleanstring(self.document.xpath('//div[@class="compteur"]//strong')[0]))
a.currency = u'MIAM'
try:
a.coming = Decimal(Transaction.clean_amount(self.document.xpath('//table[@id="solde_acquisition_lignes"]//th[@class="col_montant"]')[0].text))
except IndexError:
a.coming = Decimal('0')
yield a
COL_DATE = 0 klass = Account
COL_LABEL = 1
COL_AMOUNT = 2
MONTHS = ['janv', u'févr', u'mars', u'avr', u'mai', u'juin', u'juil', u'août', u'sept', u'oct', u'nov', u'déc'] obj_id = '0'
def get_transactions(self, _type='consommable'): obj_label = u'Compte miams'
for tr in self.document.xpath('//table[@id="solde_%s_lignes"]/tbody/tr' % _type): obj_balance = CleanDecimal('//div[@class="compteur"]//strong')
cols = tr.findall('td') obj_currency = u'MIAM'
obj_coming = CleanDecimal('//table[@id="solde_acquisition_lignes"]//th[@class="col_montant"]', default=Decimal('0'))
t = Transaction(0) class MyDate(Filter):
MONTHS = ['janv', u'févr', u'mars', u'avr', u'mai', u'juin', u'juil', u'août', u'sept', u'oct', u'nov', u'déc']
day, month, year = self.parser.tocleanstring(cols[self.COL_DATE]).split(' ') def filter(self, txt):
day, month, year = txt.split(' ')
day = int(day) day = int(day)
year = int(year) year = int(year)
month = self.MONTHS.index(month.rstrip('.')) + 1 month = self.MONTHS.index(month.rstrip('.')) + 1
date = datetime.date(year, month, day) return datetime.date(year, month, day)
label = self.parser.tocleanstring(cols[self.COL_LABEL]) def get_transactions(self, type='consommable'):
t.parse(date, label) class get_history(Transaction.TransactionsElement):
t.set_amount(self.parser.tocleanstring(cols[self.COL_AMOUNT])) head_xpath = '//table[@id="solde_%s_lignes"]//thead//tr/th/text()' % type
item_xpath = '//table[@id="solde_%s_lignes"]//tbody/tr' % type
yield t col_date = u"Date de valeur"
col_raw = u"Motif"
class item(Transaction.TransactionElement):
obj_amount = Transaction.Amount('./td[last()]')
obj_date = AccountsPage.MyDate(CleanText(TableCell('date')))
return get_history(self)()