198 lines
9.6 KiB
Python
198 lines
9.6 KiB
Python
|
from django.http import HttpResponse,HttpResponseRedirect
|
||
|
from django.shortcuts import render,get_object_or_404,redirect
|
||
|
from django.core.paginator import Paginator
|
||
|
from django.urls.base import reverse, reverse_lazy
|
||
|
from django.views.generic.edit import DeleteView,UpdateView
|
||
|
from .models import SerieTV,Episodi,Stagioni,GenereSerieTV,CommentoSerieTV,Immagini
|
||
|
from .forms import SearchTVShowAPI,CommentiForms,SegnalazioneSerieTVForm
|
||
|
from utils.thetvdbapi import search_tv_show,get_tvshow_info,image_Endpoint
|
||
|
from utils.download_image import get_image
|
||
|
from utils.english_genres_to_italian import englishgenres
|
||
|
from django.contrib.admin.views.decorators import staff_member_required
|
||
|
from django.contrib.auth.decorators import login_required
|
||
|
from django.contrib import messages
|
||
|
from core.models import Profilo
|
||
|
import random
|
||
|
# Create your views here.
|
||
|
|
||
|
|
||
|
def generiserie(request):
|
||
|
generi = GenereSerieTV.objects.all()
|
||
|
context = {"generi":generi}
|
||
|
return render(request,'lista_generi.html',context)
|
||
|
|
||
|
def generi_lista_serietv(request,genere):
|
||
|
genere = get_object_or_404(GenereSerieTV,genere=genere)
|
||
|
serietv = SerieTV.objects.filter(genere=genere)
|
||
|
context = {"genere":genere,"serietv":serietv}
|
||
|
return render(request,'serietv_genre.html',context)
|
||
|
|
||
|
|
||
|
def serietv_youmightlike(genres,serietv):
|
||
|
random_picked_genre = random.sample(genres,1)
|
||
|
serietv_same_genres = SerieTV.objects.filter(genere__in=random_picked_genre).values("titolo")
|
||
|
current_serietv = serietv.titolo
|
||
|
serietv_with_same_genre = SerieTV.objects.exclude(titolo=current_serietv)
|
||
|
number_serietv_with_same_genre = SerieTV.objects.filter(genere__in=random_picked_genre).count()
|
||
|
# random_serietv_list = random.randint(1,number_serietv_with_same_genre)
|
||
|
# rand_serietv = random.sample(list(serietv_with_same_genre),min(random_serietv_list, len(serietv_with_same_genre))) # comportamento precedente
|
||
|
rand_serietv = random.sample(list(serietv_with_same_genre),number_serietv_with_same_genre if number_serietv_with_same_genre < 8 else 8) # seleziona casualmente degli elementi univoci nel database
|
||
|
return rand_serietv
|
||
|
|
||
|
|
||
|
def serietv(request):
|
||
|
serietv = SerieTV.objects.all().order_by("titolo")
|
||
|
generi = GenereSerieTV.objects.all()
|
||
|
paginator = Paginator(serietv, 100)
|
||
|
numero_pagina = request.GET.get('pagina')
|
||
|
serie = paginator.get_page(numero_pagina)
|
||
|
context = {"serie":serie,"generi":generi}
|
||
|
return render(request,"serietv.html",context)
|
||
|
|
||
|
def serietv_detail(request,slug):
|
||
|
serietv = get_object_or_404(SerieTV,slug=slug)
|
||
|
serietv.visualizzazioni += 1
|
||
|
serietv.save()
|
||
|
immagini_serietv = Immagini.objects.filter(serietv=serietv)
|
||
|
commenti = CommentoSerieTV.objects.filter(media=serietv).order_by("-data_commento")
|
||
|
genres = list(serietv.genere.all())
|
||
|
serietv_foryou = serietv_youmightlike(genres,serietv)
|
||
|
is_favorite = False
|
||
|
watch_later = False
|
||
|
user_commented = False
|
||
|
if request.user.is_authenticated:
|
||
|
profilo = get_object_or_404(Profilo,user=request.user)
|
||
|
preferito = serietv.preferito.filter(user=profilo.user)
|
||
|
guarda = serietv.guarda_dopo.filter(user=profilo.user)
|
||
|
user_commented = CommentoSerieTV.objects.filter(media=serietv, utente=profilo).exists()
|
||
|
if preferito.exists():
|
||
|
is_favorite = True
|
||
|
if guarda.exists():
|
||
|
watch_later = True
|
||
|
else:
|
||
|
is_favorite = False
|
||
|
watch_later = False
|
||
|
if request.method == "POST":
|
||
|
form = CommentiForms(request.POST or None)
|
||
|
if form.is_valid():
|
||
|
form.save(commit=False)
|
||
|
form.instance.media = serietv
|
||
|
profilo = Profilo.objects.get(user=request.user)
|
||
|
form.instance.utente = profilo
|
||
|
form.save()
|
||
|
return HttpResponseRedirect(serietv.get_absolute_url())
|
||
|
|
||
|
else:
|
||
|
form = CommentiForms()
|
||
|
if request.method == "POST":
|
||
|
segnala_serietv_form = SegnalazioneSerieTVForm(request.POST or None)
|
||
|
if segnala_serietv_form.is_valid():
|
||
|
segnala_serietv_form.save(commit=False)
|
||
|
segnala_serietv_form.instance.serietv = serietv
|
||
|
segnala_serietv_form.save()
|
||
|
return HttpResponseRedirect(serietv.get_absolute_url())
|
||
|
else:
|
||
|
segnala_serietv_form = SegnalazioneSerieTVForm()
|
||
|
context = {"serietv":serietv,"commenti":commenti,"form":form,"serietv_foryou":serietv_foryou,"segnala_serietv_form":segnala_serietv_form,"immagini_serietv":immagini_serietv,"is_favorite":is_favorite,"watch_later":watch_later,"user_commented":user_commented}
|
||
|
return render(request,"details2.html",context)
|
||
|
|
||
|
@staff_member_required
|
||
|
def add_serietv_api(request):
|
||
|
if request.method == "GET":
|
||
|
form = SearchTVShowAPI(request.GET or None)
|
||
|
if form.is_valid():
|
||
|
serie = form.cleaned_data["serie_tv"]
|
||
|
data_tv_show = search_tv_show(serie)
|
||
|
tv_genre,tv_show_info = get_tvshow_info(data_tv_show)
|
||
|
titolo = data_tv_show['data'][0]['seriesName']
|
||
|
descrizione = data_tv_show['data'][0]['overview']
|
||
|
immagini = data_tv_show['data'][0]['poster']
|
||
|
img_path = image_Endpoint() + immagini
|
||
|
generi = tv_genre['data']['genre']
|
||
|
lista_generi = ", ".join(generi)
|
||
|
stagioni = tv_genre['data']['season']
|
||
|
# for generi in data_tv_show['data'][0]['genre']:
|
||
|
# print(generi)
|
||
|
serie_tv = {"titolo":titolo,"descrizione":descrizione,"poster":img_path,"lista_generi":lista_generi,"stagioni":stagioni,"generi":generi}
|
||
|
return render(request,'visualizza_risultatiserietv.html',serie_tv)
|
||
|
else:
|
||
|
form = SearchTVShowAPI()
|
||
|
context = {"form":form}
|
||
|
return render(request,'aggiungi_serietv_api.html',context)
|
||
|
|
||
|
@staff_member_required
|
||
|
def salva_tvshow(request,titolo,descrizione,generi,stagioni,poster):
|
||
|
if request.method == "GET":
|
||
|
print(titolo,descrizione,generi)
|
||
|
data_tv_show = search_tv_show(titolo)
|
||
|
tv_genre,tv_show_info = get_tvshow_info(data_tv_show)
|
||
|
background = tv_genre['data']['fanart']
|
||
|
background_path = 'https://artworks.thetvdb.com/banners/' + background
|
||
|
serietv = SerieTV()
|
||
|
if SerieTV.objects.filter(titolo=titolo).exists():
|
||
|
return HttpResponse('Serie TV giá presente nel DB!')
|
||
|
else:
|
||
|
serietv.titolo = titolo
|
||
|
serietv.descrizione = descrizione
|
||
|
serietv.immagine_poster = get_image(poster)
|
||
|
serietv.immagine_background = get_image(background_path)
|
||
|
serietv.save()
|
||
|
generi = list(generi.split(", "))
|
||
|
generi = englishgenres(generi)
|
||
|
for genre in generi:
|
||
|
if GenereSerieTV.objects.filter(genere=genre).exists():
|
||
|
genere = GenereSerieTV.objects.get(genere=genre)
|
||
|
serietv.genere.add(genere)
|
||
|
else:
|
||
|
GenereSerieTV.objects.get_or_create(genere=genre)
|
||
|
genere = GenereSerieTV.objects.get(genere=genre)
|
||
|
serietv.genere.add(genere)
|
||
|
if stagioni == 1:
|
||
|
season = Stagioni.objects.create(numero_stagione=stagioni,serie_tv=serietv)
|
||
|
for episodes in tv_show_info['data']:
|
||
|
if season.numero_stagione == episodes['airedSeason']:
|
||
|
numero_stagione = Stagioni.objects.get(numero_stagione=season.numero_stagione,serie_tv=season.serie_tv)
|
||
|
print(numero_stagione)
|
||
|
Episodi.objects.create(stagione=numero_stagione,numero_episodio=episodes['airedEpisodeNumber'],streaming_link="",nome_episodio=episodes['episodeName'])
|
||
|
else:
|
||
|
for seasons in range(1,(stagioni+1)):
|
||
|
season = Stagioni.objects.create(numero_stagione=seasons,serie_tv=serietv)
|
||
|
for episodes in tv_show_info['data']:
|
||
|
if season.numero_stagione == episodes['airedSeason']:
|
||
|
numero_stagione = Stagioni.objects.get(numero_stagione=season.numero_stagione,serie_tv=season.serie_tv)
|
||
|
Episodi.objects.create(stagione=numero_stagione,numero_episodio=episodes['airedEpisodeNumber'],streaming_link="",nome_episodio=episodes['episodeName'])
|
||
|
return redirect(serietv.get_absolute_url())
|
||
|
|
||
|
|
||
|
|
||
|
def preferiti(request,slug):
|
||
|
serietv = get_object_or_404(SerieTV,slug=slug)
|
||
|
user = request.user
|
||
|
profilo = get_object_or_404(Profilo,user=user)
|
||
|
preferito = serietv.preferito.filter(user=profilo.user)
|
||
|
if preferito.exists(): # Controllo se il ManyToManyField esiste filtrandolo con l'id dell'utente che esegue la richiesta
|
||
|
serietv.preferito.remove(profilo) # Se esiste rimuovo dai preferiti
|
||
|
messages.error(request, 'Film tolto dai preferiti correttamente!') # Mostro il messaggio
|
||
|
else:
|
||
|
serietv.preferito.add(profilo) # Se il ManyToManyField non esiste lo creo aggiungendo ai preferiti l'id dell'utente che esegue la richiesta
|
||
|
messages.success(request, 'Film aggiunto ai preferiti correttamente!') # Mostro il messaggio
|
||
|
return HttpResponseRedirect(serietv.get_absolute_url()) # Ritorno l'absolute url del film
|
||
|
|
||
|
def guarda_dopo(request,slug):
|
||
|
serietv = get_object_or_404(SerieTV,slug=slug)
|
||
|
user = request.user
|
||
|
profilo = get_object_or_404(Profilo,user=user)
|
||
|
guarda_dopo = serietv.guarda_dopo.filter(user=profilo.user)
|
||
|
if guarda_dopo.exists():
|
||
|
serietv.guarda_dopo.remove(profilo)
|
||
|
else:
|
||
|
serietv.guarda_dopo.add(profilo)
|
||
|
return HttpResponseRedirect(serietv.get_absolute_url())
|
||
|
|
||
|
class DeleteComment(DeleteView):
|
||
|
model = CommentoSerieTV
|
||
|
|
||
|
def get_success_url(self):
|
||
|
tv_show = self.get_object().media
|
||
|
return reverse_lazy('serietvdetail', kwargs={'slug': tv_show.slug})
|