improve registration

online_registration
Raz 12 months ago
parent 24deb2198d
commit da18a5d836
  1. 38
      tournaments/forms.py
  2. 5
      tournaments/templates/registration/login.html
  3. 19
      tournaments/templates/registration/password_reset_complete.html
  4. 29
      tournaments/templates/registration/password_reset_confirm.html
  5. 20
      tournaments/templates/registration/password_reset_done.html
  6. 11
      tournaments/templates/registration/password_reset_email.html
  7. 25
      tournaments/templates/registration/password_reset_form.html
  8. 4
      tournaments/urls.py
  9. 46
      tournaments/views.py

@ -115,3 +115,41 @@ class AddPlayerForm(forms.Form):
# Return the cleaned data with any modifications applied
return cleaned_data
from django.contrib.auth.forms import PasswordResetForm
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.contrib.auth.tokens import default_token_generator
from django.contrib.sites.shortcuts import get_current_site
from django.utils.encoding import force_bytes
class CustomPasswordResetForm(PasswordResetForm):
def save(self, *args, **kwargs):
"""
Override the save method to send a custom email.
"""
email = self.cleaned_data["email"]
users = self.get_users(email)
for user in users:
# Generate the token for password reset
token = default_token_generator.make_token(user)
uid = urlsafe_base64_encode(force_bytes(user.pk))
# Prepare the context for the email template
context = {
"email": user.email,
"domain": get_current_site(self.request).domain,
"site_name": "Padel Club",
"uid": uid,
"token": token,
"protocol": "http", # Use 'https' in production
}
# Render the email content from the template
subject = "Réinitialisation du mot de passe"
message = render_to_string("registration/password_reset_email.html", context)
# Send the email
send_mail(subject, message, None, [user.email])

@ -20,6 +20,11 @@
<label for="password">Mot de passe :</label>
<input type="password" name="password" id="password" required>
<button type="submit" class="button">Se connecter</button>
<p>
<a href="{% url 'password_reset' %}" class="styled-link">Mot de passe oublié ?</a>
</p>
</form>
<p>Pas encore de compte ? <a href="{% url 'signup' %}" class="styled-link">Créer le tout de suite !</a></p>
</div>

@ -0,0 +1,19 @@
{% extends 'tournaments/base.html' %}
{% block head_title %} Réinitialisation terminée {% endblock %}
{% block first_title %} Padel Club {% endblock %}
{% block second_title %} Réinitialisation terminée {% endblock %}
{% block content %}
<div class="grid-x">
<div class="bubble">
<div class="cell medium-6 large-6 my-block">
<p>
Votre mot de passe a été réinitialisé avec succès. Vous pouvez maintenant vous connecter avec votre nouveau mot de passe.
</p>
<p>
<a href="{% url 'login' %}" class="button">Se connecter</a>
</p>
</div>
</div>
</div>
{% endblock %}

@ -0,0 +1,29 @@
{% extends 'tournaments/base.html' %}
{% block head_title %} Nouveau mot de passe {% endblock %}
{% block first_title %} Padel Club {% endblock %}
{% block second_title %} Nouveau mot de passe {% endblock %}
{% block content %}
<div class="grid-x">
<div class="bubble">
<div class="cell medium-6 large-6 my-block">
<form method="post">
{% csrf_token %}
<label for="new_password1">Nouveau mot de passe :</label>
<input type="password" name="new_password1" id="new_password1" required>
<label for="new_password2">Confirmer le nouveau mot de passe :</label>
<input type="password" name="new_password2" id="new_password2" required>
<button type="submit" class="button">Réinitialiser le mot de passe</button>
</form>
<p>
<a href="{% url 'login' %}" class="styled-link">Retour à la connexion</a>
</p>
</div>
{% for message in messages %}
<div class="alert alert-{{ message.tags }}">{{ message }}</div>
{% endfor %}
</div>
</div>
{% endblock %}

@ -0,0 +1,20 @@
{% extends 'tournaments/base.html' %}
{% block head_title %} Demande envoyée {% endblock %}
{% block first_title %} Padel Club {% endblock %}
{% block second_title %} Demande envoyée {% endblock %}
{% block content %}
<div class="grid-x">
<div class="bubble">
<div class="cell medium-6 large-6 my-block">
<p>
Un e-mail contenant un lien pour réinitialiser votre mot de passe a été envoyé à votre adresse.
Veuillez vérifier votre boîte de réception.
</p>
<p>
<a href="{% url 'login' %}" class="styled-link">Retour à la connexion</a>
</p>
</div>
</div>
</div>
{% endblock %}

