# Create your views here. from django.shortcuts import render, get_object_or_404, redirect from django.contrib.auth.decorators import login_required from rest_framework.response import Response from rest_framework.decorators import api_view from .models import Artista, Album, Song from .forms import ArtistaForm, AlbumForm, SongForm from .serializers import ArtistaSerializer, AlbumSerializer, CancionSerializer import logging logger = logging.getLogger(__name__) @login_required def principal(request): artistas = Artista.objects.all() albumes = Album.objects.all() return render(request, 'lyrics/index.html', {'artistas': artistas, 'albumes': albumes}) ######################### # Vistas para los artistas @login_required def lista_artistas(request): artistas = Artista.objects.all() return render(request, 'lyrics/lista_artistas.html', {'artistas': artistas}) @login_required def detalle_artista(request, artista_id): artista = get_object_or_404(Artista, pk=artista_id) albumes = Album.objects.filter(artist=artista_id) return render(request, 'lyrics/detalle_artista.html', {'artista': artista, 'albumes': albumes}) @login_required def nuevo_artista(request): if request.method == 'POST': form = ArtistaForm(request.POST, request.FILES) if form.is_valid(): form.save() return redirect('lyrics:lista_artistas') else: form = ArtistaForm() return render(request, 'lyrics/form_artista.html', {'form': form}) @login_required def editar_artista(request, artista_id): artista = get_object_or_404(Artista, pk=artista_id) if request.method == 'POST': form = ArtistaForm(request.POST, request.FILES, instance=artista) if form.is_valid(): form.save() return redirect('lyrics:lista_artistas') else: form = ArtistaForm(instance=artista) return render(request, 'lyrics/form_artista.html', {'form': form}) @login_required def eliminar_artista(request, artista_id): artista = get_object_or_404(Artista, pk=artista_id) artista.delete() return redirect('lyrics:lista_artistas') ######################### # Vistas para los albumes @login_required def lista_albumes(request): albumes = Album.objects.all() return render(request, 'lyrics/lista_albumes.html', {'albumes': albumes}) @login_required def detalle_album(request, album_id): album = get_object_or_404(Album, pk=album_id) songs = Song.objects.filter(album_id=album_id) return render(request, 'lyrics/detalle_album.html', {'album': album, 'songs': songs}) @login_required def nuevo_album(request): artistas = Artista.objects.all() # vamos a ver si hay vehículos dados de alta if artistas: if request.method == 'POST': form = AlbumForm(request.POST, request.FILES) if form.is_valid(): form.save() return redirect('lyrics:lista_albumes') else: form = AlbumForm() return render(request, 'lyrics/form_album.html', {'form': form}) else: return render(request, 'lyrics/index.html') @login_required def editar_album(request, album_id): album = get_object_or_404(Album, pk=album_id) if request.method == 'POST': form = AlbumForm(request.POST, request.FILES, instance=album) if form.is_valid(): form.save() return redirect('lyrics:lista_albumes') else: form = AlbumForm(instance=album) return render(request, 'lyrics/form_album.html', {'form': form}) @login_required def eliminar_album(request, album_id): album = Album.objects.get(pk=album_id) album.delete() return redirect('lyrics:lista_albumes') ######################### # Vistas para los songs @login_required def lista_songs(request): songs = Song.objects.all() return render(request, 'lyrics/lista_songs.html', {'songs': songs}) @login_required def detalle_song(request, song_id): song = get_object_or_404(Song, pk=song_id) albumes = Album.objects.filter(song=song_id) return render(request, 'lyrics/detalle_song.html', {'song': song, 'albumes': albumes}) @login_required def nuevo_song(request): album_id = request.GET.get('album_id') # Obtener el album_id de los parámetros de la URL if request.method == 'POST': form = SongForm(request.POST, request.FILES) if form.is_valid(): album = form.cleaned_data['album'] song_count = album.song.count() nueva_cancion = form.save(commit=False) nueva_cancion.pista = song_count + 1 nueva_cancion.save() logger.info("Canción creada %s", nueva_cancion.title) return redirect('lyrics:lista_songs') else: if album_id: # Si tenemos un album_id, preseleccionamos ese álbum en el formulario album = get_object_or_404(Album, id=album_id) form = SongForm(initial={'album': album, 'artist': album.artist, 'year': album.year}) else: form = SongForm() return render(request, 'lyrics/form_song.html', {'form': form}) @login_required def editar_song(request, song_id): song = get_object_or_404(Song, pk=song_id) if request.method == 'POST': form = SongForm(request.POST, request.FILES, instance=song) if form.is_valid(): form.save() return redirect('lyrics:lista_songs') else: form = SongForm(instance=song) return render(request, 'lyrics/form_song.html', {'form': form}) @login_required def eliminar_song(request, song_id): song = get_object_or_404(Song, pk=song_id) song.delete() return redirect('lyrics:lista_songs') @api_view(['GET']) def api_lista_artistas(request): """Devuelve la lista de todos los artistas.""" artistas = Artista.objects.all() serializer = ArtistaSerializer(artistas, many=True) return Response(serializer.data) @api_view(['GET']) def api_detalle_artista(request, artista_id): """Devuelve los detalles de un artista específico.""" try: artista = Artista.objects.get(id=artista_id) serializer = ArtistaSerializer(artista) return Response(serializer.data) except Artista.DoesNotExist: return Response({'error': 'Artista no encontrado'}, status=404) @api_view(['GET']) def api_lista_albumes(request): """Devuelve la lista de todos los albumes.""" albumes = Album.objects.all() serializer = AlbumSerializer(albumes, many=True) return Response(serializer.data) @api_view(['GET']) def api_detalle_album(request, album_id): """Devuelve los detalles de un album específico.""" try: album = Album.objects.get(id=album_id) serializer = AlbumSerializer(album) return Response(serializer.data) except Album.DoesNotExist: return Response({'error': 'Album no encontrado'}, status=404) @api_view(['GET']) def api_lista_canciones(request): """Devuelve la lista de todos los canciones.""" canciones = Song.objects.all() serializer = CancionSerializer(canciones, many=True) return Response(serializer.data) @api_view(['GET']) def api_detalle_cancion(request, cancion_id): """Devuelve los detalles de un cancion específica.""" try: cancion = Song.objects.get(id=cancion_id) serializer = CancionSerializer(cancion) return Response(serializer.data) except Song.DoesNotExist: return Response({'error': 'Canción no encontrada'}, status=404)