ajout de la prise en charge des formulaires dans lolix

This commit is contained in:
Bezleputh 2013-06-25 13:52:39 +02:00 committed by Florent
commit 3a3d51be7a
3 changed files with 126 additions and 17 deletions

View file

@ -17,18 +17,17 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# 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.backend import BaseBackend #, BackendConfig from weboob.tools.backend import BaseBackend, BackendConfig
# from weboob.tools.value import Value from weboob.tools.ordereddict import OrderedDict
from weboob.tools.value import Value
from .browser import LolixBrowser
from weboob.capabilities.job import ICapJob from weboob.capabilities.job import ICapJob
from .browser import LolixBrowser
__all__ = ['LolixBackend'] __all__ = ['LolixBackend']
class LolixBackend(BaseBackend, ICapJob): class LolixBackend(BaseBackend, BackendConfig, ICapJob):
NAME = 'lolix' NAME = 'lolix'
DESCRIPTION = u'Lolix est un centre de compétences spécialisé dans les technologies à base de Logiciel Libre.' DESCRIPTION = u'Lolix est un centre de compétences spécialisé dans les technologies à base de Logiciel Libre.'
MAINTAINER = u'Bezleputh' MAINTAINER = u'Bezleputh'
@ -37,9 +36,108 @@ class LolixBackend(BaseBackend, ICapJob):
BROWSER = LolixBrowser BROWSER = LolixBrowser
region_choices = OrderedDict([(k, u'%s' % (v)) for k, v in sorted({
'0': u'-- Indifférent --',
'100000000': u'-- France entière',
'100100000': u'-- France métropolitaine',
'100100001': u'-- Alsace',
'100100002': u'-- Auvergne',
'100100003': u'-- Aquitaine',
'100100004': u'-- Bourgogne',
'100100005': u'-- Bretagne',
'100100025': u'-- Centre',
'100100027': u'-- Champagne-Ardenne',
'100100030': u'-- Corse',
'100100037': u'-- Franche-Comté',
'100100040': u'-- Ile de France',
'100100044': u'-- Languedoc-Roussillon',
'100100048': u'-- Limousin',
'100100051': u'-- Lorraine',
'100100055': u'-- Midi-Pyrénées',
'100100060': u'-- Nord-Pas-de-Calais',
'100100073': u'-- Normandie',
'100100076': u'-- Pays-de-Loire',
'100100079': u'-- Picardie',
'100100082': u'-- Poitou-Charentes',
'100100085': u'-- Provence Alpes Cote d\'azur',
'100100090': u'-- Rhône Alpes',
'100200000': u'-- DOM et TOM',
'100200001': u'-- Guadeloupe',
'100200002': u'-- Guyane',
'100200003': u'-- Martinique',
'100200004': u'-- Réunion',
'100200005': u'-- Saint-Pierre et Miquelon',
'200000000': u'-- Etranger',
}.iteritems())])
poste_choices = OrderedDict([(k, u'%s' % (v)) for k, v in sorted({
'0': u'-- Indifférent',
'100000000': u'-- Service Technique',
'100005000': u'-- Administrateur base de données',
'100004000': u'-- Admin. Système/Réseaux',
'100004004': u'-- Administrateur système',
'100004002': u'-- Administrateur réseaux',
'100007000': u'-- Analyste',
'100002000': u'-- Chef de projet',
'100002001': u'-- Chef de projet junior',
'100002002': u'-- Chef de projet senior',
'100021000': u'-- Consultant',
'100003000': u'-- Développeur',
'100003001': u'-- Développeur junior',
'100003002': u'-- Développeur senior',
'100009000': u'-- Directeur technique',
'100006000': u'-- Ingénieur d\'étude',
'100011000': u'-- Ingénieur support',
'100012000': u'-- Responsable R & D',
'100010000': u'-- Technicien',
'100010002': u'-- Technicien hotline',
'100010003': u'-- Technicien maintenance',
'100020000': u'-- Webmaster',
'200000000': u'-- Service Commercial',
'200300000': u'-- Commercial',
'200200000': u'-- Directeur commercial',
'200100000': u'-- Technico commercial',
'400000000': u'-- Service Marketing',
'400100000': u'-- Responsable Marketing',
'300000000': u'-- Service qualité',
'300100000': u'-- Assistant qualité',
'300200000': u'-- Responsable qualité',
'2000000': u'-- Fondateur',
'7000000': u'-- Formateur',
'6000000': u'-- Journaliste',
'500100000': u'-- Assistant(e) de direction',
'4000000': u'-- Stagiaire',
'5000000': u'-- Traducteur',
}.iteritems())])
contrat_choices = OrderedDict([(k, u'%s' % (v)) for k, v in sorted({
'0': u'-- Indifférent --',
'6': u'Alternance',
'5': u'Apprentissage',
'2': u'CDD',
'1': u'CDI',
'4': u'Freelance',
'3': u'Stage',
}.iteritems())])
limit_date_choices = OrderedDict([(k, u'%s' % (v)) for k, v in sorted({
'2592000': u'30 jours',
'5184000': u'60 jours',
'7776000': u'90 jours',
'0': u'Illimitée',
}.iteritems())])
CONFIG = BackendConfig(Value('region', label=u'Région', choices=region_choices),
Value('poste', label=u'Poste', choices=poste_choices),
Value('contrat', label=u'Contrat', choices=contrat_choices),
Value('limit_date', label=u'Date limite', choices=limit_date_choices))
def search_job(self, pattern=None): def search_job(self, pattern=None):
with self.browser: with self.browser:
for advert in self.browser.search_job(): for advert in self.browser.search_job(region=self.config['region'].get(),
poste=self.config['poste'].get(),
contrat=self.config['contrat'].get(),
limit_date=self.config['limit_date'].get()):
yield advert yield advert
def get_job_advert(self, _id, advert): def get_job_advert(self, _id, advert):

