LORDCHANNEL2.0/SerieTV/views.py

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