def score_to_hundred(self, project: scoring_base.ScoringProject) -> float: """Compute a score for the given ScoringProject.""" area_type = project.details.area_type if not area_type: raise scoring_base.NotEnoughDataException() if not project.imt_proto().yearly_avg_offers_per_10_candidates: raise scoring_base.NotEnoughDataException() num_better_departements = project.local_diagnosis( ).num_less_stressful_departements # User is already in one of the top 3 départements. if num_better_departements < 3: raise scoring_base.NotEnoughDataException() # Give a score centered around 50 corresponding to the user's mobility. # The worse the current département is, the more extreme we set the # score. score_range = min(num_better_departements * 1.5, 100) / 2 if area_type >= geo_pb2.COUNTRY: return 50 + score_range if area_type >= geo_pb2.REGION: return 50 if area_type >= geo_pb2.DEPARTEMENT: return 50 - score_range / 2 return 50 - score_range
def get_local_jobbing(self, project: scoring_base.ScoringProject) \ -> reorient_jobbing_pb2.JobbingReorientJobs: """Get the jobbing opportunities for the departement.""" recommended_jobs = reorient_jobbing_pb2.JobbingReorientJobs() departement_id = project.details.city.departement_id gender = project.user_profile.gender top_unqualified_jobs = self.list_reorient_jobbing_jobs(project) current_job_market_score = project.imt_proto( ).yearly_avg_offers_per_10_candidates if departement_id in top_unqualified_jobs: for job in top_unqualified_jobs[ departement_id].departement_job_stats.jobs: if current_job_market_score: if job.market_score / current_job_market_score < 1 and \ not project.features_enabled.all_modules: break offers_gain = ( job.market_score / current_job_market_score - 1) * 100 else: if job.market_score < 8: # User is in an unknown market, we only show jobbing jobs that have at least # some job offers. break offers_gain = 0 recommended_jobs.reorient_jobbing_jobs.add( name=project.translate_string( french.genderize_job(job, gender)), offers_percent_gain=offers_gain) return recommended_jobs
def _find_best_departements(unused_: Any, project: scoring_base.ScoringProject) \ -> list[project_pb2.DepartementScore]: """Find which are the best departement to relocate for a given job group.""" own_departement_offers = project.imt_proto( ).yearly_avg_offers_per_10_candidates # If we do not have data about our own departement, we choose not to say anything. if not own_departement_offers: return [] best_departements = project.job_group_info().departement_scores result: list[project_pb2.DepartementScore] = [] for dep in itertools.islice(best_departements, 10): if dep.local_stats.imt.yearly_avg_offers_per_10_candidates <= own_departement_offers: return result offer_ratio = \ dep.local_stats.imt.yearly_avg_offers_per_10_candidates / own_departement_offers result.append( project_pb2.DepartementScore(name=project.translate_string( geo.get_departement_name(project.database, dep.departement_id)), offer_ratio=offer_ratio)) return result
def get_local_jobbing(self, project: scoring_base.ScoringProject) \ -> reorient_jobbing_pb2.JobbingReorientJobs: """Get the jobbing opportunities for the departement.""" recommended_jobs = reorient_jobbing_pb2.JobbingReorientJobs() departement_id = project.details.city.departement_id gender = project.user_profile.gender top_unqualified_jobs = self.list_reorient_jobbing_jobs(project) current_job_market_score = project.imt_proto().yearly_avg_offers_per_10_candidates if current_job_market_score and departement_id in top_unqualified_jobs: for job in top_unqualified_jobs[departement_id].departement_job_stats.jobs: if job.market_score / current_job_market_score < 1: break offers_gain = (job.market_score / current_job_market_score - 1) * 100 recommended_jobs.reorient_jobbing_jobs.add( name=french.genderize_job(job, gender), offers_percent_gain=offers_gain) return recommended_jobs