mirror of
https://github.com/adrigongv23/G26---Telemetry-Software.git
synced 2026-08-25 11:33:17 +02:00
Mi perfil implementado, con cambio de contraseña
This commit is contained in:
parent
a6306c5218
commit
0860c191f2
5 changed files with 181 additions and 6 deletions
|
|
@ -19,10 +19,12 @@ from django.contrib import admin
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
from django.contrib.auth import views as auth_views
|
from django.contrib.auth import views as auth_views
|
||||||
from gestion import views
|
from gestion import views
|
||||||
|
from users import views as users_views
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
path('', views.inicio, name='inicio'),
|
path('', views.inicio, name='inicio'),
|
||||||
path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'),
|
path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'),
|
||||||
path('logout/', auth_views.LogoutView.as_view(next_page='login'), name='logout'),
|
path('logout/', auth_views.LogoutView.as_view(next_page='login'), name='logout'),
|
||||||
|
path('mi-perfil/', users_views.mi_perfil, name='mi_perfil'),
|
||||||
]
|
]
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
<nav class="navbar navbar-expand-xl navbar-dark bg-dark sticky-top shadow-sm">
|
<nav class="navbar navbar-expand-xl navbar-dark bg-dark sticky-top shadow-sm">
|
||||||
<div class="container-fluid px-4">
|
<div class="container-fluid px-4">
|
||||||
<a class="navbar-brand d-flex align-items-center" href="#">
|
<a class="navbar-brand d-flex align-items-center" href="{% url 'inicio' %}">
|
||||||
<img src="{% static 'images/logo_gades.png' %}" alt="Logo Gades" height="40" class="me-2">
|
<img src="{% static 'images/logo_gades.png' %}" alt="Logo Gades" height="40" class="me-2">
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
@ -81,7 +81,7 @@
|
||||||
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="userDropdown">
|
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="userDropdown">
|
||||||
<li><span class="dropdown-item-text fw-bold text-muted">Hola, {{ user.first_name }}</span></li>
|
<li><span class="dropdown-item-text fw-bold text-muted">Hola, {{ user.first_name }}</span></li>
|
||||||
<li><hr class="dropdown-divider"></li>
|
<li><hr class="dropdown-divider"></li>
|
||||||
<li><a class="dropdown-item" href="#">Mi Perfil</a></li>
|
<li><a class="dropdown-item" href="{% url 'mi_perfil' %}">Mi Perfil</a></li>
|
||||||
<li>
|
<li>
|
||||||
<form method="post" action="{% url 'logout' %}">
|
<form method="post" action="{% url 'logout' %}">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
|
|
||||||
121
Plataform_Web/templates/mi_perfil.html
Normal file
121
Plataform_Web/templates/mi_perfil.html
Normal file
|
|
@ -0,0 +1,121 @@
|
||||||
|
{% extends 'base.html' %}
|
||||||
|
{% load static %}
|
||||||
|
|
||||||
|
{% block title %}Mi Perfil | Gades Manager{% endblock title %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="row mb-3 flex-shrink-0">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="bg-dark text-white p-3 rounded-3 shadow-sm" style="border-left: 5px solid #0d6efd;">
|
||||||
|
<h1 class="display-6 fw-bold mb-1">Mi Perfil</h1>
|
||||||
|
<p class="text-white-50 mb-0">Consulta y edita tus datos personales.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row g-4" style="overflow-y: auto;">
|
||||||
|
|
||||||
|
{% if messages %}
|
||||||
|
<div class="col-12">
|
||||||
|
{% for message in messages %}
|
||||||
|
<div class="alert alert-success py-2 small mb-0">{{ message }}</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="col-12 col-lg-6">
|
||||||
|
<div class="card border-0 shadow-sm h-100">
|
||||||
|
<div class="card-body p-4">
|
||||||
|
<h5 class="card-title fw-bold mb-3">Datos Personales</h5>
|
||||||
|
|
||||||
|
<div class="row g-2 mb-3">
|
||||||
|
<div class="col-6">
|
||||||
|
<label class="form-label small text-secondary mb-1">Rol en el equipo</label>
|
||||||
|
<input type="text" class="form-control" value="{{ user.get_rol_display }}" disabled>
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
<label class="form-label small text-secondary mb-1">Área técnica</label>
|
||||||
|
<input type="text" class="form-control" value="{{ user.get_especialidad_display|default:'—' }}" disabled>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="{{ perfil_form.username.id_for_label }}" class="form-label fw-semibold">{{ perfil_form.username.label }}</label>
|
||||||
|
{{ perfil_form.username }}
|
||||||
|
{% for error in perfil_form.username.errors %}
|
||||||
|
<div class="text-danger small mt-1">{{ error }}</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row g-2">
|
||||||
|
<div class="col-6 mb-3">
|
||||||
|
<label for="{{ perfil_form.first_name.id_for_label }}" class="form-label fw-semibold">{{ perfil_form.first_name.label }}</label>
|
||||||
|
{{ perfil_form.first_name }}
|
||||||
|
</div>
|
||||||
|
<div class="col-6 mb-3">
|
||||||
|
<label for="{{ perfil_form.last_name.id_for_label }}" class="form-label fw-semibold">{{ perfil_form.last_name.label }}</label>
|
||||||
|
{{ perfil_form.last_name }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="{{ perfil_form.email.id_for_label }}" class="form-label fw-semibold">{{ perfil_form.email.label }}</label>
|
||||||
|
{{ perfil_form.email }}
|
||||||
|
{% for error in perfil_form.email.errors %}
|
||||||
|
<div class="text-danger small mt-1">{{ error }}</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="submit" name="guardar_perfil" class="btn btn-primary fw-bold px-4">Guardar Cambios</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-12 col-lg-6">
|
||||||
|
<div class="card border-0 shadow-sm h-100">
|
||||||
|
<div class="card-body p-4">
|
||||||
|
<h5 class="card-title fw-bold mb-3">Cambiar Contraseña</h5>
|
||||||
|
|
||||||
|
<form method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="{{ password_form.old_password.id_for_label }}" class="form-label fw-semibold">Contraseña actual</label>
|
||||||
|
<input type="password" name="{{ password_form.old_password.html_name }}" id="{{ password_form.old_password.id_for_label }}" class="form-control">
|
||||||
|
{% for error in password_form.old_password.errors %}
|
||||||
|
<div class="text-danger small mt-1">{{ error }}</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="{{ password_form.new_password1.id_for_label }}" class="form-label fw-semibold">Nueva contraseña</label>
|
||||||
|
<input type="password" name="{{ password_form.new_password1.html_name }}" id="{{ password_form.new_password1.id_for_label }}" class="form-control">
|
||||||
|
{% for error in password_form.new_password1.errors %}
|
||||||
|
<div class="text-danger small mt-1">{{ error }}</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="{{ password_form.new_password2.id_for_label }}" class="form-label fw-semibold">Confirmar nueva contraseña</label>
|
||||||
|
<input type="password" name="{{ password_form.new_password2.html_name }}" id="{{ password_form.new_password2.id_for_label }}" class="form-control">
|
||||||
|
{% for error in password_form.new_password2.errors %}
|
||||||
|
<div class="text-danger small mt-1">{{ error }}</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if password_form.non_field_errors %}
|
||||||
|
<div class="text-danger small mb-3">{{ password_form.non_field_errors }}</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<button type="submit" name="cambiar_password" class="btn btn-outline-danger fw-bold px-4">Cambiar Contraseña</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endblock content %}
|
||||||
20
Plataform_Web/users/forms.py
Normal file
20
Plataform_Web/users/forms.py
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
from django import forms
|
||||||
|
from .models import CustomUser
|
||||||
|
|
||||||
|
|
||||||
|
class PerfilForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = CustomUser
|
||||||
|
fields = ['username', 'first_name', 'last_name', 'email']
|
||||||
|
widgets = {
|
||||||
|
'username': forms.TextInput(attrs={'class': 'form-control'}),
|
||||||
|
'first_name': forms.TextInput(attrs={'class': 'form-control'}),
|
||||||
|
'last_name': forms.TextInput(attrs={'class': 'form-control'}),
|
||||||
|
'email': forms.EmailInput(attrs={'class': 'form-control'}),
|
||||||
|
}
|
||||||
|
labels = {
|
||||||
|
'username': 'Usuario',
|
||||||
|
'first_name': 'Nombre',
|
||||||
|
'last_name': 'Apellidos',
|
||||||
|
'email': 'Correo electrónico',
|
||||||
|
}
|
||||||
|
|
@ -1,7 +1,39 @@
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render, redirect
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
|
from django.contrib.auth.forms import PasswordChangeForm
|
||||||
|
from django.contrib.auth import update_session_auth_hash
|
||||||
|
from django.contrib import messages
|
||||||
|
from .forms import PerfilForm
|
||||||
|
|
||||||
@login_required # Esto obliga a que el usuario tenga que loguearse antes de ver la web
|
|
||||||
|
@login_required
|
||||||
def index(request):
|
def index(request):
|
||||||
# 'request.user' contiene los datos del usuario que está navegando
|
return render(request, 'index.html')
|
||||||
return render(request, 'index.html')
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def mi_perfil(request):
|
||||||
|
perfil_form = PerfilForm(instance=request.user)
|
||||||
|
password_form = PasswordChangeForm(user=request.user)
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
if 'guardar_perfil' in request.POST:
|
||||||
|
perfil_form = PerfilForm(request.POST, instance=request.user)
|
||||||
|
if perfil_form.is_valid():
|
||||||
|
perfil_form.save()
|
||||||
|
messages.success(request, 'Tus datos se han actualizado correctamente.')
|
||||||
|
return redirect('mi_perfil')
|
||||||
|
|
||||||
|
elif 'cambiar_password' in request.POST:
|
||||||
|
password_form = PasswordChangeForm(user=request.user, data=request.POST)
|
||||||
|
if password_form.is_valid():
|
||||||
|
user = password_form.save()
|
||||||
|
update_session_auth_hash(request, user)
|
||||||
|
messages.success(request, 'Tu contraseña se ha cambiado correctamente.')
|
||||||
|
return redirect('mi_perfil')
|
||||||
|
|
||||||
|
context = {
|
||||||
|
'perfil_form': perfil_form,
|
||||||
|
'password_form': password_form,
|
||||||
|
}
|
||||||
|
return render(request, 'mi_perfil.html', context)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue