feat [both]: fill values from film

This commit is contained in:
Alice 2022-12-04 01:25:56 +01:00
parent e80c833c83
commit ac07bf5e1a
5 changed files with 59 additions and 12 deletions

View file

@ -1,6 +1,6 @@
<template> <template>
<div class="columns"> <div class="columns">
<div class="column"> <div class="column is-three-fifths">
<div class="field"> <div class="field">
<label class="label">Date de projection</label> <label class="label">Date de projection</label>
<div class="control"> <div class="control">
@ -140,13 +140,14 @@
</div> </div>
</div> </div>
<div class="column"> <div class="column is-two-fifths">
<!-- doc : https://bluefantail.github.io/bulma-list/ --> <!-- doc : https://bluefantail.github.io/bulma-list/ -->
<div class="list has-visible-pointer-controls"> <div class="list has-visible-pointer-controls">
<div <div
v-for="(foundFilm, index) of foundFilms" v-for="(foundFilm, index) of foundFilms"
:key="foundFilm.id" :key="foundFilm.id"
class="list-item" class="list-item"
:class="{ 'is-active': isChosen(foundFilm) }"
> >
<div class="list-item-image"> <div class="list-item-image">
<figure class="image is-64x64"> <figure class="image is-64x64">
@ -161,8 +162,16 @@
</div> </div>
<div class="list-item-controls"> <div class="list-item-controls">
<div class="buttons is-right"> <div class="buttons is-right">
<button class="button" @click="fill(foundFilm.id)"> <button
Préremplir v-if="isChosen(foundFilm)"
class="button"
@click="fillAll"
>
<v-icon name="bi-arrow-bar-left" />
Remplir tout
</button>
<button v-else class="button" @click="choose(foundFilm.id)">
Choisir
</button> </button>
</div> </div>
</div> </div>
@ -186,7 +195,7 @@ defineProps({
}, },
}, },
}) })
const emits = defineEmits(["save", "publish"]) const emits = defineEmits(["save", "publish", "update:modelValue"])
const film = useModel<Film>("modelValue", { type: "object" }) const film = useModel<Film>("modelValue", { type: "object" })
const foundFilms = ref() const foundFilms = ref()
@ -215,9 +224,18 @@ async function findFilm() {
).data.value ).data.value
} }
async function fill(tmdbId: number) { async function choose(tmdbId: number) {
film.value = (await apiGet(`tmdb/${tmdbId}/fill/`)).data.value chosenFilm.value =
// TODO fix form reactivity ((await apiGet<Film>(`tmdb/${tmdbId}/fill/`)).data.value as Film) ||
undefined
}
function isChosen(filmToCheck: Film) {
return chosenFilm.value?.tmdbId === filmToCheck?.tmdbId
}
function fillAll() {
Object.assign(film.value, chosenFilm.value)
} }
</script> </script>
@ -225,4 +243,10 @@ async function fill(tmdbId: number) {
.image img .image img
height: 100% height: 100%
object-fit: cover object-fit: cover
textarea
resize: vertical
.list-item.is-active
background-color: $grey-lighter
</style> </style>

View file

@ -25,6 +25,7 @@ export type Film = {
posterLink?: string posterLink?: string
bannerLink?: string bannerLink?: string
isConfirmed?: boolean isConfirmed?: boolean
tmdbId?: number
} }
export type ShortFilm = { export type ShortFilm = {

View file

@ -1,10 +1,12 @@
import { OhVueIcon, addIcons } from "oh-vue-icons" import { OhVueIcon, addIcons } from "oh-vue-icons"
import { import {
BiArrowBarLeft,
RiCalendarEventFill, RiCalendarEventFill,
RiDoubleQuotesL, RiDoubleQuotesL,
RiFacebookBoxFill, RiFacebookBoxFill,
RiInstagramFill, RiInstagramFill,
RiMailFill, RiMailFill,
RiMailLine,
RiMapPin2Fill, RiMapPin2Fill,
RiPlayCircleFill, RiPlayCircleFill,
} from "oh-vue-icons/icons" } from "oh-vue-icons/icons"
@ -15,8 +17,10 @@ addIcons(
RiFacebookBoxFill, RiFacebookBoxFill,
RiInstagramFill, RiInstagramFill,
RiMailFill, RiMailFill,
RiMailLine,
RiMapPin2Fill, RiMapPin2Fill,
RiPlayCircleFill RiPlayCircleFill,
BiArrowBarLeft
) )
export default defineNuxtPlugin((nuxtApp) => { export default defineNuxtPlugin((nuxtApp) => {

View file

@ -16,3 +16,21 @@ class FilmSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Film model = Film
fields = "__all__" # fields = "__all__" #
class FromTmdbFilmSerializer(serializers.ModelSerializer):
class Meta:
model = Film
fields = [
"title",
"actors",
"director",
"duration",
"synopsis",
"origin_country",
"release_year",
"is_in_color",
"poster_link",
"imdb_id",
"tmdb_id",
]

View file

@ -7,7 +7,7 @@ from rest_framework.response import Response
from tmdbv3api import TMDb, Search, Movie from tmdbv3api import TMDb, Search, Movie
from myapi.models import Film from myapi.models import Film
from myapi.serializers import FilmSerializer from myapi.serializers import FilmSerializer, FromTmdbFilmSerializer
from ulm_cine_club_api.settings.base import TMDB_API_KEY from ulm_cine_club_api.settings.base import TMDB_API_KEY
tmdb = TMDb() tmdb = TMDb()
@ -23,7 +23,7 @@ class TmdbViewSet(viewsets.ViewSet):
tmdb_results = search.movies({"query": query}) tmdb_results = search.movies({"query": query})
res = [ res = [
{ {
"id": film["id"], "tmdb_id": film["id"],
"release_date": film["release_date"], "release_date": film["release_date"],
"title": film["title"], "title": film["title"],
"poster_path": film["poster_path"], "poster_path": film["poster_path"],
@ -50,7 +50,7 @@ class TmdbViewSet(viewsets.ViewSet):
), # TODO iso to French name ), # TODO iso to French name
is_in_color=not any(keyword["id"] == 12999 for keyword in tmdb_movie["keywords"]["keywords"]) is_in_color=not any(keyword["id"] == 12999 for keyword in tmdb_movie["keywords"]["keywords"])
) )
serializer = FilmSerializer(internal_movie) serializer = FromTmdbFilmSerializer(internal_movie)
return Response(serializer.data) return Response(serializer.data)