# -*- coding: utf-8 -*- # Copyright(C) 2013 Bezleputh # # 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 . from weboob.tools.backend import Module, BackendConfig from weboob.tools.ordereddict import OrderedDict from weboob.tools.value import Value from weboob.capabilities.job import CapJob, BaseJobAdvert from .browser import AdeccoBrowser __all__ = ['AdeccoModule'] class AdeccoModule(Module, CapJob): NAME = 'adecco' DESCRIPTION = u'adecco website' MAINTAINER = u'Bezleputh' EMAIL = 'carton_ben@yahoo.fr' VERSION = '1.2' BROWSER = AdeccoBrowser publicationDate_choices = OrderedDict([(k, u'%s' % (v)) for k, v in sorted({ '000000': u'-- Indifférent --', '1': u'Moins de 48 heures', '2': u'Moins de 1 semaine', '4': u'Moins de 2 semaines', '3': u'Moins de 5 semaines', }.iteritems())]) type_contract_choices = OrderedDict([(k, u'%s' % (v)) for k, v in sorted({ '000000': u'--Indifferent--', '1': u'CDD', '2': u'CDI', '3': u'Intérim', '4': u'Emploi formation', '5': u'Emploi saisonnier', '6': u'Stage', '7': u'Autre', }.iteritems())]) places_choices = OrderedDict([(k, u'%s' % (v)) for k, v in sorted({ '100|REGION_0|DEPARTEMENT_0': u'--Indifferent--', '101|REGION_1': u'Alsace', '102|REGION_1|DEPARTEMENT_1': u'-- Rhin (Bas) (67)', '103|REGION_1|DEPARTEMENT_2': u'-- Rhin (Haut) (68)', '104|REGION_2': u'Aquitaine', '105|REGION_2|DEPARTEMENT_3': u'-- Dordogne (24)', '106|REGION_2|DEPARTEMENT_4': u'-- Gironde (33)', '107|REGION_2|DEPARTEMENT_5': u'-- Landes (40)', '108|REGION_2|DEPARTEMENT_6': u'-- Lot et Garonne (47)', '109|REGION_2|DEPARTEMENT_7': u'-- Pyrénées Atlantiques (64)', '110|REGION_3': u'Auvergne', '111|REGION_3|DEPARTEMENT_8': u'-- Allier (03)', '112|REGION_3|DEPARTEMENT_9': u'-- Cantal (15)', '113|REGION_3|DEPARTEMENT_10': u'-- Loire (Haute) (43)', '114|REGION_3|DEPARTEMENT_11': u'-- Puy de Dôme (63)', '115|REGION_5': u'Bourgogne', '116|REGION_5|DEPARTEMENT_15': u'-- Côte d\'Or (21)', '117|REGION_5|DEPARTEMENT_16': u'-- Nièvre (58)', '118|REGION_5|DEPARTEMENT_17': u'-- Saône et Loire (71)', '119|REGION_5|DEPARTEMENT_18': u'-- Yonne (89)', '120|REGION_6': u'Bretagne', '121|REGION_6|DEPARTEMENT_19': u'-- Côtes d\'Armor (22)', '122|REGION_6|DEPARTEMENT_20': u'-- Finistère (29)', '123|REGION_6|DEPARTEMENT_21': u'-- Ille et Vilaine (35)', '124|REGION_6|DEPARTEMENT_22': u'-- Morbihan (56)', '125|REGION_7': u'Centre', '126|REGION_7|DEPARTEMENT_23': u'-- Cher (18)', '127|REGION_7|DEPARTEMENT_24': u'-- Eure et Loir (28)', '128|REGION_7|DEPARTEMENT_25': u'-- Indre (36)', '129|REGION_7|DEPARTEMENT_26': u'-- Indre et Loire (37)', '130|REGION_7|DEPARTEMENT_27': u'-- Loir et Cher (41)', '131|REGION_7|DEPARTEMENT_28': u'-- Loiret (45)', '132|REGION_8': u'Champagne Ardenne', '133|REGION_8|DEPARTEMENT_29': u'-- Ardennes (08)', '134|REGION_8|DEPARTEMENT_30': u'-- Aube (10)', '135|REGION_8|DEPARTEMENT_31': u'-- Marne (51)', '136|REGION_8|DEPARTEMENT_32': u'-- Marne (Haute) (52)', '137|REGION_9': u'Corse', '138|REGION_9|DEPARTEMENT_33': u'-- Corse du Sud (2A)', '139|REGION_9|DEPARTEMENT_34': u'-- Haute Corse (2B)', '140|REGION_11': u'Franche Comté', '141|REGION_11|DEPARTEMENT_43': u'-- Belfort (Territoire de) (90)', '142|REGION_11|DEPARTEMENT_40': u'-- Doubs (25)', '143|REGION_11|DEPARTEMENT_41': u'-- Jura (39)', '144|REGION_11|DEPARTEMENT_42': u'-- Saône (Haute) (70)', '145|REGION_13': u'Ile de France', '146|REGION_13|DEPARTEMENT_49': u'-- Essonne (91)', '147|REGION_13|DEPARTEMENT_50': u'-- Hauts de Seine (92)', '148|REGION_13|DEPARTEMENT_46': u'-- Paris (Dept.) (75)', '149|REGION_13|DEPARTEMENT_51': u'-- Seine Saint Denis (93)', '150|REGION_13|DEPARTEMENT_47': u'-- Seine et Marne (77)', '151|REGION_13|DEPARTEMENT_53': u'-- Val d\'Oise (95)', '152|REGION_13|DEPARTEMENT_52': u'-- Val de Marne (94)', '153|REGION_13|DEPARTEMENT_48': u'-- Yvelines (78)', '154|REGION_14': u'Languedoc Roussillon', '155|REGION_14|DEPARTEMENT_54': u'-- Aude (11)', '156|REGION_14|DEPARTEMENT_55': u'-- Gard (30)', '157|REGION_14|DEPARTEMENT_56': u'-- Hérault (34)', '158|REGION_14|DEPARTEMENT_57': u'-- Lozère (48)', '159|REGION_14|DEPARTEMENT_58': u'-- Pyrénées Orientales (66)', '160|REGION_15': u'Limousin', '161|REGION_15|DEPARTEMENT_59': u'-- Corrèze (19)', '162|REGION_15|DEPARTEMENT_60': u'-- Creuse (23)', '163|REGION_15|DEPARTEMENT_61': u'-- Vienne (Haute) (87)', '164|REGION_16': u'Lorraine', '165|REGION_16|DEPARTEMENT_62': u'-- Meurthe et Moselle (54)', '166|REGION_16|DEPARTEMENT_63': u'-- Meuse (55)', '167|REGION_16|DEPARTEMENT_64': u'-- Moselle (57)', '168|REGION_16|DEPARTEMENT_65': u'-- Vosges (88)', '169|REGION_17': u'Midi Pyrénées', '170|REGION_17|DEPARTEMENT_66': u'-- Ariège (09)', '171|REGION_17|DEPARTEMENT_67': u'-- Aveyron (12)', '172|REGION_17|DEPARTEMENT_68': u'-- Garonne (Haute) (31)', '173|REGION_17|DEPARTEMENT_69': u'-- Gers (32)', '174|REGION_17|DEPARTEMENT_70': u'-- Lot (46)', '175|REGION_17|DEPARTEMENT_71': u'-- Pyrénées (Hautes) (65)', '176|REGION_17|DEPARTEMENT_72': u'-- Tarn (81)', '177|REGION_17|DEPARTEMENT_73': u'-- Tarn et Garonne (82)', '178|REGION_18': u'Nord Pas de Calais', '179|REGION_18|DEPARTEMENT_74': u'-- Nord (59)', '180|REGION_18|DEPARTEMENT_75': u'-- Pas de Calais (62)', '181|REGION_4': u'Normandie (Basse)', '182|REGION_4|DEPARTEMENT_12': u'-- Calvados (14)', '183|REGION_4|DEPARTEMENT_13': u'-- Manche (50)', '184|REGION_4|DEPARTEMENT_14': u'-- Orne (61)', '185|REGION_12': u'Normandie (Haute)', '186|REGION_12|DEPARTEMENT_44': u'-- Eure (27)', '187|REGION_12|DEPARTEMENT_47': u'-- Seine Maritime (76)', '188|REGION_19': u'Pays de la Loire', '189|REGION_19|DEPARTEMENT_76': u'-- Loire Atlantique (44)', '190|REGION_19|DEPARTEMENT_77': u'-- Maine et Loire (49)', '191|REGION_19|DEPARTEMENT_78': u'-- Mayenne (53)', '192|REGION_19|DEPARTEMENT_79': u'-- Sarthe (72)', '193|REGION_19|DEPARTEMENT_80': u'-- Vendée (85)', '194|REGION_20': u'Picardie', '195|REGION_20|DEPARTEMENT_81': u'-- Aisne (02)', '196|REGION_20|DEPARTEMENT_83': u'-- Oise (60)', '197|REGION_20|DEPARTEMENT_84': u'-- Somme (80)', '198|REGION_21': u'Poitou Charentes', '199|REGION_21|DEPARTEMENT_85': u'-- Charente (16)', '200|REGION_21|DEPARTEMENT_86': u'-- Charente Maritime (17)', '201|REGION_21|DEPARTEMENT_87': u'-- Sèvres (Deux) (79)', '202|REGION_21|DEPARTEMENT_88': u'-- Vienne (86)', '203|REGION_22': u'Provence Alpes Côte d\'Azur', '204|REGION_22|DEPARTEMENT_90': u'-- Alpes (Hautes) (05)', '205|REGION_22|DEPARTEMENT_91': u'-- Alpes Maritimes (06)', '206|REGION_22|DEPARTEMENT_89': u'-- Alpes de Haute Provence (04)', '207|REGION_22|DEPARTEMENT_92': u'-- Bouches du Rhône (13)', '208|REGION_22|DEPARTEMENT_93': u'-- Var (83)', '209|REGION_22|DEPARTEMENT_94': u'-- Vaucluse (84)', '210|REGION_23': u'Rhône Alpes', '211|REGION_23|DEPARTEMENT_95': u'-- Ain (01)', '212|REGION_23|DEPARTEMENT_96': u'-- Ardèche (07)', '213|REGION_23|DEPARTEMENT_97': u'-- Drôme (26)', '214|REGION_23|DEPARTEMENT_98': u'-- Isère (38)', '215|REGION_23|DEPARTEMENT_99': u'-- Loire (42)', '216|REGION_23|DEPARTEMENT_100': u'-- Rhône (69)', '217|REGION_23|DEPARTEMENT_101': u'-- Savoie (73)', '218|REGION_23|DEPARTEMENT_102': u'-- Savoie (Haute) (74)', '219|REGION_10': u'DOM TOM', '220|REGION_10|DEPARTEMENT_35': u'-- Guadeloupe (971)', '221|REGION_10|DEPARTEMENT_37': u'-- Guyane (973)', '222|REGION_10|DEPARTEMENT_38': u'-- La Réunion (974)', '223|REGION_10|DEPARTEMENT_36': u'-- Martinique (972)', '224|REGION_10|DEPARTEMENT_108': u'-- Mayotte (976)', '225|REGION_10|DEPARTEMENT_109': u'-- Nouvelle Calédonie (988)', '226|REGION_10|DEPARTEMENT_108': u'-- Polynésie (987)', '227|REGION_10|DEPARTEMENT_107': u'-- Saint Pierre et Miquelon (975)', '228|REGION_24': u'International', '229|REGION_24|DEPARTEMENT_104': u'-- Andorre', '230|REGION_24|DEPARTEMENT_105': u'-- Monaco', '231|REGION_24|DEPARTEMENT_106': u'-- Suisse', }.iteritems())]) activityDomain_choices = OrderedDict([(k, u'%s' % (v)) for k, v in sorted({ '100|DOMAIN_0': u'Tous domaines d\'activité', '101|DOMAIN_1': u'Accueil - Secrétariat - Fonctions Administratives', '102|DOMAIN_1|ACTIVITY_1': u'-- Accueil', '103|DOMAIN_1|ACTIVITY_2': u'-- Secrétariat - Assistanat', '104|DOMAIN_1|ACTIVITY_3': u'-- Autres Fonctions Administratives', '105|DOMAIN_2': u'Achats - Juridique - Qualité - RH - Direction', '106|DOMAIN_2|ACTIVITY_4': u'-- Achats ', '107|DOMAIN_2|ACTIVITY_5': u'-- Juridique', '108|DOMAIN_2|ACTIVITY_6': u'-- Qualité', '109|DOMAIN_2|ACTIVITY_7': u'Ressources Humaines - Formation', '110|DOMAIN_2|ACTIVITY_8': u'-- Direction Générale', '111|DOMAIN_3': u'Agriculture - Viticulture - Pêche - Espaces Verts', '112|DOMAIN_3|ACTIVITY_9': u'-- Agriculture - Viticulture - Pêche ', '113|DOMAIN_3|ACTIVITY_10': u'-- Espaces Verts - Exploitation Forestière', '114|DOMAIN_4': u'Automobile', '115|DOMAIN_5': u'Banque - Finance - Gestion Comptabilité - Assurance', '116|DOMAIN_5|ACTIVITY_11': u'-- Banque - Finance ', '117|DOMAIN_5|ACTIVITY_12': u'-- Gestion - Comptabilité', '118|DOMAIN_5|ACTIVITY_13': u'-- Assurance', '119|DOMAIN_6': u'Bâtiment - Travaux Publics - Architecture - Immobilier', '120|DOMAIN_6|ACTIVITY_14': u'-- Bâtiment - Travaux Publics', '121|DOMAIN_6|ACTIVITY_15': u'-- Architecture - Immobilier ', '122|DOMAIN_13': u'Bureaux d\'Etudes - Méthodes', '123|DOMAIN_8': u'Commerce - Vente - Grande Distribution', '124|DOMAIN_8|ACTIVITY_20': u'-- Commerce - Vente', '125|DOMAIN_8|ACTIVITY_21': u'-- Grande et Moyenne Distribution', '126|DOMAIN_9': u'Environnement - Nettoyage - Sécurité', '127|DOMAIN_9|ACTIVITY_22': u'-- Environnement - HSE - Développement durable', '128|DOMAIN_9|ACTIVITY_23': u'-- Nettoyage - Assainissement - Pressing', '129|DOMAIN_9|ACTIVITY_24': u'-- Sécurité - Premiers secours', '130|DOMAIN_10': u'Hôtellerie - Restauration - Métiers de Bouche', '131|DOMAIN_10|ACTIVITY_25': u'-- Hôtellerie', '132|DOMAIN_10|ACTIVITY_27': u'-- Métiers de bouche', '133|DOMAIN_10|ACTIVITY_26': u'-- Restauration', '134|DOMAIN_11': u'Industrie', '135|DOMAIN_11|ACTIVITY_32': u'-- Aéronautique - Navale', '136|DOMAIN_11|ACTIVITY_33': u'-- Agroalimentaire', '137|DOMAIN_11|ACTIVITY_58': u'-- Chimie - Pétrochimie', '138|DOMAIN_11|ACTIVITY_28': u'-- Electricité - Electronique - Automatisme', '139|DOMAIN_11|ACTIVITY_29': u'-- Maintenance - Entretien - SAV ', '140|DOMAIN_11|ACTIVITY_30': u'-- Mécanique Générale', '141|DOMAIN_11|ACTIVITY_31': u'-- Production - Fabrication ', '142|DOMAIN_11|ACTIVITY_36': u'-- Sidérurgie - Métallurgie - Tuyauterie - Soudure', '143|DOMAIN_11|ACTIVITY_34': u'-- Nucléaire - Production d\'énergie', '144|DOMAIN_11|ACTIVITY_35': u'-- Plasturgie - Bois - Papier - Verre - Cuir - Textile', '145|DOMAIN_12': u'Informatique - Technologie de l\'Information', '146|DOMAIN_12|ACTIVITY_37': u'-- Direction informatique encadrement', '147|DOMAIN_12|ACTIVITY_38': u'-- Etude et développement', '148|DOMAIN_12|ACTIVITY_39': u'-- Exploitation, maintenance et support ', '149|DOMAIN_12|ACTIVITY_40': u'-- Systèmes et réseaux informatique et télécom', '150|DOMAIN_14': u'Logistique - Manutention - Transport', '151|DOMAIN_14|ACTIVITY_42': u'-- Conduite de véhicule', '152|DOMAIN_14|ACTIVITY_43': u'-- Exploitation de logistique - supply chain', '153|DOMAIN_14|ACTIVITY_44': u'-- Manutention', '154|DOMAIN_14|ACTIVITY_45': u'-- Transport', '155|DOMAIN_15': u'Marketing - Communication - Imprimerie - Edition', '156|DOMAIN_15|ACTIVITY_47': u'-- Imprimerie - Edition - Arts Graphiques', '157|DOMAIN_15|ACTIVITY_46': u'-- Marketing - Communication - Medias', '158|DOMAIN_16': u'Médical - Paramédical - Esthétique', '159|DOMAIN_16|ACTIVITY_59': u'-- Commerce Appareillage', '160|DOMAIN_16|ACTIVITY_50': u'-- Directions, Cadres et Enseignement', '161|DOMAIN_16|ACTIVITY_49': u'-- Rééducation, Radiologie, Appareillage, LAM', '162|DOMAIN_16|ACTIVITY_51': u'-- Secrétariat, Dentaire, Social, Esthétique et Autres', '163|DOMAIN_16|ACTIVITY_48': u'-- Soignants - Auxiliaires', '164|DOMAIN_7': u'Pharmacie (Industrie, Officine) - Recherche clinique', '165|DOMAIN_7|ACTIVITY_16': u'-- Industrie Pharmaceutique / Cosmétologique - Biotech', '166|DOMAIN_7|ACTIVITY_17': u'-- Recherche Clinique', '167|DOMAIN_7|ACTIVITY_18': u'-- Pharmacie Officine / Hospit / Para-pharmacie', '168|DOMAIN_7|ACTIVITY_19': u'-- Vente, information et promotion du médicament', '169|DOMAIN_17': u'Télémarketing - Téléservices', '170|DOMAIN_17|ACTIVITY_52': u'-- Téléconseil - Télévente - Autres', '171|DOMAIN_17|ACTIVITY_53': u'-- Direction, Encadrement', '172|DOMAIN_18': u'Tourisme - Loisirs - Spectacle - Audiovisuel', '173|DOMAIN_18|ACTIVITY_54': u'-- Tourisme - Loisirs', '174|DOMAIN_18|ACTIVITY_55': u'-- Spectacle - Audiovisuel', }.iteritems())]) CONFIG = BackendConfig(Value('publication_date', label=u'Publication Date', choices=publicationDate_choices), Value('place', label=u'Place', choices=places_choices), Value('contract', labe=u'Contract type', choices=type_contract_choices), Value('activity_domain', label=u'Activity Domain', choices=activityDomain_choices), ) def search_job(self, pattern=None): for advert in self.browser.search_job(pattern): yield advert def decode_choice(self, place): splitted_choice = place.split('|') part1 = splitted_choice[1].split('_')[1] if len(splitted_choice) == 3: part2 = splitted_choice[2].split('_')[1] return part1, part2 else: return part1, 0 def advanced_search_job(self): region, departement = self.decode_choice(self.config['place'].get()) domain, category = self.decode_choice(self.config['activity_domain'].get()) for advert in self.browser.advanced_search_job(publication_date=int(self.config['publication_date'].get()), contract_type=int(self.config['contract'].get()), conty=departement, region=region, job_category=category, activity_domain=domain ): yield advert def get_job_advert(self, _id, advert=None): return self.browser.get_job_advert(_id, advert) def fill_obj(self, advert, fields): return self.get_job_advert(advert.id, advert) OBJECTS = {BaseJobAdvert: fill_obj}