예제 #1
0
    def _find_relevant_testimonials(self, project: scoring_base.ScoringProject) \
            -> Optional[testimonial_pb2.Testimonials]:
        """Find the testimonials relevant for the user's project."""

        max_testimonial_num = 8
        all_testimonials = self.testimonial_db.get_collection(project.database)

        if not all_testimonials:
            return None
        job_group_id = project.details.target_job.job_group.rome_id

        filtered_testimonials = list(
            scoring_base.filter_using_score(all_testimonials,
                                            lambda j: j.filters, project))
        if not filtered_testimonials:
            return None

        same_job_testimonials = [
            testimonial
            for testimonial in filtered_testimonials if _is_in_job_group(
                job_group_id, testimonial.preferred_job_group_ids)
        ]

        if not same_job_testimonials:
            return testimonial_pb2.Testimonials(
                testimonials=filtered_testimonials[:max_testimonial_num])
        return testimonial_pb2.Testimonials(
            testimonials=same_job_testimonials[:max_testimonial_num])
예제 #2
0
 def _get_relevant_salons(self, project: scoring_base.ScoringProject) \
         -> list[online_salon_pb2.OnlineSalon]:
     today = project.now
     # TODO(cyrille): Test filters.
     filtered_salons = scoring_base.filter_using_score(
         self._salon_db.get_collection(project.database),
         lambda salon: salon.filters,
         project)
     kept_salons = []
     for salon in filtered_salons:
         score = 0
         if today >= salon.application_end_date.ToDatetime():
             continue
         if salon.locations:
             # Do not show salon if we know user won't move to its location.
             if all(
                     not _might_move_to(project.details, location)
                     for location in salon.locations):
                 continue
             score += 1
         if salon.job_group_ids:
             # Do not show salon if we know user is not interested in its jobs.
             if not _is_in_job_group(
                     project.details.target_job.job_group.rome_id, salon.job_group_ids):
                 continue
             score += 1
         kept_salons.append((salon, score))
     return [salon for salon, score in sorted(
         kept_salons, key=lambda ks: (-ks[1], ks[0].start_date.ToDatetime()))]
예제 #3
0
    def list_associations(self, project):
        """List all associations for a project."""

        all_associations = self._db.get_collection(project.database)
        return list(
            scoring_base.filter_using_score(all_associations,
                                            lambda j: j.filters, project))
예제 #4
0
    def list_jobboards(self, project):
        """List all job boards for this project."""

        all_job_boards = self._db.get_collection(project.database)
        return list(
            scoring_base.filter_using_score(all_job_boards,
                                            lambda j: j.filters, project))
예제 #5
0
def list_jobboards(
        project: scoring_base.ScoringProject
) -> Iterator[jobboard_pb2.JobBoard]:
    """List all job boards for this project."""

    all_job_boards = _JOBBOARDS.get_collection(project.database)
    for job_board_template in scoring_base.filter_using_score(
            all_job_boards, lambda j: j.filters, project):
        job_board = jobboard_pb2.JobBoard()
        job_board.CopyFrom(job_board_template)
        job_board.link = project.populate_template(job_board.link)
        yield job_board
예제 #6
0
    def list_events(
            self,
            project: scoring_base.ScoringProject) -> List[event_pb2.Event]:
        """List all events close to the project's target."""

        today = project.now.strftime('%Y-%m-%d')
        all_events = [
            e for e in self._db.get_collection(project.database)
            if e.start_date >= today
        ]
        return list(
            scoring_base.filter_using_score(all_events, lambda e: e.filters,
                                            project))
예제 #7
0
    def get_expanded_card_data(self, project):
        """Retrieve data for the expanded card."""

        banks = _PARTNER_BANKS.get_collection(project.database)
        all_schools = _PARTNER_SCHOOLS.get_collection(project.database)
        relevant_schools = scoring_base.filter_using_score(
            all_schools, lambda s: s.filters, project)
        # TODO(cyrille): Replace this once importer gets schools, and not only lists.
        user_specific_list = next(
            (school.link for school in relevant_schools if school.link), None)
        one_euro_program = driving_license_pb2.OneEuroProgram(
            partner_banks=banks)
        if project.get_user_age() <= 18:
            one_euro_program.mission_locale.CopyFrom(
                project.mission_locale_data())
        if user_specific_list:
            one_euro_program.school_list_link = user_specific_list
        return one_euro_program
예제 #8
0
 def _list_contact_leads(self, project: scoring_base.ScoringProject) \
         -> Iterator[network_pb2.ContactLeadTemplate]:
     return scoring_base.filter_using_score(
         self._db.get_collection(project.database), lambda l: l.filters,
         project)
예제 #9
0
 def _list_contact_leads(self, project):
     return scoring_base.filter_using_score(
         self._db.get_collection(project.database), lambda l: l.filters,
         project)