First implementation of champslibres module
This commit is contained in:
parent
642cfbb41c
commit
12c51ba61c
6 changed files with 254 additions and 0 deletions
23
modules/champslibres/__init__.py
Normal file
23
modules/champslibres/__init__.py
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright(C) 2010-2011 Jeremy Monnet
|
||||
#
|
||||
# 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/>.
|
||||
|
||||
|
||||
from .backend import ChampslibresBackend
|
||||
|
||||
__all__ = ['ChampslibresBackend']
|
||||
64
modules/champslibres/backend.py
Normal file
64
modules/champslibres/backend.py
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright(C) 2010-2012 Florent Fourcot
|
||||
#
|
||||
# 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/>.
|
||||
|
||||
|
||||
from weboob.capabilities.library import ICapBook
|
||||
from weboob.tools.backend import BaseBackend, BackendConfig
|
||||
from weboob.tools.value import ValueBackendPassword, Value
|
||||
|
||||
from .browser import ChampslibresBrowser
|
||||
|
||||
|
||||
__all__ = ['ChampslibresBackend']
|
||||
|
||||
|
||||
class ChampslibresBackend(BaseBackend, ICapBook):
|
||||
NAME = 'champslibres'
|
||||
MAINTAINER = u'Florent Fourcot'
|
||||
EMAIL = 'weboob@flo.fourcot.fr'
|
||||
VERSION = '0.c'
|
||||
DESCRIPTION = 'Champs Libres (Rennes) Library'
|
||||
LICENSE = 'AGPLv3+'
|
||||
CONFIG = BackendConfig(Value('login', label='Account ID', regexp='^\d{1,15}|$'),
|
||||
ValueBackendPassword('password', label='Password of account'),
|
||||
)
|
||||
BROWSER = ChampslibresBrowser
|
||||
|
||||
def create_default_browser(self):
|
||||
return self.create_browser(self.config['login'].get(),
|
||||
self.config['password'].get())
|
||||
|
||||
def get_rented(self):
|
||||
for book in self.browser.get_rented_books_list():
|
||||
yield book
|
||||
|
||||
def get_booked(self):
|
||||
raise NotImplementedError()
|
||||
|
||||
def iter_books(self):
|
||||
#for book in self.get_booked():
|
||||
# yield book
|
||||
for book in self.get_rented():
|
||||
yield book
|
||||
|
||||
def get_book(self, _id):
|
||||
raise NotImplementedError()
|
||||
|
||||
def search_books(self, _string):
|
||||
raise NotImplementedError()
|
||||
68
modules/champslibres/browser.py
Normal file
68
modules/champslibres/browser.py
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright(C) 2010-2012 Florent Fourcot
|
||||
#
|
||||
# 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/>.
|
||||
|
||||
|
||||
from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword
|
||||
|
||||
from .pages import LoginPage, HomePage, HistoryPage, RentedPage
|
||||
|
||||
|
||||
__all__ = ['ChampslibresBrowser']
|
||||
|
||||
|
||||
# Browser
|
||||
class ChampslibresBrowser(BaseBrowser):
|
||||
PROTOCOL = 'http'
|
||||
ENCODING = None
|
||||
PAGES = {
|
||||
'.*login.*': LoginPage,
|
||||
'.*home\?lang=frf.*': HomePage,
|
||||
'http://.*/index.aspx\?IdPage=429': HistoryPage,
|
||||
'.*patroninfo.*': RentedPage,
|
||||
}
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
BaseBrowser.__init__(self, *args, **kwargs)
|
||||
|
||||
def is_logged(self):
|
||||
|
||||
return self.page \
|
||||
and not self.page.document.getroot().xpath('//input[contains(@id, "pin")]')
|
||||
|
||||
def login(self):
|
||||
assert isinstance(self.username, basestring)
|
||||
assert isinstance(self.password, basestring)
|
||||
if not self.is_on_page(HomePage):
|
||||
self.location('https://sbib.si.leschampslibres.fr/iii/cas/login?null', no_login=True)
|
||||
self.page.login(self.username, self.password)
|
||||
if not self.is_logged():
|
||||
raise BrowserIncorrectPassword()
|
||||
# Get home and get ID
|
||||
self.location('http://opac.si.leschampslibres.fr/iii/encore/home?lang=frf')
|
||||
self.id = self.page.get_id()
|
||||
self.logger.debug('Get ID ' + self.id)
|
||||
|
||||
def get_rented_books_list(self):
|
||||
if not self.is_on_page(RentedPage):
|
||||
self.location('https://sbib.si.leschampslibres.fr/patroninfo~S1*frf/1123477/items')
|
||||
return self.page.get_list()
|
||||
|
||||
# TODO
|
||||
def get_booked_books_list(self):
|
||||
return []
|
||||
BIN
modules/champslibres/favicon.png
Normal file
BIN
modules/champslibres/favicon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.5 KiB |
71
modules/champslibres/pages.py
Normal file
71
modules/champslibres/pages.py
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright(C) 2012 Florent Fourcot
|
||||
#
|
||||
# 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/>.
|
||||
|
||||
from datetime import date
|
||||
from weboob.capabilities.library import Book
|
||||
from weboob.tools.browser import BasePage
|
||||
|
||||
|
||||
class SkipPage(BasePage):
|
||||
pass
|
||||
|
||||
|
||||
class HomePage(BasePage):
|
||||
def on_loaded(self):
|
||||
link = self.document.find('//a[@id="patronRSSFeedLinkComponent"]')
|
||||
self.id = link.attrib['href'].split('/')[4]
|
||||
|
||||
def get_id(self):
|
||||
return self.id
|
||||
|
||||
|
||||
def txt2date(s):
|
||||
split = s.split('-')
|
||||
return date(int(split[2]) + 2000, int(split[1]), int(split[0]))
|
||||
|
||||
|
||||
class RentedPage(BasePage):
|
||||
def get_list(self):
|
||||
for tr in self.document.getroot().xpath('//tr[@class="patFuncEntry"]'):
|
||||
id = tr.xpath('td/input')[0].attrib["value"]
|
||||
book = Book(id)
|
||||
bigtitle = tr.xpath('td[@class="patFuncTitle"]/label/a')[0].text
|
||||
book.name = bigtitle.split('/')[0]
|
||||
book.author = bigtitle.split('/')[1]
|
||||
date = tr.xpath('td[@class="patFuncStatus"]')[0].text
|
||||
book.date = txt2date(date.replace('RETOUR', ''))
|
||||
yield book
|
||||
|
||||
|
||||
class HistoryPage(BasePage):
|
||||
pass
|
||||
|
||||
|
||||
class BookedPage(BasePage):
|
||||
# TODO: book some books...
|
||||
pass
|
||||
|
||||
|
||||
class LoginPage(BasePage):
|
||||
def login(self, login, passwd):
|
||||
self.browser.select_form(nr=0)
|
||||
self.browser.form.set_all_readonly(False)
|
||||
self.browser['code'] = login
|
||||
self.browser['pin'] = passwd
|
||||
self.browser.submit()
|
||||
28
modules/champslibres/test.py
Normal file
28
modules/champslibres/test.py
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright(C) 2010-2011 Jeremy Monnet
|
||||
#
|
||||
# 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/>.
|
||||
|
||||
|
||||
from weboob.tools.test import BackendTest
|
||||
|
||||
|
||||
class ChampslibresTest(BackendTest):
|
||||
BACKEND = 'champslibres'
|
||||
|
||||
def test_champslibres(self):
|
||||
pass
|
||||
Loading…
Add table
Add a link
Reference in a new issue