copied the code from the working repo
This commit is contained in:
247
mtucijobsbackend/app/routers/job.py
Normal file
247
mtucijobsbackend/app/routers/job.py
Normal file
@@ -0,0 +1,247 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user