207 lines
10 KiB
Python
207 lines
10 KiB
Python
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}) |