Browse Source

Modelo de usuarios personalizado con foto

politica
Celestino Rey 1 year ago
parent
commit
6c6e22e8c0
13 changed files with 145 additions and 78 deletions
  1. +4
    -2
      Libros/biblioteca/biblioteca/settings.py
  2. +29
    -1
      Libros/biblioteca/gestion/admin.py
  3. +15
    -1
      Libros/biblioteca/gestion/forms.py
  4. +34
    -0
      Libros/biblioteca/gestion/managers.py
  5. +16
    -15
      Libros/biblioteca/gestion/migrations/0001_initial.py
  6. +0
    -20
      Libros/biblioteca/gestion/migrations/0002_alter_libro_fecha_publicacion.py
  7. +26
    -0
      Libros/biblioteca/gestion/migrations/0002_autor_reymotauser_is_active_reymotauser_is_staff_and_more.py
  8. +0
    -18
      Libros/biblioteca/gestion/migrations/0003_libro_portada.py
  9. +0
    -18
      Libros/biblioteca/gestion/migrations/0004_autor_foto.py
  10. +19
    -1
      Libros/biblioteca/gestion/models.py
  11. +2
    -2
      Libros/biblioteca/gestion/templates/_cabecera.html
  12. BIN
      Libros/biblioteca/libros.sqlite3
  13. BIN
      Libros/biblioteca/profile_images/gravatar-tino.jpeg

+ 4
- 2
Libros/biblioteca/biblioteca/settings.py View File

@ -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'
LOGOUT_REDIRECT_URL = 'principal'
AUTH_USER_MODEL = "gestion.ReyMotaUser"

+ 29
- 1
Libros/biblioteca/gestion/admin.py View File

@ -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)

+ 15
- 1
Libros/biblioteca/gestion/forms.py View File

@ -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")

+ 34
- 0
Libros/biblioteca/gestion/managers.py View File

@ -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)

+ 16
- 15
Libros/biblioteca/gestion/migrations/0001_initial.py View File

@ -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,
},
),
]

+ 0
- 20
Libros/biblioteca/gestion/migrations/0002_alter_libro_fecha_publicacion.py View File

@ -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]),
),
]

+ 26
- 0
Libros/biblioteca/gestion/migrations/0002_autor_reymotauser_is_active_reymotauser_is_staff_and_more.py View File

@ -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),
),
]

+ 0
- 18
Libros/biblioteca/gestion/migrations/0003_libro_portada.py View File

@ -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/'),
),
]

+ 0
- 18
Libros/biblioteca/gestion/migrations/0004_autor_foto.py View File

@ -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/'),
),
]

+ 19
- 1
Libros/biblioteca/gestion/models.py View File

@ -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

+ 2
- 2
Libros/biblioteca/gestion/templates/_cabecera.html View File

@ -15,7 +15,7 @@
<div class="app-utilities col-auto">
<div class="app-utility-item app-user-dropdown dropdown">
{% if user.is_authenticated %}
<a class="dropdown-toggle" id="user-dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">{{ user.get_username }}</a>
<a class="dropdown-toggle" id="user-dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false"><img src="{{ user.foto }}"></a>
{% else %}
<a class="dropdown-toggle" id="user-dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">Sin usuario</a>
{% endif %}
@ -141,5 +141,5 @@
</nav><!--//app-nav-->
</div><!--//sidepanel-inner-->
</div><!--//app-sidepanel-->
</header><!--//app-header-->

BIN
Libros/biblioteca/db.sqlite3 → Libros/biblioteca/libros.sqlite3 View File


BIN
Libros/biblioteca/profile_images/gravatar-tino.jpeg View File

Before After
Width: 256  |  Height: 256  |  Size: 29 KiB

Loading…
Cancel
Save