Skip to content

Commit

Permalink
temporary commit
Browse files Browse the repository at this point in the history
  • Loading branch information
Mxbely committed Jan 19, 2025
1 parent 6943738 commit 06daf89
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 34 deletions.
73 changes: 44 additions & 29 deletions src/routes/movies.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,13 @@
from sqlalchemy.orm import Session, joinedload
import datetime
from database import get_db
from database.models import MovieModel, CountryModel, GenreModel, ActorModel, LanguageModel
from database.models import (
MovieModel,
CountryModel,
GenreModel,
ActorModel,
LanguageModel,
)

from schemas.movies import MovieListResponse, MovieDetail, MovieCreate, MovieUpdate

Expand All @@ -14,19 +20,25 @@

@router.get("/movies/", response_model=MovieListResponse)
def get_movies(
db: Session = Depends(get_db),
page: int = Query(1, ge=1),
per_page: int = Query(10, ge=1, le=20)
db: Session = Depends(get_db),
page: int = Query(1, ge=1),
per_page: int = Query(10, ge=1, le=20),
):

movies = db.query(MovieModel).order_by(MovieModel.id.desc()).offset((page - 1) * per_page).limit(per_page).all()
movies = (
db.query(MovieModel)
.order_by(MovieModel.id.desc())
.offset((page - 1) * per_page)
.limit(per_page)
.all()
)
print(f"print get_movies: {movies}")

if not movies:
raise HTTPException(status_code=404, detail="No movies found.")

