| @ -1,8 +0,0 @@ | |||
| from django.contrib import admin | |||
| # Register your models here. | |||
| from .models import Autor, Libro | |||
| admin.site.register(Autor) | |||
| admin.site.register(Libro) | |||
| @ -1,6 +0,0 @@ | |||
| from django.apps import AppConfig | |||
| class LibrosConfig(AppConfig): | |||
| default_auto_field = 'django.db.models.BigAutoField' | |||
| name = 'libros' | |||
| @ -1,30 +0,0 @@ | |||
| from django import forms | |||
| from .models import Autor, Libro | |||
| class AutorForm(forms.ModelForm): | |||
| class Meta: | |||
| model = Autor | |||
| fields = ['nombre', 'biografia', 'foto'] | |||
| nombre = forms.CharField( | |||
| widget=forms.TextInput(attrs={'class': 'form-control'})) | |||
| biografia = forms.CharField( | |||
| widget=forms.TextInput(attrs={'class': 'form-control'})) | |||
| class LibroForm(forms.ModelForm): | |||
| class Meta: | |||
| model = Libro | |||
| fields = ['titulo', 'autor', 'fecha_publicacion', 'descripcion', | |||
| 'archivo', 'portada'] | |||
| titulo = forms.CharField( | |||
| widget=forms.TextInput(attrs={'class': 'form-control'})) | |||
| descripcion = forms.CharField( | |||
| widget=forms.TextInput(attrs={'class': 'form-control'})) | |||
| autor = forms.ModelChoiceField( | |||
| queryset=Autor.objects.all(), | |||
| widget=forms.Select(attrs={'class': 'form-control'})) | |||
| @ -1,38 +0,0 @@ | |||
| # Generated by Django 4.2 on 2024-09-09 14:52 | |||
| import django.core.validators | |||
| from django.db import migrations, models | |||
| import django.db.models.deletion | |||
| import libros.models | |||
| class Migration(migrations.Migration): | |||
| initial = True | |||
| dependencies = [ | |||
| ] | |||
| operations = [ | |||
| migrations.CreateModel( | |||
| name='Autor', | |||
| fields=[ | |||
| ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | |||
| ('nombre', models.CharField(max_length=200)), | |||
| ('biografia', models.TextField(blank=True, null=True)), | |||
| ('foto', models.ImageField(blank=True, null=True, upload_to='autores/')), | |||
| ], | |||
| ), | |||
| migrations.CreateModel( | |||
| name='Libro', | |||
| fields=[ | |||
| ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | |||
| ('titulo', models.CharField(max_length=200)), | |||
| ('fecha_publicacion', models.PositiveBigIntegerField(default=2024, validators=[django.core.validators.MinValueValidator(1984), libros.models.max_value_current_year])), | |||
| ('descripcion', models.TextField(blank=True, null=True)), | |||
| ('archivo', models.FileField(upload_to='libros/')), | |||
| ('portada', models.ImageField(blank=True, null=True, upload_to='portadas/')), | |||
| ('autor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='libros.autor')), | |||
| ], | |||
| ), | |||
| ] | |||
| @ -1,32 +0,0 @@ | |||
| from django.db import models | |||
| import datetime | |||
| from django.core.validators import MaxValueValidator, MinValueValidator | |||
| def current_year(): | |||
| return datetime.date.today().year | |||
| def max_value_current_year(value): | |||
| return MaxValueValidator(current_year())(value) | |||
| class Autor(models.Model): | |||
| nombre = models.CharField(max_length=200) | |||
| biografia = models.TextField(blank=True, null=True) | |||
| foto = models.ImageField(upload_to='autores/', blank=True, null=True) # Nuevo campo | |||
| def __str__(self): | |||
| return self.nombre | |||
| class Libro(models.Model): | |||
| titulo = models.CharField(max_length=200) | |||
| autor = models.ForeignKey(Autor, on_delete=models.CASCADE) | |||
| fecha_publicacion = models.PositiveBigIntegerField(default=current_year(), validators=[MinValueValidator(1984), max_value_current_year]) | |||
| descripcion = models.TextField(blank=True, null=True) | |||
| archivo = models.FileField(upload_to='libros/') | |||
| portada = models.ImageField(upload_to='portadas/', blank=True, null=True) # Nuevo campo | |||
| def __str__(self): | |||
| return self.titulo | |||
| @ -1,3 +0,0 @@ | |||
| from django.test import TestCase | |||
| # Create your tests here. | |||
| @ -1,21 +0,0 @@ | |||
| from django.urls import path | |||
| from . import views | |||
| app_name = 'libros' | |||
| urlpatterns = [ | |||
| path('', views.principal, name='principal'), | |||
| path('autores/', views.lista_autores, name='lista_autores'), | |||
| path('autores/nuevo/', views.nuevo_autor, name='nuevo_autor'), | |||
| path('autores/<int:autor_id>/', views.detalle_autor, name='detalle_autor'), | |||
| path('autores/<int:autor_id>/editar/', views.editar_autor, name='editar_autor'), | |||
| path('autores/<int:autor_id>/eliminar/', views.eliminar_autor, name='eliminar_autor'), | |||
| path('libros/', views.lista_libros, name='lista_libros'), | |||
| path('libros/nuevo/', views.nuevo_libro, name='nuevo_libro'), | |||
| path('libros/<int:libro_id>/', views.detalle_libro, name='detalle_libro'), | |||
| path('libros/<int:libro_id>/editar/', views.editar_libro, name='editar_libro'), | |||
| path('libros/<int:libro_id>/eliminar/', views.eliminar_libro, name='eliminar_libro'), | |||
| ] | |||
| @ -1,103 +0,0 @@ | |||
| from django.shortcuts import render, get_object_or_404, redirect | |||
| from django.contrib.auth.decorators import login_required | |||
| from .models import Autor, Libro | |||
| from .forms import AutorForm, LibroForm | |||
| @login_required | |||
| def principal(request): | |||
| return render(request, 'libros/index.html') | |||
| # Vistas para los autores | |||
| @login_required | |||
| def lista_autores(request): | |||
| autores = Autor.objects.all() | |||
| return render(request, 'libros/lista_autores.html', {'autores': autores}) | |||
| @login_required | |||
| def detalle_autor(request, autor_id): | |||
| autor = get_object_or_404(Autor, pk=autor_id) | |||
| libros = Libro.objects.filter(autor=autor_id) | |||
| return render(request, 'libros/detalle_autor.html', {'autor': autor, 'libros': libros}) | |||
| @login_required | |||
| def nuevo_autor(request): | |||
| if request.method == 'POST': | |||
| form = AutorForm(request.POST, request.FILES) | |||
| if form.is_valid(): | |||
| form.save() | |||
| return redirect('libros:lista_autores') | |||
| else: | |||
| form = AutorForm() | |||
| return render(request, 'libros/form_autor.html', {'form': form}) | |||
| @login_required | |||
| def editar_autor(request, autor_id): | |||
| autor = get_object_or_404(Autor, pk=autor_id) | |||
| if request.method == 'POST': | |||
| form = AutorForm(request.POST, request.FILES, instance=autor) | |||
| if form.is_valid(): | |||
| form.save() | |||
| return redirect('libros:lista_autores') | |||
| else: | |||
| form = AutorForm(instance=autor) | |||
| return render(request, 'libros/form_autor.html', {'form': form}) | |||
| @login_required | |||
| def eliminar_autor(request, autor_id): | |||
| autor = get_object_or_404(Autor, pk=autor_id) | |||
| autor.delete() | |||
| return redirect('libros:lista_autores') | |||
| # Vistas para los libros | |||
| @login_required | |||
| def lista_libros(request): | |||
| libros = Libro.objects.all() | |||
| return render(request, 'libros/lista_libros.html', {'libros': libros}) | |||
| @login_required | |||
| def detalle_libro(request, libro_id): | |||
| libro = get_object_or_404(Libro, pk=libro_id) | |||
| return render(request, 'libros/detalle_libro.html', {'libro': libro}) | |||
| @login_required | |||
| def nuevo_libro(request): | |||
| if request.method == 'POST': | |||
| form = LibroForm(request.POST, request.FILES) | |||
| if form.is_valid(): | |||
| form.save() | |||
| return redirect('libros:lista_libros') | |||
| else: | |||
| form = LibroForm() | |||
| return render(request, 'libros/form_libro.html', {'form': form}) | |||
| @login_required | |||
| def editar_libro(request, libro_id): | |||
| libro = get_object_or_404(Libro, pk=libro_id) | |||
| if request.method == 'POST': | |||
| form = LibroForm(request.POST, request.FILES, instance=libro) | |||
| if form.is_valid(): | |||
| form.save() | |||
| return redirect('libros:lista_libros') | |||
| else: | |||
| form = LibroForm(instance=libro) | |||
| return render(request, 'libros/form_libro.html', {'form': form}) | |||
| @login_required | |||
| def eliminar_libro(request, libro_id): | |||
| libro = get_object_or_404(Libro, pk=libro_id) | |||
| libro.delete() | |||
| return redirect('libros:lista_libros') | |||
| @ -0,0 +1,7 @@ | |||
| from django.core.management.base import BaseCommand | |||
| from repostajes.models import Vehiculo, Repostaje | |||
| class Command(BaseCommand): | |||
| def handle(self, *args, **options): | |||
| Vehiculo.objects.all().delete() | |||
| Repostaje.objects.all().delete() | |||