LORDCHANNEL2.0/Anime/views.py

207 lines
10 KiB
Python
Raw Permalink Normal View History

2021-03-13 18:36:50 +00:00
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})