diff --git a/Libros/biblioteca/biblioteca/settings.py b/Libros/biblioteca/biblioteca/settings.py index 2c494ee..0ad5445 100644 --- a/Libros/biblioteca/biblioteca/settings.py +++ b/Libros/biblioteca/biblioteca/settings.py @@ -77,7 +77,7 @@ WSGI_APPLICATION = 'biblioteca.wsgi.application' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', + 'NAME': BASE_DIR / 'libros.sqlite3', } } @@ -125,4 +125,6 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' LOGIN_URL = '/accounts/login/' LOGIN_REDIRECT_URL = '/gestion/libros' -LOGOUT_REDIRECT_URL = 'principal' \ No newline at end of file +LOGOUT_REDIRECT_URL = 'principal' + +AUTH_USER_MODEL = "gestion.ReyMotaUser" diff --git a/Libros/biblioteca/gestion/admin.py b/Libros/biblioteca/gestion/admin.py index 027b055..4acf35f 100644 --- a/Libros/biblioteca/gestion/admin.py +++ b/Libros/biblioteca/gestion/admin.py @@ -1,9 +1,37 @@ from django.contrib import admin +from django.contrib.auth.admin import UserAdmin # Register your models here. -from .models import Autor, Libro +from .models import Autor, Libro, ReyMotaUser +from .forms import ReyMotaUserCreationForm, ReyMotaUserChangeForm admin.site.register(Autor) admin.site.register(Libro) + +class ReyMotaUserAdmin(UserAdmin): + add_form = ReyMotaUserCreationForm + form = ReyMotaUserChangeForm + model = ReyMotaUser + list_display = ("email", "is_staff", "is_active", "foto") + list_filter = ("email", "is_staff", "is_active",) + fieldsets = ( + (None, {"fields": ("email", "password")}), + ("Permissions", {"fields": ("is_staff", "is_active", "groups", "user_permissions")}), + ("Varios", {"fields": ("foto",)}), + ) + add_fieldsets = ( + (None, { + "classes": ("wide",), + "fields": ( + "email", "password1", "password2", "is_staff", + "is_active", "groups", "user_permissions" + )} + ), + ("Varios", {"fields": ("foto",)}), + ) + search_fields = ("email",) + ordering = ("email",) + +admin.site.register(ReyMotaUser, ReyMotaUserAdmin) \ No newline at end of file diff --git a/Libros/biblioteca/gestion/forms.py b/Libros/biblioteca/gestion/forms.py index c26f299..46a119f 100644 --- a/Libros/biblioteca/gestion/forms.py +++ b/Libros/biblioteca/gestion/forms.py @@ -1,5 +1,7 @@ from django import forms -from .models import Autor, Libro +from django.contrib.auth.forms import UserCreationForm, UserChangeForm + +from .models import Autor, Libro, ReyMotaUser class AutorForm(forms.ModelForm): class Meta: @@ -25,3 +27,15 @@ class LibroForm(forms.ModelForm): queryset=Autor.objects.all(), widget=forms.Select(attrs={'class': 'form-control'})) +class ReyMotaUserCreationForm(UserCreationForm): + + class Meta: + model = ReyMotaUser + fields = ("email", "foto") + + +class ReyMotaUserChangeForm(UserChangeForm): + + class Meta: + model = ReyMotaUser + fields = ("email", "foto") \ No newline at end of file diff --git a/Libros/biblioteca/gestion/managers.py b/Libros/biblioteca/gestion/managers.py new file mode 100644 index 0000000..a42b5cc --- /dev/null +++ b/Libros/biblioteca/gestion/managers.py @@ -0,0 +1,34 @@ +from django.contrib.auth.base_user import BaseUserManager +from django.utils.translation import gettext_lazy as _ + + +class ReyMotaUserManager(BaseUserManager): + """ + ReyMota user model manager where email is the unique identifiers + for authentication instead of usernames. + """ + def create_user(self, email, password, **extra_fields): + """ + Create and save a user with the given email and password. + """ + if not email: + raise ValueError(_("The Email must be set")) + email = self.normalize_email(email) + user = self.model(email=email, **extra_fields) + user.set_password(password) + user.save() + return user + + def create_superuser(self, email, password, **extra_fields): + """ + Create and save a SuperUser with the given email and password. + """ + extra_fields.setdefault("is_staff", True) + extra_fields.setdefault("is_superuser", True) + extra_fields.setdefault("is_active", True) + + if extra_fields.get("is_staff") is not True: + raise ValueError(_("Superuser must have is_staff=True.")) + if extra_fields.get("is_superuser") is not True: + raise ValueError(_("Superuser must have is_superuser=True.")) + return self.create_user(email, password, **extra_fields) \ No newline at end of file diff --git a/Libros/biblioteca/gestion/migrations/0001_initial.py b/Libros/biblioteca/gestion/migrations/0001_initial.py index 42193b5..5190c89 100644 --- a/Libros/biblioteca/gestion/migrations/0001_initial.py +++ b/Libros/biblioteca/gestion/migrations/0001_initial.py @@ -1,6 +1,8 @@ -# Generated by Django 5.0.7 on 2024-08-05 09:29 +# Generated by Django 5.0.7 on 2024-08-09 09:07 +import django.core.validators import django.db.models.deletion +import gestion.models from django.db import migrations, models @@ -9,26 +11,25 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), ] operations = [ migrations.CreateModel( - name='Autor', + name='ReyMotaUser', 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)), - ], - ), - 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.DateField()), - ('descripcion', models.TextField(blank=True, null=True)), - ('archivo', models.FileField(upload_to='libros/')), - ('autor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gestion.autor')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('email', models.EmailField(max_length=254, unique=True, verbose_name='email address')), + ('foto', models.ImageField(blank=True, upload_to='profile_images')), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), ], + options={ + 'abstract': False, + }, ), + ] diff --git a/Libros/biblioteca/gestion/migrations/0002_alter_libro_fecha_publicacion.py b/Libros/biblioteca/gestion/migrations/0002_alter_libro_fecha_publicacion.py deleted file mode 100644 index fb30d3a..0000000 --- a/Libros/biblioteca/gestion/migrations/0002_alter_libro_fecha_publicacion.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 5.0.7 on 2024-08-05 10:17 - -import django.core.validators -import gestion.models -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('gestion', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='libro', - name='fecha_publicacion', - field=models.PositiveBigIntegerField(default=2024, validators=[django.core.validators.MinValueValidator(1984), gestion.models.max_value_current_year]), - ), - ] diff --git a/Libros/biblioteca/gestion/migrations/0002_autor_reymotauser_is_active_reymotauser_is_staff_and_more.py b/Libros/biblioteca/gestion/migrations/0002_autor_reymotauser_is_active_reymotauser_is_staff_and_more.py new file mode 100644 index 0000000..daa1d50 --- /dev/null +++ b/Libros/biblioteca/gestion/migrations/0002_autor_reymotauser_is_active_reymotauser_is_staff_and_more.py @@ -0,0 +1,26 @@ +# Generated by Django 5.0.7 on 2024-08-09 09:13 + +import django.core.validators +import django.db.models.deletion +import gestion.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('gestion', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='reymotauser', + name='is_active', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='reymotauser', + name='is_staff', + field=models.BooleanField(default=False), + ), + ] diff --git a/Libros/biblioteca/gestion/migrations/0003_libro_portada.py b/Libros/biblioteca/gestion/migrations/0003_libro_portada.py deleted file mode 100644 index 3294c48..0000000 --- a/Libros/biblioteca/gestion/migrations/0003_libro_portada.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.0.7 on 2024-08-05 10:24 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('gestion', '0002_alter_libro_fecha_publicacion'), - ] - - operations = [ - migrations.AddField( - model_name='libro', - name='portada', - field=models.ImageField(blank=True, null=True, upload_to='portadas/'), - ), - ] diff --git a/Libros/biblioteca/gestion/migrations/0004_autor_foto.py b/Libros/biblioteca/gestion/migrations/0004_autor_foto.py deleted file mode 100644 index f46d19b..0000000 --- a/Libros/biblioteca/gestion/migrations/0004_autor_foto.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.0.7 on 2024-08-05 10:29 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('gestion', '0003_libro_portada'), - ] - - operations = [ - migrations.AddField( - model_name='autor', - name='foto', - field=models.ImageField(blank=True, null=True, upload_to='autores/'), - ), - ] diff --git a/Libros/biblioteca/gestion/models.py b/Libros/biblioteca/gestion/models.py index 11d5cea..73ae3ca 100644 --- a/Libros/biblioteca/gestion/models.py +++ b/Libros/biblioteca/gestion/models.py @@ -1,7 +1,10 @@ +from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin from django.db import models - import datetime from django.core.validators import MaxValueValidator, MinValueValidator +from django.utils.translation import gettext_lazy as _ + +from .managers import ReyMotaUserManager def current_year(): return datetime.date.today().year @@ -28,3 +31,18 @@ class Libro(models.Model): def __str__(self): return self.titulo + + +class ReyMotaUser(AbstractBaseUser, PermissionsMixin): + email = models.EmailField(_("email address"), unique=True) + foto = models.ImageField(upload_to="profile_images", blank=True) + is_staff = models.BooleanField(default=False) + is_active = models.BooleanField(default=True) + + USERNAME_FIELD = "email" + REQUIRED_FIELDS = [] + + objects = ReyMotaUserManager() + + def __str__(self): + return self.email \ No newline at end of file diff --git a/Libros/biblioteca/gestion/templates/_cabecera.html b/Libros/biblioteca/gestion/templates/_cabecera.html index 57b87e4..b82dbf7 100644 --- a/Libros/biblioteca/gestion/templates/_cabecera.html +++ b/Libros/biblioteca/gestion/templates/_cabecera.html @@ -15,7 +15,7 @@