diff --git a/modules/lolix/backend.py b/modules/lolix/backend.py index 9b624dc3..cebb7b25 100644 --- a/modules/lolix/backend.py +++ b/modules/lolix/backend.py @@ -17,18 +17,17 @@ # You should have received a copy of the GNU Affero General Public License # along with weboob. If not, see . -from weboob.tools.backend import BaseBackend #, BackendConfig -# from weboob.tools.value import Value - -from .browser import LolixBrowser - +from weboob.tools.backend import BaseBackend, BackendConfig +from weboob.tools.ordereddict import OrderedDict +from weboob.tools.value import Value from weboob.capabilities.job import ICapJob +from .browser import LolixBrowser __all__ = ['LolixBackend'] -class LolixBackend(BaseBackend, ICapJob): +class LolixBackend(BaseBackend, BackendConfig, ICapJob): NAME = 'lolix' DESCRIPTION = u'Lolix est un centre de compétences spécialisé dans les technologies à base de Logiciel Libre.' MAINTAINER = u'Bezleputh' @@ -37,9 +36,108 @@ class LolixBackend(BaseBackend, ICapJob): 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): 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 def get_job_advert(self, _id, advert): diff --git a/modules/lolix/browser.py b/modules/lolix/browser.py index c46893d9..10ad3b0d 100644 --- a/modules/lolix/browser.py +++ b/modules/lolix/browser.py @@ -21,6 +21,7 @@ from weboob.tools.browser.decorators import id2url from weboob.tools.browser import BaseBrowser from .job import LolixJobAdvert from .pages import SearchPage, AdvertPage +import urllib __all__ = ['LolixBrowser'] @@ -31,12 +32,21 @@ class LolixBrowser(BaseBrowser): ENCODING = 'iso-8859-1' PAGES = { - '%s://%s/date.php' % (PROTOCOL, DOMAIN): SearchPage, + '%s://%s/search.php' % (PROTOCOL, DOMAIN): SearchPage, '%s://%s/offre.php\?id=(?P.+)' % (PROTOCOL, DOMAIN): AdvertPage, } - def search_job(self): - self.location('%s://%s/date.php' % (self.PROTOCOL, self.DOMAIN)) + def search_job(self, region=None, poste=None, contrat=None, limit_date=None): + 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) return self.page.iter_job_adverts() diff --git a/modules/lolix/pages.py b/modules/lolix/pages.py index 96bcb41a..24ea0e62 100644 --- a/modules/lolix/pages.py +++ b/modules/lolix/pages.py @@ -80,15 +80,16 @@ class SearchPage(BasePage): def is_row_advert(self, row): cols = self.parser.select(row, 'td') - d = dict(cols[1].attrib) - if 'class' in d.keys(): - if 'ListeDark' == d['class'] or 'ListeLight' == d['class']: - return cols + if len(cols) > 1: + d = dict(cols[1].attrib) + if 'class' in d.keys(): + if 'ListeDark' == d['class'] or 'ListeLight' == d['class']: + return 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.publication_date = dateutil.parser.parse(cols[1].text).date() - advert.society_name = u'%s' % self.parser.select(cols[2], 'a')[0].text + advert.publication_date = dateutil.parser.parse(cols[0].text).date() + advert.society_name = u'%s' % self.parser.select(cols[1], 'a')[0].text advert.title = u'%s' % a.text return advert