copied the code from the working repo

This commit is contained in:
2024-11-30 16:00:48 +03:00
parent f22b92869b
commit 15ac0cb9b8
148 changed files with 23342 additions and 0 deletions

View 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)