Modificando codigo para que pylint sea feliz
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
"""Configura el panel de administracion para la aplicacion"""
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.contrib.auth.forms import ReadOnlyPasswordHashField
|
from django.contrib.auth.forms import ReadOnlyPasswordHashField
|
||||||
from django.contrib.auth.models import Group
|
from django.contrib.auth.models import Group
|
||||||
@@ -5,18 +6,26 @@ from django import forms
|
|||||||
|
|
||||||
from users.models import User, SocialNetworks
|
from users.models import User, SocialNetworks
|
||||||
|
|
||||||
|
# Remueve Group, el cual es definido por django pero mi modelo no lo tiene implementado ni
|
||||||
|
# lo utiliza
|
||||||
admin.site.unregister(Group)
|
admin.site.unregister(Group)
|
||||||
|
|
||||||
|
|
||||||
class UserAddForm(forms.ModelForm):
|
class UserAddForm(forms.ModelForm):
|
||||||
|
"""Formulario para agregar un usuario"""
|
||||||
password = forms.CharField(label='Contraseña', widget=forms.PasswordInput)
|
password = forms.CharField(label='Contraseña', widget=forms.PasswordInput)
|
||||||
password_confirmation = forms.CharField(label='Confirmación de contraseña', widget=forms.PasswordInput)
|
password_confirmation = forms.CharField(label='Confirmación de contraseña',
|
||||||
|
widget=forms.PasswordInput)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = User
|
model = User
|
||||||
fields = ('username', 'email')
|
fields = ('username', 'email')
|
||||||
|
|
||||||
def clean_password_confirmation(self):
|
def clean_password_confirmation(self):
|
||||||
|
"""Valida la contraseña con su confirmación
|
||||||
|
|
||||||
|
Es llamado por la autenticación de django
|
||||||
|
"""
|
||||||
password = self.cleaned_data.get("password")
|
password = self.cleaned_data.get("password")
|
||||||
password_confirmation = self.cleaned_data.get("password_confirmation")
|
password_confirmation = self.cleaned_data.get("password_confirmation")
|
||||||
|
|
||||||
@@ -26,6 +35,7 @@ class UserAddForm(forms.ModelForm):
|
|||||||
return password_confirmation
|
return password_confirmation
|
||||||
|
|
||||||
def save(self, commit=True):
|
def save(self, commit=True):
|
||||||
|
"""Guarda un usuario"""
|
||||||
user = super().save(commit=False)
|
user = super().save(commit=False)
|
||||||
user.set_password(self.cleaned_data['password'])
|
user.set_password(self.cleaned_data['password'])
|
||||||
|
|
||||||
@@ -36,6 +46,7 @@ class UserAddForm(forms.ModelForm):
|
|||||||
|
|
||||||
|
|
||||||
class UserChangeForm(forms.ModelForm):
|
class UserChangeForm(forms.ModelForm):
|
||||||
|
"""Formulario para editar un usuario"""
|
||||||
password = ReadOnlyPasswordHashField()
|
password = ReadOnlyPasswordHashField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
@@ -43,11 +54,20 @@ class UserChangeForm(forms.ModelForm):
|
|||||||
fields = ('username', 'email', 'password', 'is_admin')
|
fields = ('username', 'email', 'password', 'is_admin')
|
||||||
|
|
||||||
def clean_password(self):
|
def clean_password(self):
|
||||||
|
"""Retorna la contraseña inicial entregada al formulario
|
||||||
|
|
||||||
|
Esto es debido a que no se puede modificar la contraseña en esta sección
|
||||||
|
"""
|
||||||
return self.initial['password']
|
return self.initial['password']
|
||||||
|
|
||||||
|
|
||||||
@admin.register(User)
|
@admin.register(User)
|
||||||
class UserAdmin(admin.ModelAdmin):
|
class UserAdmin(admin.ModelAdmin):
|
||||||
|
"""Crea la defincion de Usuario para el panel de administracion
|
||||||
|
|
||||||
|
Tiene un formulario de creacion y modificacion;
|
||||||
|
"""
|
||||||
|
|
||||||
form = UserChangeForm
|
form = UserChangeForm
|
||||||
add_form = UserAddForm
|
add_form = UserAddForm
|
||||||
|
|
||||||
@@ -67,20 +87,26 @@ class UserAdmin(admin.ModelAdmin):
|
|||||||
ordering = ('username', 'email')
|
ordering = ('username', 'email')
|
||||||
|
|
||||||
def get_fieldsets(self, request, obj=None):
|
def get_fieldsets(self, request, obj=None):
|
||||||
|
"""Sobrescribe esta función para retornar los fieldsets correspondientes a agregar
|
||||||
|
un nuevo usuario"""
|
||||||
|
|
||||||
if not obj:
|
if not obj:
|
||||||
return self.add_fieldsets
|
return self.add_fieldsets
|
||||||
return super().get_fieldsets(request, obj)
|
return super().get_fieldsets(request, obj)
|
||||||
|
|
||||||
def get_form(self, request, obj=None, **kwargs):
|
def get_form(self, request, obj=None, change=False, **kwargs):
|
||||||
|
"""Sobrescribe esta función para retornar el formulario correspondiente a agregar
|
||||||
|
un nuevo usuario"""
|
||||||
defaults = {}
|
defaults = {}
|
||||||
if obj is None:
|
if obj is None:
|
||||||
defaults['form'] = self.add_form
|
defaults['form'] = self.add_form
|
||||||
defaults.update(kwargs)
|
defaults.update(kwargs)
|
||||||
return super().get_form(request, obj, **defaults)
|
return super().get_form(request, obj, change, **defaults)
|
||||||
|
|
||||||
|
|
||||||
@admin.register(SocialNetworks)
|
@admin.register(SocialNetworks)
|
||||||
class SocialNetworksAdmin(admin.ModelAdmin):
|
class SocialNetworksAdmin(admin.ModelAdmin):
|
||||||
|
"""Administrador para las redes sociales de un usuario"""
|
||||||
list_display = ('user', 'twitter', 'facebook', 'instagram', 'youtube', 'twitch')
|
list_display = ('user', 'twitter', 'facebook', 'instagram', 'youtube', 'twitch')
|
||||||
raw_id_fields = ('user',)
|
raw_id_fields = ('user',)
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
|
"""Definición de la configuración de la aplicación"""
|
||||||
from django.apps import AppConfig
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
class UsersConfig(AppConfig):
|
class UsersConfig(AppConfig):
|
||||||
|
"""Configuración, por ahora solo el nombre de la aplicación es necesario"""
|
||||||
name = 'users'
|
name = 'users'
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
|
"""Definicion de modelos de usuario"""
|
||||||
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
|
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
|
||||||
from django.contrib.auth.validators import UnicodeUsernameValidator
|
from django.contrib.auth.validators import UnicodeUsernameValidator
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
class UserManager(BaseUserManager):
|
class UserManager(BaseUserManager):
|
||||||
|
"""Manager de usuarios, otorga la posibilidad de crear usuarios"""
|
||||||
|
|
||||||
def create_user(self, username, email, password):
|
def create_user(self, username, email, password):
|
||||||
|
"""Crea un usuario"""
|
||||||
if not username:
|
if not username:
|
||||||
raise ValueError('El usuario debe tener un nombre de usuario')
|
raise ValueError('El usuario debe tener un nombre de usuario')
|
||||||
if not email:
|
if not email:
|
||||||
@@ -21,6 +25,7 @@ class UserManager(BaseUserManager):
|
|||||||
return user
|
return user
|
||||||
|
|
||||||
def create_superuser(self, username, email, password=None):
|
def create_superuser(self, username, email, password=None):
|
||||||
|
"""Crea un super usuario"""
|
||||||
user = self.create_user(
|
user = self.create_user(
|
||||||
username=username,
|
username=username,
|
||||||
email=email,
|
email=email,
|
||||||
@@ -32,6 +37,8 @@ class UserManager(BaseUserManager):
|
|||||||
|
|
||||||
|
|
||||||
class User(AbstractBaseUser):
|
class User(AbstractBaseUser):
|
||||||
|
"""Definición del modelo de usuario de la aplicación"""
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = 'usuario'
|
verbose_name = 'usuario'
|
||||||
verbose_name_plural = 'usuarios'
|
verbose_name_plural = 'usuarios'
|
||||||
@@ -40,7 +47,8 @@ class User(AbstractBaseUser):
|
|||||||
|
|
||||||
username_validator = UnicodeUsernameValidator()
|
username_validator = UnicodeUsernameValidator()
|
||||||
|
|
||||||
username = models.CharField('nombre de usuario', max_length=40, validators=[username_validator], unique=True)
|
username = models.CharField('nombre de usuario', max_length=40,
|
||||||
|
validators=[username_validator], unique=True)
|
||||||
email = models.EmailField('correo')
|
email = models.EmailField('correo')
|
||||||
is_active = models.BooleanField('esta activo', default=True)
|
is_active = models.BooleanField('esta activo', default=True)
|
||||||
is_admin = models.BooleanField('es administrador', default=False)
|
is_admin = models.BooleanField('es administrador', default=False)
|
||||||
@@ -51,18 +59,24 @@ class User(AbstractBaseUser):
|
|||||||
|
|
||||||
REQUIRED_FIELDS = ['email']
|
REQUIRED_FIELDS = ['email']
|
||||||
|
|
||||||
def has_perm(self, *args, **kwargs):
|
@staticmethod
|
||||||
|
def has_perm():
|
||||||
|
"""Los usuarios siempre tienen permiso"""
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def has_module_perms(self, *args, **kwargs):
|
@staticmethod
|
||||||
|
def has_module_perms():
|
||||||
|
"""Los usuarios siempre tienen permiso"""
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_staff(self):
|
def is_staff(self):
|
||||||
|
"""Ser staff es equivalente a ser administrador"""
|
||||||
return self.is_admin
|
return self.is_admin
|
||||||
|
|
||||||
|
|
||||||
class SocialNetworks(models.Model):
|
class SocialNetworks(models.Model):
|
||||||
|
"""Definición de las redes sociales de un usuario"""
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = 'Redes Sociales'
|
verbose_name = 'Redes Sociales'
|
||||||
verbose_name_plural = 'Redes Sociales'
|
verbose_name_plural = 'Redes Sociales'
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
|
"""Definición de rutas para auth"""
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
from users import views
|
from users import views
|
||||||
|
|
||||||
|
# Nombre de aplicacion para utilizarlo de prefix en las rutas
|
||||||
|
# pylint: disable=invalid-name
|
||||||
app_name = 'auth'
|
app_name = 'auth'
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
|||||||
@@ -1,10 +1,17 @@
|
|||||||
|
"""Definición de las vistas de la aplicación"""
|
||||||
from django.http import HttpResponseRedirect, HttpResponseNotAllowed
|
from django.http import HttpResponseRedirect, HttpResponseNotAllowed
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.utils.http import url_has_allowed_host_and_scheme
|
from django.utils.http import url_has_allowed_host_and_scheme
|
||||||
from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout, get_user_model
|
from django.contrib.auth import login as auth_login, logout as auth_logout
|
||||||
|
from django.contrib.auth import authenticate, get_user_model
|
||||||
|
|
||||||
|
|
||||||
def get_next_url(request):
|
def get_next_url(request):
|
||||||
|
"""Obtiene el parametro next, el cual puede estar en POST o GET
|
||||||
|
|
||||||
|
Este parametro es una url por lo que debe validarse que sea seguro, en caso que no lo sea
|
||||||
|
se retornara '/' para evitar problemas de seguridad
|
||||||
|
"""
|
||||||
next_url = request.POST.get('next', request.GET.get('next', ''))
|
next_url = request.POST.get('next', request.GET.get('next', ''))
|
||||||
|
|
||||||
url_is_safe = url_has_allowed_host_and_scheme(
|
url_is_safe = url_has_allowed_host_and_scheme(
|
||||||
@@ -18,19 +25,31 @@ def get_next_url(request):
|
|||||||
|
|
||||||
|
|
||||||
def login(request):
|
def login(request):
|
||||||
|
"""Entrada de la ruta de login
|
||||||
|
|
||||||
|
Solo se permiten request que sean GET o POST
|
||||||
|
"""
|
||||||
if request.method == 'GET':
|
if request.method == 'GET':
|
||||||
return _login_get(request)
|
return _login_get(request)
|
||||||
elif request.method == 'POST':
|
if request.method == 'POST':
|
||||||
return _login_post(request)
|
return _login_post(request)
|
||||||
else:
|
|
||||||
return HttpResponseNotAllowed(permitted_methods=['GET', 'POST'])
|
return HttpResponseNotAllowed(permitted_methods=['GET', 'POST'])
|
||||||
|
|
||||||
|
|
||||||
def _login_get(request):
|
def _login_get(request):
|
||||||
return render(request, template_name='users/login.html', context={'next': get_next_url(request)})
|
"""Retorna la vista de login y le entrega el parametro next a la vista"""
|
||||||
|
return render(request, template_name='users/login.html',
|
||||||
|
context={'next': get_next_url(request)})
|
||||||
|
|
||||||
|
|
||||||
def _login_post(request):
|
def _login_post(request):
|
||||||
|
"""El POST de login que corresponde a la autenticación de un usuario
|
||||||
|
|
||||||
|
Si es que es correcta continuara el usuario sera autenticado en el sistema y se le redirigirá a
|
||||||
|
la direccion del parametro next
|
||||||
|
|
||||||
|
Si es que no se volverá a la misma vista de login con un error
|
||||||
|
"""
|
||||||
username = request.POST.get('username', '')
|
username = request.POST.get('username', '')
|
||||||
password = request.POST.get('password', '')
|
password = request.POST.get('password', '')
|
||||||
|
|
||||||
@@ -39,7 +58,7 @@ def _login_post(request):
|
|||||||
if user is not None:
|
if user is not None:
|
||||||
auth_login(request, user)
|
auth_login(request, user)
|
||||||
return HttpResponseRedirect(get_next_url(request))
|
return HttpResponseRedirect(get_next_url(request))
|
||||||
else:
|
|
||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
template_name='users/login.html',
|
template_name='users/login.html',
|
||||||
@@ -48,24 +67,30 @@ def _login_post(request):
|
|||||||
|
|
||||||
|
|
||||||
def logout(request):
|
def logout(request):
|
||||||
|
"""Realiza el logout de un usuario y lo redirige a la url del parametro next"""
|
||||||
auth_logout(request)
|
auth_logout(request)
|
||||||
return HttpResponseRedirect(get_next_url(request))
|
return HttpResponseRedirect(get_next_url(request))
|
||||||
|
|
||||||
|
|
||||||
def register(request):
|
def register(request):
|
||||||
|
"""Entrada de la ruta de register, solo acepta GET y POST"""
|
||||||
if request.method == 'GET':
|
if request.method == 'GET':
|
||||||
return _register_get(request)
|
return _register_get(request)
|
||||||
elif request.method == 'POST':
|
if request.method == 'POST':
|
||||||
return _register_post(request)
|
return _register_post(request)
|
||||||
else:
|
|
||||||
return HttpResponseNotAllowed(permitted_methods=['GET', 'POST'])
|
return HttpResponseNotAllowed(permitted_methods=['GET', 'POST'])
|
||||||
|
|
||||||
|
|
||||||
def _register_get(request):
|
def _register_get(request):
|
||||||
return render(request, template_name='users/register.html', context={'next': get_next_url(request)})
|
"""Retorna la vista de registro con el parametro de next"""
|
||||||
|
return render(request, template_name='users/register.html',
|
||||||
|
context={'next': get_next_url(request)})
|
||||||
|
|
||||||
|
|
||||||
def _register_post(request):
|
def _register_post(request):
|
||||||
|
"""Registra un usuario, si es que es correcto sera logeado y se redireccionara a la url en next,
|
||||||
|
en otro caso, se devolverá a la vista de registro con errores
|
||||||
|
"""
|
||||||
username = request.POST.get('username', '')
|
username = request.POST.get('username', '')
|
||||||
password = request.POST.get('password', '')
|
password = request.POST.get('password', '')
|
||||||
password_confirm = request.POST.get('password_confirm', '')
|
password_confirm = request.POST.get('password_confirm', '')
|
||||||
@@ -80,21 +105,27 @@ def _register_post(request):
|
|||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
template_name='users/register.html',
|
template_name='users/register.html',
|
||||||
context={'next': get_next_url(request), 'error': 'Debe ingresar un nombre de usuario', 'old': old}
|
context={'next': get_next_url(request),
|
||||||
|
'error': 'Debe ingresar un nombre de usuario',
|
||||||
|
'old': old}
|
||||||
)
|
)
|
||||||
|
|
||||||
if get_user_model().objects.filter(username=username).count() > 0:
|
if get_user_model().objects.filter(username=username).count() > 0:
|
||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
template_name='users/register.html',
|
template_name='users/register.html',
|
||||||
context={'next': get_next_url(request), 'error': 'El nombre de usuario esta en uso', 'old': old}
|
context={'next': get_next_url(request),
|
||||||
|
'error': 'El nombre de usuario esta en uso',
|
||||||
|
'old': old}
|
||||||
)
|
)
|
||||||
|
|
||||||
if password and password != password_confirm:
|
if password and password != password_confirm:
|
||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
template_name='users/register.html',
|
template_name='users/register.html',
|
||||||
context={'next': get_next_url(request), 'error': 'Las contraseñas no coinciden', 'old': old}
|
context={'next': get_next_url(request),
|
||||||
|
'error': 'Las contraseñas no coinciden',
|
||||||
|
'old': old}
|
||||||
)
|
)
|
||||||
|
|
||||||
user = get_user_model().objects.create_user(username, email, password)
|
user = get_user_model().objects.create_user(username, email, password)
|
||||||
|
|||||||
Reference in New Issue
Block a user