mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-10-31 15:50:03 +01:00 
			
		
		
		
	Add links to resend mail confirmations
This commit is contained in:
		| @@ -12,7 +12,7 @@ from django.urls import reverse, reverse_lazy | ||||
| from django.utils.encoding import force_bytes | ||||
| from django.utils.http import urlsafe_base64_encode | ||||
| from django.utils.translation import gettext_lazy as _ | ||||
| from registration.tokens import account_activation_token | ||||
| from registration.tokens import email_validation_token | ||||
| from note.models import MembershipTransaction | ||||
|  | ||||
|  | ||||
| @@ -73,13 +73,13 @@ class Profile(models.Model): | ||||
|  | ||||
|     def send_email_validation_link(self): | ||||
|         subject = "Activate your Note Kfet account" | ||||
|         message = loader.render_to_string('registration/account_activation_email.html', | ||||
|         message = loader.render_to_string('registration/email_validation_email.html', | ||||
|                                           { | ||||
|                                               'user': self.user, | ||||
|                                               'domain': "nk20.ynerant.fr", | ||||
|                                               'site_name': "La Note Kfet", | ||||
|                                               'protocol': 'https', | ||||
|                                               'token': account_activation_token.make_token(self.user), | ||||
|                                               'token': email_validation_token.make_token(self.user), | ||||
|                                               'uid': urlsafe_base64_encode(force_bytes(self.user.pk)).decode('UTF-8'), | ||||
|                                           }) | ||||
|         self.user.email_user(subject, message) | ||||
|   | ||||
| @@ -27,4 +27,4 @@ class AccountActivationTokenGenerator(PasswordResetTokenGenerator): | ||||
|         return str(user.pk) + str(user.profile.email_confirmed) + str(login_timestamp) + str(timestamp) | ||||
|  | ||||
|  | ||||
| account_activation_token = AccountActivationTokenGenerator() | ||||
| email_validation_token = AccountActivationTokenGenerator() | ||||
|   | ||||
| @@ -8,8 +8,10 @@ from . import views | ||||
| app_name = 'registration' | ||||
| urlpatterns = [ | ||||
|     path('signup/', views.UserCreateView.as_view(), name="signup"), | ||||
|     path('validate_email/sent/', views.UserActivationEmailSentView.as_view(), name='account_activation_sent'), | ||||
|     path('validate_email/<uidb64>/<token>/', views.UserActivateView.as_view(), name='account_activation'), | ||||
|     path('validate_email/sent/', views.UserValidationEmailSentView.as_view(), name='email_validation_sent'), | ||||
|     path('validate_email/resend/<int:pk>/', views.UserResendValidationEmailView.as_view(), | ||||
|          name='email_validation_resend'), | ||||
|     path('validate_email/<uidb64>/<token>/', views.UserValidateView.as_view(), name='email_validation'), | ||||
|     path('validate_user/', views.FutureUserListView.as_view(), name="future_user_list"), | ||||
|     path('validate_user/<int:pk>/', views.FutureUserDetailView.as_view(), name="future_user_detail"), | ||||
|     path('validate_user/<int:pk>/invalidate/', views.FutureUserInvalidateView.as_view(), name="future_user_invalidate"), | ||||
|   | ||||
| @@ -16,14 +16,14 @@ from django.views.generic import CreateView, TemplateView, DetailView, FormView | ||||
| from django_tables2 import SingleTableView | ||||
| from member.forms import ProfileForm | ||||
| from member.models import Membership, Club | ||||
| from note.models import SpecialTransaction | ||||
| from note.models import SpecialTransaction, Transaction | ||||
| from note.templatetags.pretty_money import pretty_money | ||||
| from permission.backends import PermissionBackend | ||||
| from permission.views import ProtectQuerysetMixin | ||||
|  | ||||
| from .forms import SignUpForm, ValidationForm | ||||
| from .tables import FutureUserTable | ||||
| from .tokens import account_activation_token | ||||
| from .tokens import email_validation_token | ||||
|  | ||||
|  | ||||
| class UserCreateView(CreateView): | ||||
| @@ -32,7 +32,7 @@ class UserCreateView(CreateView): | ||||
|     """ | ||||
|  | ||||
|     form_class = SignUpForm | ||||
|     success_url = reverse_lazy('registration:account_activation_sent') | ||||
|     success_url = reverse_lazy('registration:email_validation_sent') | ||||
|     template_name = 'registration/signup.html' | ||||
|     second_form = ProfileForm | ||||
|  | ||||
| @@ -66,9 +66,9 @@ class UserCreateView(CreateView): | ||||
|         return super().form_valid(form) | ||||
|  | ||||
|  | ||||
| class UserActivateView(TemplateView): | ||||
| class UserValidateView(LoginRequiredMixin, ProtectQuerysetMixin, TemplateView): | ||||
|     title = _("Account Activation") | ||||
|     template_name = 'registration/account_activation_complete.html' | ||||
|     template_name = 'registration/email_validation_complete.html' | ||||
|  | ||||
|     @method_decorator(csrf_protect) | ||||
|     def dispatch(self, *args, **kwargs): | ||||
| @@ -84,7 +84,7 @@ class UserActivateView(TemplateView): | ||||
|         user = self.get_user(kwargs['uidb64']) | ||||
|         token = kwargs['token'] | ||||
|  | ||||
|         if user is not None and account_activation_token.check_token(user, token): | ||||
|         if user is not None and email_validation_token.check_token(user, token): | ||||
|             self.validlink = True | ||||
|             user.is_active = True | ||||
|             user.profile.email_confirmed = True | ||||
| @@ -116,11 +116,26 @@ class UserActivateView(TemplateView): | ||||
|         return context | ||||
|  | ||||
|  | ||||
| class UserActivationEmailSentView(TemplateView): | ||||
|     template_name = 'registration/account_activation_email_sent.html' | ||||
| class UserValidationEmailSentView(LoginRequiredMixin, ProtectQuerysetMixin, TemplateView): | ||||
|     template_name = 'registration/email_validation_email_sent.html' | ||||
|     title = _('Account activation email sent') | ||||
|  | ||||
|  | ||||
| class UserResendValidationEmailView(LoginRequiredMixin, ProtectQuerysetMixin, DetailView): | ||||
|     model = User | ||||
|  | ||||
|     def get_queryset(self, **kwargs): | ||||
|         return super().get_queryset(**kwargs).filter(profile__email_confirmed=False) | ||||
|  | ||||
|     def get(self, request, *args, **kwargs): | ||||
|         user = self.get_object() | ||||
|  | ||||
|         user.profile.send_email_validation_link() | ||||
|  | ||||
|         url = 'member:user_detail' if user.profile.registration_valid else 'registration:future_user_detail' | ||||
|         return redirect(url, user.id) | ||||
|  | ||||
|  | ||||
| class FutureUserListView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableView): | ||||
|     """ | ||||
|     Affiche la liste des utilisateurs, avec une fonction de recherche statique | ||||
|   | ||||
| @@ -1,5 +1,14 @@ | ||||
| {% load render_table from django_tables2 %} | ||||
| {% load i18n %} | ||||
| {% load perms %} | ||||
|  | ||||
| {% if not object.profile.email_confirmed and "member.change_profile_email_confirmed"|has_perm:object.profile %} | ||||
|     <div class="alert alert-warning"> | ||||
|         {% trans "This user doesn't have confirmed his/her e-mail address." %} | ||||
|         <a href="{% url "registration:email_validation_resend" pk=object.pk %}">{% trans "Click here to resend a validation link." %}</a> | ||||
|     </div> | ||||
| {% endif %} | ||||
|  | ||||
| <div class="accordion shadow" id="accordionProfile"> | ||||
|     <div class="card"> | ||||
|         <div class="card-header position-relative" id="clubListHeading"> | ||||
|   | ||||
| @@ -2,7 +2,7 @@ Hi {{ user.username }}, | ||||
| 
 | ||||
| Welcome to {{ site_name }}. Please click on the link below to confirm your registration. | ||||
| 
 | ||||
| {{ protocol }}://{{ domain }}{% url 'registration:account_activation' uidb64=uid token=token %} | ||||
| {{ protocol }}://{{ domain }}{% url 'registration:email_validation' uidb64=uid token=token %} | ||||
| 
 | ||||
| This link is only valid for a couple of days, after that you will need to contact us to validate your email. | ||||
| 
 | ||||
| @@ -2,7 +2,7 @@ | ||||
| {% load static %} | ||||
| {% load i18n %} | ||||
| {% load crispy_forms_tags %} | ||||
| {% load pretty_money %} | ||||
| {% load perms %} | ||||
|  | ||||
| {% block content %} | ||||
|     <div class="card bg-light shadow"> | ||||
| @@ -20,6 +20,15 @@ | ||||
|                 <dt class="col-xl-6">{% trans 'email'|capfirst %}</dt> | ||||
|                 <dd class="col-xl-6"><a href="mailto:{{ object.email }}">{{ object.email }}</a></dd> | ||||
|  | ||||
|                 {% if not object.profile.email_confirmed and "member.change_profile_email_confirmed"|has_perm:object.profile %} | ||||
|                     <dd class="col-xl-12"> | ||||
|                         <div class="alert alert-warning"> | ||||
|                             {% trans "This user doesn't have confirmed his/her e-mail address." %} | ||||
|                             <a href="{% url "registration:email_validation_resend" pk=object.pk %}">{% trans "Click here to resend a validation link." %}</a> | ||||
|                         </div> | ||||
|                     </dd> | ||||
|                 {% endif %} | ||||
|  | ||||
|                 <dt class="col-xl-6">{% trans 'password'|capfirst %}</dt> | ||||
|                 <dd class="col-xl-6"> | ||||
|                     <a class="small" href="{% url 'password_change' %}"> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user