69 lines
2.6 KiB
Python
69 lines
2.6 KiB
Python
import sys
|
||
import os
|
||
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'model')))
|
||
|
||
|
||
from sqlalchemy.ext.asyncio import AsyncSession
|
||
from sqlalchemy.future import select
|
||
from sqlalchemy.orm import joinedload
|
||
from sqlalchemy import or_
|
||
from sqlalchemy.exc import IntegrityError
|
||
from model.database import Client, AppliedJob, Job
|
||
|
||
def get_filtered_jobs(session: AsyncSession, user_job_titles, minimum_annual_salary, salary_currency,
|
||
user_location_type, user_locations, user_levels, user_job_types):
|
||
# Строим фильтры для каждого из параметров пользователя
|
||
filters = []
|
||
|
||
# Фильтрация по job_title (примерное совпадение)
|
||
if user_job_titles:
|
||
filters.append(Job.job_title.in_(user_job_titles))
|
||
|
||
# Фильтрация по minimum_annual_salary (если указано)
|
||
if minimum_annual_salary is not None:
|
||
filters.append(Job.minimum_annual_salary >= minimum_annual_salary)
|
||
|
||
# Фильтрация по salary_currency (если указано)
|
||
if salary_currency is not None:
|
||
filters.append(Job.salary_currency == salary_currency)
|
||
|
||
# Фильтрация по location_type (если указано)
|
||
if user_location_type:
|
||
filters.append(Job.location_type == user_location_type)
|
||
|
||
# Фильтрация по location (разделяем по каждому городу)
|
||
if user_locations:
|
||
location_filters = [Job.location.ilike(location) for location in user_locations]
|
||
filters.append(or_(*location_filters))
|
||
|
||
# Фильтрация по job_level (если указаны)
|
||
if user_levels:
|
||
filters.append(Job.job_level.in_(user_levels))
|
||
|
||
# Фильтрация по job_type (если указаны)
|
||
if user_job_types:
|
||
filters.append(Job.job_type.in_(user_job_types))
|
||
|
||
# Выполняем запрос с применением всех фильтров
|
||
query = session.query(Job).filter(*filters)
|
||
|
||
# Получаем все результаты
|
||
jobs = query.all()
|
||
|
||
return jobs
|
||
|
||
# Пример использования функции
|
||
jobs = get_filtered_jobs(
|
||
session=session,
|
||
user_job_titles=["Electronics Engineer", "Hardware Engineer"],
|
||
minimum_annual_salary=None,
|
||
salary_currency=None,
|
||
user_location_type=None,
|
||
user_locations=["Burnaby, Canada", "Vancouver, Canada", "Toronto, Canada"],
|
||
user_levels=["Mid", "Senior", "Manager"],
|
||
user_job_types=["Full-time", "Permanent"]
|
||
)
|
||
|
||
# Выводим вакансии
|
||
for job in jobs:
|
||
print(job.job_title, job.location, job.job_level, job.job_type) |