prev_page = f"/theater/movies/?page={page - 1}&per_page={per_page}"
next_page =f"/theater/movies/?page={page + 1}&per_page={per_page}"
next_page = f"/theater/movies/?page={page + 1}&per_page={per_page}"
total_items = db.query(MovieModel).count()
total_pages = (total_items // per_page) + (1 if total_items % per_page > 0 else 0)

Expand All @@ -43,20 +55,18 @@ def get_movies(


@router.post("/movies/", response_model=MovieDetail, status_code=201)
def create_movie(
movie: MovieCreate,
db: Session = Depends(get_db)
):
db_movie = db.query(MovieModel).filter(
MovieModel.name == movie.name
).filter(
MovieModel.date == movie.date
).first()
def create_movie(movie: MovieCreate, db: Session = Depends(get_db)):
db_movie = (
db.query(MovieModel)
.filter(MovieModel.name == movie.name)
.filter(MovieModel.date == movie.date)
.first()
)

if db_movie:
raise HTTPException(
status_code=409,
detail=f"A movie with the name '{db_movie.name}' and release date '{db_movie.date}' already exists."
detail=f"A movie with the name '{db_movie.name}' and release date '{db_movie.date}' already exists.",
)

if movie.date > datetime.datetime.now().date() + datetime.timedelta(days=365):
Expand All @@ -73,7 +83,11 @@ def create_movie(
if movie.languages:
# languages.extend(check_or_create_many_instances_by_name(movie.languages, LanguageModel, db))
for language_name in movie.languages:
language = db.query(LanguageModel).filter(LanguageModel.name == language_name).first()
language = (
db.query(LanguageModel)
.filter(LanguageModel.name == language_name)
.first()
)
if not language:
language = LanguageModel(name=language_name)
db.add(language)
Expand Down Expand Up @@ -135,35 +149,36 @@ def create_movie(


@router.get("/movies/{movie_id}/", response_model=MovieDetail)
def get_movie(
movie_id: int,
db: Session = Depends(get_db)
):
def get_movie(movie_id: int, db: Session = Depends(get_db)):
movie = db.query(MovieModel).filter(MovieModel.id == movie_id).first()
print(f"print get_movie: {movie}")
if not movie:
raise HTTPException(status_code=404, detail="Movie with the given ID was not found.")
raise HTTPException(
status_code=404, detail="Movie with the given ID was not found."
)
return movie


@router.delete("/movies/{movie_id}/", status_code=204)
def delete_movie(
movie_id: int,
db: Session = Depends(get_db)
):
def delete_movie(movie_id: int, db: Session = Depends(get_db)):
movie = db.query(MovieModel).filter(MovieModel.id == movie_id).first()
print(f"print delete_movie: {movie}")
if not movie:
raise HTTPException(status_code=404, detail="Movie with the given ID was not found.")
raise HTTPException(
status_code=404, detail="Movie with the given ID was not found."
)
db.delete(movie)
db.commit()


@router.patch("/movies/{movie_id}/", status_code=200)
def edit_movie(movie_id: int, movie_data: MovieUpdate, db: Session = Depends(get_db)):
movie = db.query(MovieModel).filter(MovieModel.id == movie_id).first()
print(f"print edit_movie: {movie} and {movie_id}")
if not movie:
raise HTTPException(status_code=404, detail="Movie with the given ID was not found.")
raise HTTPException(
status_code=404, detail="Movie with the given ID was not found."
)

try:
movie_date = movie_data.model_dump(exclude_unset=True)
Expand Down Expand Up @@ -228,4 +243,4 @@ def edit_movie(movie_id: int, movie_data: MovieUpdate, db: Session = Depends(get
#
# db.commit()
# db.refresh(db_movie)
# return {"detail": "Movie updated successfully.", "movie": db_movie}
# return {"detail": "Movie updated successfully.", "movie": db_movie}
23 changes: 18 additions & 5 deletions src/schemas/movies.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,54 +19,62 @@ class Movie(BaseModel):
budget: float
revenue: float


class Genre(BaseModel):
name: str
movies: list[Movie]

model_config = {"from_attributes": True}


class GenreDetail(BaseModel):
id: int
name: str


class Actor(BaseModel):
name: str
movies: list[Movie]

model_config = {"from_attributes": True}


class ActorDetail(BaseModel):
id: int
name: str


class Language(BaseModel):
name: str
movies: list[Movie]

model_config = {"from_attributes": True}


class LanguageDetail(BaseModel):
id: int
name: str


class Country(BaseModel):
code: str
name: Optional[str]
movies: list[Movie]

model_config = {"from_attributes": True}


class CountryDetail(BaseModel):
id: int
code: str
name: Optional[str]




class MovieCreate(BaseModel):
name: str = Field(max_length=255)
date: datetime.date #= Field(lt=datetime.date.today() + datetime.timedelta(days=365))
date: (
datetime.date
) # = Field(lt=datetime.date.today() + datetime.timedelta(days=365))
score: float = Field(ge=0, le=100)
overview: str
status: MovieStatus
Expand All @@ -79,33 +87,38 @@ class MovieCreate(BaseModel):

model_config = {"from_attributes": True}


class MovieDetail(Movie):
id: int
country: Optional[CountryDetail] = None
genres: Optional[list[GenreDetail]] = None
actors: Optional[list[ActorDetail]] = None
languages: Optional[list[LanguageDetail]] = None


class MovieList(BaseModel):
id: int
name: str
date: datetime.date
score: float
overview: str


class MovieListResponse(BaseModel):
movies: list[MovieList]
prev_page: str | None
next_page: str | None
total_pages: int
total_items: int


class MovieUpdate(Movie):
name: Optional[str] = Field(max_length=255, default=None)
date: Optional[datetime.date] = Field(lt=datetime.date.today() + datetime.timedelta(days=365), default=None)
date: Optional[datetime.date] = Field(
lt=datetime.date.today() + datetime.timedelta(days=365), default=None
)
overview: Optional[str] = None
status: Optional[MovieStatus] = None
score: Optional[float] = Field(ge=0, le=100, default=None)
budget: Optional[float] = Field(gt=0, default=None)
revenue: Optional[float] = Field(gt=0, default=None)

0 comments on commit 06daf89

Please sign in to comment.