Modificando codigo para que pylint sea feliz

This commit is contained in:
Daniel Cortes
2020-06-07 20:52:22 -04:00
parent 6acf81b599
commit 40a5d37bb8
5 changed files with 100 additions and 24 deletions

View File

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

View File

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

View File

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

View File

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

View File

@@ -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,33 +58,39 @@ 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',
context={'next': get_next_url(request), 'error': 'Usuario o contraseña son incorrectos'} context={'next': get_next_url(request), 'error': 'Usuario o contraseña son incorrectos'}
) )
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)