From dfa7bb9a0ea9fa98511a23d29e49d700407a7fb8 Mon Sep 17 00:00:00 2001 From: Vadym Sulim Date: Wed, 22 Jan 2025 04:34:34 +0200 Subject: [PATCH 1/4] solution to be fixed :( --- .flake8 | 2 +- src/routes/movies.py | 197 +++++++++++++++++++++++++++++++++++++++++- src/schemas/movies.py | 85 +++++++++++++++++- 3 files changed, 280 insertions(+), 4 deletions(-) diff --git a/.flake8 b/.flake8 index cbd72d8..0dcc00e 100644 --- a/.flake8 +++ b/.flake8 @@ -5,4 +5,4 @@ max-line-length = 119 max-complexity = 18 select = B,C,E,F,W,T4,B9,ANN,Q0,N8,VNE exclude = .venv -extend-exclude = src/tests/* +extend-exclude = src/tests/*, src/database/migrations/*, src/config/*, src/database/populate.py diff --git a/src/routes/movies.py b/src/routes/movies.py index e44678a..42c826b 100644 --- a/src/routes/movies.py +++ b/src/routes/movies.py @@ -1,12 +1,205 @@ from fastapi import APIRouter, Depends, HTTPException, Query +from sqlalchemy import desc from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import Session, joinedload from database import get_db from database.models import MovieModel, CountryModel, GenreModel, ActorModel, LanguageModel - +from schemas.movies import MoviesBase, MovieBase, MovieDetailSchema, MovieCreateSchema, CountryBase, GenreBase, \ + ActorBase, LanguageBase router = APIRouter() -# Write your code here +# get all movies +@router.get("/movies/", response_model=MoviesBase) +def get_movies(db: Session = Depends(get_db), + page: int = Query(1, ge=1), + per_page: int = Query(10, ge=1)) -> MoviesBase: + movies = db.query(MovieModel).options( + joinedload(MovieModel.country), + joinedload(MovieModel.genres), + joinedload(MovieModel.actors), + joinedload(MovieModel.languages) + ).order_by(desc(MovieModel.id)).limit(per_page).offset((page - 1) * per_page).all() + + if not movies: + raise HTTPException(status_code=404, detail="No movies found.") + + prev_page = f"/theater/movies/?page={page - 1}&per_page={per_page}" if page > 1 else None + next_page = f"/theater/movies/?page={page + 1}&per_page={per_page}" if len(movies) == per_page else None + total_pages = (db.query(MovieModel).count() + per_page - 1) // per_page + total_items = db.query(MovieModel).count() + + return MoviesBase( + movies=[ + MovieBase( + id=movie.id, + name=movie.name, + date=movie.date, + score=movie.score, + overview=movie.overview + ) for movie in movies + ], + prev_page=prev_page, + next_page=next_page, + total_items=total_items, + total_pages=total_pages + ) + + +# movie creation +@router.post("/movies/", response_model=MovieDetailSchema, status_code=201) +def create_movie(movie: MovieCreateSchema, db: Session = Depends(get_db)) -> MovieDetailSchema: + movie_found = db.query(MovieModel).filter(MovieModel.name == movie.name, MovieModel.date == movie.date).first() + + if movie_found: + raise HTTPException(status_code=409, detail="Movie with the given name and date already exists.") + + country = db.query(CountryModel).filter(CountryModel.name == movie.country).first() + + if not country: + country = CountryModel(name=movie.country) + db.add(country) + db.commit() + db.refresh(country) + + genres = [] + for genre in movie.genres: + genre_found = db.query(GenreModel).filter(GenreModel.name == genre).first() + if not genre_found: + genre_found = GenreModel(name=genre) + db.add(genre_found) + db.commit() + db.refresh(genre_found) + genres.append(genre_found) + + actors = [] + for actor in movie.actors: + actor_found = db.query(ActorModel).filter(ActorModel.name == actor).first() + if not actor_found: + actor_found = ActorModel(name=actor) + db.add(actor_found) + db.commit() + db.refresh(actor_found) + actors.append(actor_found) + + languages = [] + for language in movie.languages: + language_found = db.query(LanguageModel).filter(LanguageModel.name == language).first() + if not language_found: + language_found = LanguageModel(name=language) + db.add(language_found) + db.commit() + db.refresh(language_found) + languages.append(language_found) + + new_movie = MovieModel( + name=movie.name, + date=movie.date, + score=movie.score, + overview=movie.overview, + status=movie.status, + country_id=country.id, + genres=genres, + actors=actors, + languages=languages, + budget=movie.budget, + revenue=movie.revenue + ) + + db.add(new_movie) + db.commit() + db.refresh(new_movie) + + return MovieDetailSchema( + id=new_movie.id, + name=new_movie.name, + date=new_movie.date, + score=new_movie.score, + overview=new_movie.overview, + status=new_movie.status, + countries=[CountryBase(id=country.id, name=country.name, code=country.code)], + genres=[GenreBase(id=genre.id, name=genre.name) for genre in new_movie.genres], + actors=[ActorBase(id=actor.id, name=actor.name) for actor in new_movie.actors], + languages=[LanguageBase(id=language.id, name=language.name) for language in new_movie.languages], + budget=new_movie.budget, + revenue=new_movie.revenue + ) + + +# get movie by id +@router.get("/movies/{movie_id}/", response_model=MovieDetailSchema) +def get_movie(movie_id: int, db: Session = Depends(get_db)) -> MovieDetailSchema: + movie = db.get(MovieModel, movie_id) + + if not movie: + raise HTTPException(status_code=404, detail="Movie with the given ID was not found.") + + country = movie.country + if not country or not country.name: + raise HTTPException(status_code=404, detail="Country information is invalid.") + + return MovieDetailSchema( + id=movie.id, + name=movie.name, + date=movie.date, + score=movie.score, + overview=movie.overview, + status=movie.status, + budget=movie.budget, + revenue=movie.revenue, + countries=[CountryBase(id=country.id, code=country.code, name=country.name)], + genres=[GenreBase(id=genre.id, name=genre.name) for genre in movie.genres], + actors=[ActorBase(id=actor.id, name=actor.name) for actor in movie.actors], + languages=[LanguageBase(id=language.id, name=language.name) for language in movie.languages], + ) + + +# delete movie +@router.delete("/movies/{movie_id}/", status_code=204) +def delete_movie(movie_id: int, db: Session = Depends(get_db)): + movie = db.get(MovieModel, movie_id) + + if not movie: + raise HTTPException(status_code=404, detail="Movie with the given ID was not found.") + + db.delete(movie) + db.commit() + + +# update movie +@router.put("/movies/{movie_id}/", response_model=MovieDetailSchema) +def update_movie(movie_id: int, movie: MovieCreateSchema, db: Session = Depends(get_db)) -> MovieDetailSchema: + existing_movie = db.get(MovieModel, movie_id) + + if not existing_movie: + raise HTTPException(status_code=404, detail="Movie with the given ID was not found.") + + existing_movie.name = movie.name + existing_movie.date = movie.date + existing_movie.score = movie.score + existing_movie.overview = movie.overview + existing_movie.status = movie.status + existing_movie.budget = movie.budget + existing_movie.revenue = movie.revenue + + db.commit() + db.refresh(existing_movie) + + return MovieDetailSchema( + id=existing_movie.id, + name=existing_movie.name, + date=existing_movie.date, + score=existing_movie.score, + overview=existing_movie.overview, + status=existing_movie.status, + budget=existing_movie.budget, + revenue=existing_movie.revenue, + countries=[CountryBase(id=existing_movie.country.id, + code=existing_movie.country.code, + name=existing_movie.country.name)], + genres=[GenreBase(id=genre.id, name=genre.name) for genre in existing_movie.genres], + actors=[ActorBase(id=actor.id, name=actor.name) for actor in existing_movie.actors], + languages=[LanguageBase(id=language.id, name=language.name) for language in existing_movie.languages], + ) diff --git a/src/schemas/movies.py b/src/schemas/movies.py index fabb9be..f526c06 100644 --- a/src/schemas/movies.py +++ b/src/schemas/movies.py @@ -1 +1,84 @@ -# Write your code here +import datetime + +from pydantic import BaseModel, Field, field_validator + + +class MovieBase(BaseModel): + id: int + name: str = Field(min_length=1, max_length=255) + date: datetime.date + score: float + overview: str + + +class MoviesBase(BaseModel): + movies: list[MovieBase] + prev_page: str | None + next_page: str | None + total_pages: int + total_items: int + + +class GenreBase(BaseModel): + id: int + name: str = Field(min_length=1, max_length=255) + + +class ActorBase(BaseModel): + id: int + name: str = Field(min_length=1, max_length=255) + + +class LanguageBase(BaseModel): + id: int + name: str = Field(min_length=1, max_length=255) + + +class CountryBase(BaseModel): + id: int + name: str = Field(min_length=1, max_length=255) + code: str = Field(default=None, max_length=2) + + +class MovieCreateSchema(MovieBase): + name: str + date: datetime.date + score: float = Field(ge=0, le=100) + overview: str + status: str + budget: float = Field(ge=0) + revenue: float = Field(ge=0) + country: str + genres: list[str] + actors: list[str] + languages: list[str] + + @field_validator("date") + def validate(cls, value: str | datetime.date): + if value < datetime.date.today() + datetime.timedelta(days=365): + raise ValueError("Date must be at least one year in future") + return value + + +class MovieDetailSchema(MovieBase): + status: str + budget: float = Field(ge=0) + revenue: float = Field(ge=0) + countries: list[CountryBase] + genres: list[GenreBase] + actors: list[ActorBase] + languages: list[LanguageBase] + + +class MovieUpdateSchema(BaseModel): + name: str + date: datetime.date + score: float = Field(ge=0, le=100) + overview: str + status: str + budget: float = Field(ge=0) + revenue: float = Field(ge=0) + countries: list[str] + genres: list[str] + actors: list[str] + languages: list[str] From c0e12663590c617d63fe847822cbde4398f92ad1 Mon Sep 17 00:00:00 2001 From: Vadym Sulim Date: Wed, 22 Jan 2025 04:52:52 +0200 Subject: [PATCH 2/4] fixed ai notes --- src/routes/movies.py | 90 +++++++++++++++++++++++++++++++++++-------- src/schemas/movies.py | 38 +++++++++--------- 2 files changed, 92 insertions(+), 36 deletions(-) diff --git a/src/routes/movies.py b/src/routes/movies.py index 42c826b..18fdf53 100644 --- a/src/routes/movies.py +++ b/src/routes/movies.py @@ -6,7 +6,7 @@ from database import get_db from database.models import MovieModel, CountryModel, GenreModel, ActorModel, LanguageModel from schemas.movies import MoviesBase, MovieBase, MovieDetailSchema, MovieCreateSchema, CountryBase, GenreBase, \ - ActorBase, LanguageBase + ActorBase, LanguageBase, MovieUpdateSchema router = APIRouter() @@ -54,12 +54,14 @@ def create_movie(movie: MovieCreateSchema, db: Session = Depends(get_db)) -> Mov movie_found = db.query(MovieModel).filter(MovieModel.name == movie.name, MovieModel.date == movie.date).first() if movie_found: - raise HTTPException(status_code=409, detail="Movie with the given name and date already exists.") + raise HTTPException(status_code=409, detail=f"A movie with the name" + f" '{movie.name}' and" + f" release date '{movie.date}' already exists.") country = db.query(CountryModel).filter(CountryModel.name == movie.country).first() if not country: - country = CountryModel(name=movie.country) + country = CountryModel(name=movie.country, code=f"{movie.country}") db.add(country) db.commit() db.refresh(country) @@ -170,22 +172,78 @@ def delete_movie(movie_id: int, db: Session = Depends(get_db)): # update movie @router.put("/movies/{movie_id}/", response_model=MovieDetailSchema) -def update_movie(movie_id: int, movie: MovieCreateSchema, db: Session = Depends(get_db)) -> MovieDetailSchema: +def update_movie(movie_id: int, movie: MovieUpdateSchema, db: Session = Depends(get_db)) -> MovieDetailSchema: existing_movie = db.get(MovieModel, movie_id) if not existing_movie: raise HTTPException(status_code=404, detail="Movie with the given ID was not found.") - existing_movie.name = movie.name - existing_movie.date = movie.date - existing_movie.score = movie.score - existing_movie.overview = movie.overview - existing_movie.status = movie.status - existing_movie.budget = movie.budget - existing_movie.revenue = movie.revenue - - db.commit() - db.refresh(existing_movie) + if movie.name is not None: + existing_movie.name = movie.name + if movie.date is not None: + existing_movie.date = movie.date + if movie.score is not None: + existing_movie.score = movie.score + if movie.overview is not None: + existing_movie.overview = movie.overview + if movie.status is not None: + existing_movie.status = movie.status + if movie.budget is not None: + existing_movie.budget = movie.budget + if movie.revenue is not None: + existing_movie.revenue = movie.revenue + + if movie.country is not None: + country = db.query(CountryModel).filter(CountryModel.name == movie.country).first() + if not country: + country = CountryModel(name=movie.country, code="default_code") # Set a default code or generate one + db.add(country) + db.commit() + db.refresh(country) + existing_movie.country_id = country.id + + if movie.genres is not None: + genres = [] + for genre in movie.genres: + genre_found = db.query(GenreModel).filter(GenreModel.name == genre).first() + if not genre_found: + genre_found = GenreModel(name=genre) + db.add(genre_found) + db.commit() + db.refresh(genre_found) + genres.append(genre_found) + existing_movie.genres = genres + + if movie.actors is not None: + actors = [] + for actor in movie.actors: + actor_found = db.query(ActorModel).filter(ActorModel.name == actor).first() + if not actor_found: + actor_found = ActorModel(name=actor) + db.add(actor_found) + db.commit() + db.refresh(actor_found) + actors.append(actor_found) + existing_movie.actors = actors + + if movie.languages is not None: + languages = [] + for language in movie.languages: + language_found = db.query(LanguageModel).filter(LanguageModel.name == language).first() + if not language_found: + language_found = LanguageModel(name=language) + db.add(language_found) + db.commit() + db.refresh(language_found) + languages.append(language_found) + existing_movie.languages = languages + + try: + db.commit() + db.refresh(existing_movie) + except IntegrityError: + db.rollback() + raise HTTPException(status_code=400, detail="Integrity error occurred while updating the movie.") return MovieDetailSchema( id=existing_movie.id, @@ -196,9 +254,7 @@ def update_movie(movie_id: int, movie: MovieCreateSchema, db: Session = Depends( status=existing_movie.status, budget=existing_movie.budget, revenue=existing_movie.revenue, - countries=[CountryBase(id=existing_movie.country.id, - code=existing_movie.country.code, - name=existing_movie.country.name)], + countries=[CountryBase(id=existing_movie.country.id, code=existing_movie.country.code, name=existing_movie.country.name)], genres=[GenreBase(id=genre.id, name=genre.name) for genre in existing_movie.genres], actors=[ActorBase(id=actor.id, name=actor.name) for actor in existing_movie.actors], languages=[LanguageBase(id=language.id, name=language.name) for language in existing_movie.languages], diff --git a/src/schemas/movies.py b/src/schemas/movies.py index f526c06..2495dd6 100644 --- a/src/schemas/movies.py +++ b/src/schemas/movies.py @@ -36,18 +36,18 @@ class LanguageBase(BaseModel): class CountryBase(BaseModel): id: int - name: str = Field(min_length=1, max_length=255) - code: str = Field(default=None, max_length=2) + name: str = Field(default=None, max_length=255) + code: str = Field(max_length=2) -class MovieCreateSchema(MovieBase): +class MovieCreateSchema(BaseModel): name: str date: datetime.date - score: float = Field(ge=0, le=100) + score: float overview: str status: str - budget: float = Field(ge=0) - revenue: float = Field(ge=0) + budget: float + revenue: float country: str genres: list[str] actors: list[str] @@ -55,8 +55,8 @@ class MovieCreateSchema(MovieBase): @field_validator("date") def validate(cls, value: str | datetime.date): - if value < datetime.date.today() + datetime.timedelta(days=365): - raise ValueError("Date must be at least one year in future") + if value > datetime.date.today() + datetime.timedelta(days=365): + raise ValueError("The date must not be more than one year in the future.") return value @@ -71,14 +71,14 @@ class MovieDetailSchema(MovieBase): class MovieUpdateSchema(BaseModel): - name: str - date: datetime.date - score: float = Field(ge=0, le=100) - overview: str - status: str - budget: float = Field(ge=0) - revenue: float = Field(ge=0) - countries: list[str] - genres: list[str] - actors: list[str] - languages: list[str] + name: str | None = Field(max_length=255) + date: datetime.date | None + score: float | None = Field(ge=0, le=100) + overview: str | None + status: str | None + budget: float | None = Field(ge=0) + revenue: float | None = Field(ge=0) + country: str | None + genres: list[str] | None + actors: list[str] | None + languages: list[str] | None From 6583013dd60ad0049e054f96ac954cfe3390bb8b Mon Sep 17 00:00:00 2001 From: Vadym Sulim Date: Wed, 22 Jan 2025 05:01:50 +0200 Subject: [PATCH 3/4] linted imports --- src/routes/movies.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/routes/movies.py b/src/routes/movies.py index 18fdf53..646b6d9 100644 --- a/src/routes/movies.py +++ b/src/routes/movies.py @@ -4,9 +4,20 @@ from sqlalchemy.orm import Session, joinedload from database import get_db -from database.models import MovieModel, CountryModel, GenreModel, ActorModel, LanguageModel -from schemas.movies import MoviesBase, MovieBase, MovieDetailSchema, MovieCreateSchema, CountryBase, GenreBase, \ - ActorBase, LanguageBase, MovieUpdateSchema +from database.models import (MovieModel, + CountryModel, + GenreModel, + ActorModel, + LanguageModel) +from schemas.movies import (MoviesBase, + MovieBase, + MovieDetailSchema, + MovieCreateSchema, + CountryBase, + GenreBase, + ActorBase, + LanguageBase, + MovieUpdateSchema) router = APIRouter() @@ -196,7 +207,7 @@ def update_movie(movie_id: int, movie: MovieUpdateSchema, db: Session = Depends( if movie.country is not None: country = db.query(CountryModel).filter(CountryModel.name == movie.country).first() if not country: - country = CountryModel(name=movie.country, code="default_code") # Set a default code or generate one + country = CountryModel(name=movie.country) db.add(country) db.commit() db.refresh(country) @@ -254,7 +265,9 @@ def update_movie(movie_id: int, movie: MovieUpdateSchema, db: Session = Depends( status=existing_movie.status, budget=existing_movie.budget, revenue=existing_movie.revenue, - countries=[CountryBase(id=existing_movie.country.id, code=existing_movie.country.code, name=existing_movie.country.name)], + countries=[CountryBase(id=existing_movie.country.id, + code=existing_movie.country.code, + name=existing_movie.country.name)], genres=[GenreBase(id=genre.id, name=genre.name) for genre in existing_movie.genres], actors=[ActorBase(id=actor.id, name=actor.name) for actor in existing_movie.actors], languages=[LanguageBase(id=language.id, name=language.name) for language in existing_movie.languages], From 1f9e1d8ee37518580d6ed9c2582c03d8506fd574 Mon Sep 17 00:00:00 2001 From: Vadym Sulim Date: Wed, 22 Jan 2025 17:45:07 +0200 Subject: [PATCH 4/4] fixed tests --- src/routes/movies.py | 127 +++++------------------------------------- src/schemas/movies.py | 24 ++++---- 2 files changed, 25 insertions(+), 126 deletions(-) diff --git a/src/routes/movies.py b/src/routes/movies.py index 646b6d9..3b19d80 100644 --- a/src/routes/movies.py +++ b/src/routes/movies.py @@ -1,3 +1,5 @@ +from typing import Dict + from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy import desc from sqlalchemy.exc import IntegrityError @@ -125,48 +127,18 @@ def create_movie(movie: MovieCreateSchema, db: Session = Depends(get_db)) -> Mov db.commit() db.refresh(new_movie) - return MovieDetailSchema( - id=new_movie.id, - name=new_movie.name, - date=new_movie.date, - score=new_movie.score, - overview=new_movie.overview, - status=new_movie.status, - countries=[CountryBase(id=country.id, name=country.name, code=country.code)], - genres=[GenreBase(id=genre.id, name=genre.name) for genre in new_movie.genres], - actors=[ActorBase(id=actor.id, name=actor.name) for actor in new_movie.actors], - languages=[LanguageBase(id=language.id, name=language.name) for language in new_movie.languages], - budget=new_movie.budget, - revenue=new_movie.revenue - ) + return new_movie # get movie by id @router.get("/movies/{movie_id}/", response_model=MovieDetailSchema) def get_movie(movie_id: int, db: Session = Depends(get_db)) -> MovieDetailSchema: - movie = db.get(MovieModel, movie_id) + movie = db.query(MovieModel).filter(MovieModel.id == movie_id).first() if not movie: raise HTTPException(status_code=404, detail="Movie with the given ID was not found.") - country = movie.country - if not country or not country.name: - raise HTTPException(status_code=404, detail="Country information is invalid.") - - return MovieDetailSchema( - id=movie.id, - name=movie.name, - date=movie.date, - score=movie.score, - overview=movie.overview, - status=movie.status, - budget=movie.budget, - revenue=movie.revenue, - countries=[CountryBase(id=country.id, code=country.code, name=country.name)], - genres=[GenreBase(id=genre.id, name=genre.name) for genre in movie.genres], - actors=[ActorBase(id=actor.id, name=actor.name) for actor in movie.actors], - languages=[LanguageBase(id=language.id, name=language.name) for language in movie.languages], - ) + return movie # delete movie @@ -182,93 +154,22 @@ def delete_movie(movie_id: int, db: Session = Depends(get_db)): # update movie -@router.put("/movies/{movie_id}/", response_model=MovieDetailSchema) -def update_movie(movie_id: int, movie: MovieUpdateSchema, db: Session = Depends(get_db)) -> MovieDetailSchema: - existing_movie = db.get(MovieModel, movie_id) +@router.patch("/movies/{movie_id}/", status_code=200) +def update_movie(movie_id: int, movie: MovieUpdateSchema, db: Session = Depends(get_db)) -> dict[str, str]: + existing_movie = db.query(MovieModel).filter(MovieModel.id == movie_id).first() if not existing_movie: raise HTTPException(status_code=404, detail="Movie with the given ID was not found.") - if movie.name is not None: - existing_movie.name = movie.name - if movie.date is not None: - existing_movie.date = movie.date - if movie.score is not None: - existing_movie.score = movie.score - if movie.overview is not None: - existing_movie.overview = movie.overview - if movie.status is not None: - existing_movie.status = movie.status - if movie.budget is not None: - existing_movie.budget = movie.budget - if movie.revenue is not None: - existing_movie.revenue = movie.revenue - - if movie.country is not None: - country = db.query(CountryModel).filter(CountryModel.name == movie.country).first() - if not country: - country = CountryModel(name=movie.country) - db.add(country) - db.commit() - db.refresh(country) - existing_movie.country_id = country.id - - if movie.genres is not None: - genres = [] - for genre in movie.genres: - genre_found = db.query(GenreModel).filter(GenreModel.name == genre).first() - if not genre_found: - genre_found = GenreModel(name=genre) - db.add(genre_found) - db.commit() - db.refresh(genre_found) - genres.append(genre_found) - existing_movie.genres = genres - - if movie.actors is not None: - actors = [] - for actor in movie.actors: - actor_found = db.query(ActorModel).filter(ActorModel.name == actor).first() - if not actor_found: - actor_found = ActorModel(name=actor) - db.add(actor_found) - db.commit() - db.refresh(actor_found) - actors.append(actor_found) - existing_movie.actors = actors - - if movie.languages is not None: - languages = [] - for language in movie.languages: - language_found = db.query(LanguageModel).filter(LanguageModel.name == language).first() - if not language_found: - language_found = LanguageModel(name=language) - db.add(language_found) - db.commit() - db.refresh(language_found) - languages.append(language_found) - existing_movie.languages = languages + for field, value in movie.model_dump(exclude_unset=True).items(): + if value: + setattr(existing_movie, field, value) try: db.commit() db.refresh(existing_movie) except IntegrityError: db.rollback() - raise HTTPException(status_code=400, detail="Integrity error occurred while updating the movie.") - - return MovieDetailSchema( - id=existing_movie.id, - name=existing_movie.name, - date=existing_movie.date, - score=existing_movie.score, - overview=existing_movie.overview, - status=existing_movie.status, - budget=existing_movie.budget, - revenue=existing_movie.revenue, - countries=[CountryBase(id=existing_movie.country.id, - code=existing_movie.country.code, - name=existing_movie.country.name)], - genres=[GenreBase(id=genre.id, name=genre.name) for genre in existing_movie.genres], - actors=[ActorBase(id=actor.id, name=actor.name) for actor in existing_movie.actors], - languages=[LanguageBase(id=language.id, name=language.name) for language in existing_movie.languages], - ) + raise HTTPException(status_code=400, detail="Invalid input data.") + + return {"detail": "Movie updated successfully."} diff --git a/src/schemas/movies.py b/src/schemas/movies.py index 2495dd6..dc5814a 100644 --- a/src/schemas/movies.py +++ b/src/schemas/movies.py @@ -2,6 +2,8 @@ from pydantic import BaseModel, Field, field_validator +from database.models import MovieStatusEnum + class MovieBase(BaseModel): id: int @@ -36,7 +38,7 @@ class LanguageBase(BaseModel): class CountryBase(BaseModel): id: int - name: str = Field(default=None, max_length=255) + name: str | None = None code: str = Field(max_length=2) @@ -64,21 +66,17 @@ class MovieDetailSchema(MovieBase): status: str budget: float = Field(ge=0) revenue: float = Field(ge=0) - countries: list[CountryBase] + country: CountryBase genres: list[GenreBase] actors: list[ActorBase] languages: list[LanguageBase] class MovieUpdateSchema(BaseModel): - name: str | None = Field(max_length=255) - date: datetime.date | None - score: float | None = Field(ge=0, le=100) - overview: str | None - status: str | None - budget: float | None = Field(ge=0) - revenue: float | None = Field(ge=0) - country: str | None - genres: list[str] | None - actors: list[str] | None - languages: list[str] | None + name: str | None = Field(max_length=255, default=None) + date: datetime.date = None + score: float = Field(ge=0, le=100, default=None) + overview: str = None + status: MovieStatusEnum = None + budget: float = Field(ge=0, default=None) + revenue: float = Field(ge=0, default=None)