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") ])
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
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)])
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' ])
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
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)
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") ])
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
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
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)