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 = { DATABASES = {
'default': { 'default': {
'ENGINE': 'django.db.backends.sqlite3', '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_URL = '/accounts/login/'
LOGIN_REDIRECT_URL = '/gestion/libros' 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 import admin
from django.contrib.auth.admin import UserAdmin
# Register your models here. # 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(Autor)
admin.site.register(Libro) 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 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 AutorForm(forms.ModelForm):
class Meta: class Meta:
@ -25,3 +27,15 @@ class LibroForm(forms.ModelForm):
queryset=Autor.objects.all(), queryset=Autor.objects.all(),
widget=forms.Select(attrs={'class': 'form-control'})) 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 django.db.models.deletion
import gestion.models
from django.db import migrations, models from django.db import migrations, models
@ -9,26 +11,25 @@ class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
('auth', '0012_alter_user_first_name_max_length'),
] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='Autor',
name='ReyMotaUser',
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('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 from django.db import models
import datetime import datetime
from django.core.validators import MaxValueValidator, MinValueValidator from django.core.validators import MaxValueValidator, MinValueValidator
from django.utils.translation import gettext_lazy as _
from .managers import ReyMotaUserManager
def current_year(): def current_year():
return datetime.date.today().year return datetime.date.today().year
@ -28,3 +31,18 @@ class Libro(models.Model):
def __str__(self): def __str__(self):
return self.titulo 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-utilities col-auto">
<div class="app-utility-item app-user-dropdown dropdown"> <div class="app-utility-item app-user-dropdown dropdown">
{% if user.is_authenticated %} {% 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 %} {% else %}
<a class="dropdown-toggle" id="user-dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">Sin usuario</a> <a class="dropdown-toggle" id="user-dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">Sin usuario</a>
{% endif %} {% endif %}
@ -141,5 +141,5 @@
</nav><!--//app-nav--> </nav><!--//app-nav-->
</div><!--//sidepanel-inner--> </div><!--//sidepanel-inner-->
</div><!--//app-sidepanel--> </div><!--//app-sidepanel-->
</header><!--//app-header--> </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