Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
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
Esempio n. 4
0
    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