@ -0,0 +1,11 @@
{% autoescape off %}
Bonjour,
Vous avez demandé une réinitialisation de votre mot de passe. Veuillez cliquer sur le lien suivant pour en choisir un nouveau :
http://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
Si vous n'avez pas fait cette demande, vous pouvez ignorer ce message.
A tout de suite sur Padel Club !
{% endautoescape %}

@ -0,0 +1,25 @@
{% extends 'tournaments/base.html' %}
{% block head_title %} Réinitialisation du mot de passe {% endblock %}
{% block first_title %} Padel Club {% endblock %}
{% block second_title %} Réinitialisation du mot de passe {% endblock %}
{% block content %}
<div class="grid-x">
<div class="bubble">
<div class="cell medium-6 large-6 my-block">
<form method="post" action="{% url 'password_reset' %}">
{% csrf_token %}
<label for="email">Adresse e-mail :</label>
<input type="email" name="email" id="email" required>
<button type="submit" class="button">Envoyer le lien de réinitialisation</button>
</form>
<p>
<a href="{% url 'login' %}" class="styled-link">Retour à la connexion</a>
</p>
</div>
{% for message in messages %}
<div class="alert alert-{{ message.tags }}">{{ message }}</div>
{% endfor %}
</div>
</div>
{% endblock %}

@ -4,6 +4,7 @@ from django.urls import include, path
from . import views
urlpatterns = [
path('reset/<uidb64>/<token>/', views.CustomPasswordResetConfirmView.as_view(), name='password_reset_confirm'),
path("", views.index, name="index"),
path("tournaments/", views.tournaments, name="tournaments"),
path("clubs/", views.clubs, name="clubs"),
@ -45,5 +46,8 @@ urlpatterns = [
path('profile/', views.profile, name='profile'), # URL pattern for signup
path('tournaments/<str:tournament_id>/register/', views.register_tournament, name='register_tournament'),
path('tournaments/<str:tournament_id>/unregister/', views.unregister_tournament, name='unregister_tournament'),
path('password_reset/', auth_views.PasswordResetView.as_view(), name='password_reset'),
path('password_reset_done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'),
path('reset/done/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
]

@ -52,6 +52,15 @@ from django.template.loader import render_to_string
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.utils.encoding import force_bytes
from django.contrib.auth.forms import SetPasswordForm
from django.contrib.auth.views import PasswordResetConfirmView
from django.urls import reverse_lazy
from django.shortcuts import render
from django.utils.http import urlsafe_base64_decode
from django.contrib.auth.tokens import default_token_generator
from django.contrib.auth.models import User
from django.http import Http404
def index(request):
club_id = request.GET.get('club')
@ -687,9 +696,10 @@ def register_tournament(request, tournament_id):
# Check if the team registration form is valid and finalize the registration
elif 'register_team' in request.POST and team_form.is_valid():
registration_date = timezone.now().replace(microsecond=0)
team_registration = TeamRegistration.objects.create(
tournament=tournament,
registration_date=timezone.now()
registration_date=registration_date
)
stripped_license = None
@ -836,3 +846,37 @@ def validate_license_id(licence_id, tournament):
# If all checks pass, return True (you can add further logic here if needed)
return False
class CustomPasswordResetConfirmView(PasswordResetConfirmView):
template_name = 'registration/password_reset_confirm.html' # Custom template
def get_context_data(self, **kwargs):
"""
Modify the context to provide custom data to the template.
"""
context = super().get_context_data(**kwargs)
context['custom_message'] = "Veuillez entrer un nouveau mot de passe."
return context
def form_valid(self, form):
"""
Custom behavior when the password reset form is valid.
"""
# Call the parent method to save the new password
response = super().form_valid(form)
# Additional actions (e.g., logging or sending notifications) can be added here
# You can add custom logic after password reset
return response
def get_user(self, uidb64):
"""
Override this method to decode the uid and return the corresponding user.
"""
try:
uid = urlsafe_base64_decode(uidb64).decode()
user = User.objects.get(pk=uid)
return user
except (TypeError, ValueError, User.DoesNotExist):
raise Http404("User not found")

Loading…
Cancel
Save