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