Toggle navigation
Toggle navigation
This project
Loading...
Sign in
Marta Miranda
/
boletin_api
Go to a project
Toggle navigation
Projects
Groups
Snippets
Help
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
Marta Miranda
2023-06-15 08:56:53 -0300
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
bb3b1e05134f68b0c0052ccf43e6e23a68f062bd
bb3b1e05
1 parent
0b608665
Agregue cambiar contrasenia
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
101 additions
and
68 deletions
project/apps/usuario/api.py
project/apps/usuario/serializers.py
project/apps/usuario/tests/__init__.py
project/apps/usuario/tests/test_usuario.py
project/apps/usuario/api.py
View file @
bb3b1e0
...
...
@@ -7,7 +7,7 @@ from rest_framework.permissions import IsAuthenticated, AllowAny
from
rest_framework.response
import
Response
from
usuario.models
import
Usuario
from
usuario.serializers
import
UsuarioSerializer
from
usuario.serializers
import
UsuarioSerializer
,
CambiarClaveSecretaSerializer
class
UsuarioViewSet
(
mixins
.
RetrieveModelMixin
,
mixins
.
UpdateModelMixin
,
viewsets
.
GenericViewSet
):
...
...
@@ -22,70 +22,15 @@ class UsuarioViewSet(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, viewset
return
user
# @action(
# methods=('GET',),
# detail=True,
# url_path=r'activar-cuenta/(?P<token>[^/.]+)',
# permission_classes=(AllowAny,)
# )
# def activar_cuenta(self, request, pk, token=None):
# usuario = self.get_object(base_method=True)
# # Controlamos si el token es correcto.
# if usuario.is_active:
# return Response(data={'mensaje': 'La cuenta del usuario ya está activa'}, status=status.HTTP_200_OK)
#
# if not default_token_generator.check_token(usuario, token):
# password = generar_password_aleatorio(usuario)
# enviar_correo_electronico_activar_cuenta(usuario, password)
# raise ValidationError('Se venció token, revise nuevamente su correo electrónico')
#
# # Activamos la cuenta.
# usuario.is_active = True
# usuario.save(update_fields=('is_active',))
# data = self.get_serializer(instance=usuario).data
# return Response(data=data, status=status.HTTP_200_OK)
#
# @action(
# methods=('POST',),
# detail=False,
# url_path='recuperar-cuenta',
# permission_classes=(AllowAny,),
# parser_classes=(JSONParser,)
# )
# def recuperar_cuenta(self, request):
# if 'correo_electronico' not in request.data:
# raise ValidationError('Debe ingresar un correo electrónico')
#
# correo_electronico = request.data.get('correo_electronico')
# try:
# usuario = Usuario.objects.get(email=correo_electronico)
# enviar_correo_electronico_recuperar_cuenta(usuario)
# return Response(status=status.HTTP_200_OK)
# except Usuario.DoesNotExist as error:
# raise ValidationError(f'No existe un usuario con el correo electrónico: {correo_electronico}')
#
# @action(
# methods=('patch',),
# detail=False,
# url_path='cambiar-clave-secreta',
# parser_classes=(JSONParser,),
# serializer_class=CambiarClaveSecretaSerializer
# )
# def cambiar_clave_secreta(self, request):
# serializer = self.get_serializer(data=request.data)
# serializer.is_valid(raise_exception=True)
# serializer.save()
# return Response(status=status.HTTP_200_OK)
#
# @action(
# methods=('get',),
# detail=False,
# url_path=r'obtener-usuarios-por-tarea/(?P<tarea>[^/.]+)'
# )
# def obtener_usuarios_por_tarea(self, request, tarea=None):
# queryset = super().get_queryset()
#
# usuarios = queryset.filter(tipo_tarea_certificado=tarea, is_active=True).exclude(id=request.user.id)
# serializer = self.get_serializer(usuarios, many=True)
#
# return Response(serializer.data)
@action
(
methods
=
(
'patch'
,),
detail
=
False
,
url_path
=
'cambiar-clave-secreta'
,
parser_classes
=
(
JSONParser
,),
serializer_class
=
CambiarClaveSecretaSerializer
)
def
cambiar_clave_secreta
(
self
,
request
):
serializer
=
self
.
get_serializer
(
data
=
request
.
data
)
serializer
.
is_valid
(
raise_exception
=
True
)
serializer
.
save
()
return
Response
(
status
=
status
.
HTTP_200_OK
)
...
...
project/apps/usuario/serializers.py
View file @
bb3b1e0
...
...
@@ -26,3 +26,27 @@ class UsuarioSerializer(serializers.ModelSerializer):
'organismo'
:
'organismo.serializers.OrganismoSerializer'
,
}
class
CambiarClaveSecretaSerializer
(
DRFSerializer
):
clave
=
serializers
.
CharField
(
max_length
=
128
,
write_only
=
True
,
required
=
True
)
clave_nueva
=
serializers
.
CharField
(
max_length
=
128
,
write_only
=
True
,
required
=
True
)
clave_nueva_2
=
serializers
.
CharField
(
max_length
=
128
,
write_only
=
True
,
required
=
True
)
def
validate_clave
(
self
,
value
):
user
=
self
.
context
[
'request'
]
.
user
if
not
user
.
check_password
(
value
):
raise
serializers
.
ValidationError
(
"La contraseña anterior no es válida. ¡Intentalo nuevamente!"
)
return
value
def
validate
(
self
,
data
):
if
data
[
'clave_nueva'
]
!=
data
[
'clave_nueva_2'
]:
raise
serializers
.
ValidationError
({
'clave_nueva_2'
:
"Los nuevos campos de contraseñas no coinciden"
})
password_validation
.
validate_password
(
data
[
'clave_nueva'
],
self
.
context
[
'request'
]
.
user
)
return
data
def
save
(
self
,
**
kwargs
):
clave
=
self
.
validated_data
[
'clave_nueva'
]
usuario
=
self
.
context
[
'request'
]
.
user
usuario
.
set_password
(
clave
)
usuario
.
save
()
return
usuario
...
...
project/apps/usuario/tests/__init__.py
0 → 100644
View file @
bb3b1e0
project/apps/usuario/tests/test_usuario.py
0 → 100644
View file @
bb3b1e0
import
pytest
from
django.contrib.auth
import
get_user_model
from
core.tests.fixtures
import
create_user
,
CONTENT_TYPE_JSON
from
core.tests.utils
import
post
,
get
,
JSON_CONTENT_TYPE
,
patch
@pytest.mark.django_db
def
test_usuario_cambio_password_satisfactoriamente
():
usuario_autenticado
=
create_user
(
username
=
'mbarrera'
)
usuario_autenticado
.
set_password
(
'ultima_contraseña'
)
data
=
{
"clave"
:
"ultima_contraseña"
,
"clave_nueva"
:
"nueva_contraseña"
,
"clave_nueva_2"
:
"nueva_contraseña"
}
endpoint
=
"/api/v1/usuario/cambiar-clave-secreta/"
response
=
patch
(
endpoint
,
data
=
data
,
content_type
=
CONTENT_TYPE_JSON
,
user_logged
=
usuario_autenticado
)
assert
response
.
status_code
==
200
debianitram
=
get_user_model
()
.
objects
.
get
(
username
=
'mbarrera'
)
assert
debianitram
.
check_password
(
'nueva_contraseña'
)
@pytest.mark.django_db
def
test_usuario_cambio_password_falla_con_clave
():
usuario_autenticado
=
create_user
(
username
=
'mbarrera'
)
usuario_autenticado
.
set_password
(
'ultima_contraseña'
)
data
=
{
"clave"
:
"ultima.-."
,
"clave_nueva"
:
"nueva_contraseña"
,
"clave_nueva_2"
:
"nueva_contraseña"
}
endpoint
=
"/api/v1/usuario/cambiar-clave-secreta/"
response
=
patch
(
endpoint
,
data
=
data
,
content_type
=
CONTENT_TYPE_JSON
,
user_logged
=
usuario_autenticado
)
assert
response
.
status_code
==
400
errors
=
response
.
json
()[
'errors'
]
assert
errors
[
0
][
'detail'
]
==
'La contraseña anterior no es válida. ¡Intentalo nuevamente!'
@pytest.mark.django_db
def
test_usuario_cambio_password_falla_no_coinciden_nuevas_password
():
usuario_autenticado
=
create_user
(
username
=
'mbarrera'
)
usuario_autenticado
.
set_password
(
'ultima_contraseña'
)
data
=
{
"clave"
:
"ultima_contraseña"
,
"clave_nueva"
:
"NuevaContraseña"
,
"clave_nueva_2"
:
"nueva_contraseña"
}
endpoint
=
"/api/v1/usuario/cambiar-clave-secreta/"
response
=
patch
(
endpoint
,
data
=
data
,
content_type
=
CONTENT_TYPE_JSON
,
user_logged
=
usuario_autenticado
)
assert
response
.
status_code
==
400
errors
=
response
.
json
()[
'errors'
]
assert
errors
[
0
][
'detail'
]
==
'Los nuevos campos de contraseñas no coinciden'
...
...
Please
register
or
login
to post a comment