Files
Tg-job/mtucijobsbackend/app/routers/job.py

247 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from fastapi import status, HTTPException, Response, APIRouter, Depends, BackgroundTasks, Query
from sqlalchemy.orm import Session
from sqlalchemy import not_, func
from typing import List, Annotated
from ..database import get_db
from .. import models, schemas, security, crud
router = APIRouter(
prefix="/jobs",
dependencies=[Depends(security.verify_access_token)],
responses={401: {"description": "Unauthorized"}},
tags=['Jobs']
)
@router.get("/", response_model=List[schemas.JobGet])
def get_jobs(db: Session = Depends(get_db)):
jobs = db.query(models.Jobs).all()
if not jobs:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
response: List[schemas.JobGet] = []
for job in jobs:
hardskills = db.query(models.JobsHard_skills.Hard_skillID, models.Hard_skills.Title).\
join(models.Hard_skills, models.JobsHard_skills.Hard_skillID == models.Hard_skills.Hard_skillID).\
filter(models.JobsHard_skills.JobID == job.JobID).all()
Hardskills = [hardskill.Title for hardskill in hardskills]
response += [schemas.JobGet(JobID=job.JobID, UserID = job.UserID, Job_name=job.Job_name, Company_name=job.Company_name,
Link_to_job=job.Link_to_job, Year=job.Year, Qualification=job.Qualification, Time=job.Time,
Salary_after_interview=job.Salary_after_interview, Salary=job.Salary, Email=job.Email, Archive=job.Archive,
Responsibilities=job.Responsibilities, Hardskills=Hardskills)]
return response
@router.get("/{id}", response_model=schemas.JobGet)
def get_job(id: int, db: Session = Depends(get_db)):
job = db.query(models.Jobs).filter(models.Jobs.JobID == id).first()
if not job:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
hardskills = db.query(models.JobsHard_skills.Hard_skillID, models.Hard_skills.Title).\
join(models.Hard_skills, models.JobsHard_skills.Hard_skillID == models.Hard_skills.Hard_skillID).\
filter(models.JobsHard_skills.JobID == id).all()
Hardskills = [hardskill.Title for hardskill in hardskills]
response = schemas.JobGet(JobID=job.JobID, UserID = job.UserID, Job_name=job.Job_name, Company_name=job.Company_name,
Link_to_job=job.Link_to_job, Year=job.Year, Qualification=job.Qualification, Time=job.Time,
Salary_after_interview=job.Salary_after_interview, Salary=job.Salary, Email=job.Email, Archive=job.Archive,
Responsibilities=job.Responsibilities, Hardskills=Hardskills)
return response
@router.get("/matches/{id}", response_model=List[schemas.MatchJob])
def get_matches(id: int, db: Session = Depends(get_db)):
matches = db.query(models.Matches).filter(models.Matches.JobID == id).order_by(models.Matches.Match.desc()).all()
matches = db.query(
models.Students.StudentID,
models.Students.Name,
models.Students.Type,
models.Students.Faculties,
models.Students.Group,
models.Students.Year,
models.Students.Experience_specialty,
models.Students.Time,
models.Students.Soft_skills,
models.Students.Link,
models.Students.Email,
models.Students.Phone_number,
models.Matches.Match
).join(models.Matches, models.Students.StudentID == models.Matches.StudentID).\
filter(models.Matches.JobID == id).\
order_by(models.Matches.Match.desc()).\
all()
if not matches:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
return matches
@router.get("/hardskills/{id}", response_model=List[schemas.JobsHardskill])
def get_jobs_hardskills(id: int, db: Session = Depends(get_db)):
hardskills = db.query(models.JobsHard_skills.Hard_skillID, models.Hard_skills.Title).\
join(models.Hard_skills, models.JobsHard_skills.Hard_skillID == models.Hard_skills.Hard_skillID).\
filter(models.JobsHard_skills.JobID == id).all()
if not hardskills:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
return hardskills
@router.get("/students-search/", response_model=List[schemas.StudentUpdate])
def get_students(
year: int = None,
time: Annotated[list[str], Query()] = [],
hardskills: Annotated[list[str], Query()] = [],
faculties: str = None,
experience_specialty: bool = None,
db: Session = Depends(get_db)
):
if hardskills:
students = db.query(
models.Students.StudentID,
models.Students.Name,
models.Students.Type,
models.Students.Faculties,
models.Students.Group,
models.Students.Уear,
models.Students.Experience_specialty,
models.Students.Time,
models.Students.Soft_skills,
models.Students.Link,
models.Students.Email,
models.Students.Phone_number,
).join(models.StudentsHard_skills, models.Students.StudentID == models.StudentsHard_skills.StudentID).\
join(models.Hard_skills, models.StudentsHard_skills.Hard_skillID == models.Hard_skills.Hard_skillID).\
filter(models.Hard_skills.Title.in_(hardskills)).distinct(models.Students.StudentID)
else:
students = db.query(models.Students).filter(models.Students.Experience_specialty == experience_specialty)
if time:
students = students.filter(models.Students.Time.op("&&")(time))
if year:
students = students.filter(models.Students.Year >= year)
if faculties:
students = students.filter(models.Students.Faculties.ilike("%" + faculties + "%"))
response: List[schemas.StudentUpdate] = []
for student in students:
hardskills = db.query(models.StudentsHard_skills.Hard_skillID, models.Hard_skills.Title).\
join(models.Hard_skills, models.StudentsHard_skills.Hard_skillID == models.Hard_skills.Hard_skillID).\
filter(models.StudentsHard_skills.StudentID == student.StudentID).all()
Hardskills = [hardskill.Title for hardskill in hardskills]
response += [schemas.StudentUpdate(Name=student.Name, Type=student.Type, Faculties=student.Faculties,
Group=student.Group, Year=student.Year, Experience_specialty=student.Experience_specialty,
Time=student.Time, Soft_skills=student.Soft_skills, Link=student.Link, Email=student.Email,
Phone_number=student.Phone_number, Hardskills=Hardskills)]
return response
@router.get("/responses/{id}", response_model=List[schemas.Response])
def get_responses(id: int, db: Session = Depends(get_db)):
responses = db.query(models.Responses).filter(models.Responses.JobID == id).all()
if not responses:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
return responses
@router.get("/responses/", response_model=List[schemas.Response])
def get_responses_all_unprocessed(db: Session = Depends(get_db)):
responses = db.query(
models.Responses.ResponseID,
models.Responses.StudentID,
models.Responses.JobID,
models.Responses.Status,
models.Responses.Comment,
models.Responses.Link,
).join(models.Students, models.Students.StudentID == models.Responses.StudentID).\
filter(models.Responses.Status == "Ожидает рассмотрения").\
order_by(models.Students.Year.asc()).\
all() # order_by работате и на буквы в начале группы. Так, сейчас должен работать по идеи
if not responses:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
return responses
@router.post("/", status_code=status.HTTP_201_CREATED, response_model=schemas.Job)
def create_job(
job: schemas.JobCreate,
background_tasks: BackgroundTasks,
db: Session = Depends(get_db),
current_user: models.Users = Depends(security.get_current_user)
):
new_job = models.Jobs(UserID=current_user.UserID, **job.model_dump(exclude='Hardskills'))
db.add(new_job)
db.flush()
crud.update_hardskills(new_job.JobID, job.Hardskills, is_job=True, db=db)
if not new_job.Archive:
crud.update_matches(new_job.JobID, is_job=True, db=db, background_tasks=background_tasks)
crud.commit_transaction(db)
return new_job
@router.put("/{id}", response_model=schemas.Job)
def update_job(
id: int,
updated_job: schemas.JobUpdate,
background_tasks: BackgroundTasks,
db: Session = Depends(get_db),
current_user: models.Users = Depends(security.get_current_user)
):
job_query = db.query(models.Jobs).filter(models.Jobs.JobID == id)
job = job_query.first()
if not job:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
updated_data = updated_job.model_dump(exclude='Hardskills')
updated_data["UserID"] = current_user.UserID
job_query.update(updated_data, synchronize_session=False)
db.flush()
crud.update_hardskills(id, updated_job.Hardskills, is_job=True, db=db)
if not updated_job.Archive:
crud.update_matches(id, is_job=True, db=db, background_tasks=background_tasks)
else:
db.query(models.Matches).filter(models.Matches.JobID == id).delete()
db.flush()
crud.commit_transaction(db)
return job_query.first()
@router.put("/responses/{id}", status_code=status.HTTP_200_OK)
def update_response(id: int, updated_response: schemas.ResponseUpdate, background_tasks: BackgroundTasks, db: Session = Depends(get_db)):
updated_record = crud.update_record(models.Responses, id, updated_response.model_dump(), db, background_tasks)
return updated_record
@router.delete("/{id}", status_code=status.HTTP_204_NO_CONTENT)
def delete_job(id: int, db: Session = Depends(get_db)):
job_query = db.query(models.Jobs).filter(models.Jobs.JobID == id)
job = job_query.first()
if not job:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
job_query.delete()
crud.commit_transaction(db)
return Response(status_code=status.HTTP_204_NO_CONTENT)