View file

@ -21,6 +21,7 @@ from weboob.tools.browser.decorators import id2url
from weboob.tools.browser import BaseBrowser from weboob.tools.browser import BaseBrowser
from .job import LolixJobAdvert from .job import LolixJobAdvert
from .pages import SearchPage, AdvertPage from .pages import SearchPage, AdvertPage
import urllib
__all__ = ['LolixBrowser'] __all__ = ['LolixBrowser']
@ -31,12 +32,21 @@ class LolixBrowser(BaseBrowser):
ENCODING = 'iso-8859-1' ENCODING = 'iso-8859-1'
PAGES = { PAGES = {
'%s://%s/date.php' % (PROTOCOL, DOMAIN): SearchPage, '%s://%s/search.php' % (PROTOCOL, DOMAIN): SearchPage,
'%s://%s/offre.php\?id=(?P<id>.+)' % (PROTOCOL, DOMAIN): AdvertPage, '%s://%s/offre.php\?id=(?P<id>.+)' % (PROTOCOL, DOMAIN): AdvertPage,
} }
def search_job(self): def search_job(self, region=None, poste=None, contrat=None, limit_date=None):
self.location('%s://%s/date.php' % (self.PROTOCOL, self.DOMAIN)) data = {
'mode': 'find',
'page': '0',
'posteid': poste,
'contratid': contrat,
'regionid': region,
'limitjour': limit_date
}
self.location('%s://%s/search.php' % (self.PROTOCOL, self.DOMAIN), urllib.urlencode(data))
assert self.is_on_page(SearchPage) assert self.is_on_page(SearchPage)
return self.page.iter_job_adverts() return self.page.iter_job_adverts()

View file

@ -80,15 +80,16 @@ class SearchPage(BasePage):
def is_row_advert(self, row): def is_row_advert(self, row):
cols = self.parser.select(row, 'td') cols = self.parser.select(row, 'td')
d = dict(cols[1].attrib) if len(cols) > 1:
if 'class' in d.keys(): d = dict(cols[1].attrib)
if 'ListeDark' == d['class'] or 'ListeLight' == d['class']: if 'class' in d.keys():
return cols if 'ListeDark' == d['class'] or 'ListeLight' == d['class']:
return cols
def create_job_advert(self, cols): def create_job_advert(self, cols):
a = self.parser.select(cols[3], 'a')[0] a = self.parser.select(cols[2], 'a')[0]
advert = LolixJobAdvert(re.match(r'offre.php\?id=(.*)', a.attrib['href']).group(1)) advert = LolixJobAdvert(re.match(r'offre.php\?id=(.*)', a.attrib['href']).group(1))
advert.publication_date = dateutil.parser.parse(cols[1].text).date() advert.publication_date = dateutil.parser.parse(cols[0].text).date()
advert.society_name = u'%s' % self.parser.select(cols[2], 'a')[0].text advert.society_name = u'%s' % self.parser.select(cols[1], 'a')[0].text
advert.title = u'%s' % a.text advert.title = u'%s' % a.text
return advert return advert