예제 #1
0
    def score_and_explain(self, project: scoring_base.ScoringProject) \
            -> scoring_base.ExplainedScore:
        """Compute a score for the given ScoringProject."""

        associations = self.list_associations(project)
        search_length_reason = project.translate_static_string(
            "vous nous avez dit que vous êtes en recherche d'emploi "
            'depuis %jobSearchLengthAtCreation')
        if not associations:
            return scoring_base.NULL_EXPLAINED_SCORE
        if user_profile_pb2.MOTIVATION in project.user_profile.frustrations:
            return scoring_base.ExplainedScore(3, [
                project.translate_static_string(
                    'vous nous avez dit avoir du mal à garder votre ' +
                    'motivation au top')
            ])
        if len(associations) >= 3 and project.get_search_length_at_creation(
        ) >= 6:
            return scoring_base.ExplainedScore(3, [search_length_reason])
        if project.get_search_length_at_creation() >= 12:
            return scoring_base.ExplainedScore(3, [search_length_reason])
        return scoring_base.ExplainedScore(2, [
            project.translate_static_string(
                "l'accompagnement humain peut beaucoup vous apporter")
        ])
예제 #2
0
 def score_and_explain(self, project: scoring_base.ScoringProject) \
         -> scoring_base.ExplainedScore:
     if project.details.diagnostic.category_id == 'enhance-methods-to-interview':
         return scoring_base.ExplainedScore(3, [])
     reasons = [
         project.translate_static_string(
             "vous nous avez dit avoir passé beaucoup d'entretiens sans succès"
         )
     ]
     if project.details.total_interview_count < 0:
         num_interviews = 0
     elif project.details.total_interview_count > 0:
         num_interviews = project.details.total_interview_count
     else:
         num_interviews = _NUM_INTERVIEWS.get(
             project.details.total_interviews_estimate, 0)
     job_search_length_months = project.get_search_length_at_creation()
     if job_search_length_months < 1:
         job_search_length_months = 1
     num_monthly_interviews = num_interviews / job_search_length_months
     if num_monthly_interviews > _max_monthly_interviews(project):
         return scoring_base.ExplainedScore(3, reasons)
     # Whatever the number of month of search, trigger 3 if the user did more than 5 interviews:
     if num_interviews >= _NUM_INTERVIEWS[project_pb2.DECENT_AMOUNT]:
         return scoring_base.ExplainedScore(3, reasons)
     if project.details.diagnostic.category_id == 'bravo':
         return scoring_base.ExplainedScore(1, [])
     return scoring_base.NULL_EXPLAINED_SCORE
예제 #3
0
    def score_to_hundred(self, project: scoring_base.ScoringProject) -> float:
        """Compute a score for the given ScoringProject."""

        search_since_nb_months = project.get_search_length_at_creation()
        if search_since_nb_months < 0:
            raise scoring_base.NotEnoughDataException()
        if search_since_nb_months > 12:
            return 0
        return _interpolate_points(search_since_nb_months, [(0, 100), (3, 50),
                                                            (6, 30), (12, 0)])
예제 #4
0
    def score_and_explain(self, project: scoring_base.ScoringProject) \
            -> scoring_base.ExplainedScore:
        """Compute a score for the given ScoringProject."""

        missions = self.volunteering_missions(project).missions
        if not missions:
            return scoring_base.NULL_EXPLAINED_SCORE
        if project.get_search_length_at_creation() < 9:
            return scoring_base.ExplainedScore(1, [])
        return scoring_base.ExplainedScore(2, [
            'ça fait du bien de garder une activité sociale dans une recherche longue'
        ])
예제 #5
0
    def score_to_hundred(self, project: scoring_base.ScoringProject) -> float:
        """Compute a score for the given ScoringProject."""

        if project.details.weekly_applications_estimate == project_pb2.LESS_THAN_2:
            raise scoring_base.NotEnoughDataException()
        if project.details.total_interview_count < 0:
            raise scoring_base.NotEnoughDataException()
        search_since_nb_months = project.get_search_length_at_creation()
        if search_since_nb_months < 0:
            raise scoring_base.NotEnoughDataException()
        interviews_per_month = project.details.total_interview_count / search_since_nb_months
        return interviews_per_month * 15
