from django.shortcuts import render,get_object_or_404,redirect,HttpResponseRedirect from django.core.paginator import Paginator from django.contrib import messages from django.views.generic.edit import DeleteView from django.urls.base import reverse, reverse_lazy from .models import Anime,Episodi,Stagioni,GenereAnime,CommentoAnime,SegnalazioneAnime,Immagini from .forms import SearchAnimeAPI,CommentiForms,SegnalazioneAnimeForm from core.models import Profilo from django.http import HttpResponse 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 import random import re # Create your views here. def lista_generi(request): generi_anime = GenereAnime.objects.all() context = {"generi_anime":generi_anime} return render(request,'lista_generi_anime.html',context) def anime_genere(request,genere): genere_anime = get_object_or_404(GenereAnime,genere=genere) anime = Anime.objects.filter(genere=genere_anime) context = {"genere":genere_anime,"anime":anime} return render(request,'anime_genere.html',context) def anime_youmightlike(genres,anime): random_picked_genre = random.sample(genres,1) anime_same_genres = Anime.objects.filter(genere__in=random_picked_genre).values("titolo") current_anime = anime.titolo anime_with_same_genre = Anime.objects.exclude(titolo=current_anime) number_anime_with_same_genre = Anime.objects.filter(genere__in=random_picked_genre).count() # random_anime_list = random.randint(1,number_anime_with_same_genre) # rand_anime = random.sample(list(anime_with_same_genre),min(random_anime_list, len(anime_with_same_genre))) # comportamento precedente rand_anime = random.sample(list(anime_with_same_genre), number_anime_with_same_genre if number_anime_with_same_genre < 8 else 8) # seleziona casualmente degli elementi univoci nel database return rand_anime def anime_subita(request): sub_ita = "SUB-ITA" anime_sub_ita_filter = Anime.objects.filter(lingua=sub_ita).order_by('-creato_in_data') generi = GenereAnime.objects.all() paginator = Paginator(anime_sub_ita_filter, 100) numero_pagina = request.GET.get('pagina') anime_sub_ita = paginator.get_page(numero_pagina) context = {"anime_sub_ita":anime_sub_ita,"generi":generi} return render(request,"anime_sub_ita.html",context) def anime_ita(request): ita = "ITA" anime_ita_filter = Anime.objects.filter(lingua=ita).order_by('-creato_in_data') generi = GenereAnime.objects.all() paginator = Paginator(anime_ita_filter, 100) numero_pagina = request.GET.get('pagina') anime_ita = paginator.get_page(numero_pagina) context = {"anime_ita":anime_ita,"generi":generi} return render(request,"anime_ita.html",context) def anime_detail(request,slug): anime = get_object_or_404(Anime,slug=slug) anime.visualizzazioni += 1 anime.save() immagini_anime = Immagini.objects.filter(anime=anime) genres = list(anime.genere.all()) anime_chetipotrebberopiacere = anime_youmightlike(genres,anime) commenti = CommentoAnime.objects.filter(media=anime).order_by("-data_commento") is_favorite = False watch_later = False if request.user.is_authenticated: profilo = get_object_or_404(Profilo,user=request.user) preferito = anime.preferito.filter(user=profilo.user) guarda = anime.guarda_dopo.filter(user=profilo.user) if preferito.exists(): is_favorite = True if guarda.exists(): watch_later = True else: is_favorite = False watch_later = False if request.method == "POST": commenti_form = CommentiForms(request.POST or None) if commenti_form.is_valid(): commenti_form.save(commit=False) commenti_form.instance.media = anime profilo = Profilo.objects.get(user=request.user) commenti_form.instance.utente = profilo commenti_form.save() return HttpResponseRedirect(anime.get_absolute_url()) else: commenti_form = CommentiForms() if request.method == "POST": segnala_anime_form = SegnalazioneAnimeForm(request.POST) if segnala_anime_form.is_valid(): segnala_anime_form.save(commit=False) segnala_anime_form.instance.anime = anime segnala_anime_form.save() return HttpResponseRedirect(anime.get_absolute_url()) else: segnala_anime_form = SegnalazioneAnimeForm() context = {"anime":anime,"anime_chetipotrebberopiacere":anime_chetipotrebberopiacere,"is_favorite":is_favorite,"watch_later":watch_later,"segnala_anime_form":segnala_anime_form,"commenti_form":commenti_form,"commenti":commenti,"immagini_anime":immagini_anime} return render(request,"anime_template.html",context) @staff_member_required def add_anime_api(request): if request.method == "GET": form = SearchAnimeAPI(request.GET or None) if form.is_valid(): serie = form.cleaned_data["anime"] 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) anime = {"titolo":titolo,"descrizione":descrizione,"poster":img_path,"lista_generi":lista_generi,"stagioni":stagioni,"generi":generi} return render(request,'visualizza_risultatianime.html',anime) else: form = SearchAnimeAPI() context = {"form":form} return render(request,'aggiungi_anime_api.html',context) @staff_member_required def salva_anime(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 data_uscita = data_tv_show["data"][0]["firstAired"] data_rilascio = re.search('(^.{4})',data_uscita) year = data_rilascio.group(1) anime = Anime() if Anime.objects.filter(titolo=titolo).exists(): return HttpResponse('Anime giĆ” presente nel DB!') else: anime.titolo = titolo anime.descrizione = descrizione anime.immagine_poster = get_image(poster) anime.immagine_background = get_image(background_path) anime.data_uscita = year anime.save() generi = list(generi.split(", ")) lista_generi_ita = englishgenres(generi) for genre in lista_generi_ita: if GenereAnime.objects.filter(genere=genre).exists(): genere = GenereAnime.objects.get(genere=genre) anime.genere.add(genere) else: GenereAnime.objects.get_or_create(genere=genre) genere = GenereAnime.objects.get(genere=genre) anime.genere.add(genere) if stagioni == 1: season = Stagioni.objects.create(numero_stagione=stagioni,anime=anime) for episodes in tv_show_info['data']: if season.numero_stagione == episodes['airedSeason']: numero_stagione = Stagioni.objects.get(numero_stagione=season.numero_stagione,anime=season.anime) 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,anime=anime) for episodes in tv_show_info['data']: if season.numero_stagione == episodes['airedSeason']: numero_stagione = Stagioni.objects.get(numero_stagione=season.numero_stagione,anime=season.anime) Episodi.objects.create(stagione=numero_stagione,numero_episodio=episodes['airedEpisodeNumber'],streaming_link="",nome_episodio=episodes['episodeName']) return redirect(anime.get_absolute_url()) def preferiti(request,slug): anime = get_object_or_404(Anime,slug=slug) user = request.user profilo = get_object_or_404(Profilo,user=user) preferito = anime.preferito.filter(user=profilo.user) if preferito.exists(): # Controllo se il ManyToManyField esiste filtrandolo con l'id dell'utente che esegue la richiesta anime.preferito.remove(profilo) # Se esiste rimuovo dai preferiti messages.error(request, 'Film tolto dai preferiti correttamente!') # Mostro il messaggio else: anime.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(anime.get_absolute_url()) # Ritorno l'absolute url del film def guarda_dopo(request,slug): anime = get_object_or_404(Anime,slug=slug) user = request.user profilo = get_object_or_404(Profilo,user=user) guarda_dopo = anime.guarda_dopo.filter(user=profilo.user) if guarda_dopo.exists(): anime.guarda_dopo.remove(profilo) else: anime.guarda_dopo.add(profilo) return HttpResponseRedirect(anime.get_absolute_url()) class DeleteComment(DeleteView): model = CommentoAnime def get_success_url(self): anime = self.get_object().media return reverse_lazy('anime-detail', kwargs={'slug': anime.slug})