예제 #6
0
    def _num_interviews_increase(self, project: scoring_base.ScoringProject) -> float:
        """Compute the increase (in ratio) of # of interviews that one could hope for."""

        if project.details.total_interviews_estimate >= project_pb2.A_LOT or \
                project.details.total_interview_count > 20:
            return 0

        job_search_length_weeks = project.get_search_length_at_creation() * 52 / 12
        num_applicants_per_offer = project.market_stress() or 2.85
        weekly_applications = _APPLICATION_PER_WEEK.get(
            project.details.weekly_applications_estimate, 0)
        num_applications = job_search_length_weeks * weekly_applications
        num_potential_interviews = num_applications / num_applicants_per_offer
        return num_potential_interviews / (self._num_interviews(project) or 1)
예제 #7
0
    def score_and_explain(self, project: scoring_base.ScoringProject) \
            -> scoring_base.ExplainedScore:
        """Compute a score for the given ScoringProject."""

        # This job group has jobs that are too different to consider them as a
        # small change.
        if project.details.target_job.job_group.rome_id in _EXCLUDE_JOB_LIST:
            return scoring_base.NULL_EXPLAINED_SCORE

        specific_jobs = project.requirements().specific_jobs
        if not specific_jobs or specific_jobs[
                0].code_ogr == project.details.target_job.code_ogr:
            return scoring_base.NULL_EXPLAINED_SCORE

        try:
            target_job_percentage = next(
                j.percent_suggested for j in specific_jobs
                if j.code_ogr == project.details.target_job.code_ogr)
        except StopIteration:
            target_job_percentage = 0

        has_way_better_job = target_job_percentage + 30 < specific_jobs[
            0].percent_suggested
        has_better_job = target_job_percentage + 5 < specific_jobs[
            0].percent_suggested
        is_looking_for_new_job = project.details.kind == project_pb2.REORIENTATION

        reasons = []
        if has_way_better_job:
            reasons.append(
                project.translate_static_string(
                    "il y a beaucoup plus d'offres dans des métiers proches"))
        elif (project.get_search_length_at_creation() > 6 and has_better_job):
            reasons.append(
                project.translate_static_string(
                    "il y a plus d'offres dans des métiers proches"))
        if is_looking_for_new_job:
            reasons.append(
                project.translate_static_string(
                    'vous nous avez dit vouloir vous reconvertir'))
        if reasons:
            return scoring_base.ExplainedScore(3, reasons)
        return scoring_base.ExplainedScore(2, [
            project.translate_static_string(
                "il y a un bon nombre d'offres dans des métiers proches")
        ])
예제 #8
0
    def score_and_explain(self, project: scoring_base.ScoringProject) \
            -> scoring_base.ExplainedScore:
        """Compute a score for the given ScoringProject."""

        if (self._num_interviews_increase(project) >= 2
                and project.get_search_length_at_creation() <= 6):
            return scoring_base.ExplainedScore(3, [
                project.translate_static_string(
                    "nous pensons qu'avec votre profil vous pourriez "
                    "décrocher plus d'entretiens")
            ])
        if project.details.diagnostic.category_id == 'bravo' and \
                user_profile_pb2.RESUME in project.user_profile.frustrations:
            return scoring_base.ExplainedScore(1, [
                project.translate_static_string(
                    'vous nous avez dit avoir du mal à rédiger votre CV')
            ])
        return scoring_base.NULL_EXPLAINED_SCORE
예제 #9
0
    def score_and_explain(self, project: scoring_base.ScoringProject) \
            -> scoring_base.ExplainedScore:
        """Compute a score for the given ScoringProject."""

        if project.details.weekly_applications_estimate <= project_pb2.LESS_THAN_2 or \
                project.get_search_length_at_creation() < 2:
            return scoring_base.ExplainedScore(3, [
                project.translate_static_string(
                    'vous nous avez dit que vous en êtes au début de '
                    'vos candidatures')
            ])
        if project.details.diagnostic.category_id == 'bravo' and \
                user_profile_pb2.RESUME in project.user_profile.frustrations:
            return scoring_base.ExplainedScore(1, [
                project.translate_static_string(
                    'vous nous avez dit avoir du mal à rédiger votre CV')
            ])

        return scoring_base.NULL_EXPLAINED_SCORE
예제 #10
0
def _job_search_length_at_creation(
        scoring_project: scoring_base.ScoringProject) -> str:
    count = round(scoring_project.get_search_length_at_creation())
    return scoring_project.get_several_months_text(count)