Commit 1fa1cff5df72005fbc81eed701e39cc58fb30eeb
1 parent
d3c77ab1
Exists in
master
and in
3 other branches
resolvendo bugs do tipo Problema na verificação do formato do e-mail
Showing
2 changed files
with
36 additions
and
23 deletions
Show diff stats
users/forms.py
| 1 | # coding=utf-8 | 1 | # coding=utf-8 |
| 2 | +import re | ||
| 2 | from django import forms | 3 | from django import forms |
| 3 | from django.utils.translation import ugettext_lazy as _ | 4 | from django.utils.translation import ugettext_lazy as _ |
| 4 | from rolepermissions.shortcuts import assign_role | 5 | from rolepermissions.shortcuts import assign_role |
| @@ -19,6 +20,11 @@ class Validation(forms.ModelForm): | @@ -19,6 +20,11 @@ class Validation(forms.ModelForm): | ||
| 19 | 20 | ||
| 20 | try: | 21 | try: |
| 21 | validate_email( email ) | 22 | validate_email( email ) |
| 23 | + v_email = re.compile('[\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}') | ||
| 24 | + if v_email.fullmatch(email) is None: | ||
| 25 | + self._errors['email'] = [_('You must insert an email address')] | ||
| 26 | + | ||
| 27 | + return ValueError | ||
| 22 | return email | 28 | return email |
| 23 | except ValidationError: | 29 | except ValidationError: |
| 24 | self._errors['email'] = [_('You must insert an email address')] | 30 | self._errors['email'] = [_('You must insert an email address')] |
| @@ -67,7 +73,7 @@ class RegisterUserForm(Validation): | @@ -67,7 +73,7 @@ class RegisterUserForm(Validation): | ||
| 67 | model = User | 73 | model = User |
| 68 | fields = ['email', 'username', 'last_name', 'social_name', 'image', 'show_email', ] | 74 | fields = ['email', 'username', 'last_name', 'social_name', 'image', 'show_email', ] |
| 69 | widgets = { | 75 | widgets = { |
| 70 | - 'email': forms.TextInput(attrs = {'placeholder': _('Email') + ' *'}), | 76 | + 'email': forms.EmailInput(attrs = {'placeholder': _('Email') + ' *'}), |
| 71 | 'username': forms.TextInput(attrs = {'placeholder': _('Name') + ' *'}), | 77 | 'username': forms.TextInput(attrs = {'placeholder': _('Name') + ' *'}), |
| 72 | 'last_name': forms.TextInput(attrs = {'placeholder': _('Last Name') + ' *'}), | 78 | 'last_name': forms.TextInput(attrs = {'placeholder': _('Last Name') + ' *'}), |
| 73 | 'social_name': forms.TextInput(attrs = {'placeholder': _('Social Name')}), | 79 | 'social_name': forms.TextInput(attrs = {'placeholder': _('Social Name')}), |
| @@ -88,6 +94,7 @@ class ProfileForm(Validation): | @@ -88,6 +94,7 @@ class ProfileForm(Validation): | ||
| 88 | model = User | 94 | model = User |
| 89 | fields = ['email', 'username', 'last_name', 'social_name', 'description', 'show_email', 'image'] | 95 | fields = ['email', 'username', 'last_name', 'social_name', 'description', 'show_email', 'image'] |
| 90 | widgets = { | 96 | widgets = { |
| 97 | + 'email': forms.EmailInput, | ||
| 91 | 'description': forms.Textarea, | 98 | 'description': forms.Textarea, |
| 92 | 'username': forms.TextInput(attrs = {'readonly': 'readonly'}), | 99 | 'username': forms.TextInput(attrs = {'readonly': 'readonly'}), |
| 93 | 'last_name': forms.TextInput(attrs = {'readonly': 'readonly'}), | 100 | 'last_name': forms.TextInput(attrs = {'readonly': 'readonly'}), |
| @@ -122,6 +129,7 @@ class UserForm(Validation): | @@ -122,6 +129,7 @@ class UserForm(Validation): | ||
| 122 | model = User | 129 | model = User |
| 123 | fields = ['email', 'username', 'last_name', 'social_name', 'description', 'show_email', 'image', 'is_staff', 'is_active',] | 130 | fields = ['email', 'username', 'last_name', 'social_name', 'description', 'show_email', 'image', 'is_staff', 'is_active',] |
| 124 | widgets = { | 131 | widgets = { |
| 132 | + 'email': forms.EmailInput, | ||
| 125 | 'description': forms.Textarea, | 133 | 'description': forms.Textarea, |
| 126 | 'image': ResubmitFileWidget(attrs={'accept':'image/*'}), | 134 | 'image': ResubmitFileWidget(attrs={'accept':'image/*'}), |
| 127 | } | 135 | } |
| @@ -169,13 +177,18 @@ class ChangePassForm(Validation): | @@ -169,13 +177,18 @@ class ChangePassForm(Validation): | ||
| 169 | } | 177 | } |
| 170 | 178 | ||
| 171 | class PassResetRequest(forms.Form): | 179 | class PassResetRequest(forms.Form): |
| 172 | - email = forms.EmailField(label = _('Email'), max_length = 254, widget = forms.TextInput(attrs = {'placeholder': _('Email') + ' *'})) | 180 | + email = forms.EmailField(label = _('Email'), max_length = 254, widget = forms.EmailInput(attrs = {'placeholder': _('Email') + ' *'})) |
| 173 | 181 | ||
| 174 | def clean_email(self): | 182 | def clean_email(self): |
| 175 | email = self.cleaned_data.get('email', '') | 183 | email = self.cleaned_data.get('email', '') |
| 176 | 184 | ||
| 177 | try: | 185 | try: |
| 178 | validate_email( email ) | 186 | validate_email( email ) |
| 187 | + v_email = re.compile('[\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}') | ||
| 188 | + if v_email.fullmatch(email) is None: | ||
| 189 | + self._errors['email'] = [_('You must insert an email address')] | ||
| 190 | + | ||
| 191 | + return ValueError | ||
| 179 | return email | 192 | return email |
| 180 | except ValidationError: | 193 | except ValidationError: |
| 181 | self._errors['email'] = [_('You must insert a valid email address')] | 194 | self._errors['email'] = [_('You must insert a valid email address')] |
users/views.py
| @@ -47,7 +47,7 @@ class UsersListView(braces_mixins.LoginRequiredMixin, braces_mixins.StaffuserReq | @@ -47,7 +47,7 @@ class UsersListView(braces_mixins.LoginRequiredMixin, braces_mixins.StaffuserReq | ||
| 47 | 47 | ||
| 48 | def get_queryset(self): | 48 | def get_queryset(self): |
| 49 | users = User.objects.all().order_by('social_name','username').exclude(email = self.request.user.email) | 49 | users = User.objects.all().order_by('social_name','username').exclude(email = self.request.user.email) |
| 50 | - | 50 | + |
| 51 | return users | 51 | return users |
| 52 | 52 | ||
| 53 | def get_context_data (self, **kwargs): | 53 | def get_context_data (self, **kwargs): |
| @@ -70,14 +70,14 @@ class SearchView(braces_mixins.LoginRequiredMixin, braces_mixins.StaffuserRequir | @@ -70,14 +70,14 @@ class SearchView(braces_mixins.LoginRequiredMixin, braces_mixins.StaffuserRequir | ||
| 70 | 70 | ||
| 71 | if search == '': | 71 | if search == '': |
| 72 | return redirect(reverse_lazy('users:manage')) | 72 | return redirect(reverse_lazy('users:manage')) |
| 73 | - | 73 | + |
| 74 | return super(SearchView, self).dispatch(request, *args, **kwargs) | 74 | return super(SearchView, self).dispatch(request, *args, **kwargs) |
| 75 | 75 | ||
| 76 | def get_queryset(self): | 76 | def get_queryset(self): |
| 77 | search = self.request.GET.get('search', '') | 77 | search = self.request.GET.get('search', '') |
| 78 | 78 | ||
| 79 | users = User.objects.filter(Q(username__icontains = search) | Q(last_name__icontains = search) | Q(social_name__icontains = search) | Q(email__icontains = search)).distinct().order_by('social_name','username').exclude(email = self.request.user.email) | 79 | users = User.objects.filter(Q(username__icontains = search) | Q(last_name__icontains = search) | Q(social_name__icontains = search) | Q(email__icontains = search)).distinct().order_by('social_name','username').exclude(email = self.request.user.email) |
| 80 | - | 80 | + |
| 81 | return users | 81 | return users |
| 82 | 82 | ||
| 83 | def get_context_data (self, **kwargs): | 83 | def get_context_data (self, **kwargs): |
| @@ -143,9 +143,9 @@ class UpdateView(braces_mixins.LoginRequiredMixin, braces_mixins.StaffuserRequir | @@ -143,9 +143,9 @@ class UpdateView(braces_mixins.LoginRequiredMixin, braces_mixins.StaffuserRequir | ||
| 143 | 143 | ||
| 144 | def get_form_kwargs(self): | 144 | def get_form_kwargs(self): |
| 145 | kwargs = super(UpdateView, self).get_form_kwargs() | 145 | kwargs = super(UpdateView, self).get_form_kwargs() |
| 146 | - | 146 | + |
| 147 | kwargs.update({'is_edit': True}) | 147 | kwargs.update({'is_edit': True}) |
| 148 | - | 148 | + |
| 149 | return kwargs | 149 | return kwargs |
| 150 | 150 | ||
| 151 | def form_valid(self, form): | 151 | def form_valid(self, form): |
| @@ -235,7 +235,7 @@ class DeleteView(braces_mixins.LoginRequiredMixin, LogMixin, generic.DeleteView) | @@ -235,7 +235,7 @@ class DeleteView(braces_mixins.LoginRequiredMixin, LogMixin, generic.DeleteView) | ||
| 235 | self.log_context['dependencies'] = False | 235 | self.log_context['dependencies'] = False |
| 236 | 236 | ||
| 237 | user.delete() | 237 | user.delete() |
| 238 | - | 238 | + |
| 239 | messages.success(self.request, success_msg) | 239 | messages.success(self.request, success_msg) |
| 240 | 240 | ||
| 241 | redirect_url = redirect(success_url) | 241 | redirect_url = redirect(success_url) |
| @@ -275,10 +275,10 @@ class ChangePassView(LoginRequiredMixin, generic.UpdateView): | @@ -275,10 +275,10 @@ class ChangePassView(LoginRequiredMixin, generic.UpdateView): | ||
| 275 | 275 | ||
| 276 | def get_form_kwargs(self): | 276 | def get_form_kwargs(self): |
| 277 | kwargs = super(ChangePassView, self).get_form_kwargs() | 277 | kwargs = super(ChangePassView, self).get_form_kwargs() |
| 278 | - | 278 | + |
| 279 | kwargs.update({'user': self.request.user}) | 279 | kwargs.update({'user': self.request.user}) |
| 280 | kwargs.update({'request': self.request}) | 280 | kwargs.update({'request': self.request}) |
| 281 | - | 281 | + |
| 282 | return kwargs | 282 | return kwargs |
| 283 | 283 | ||
| 284 | def get_object(self): | 284 | def get_object(self): |
| @@ -297,7 +297,7 @@ class ChangePassView(LoginRequiredMixin, generic.UpdateView): | @@ -297,7 +297,7 @@ class ChangePassView(LoginRequiredMixin, generic.UpdateView): | ||
| 297 | context = super(ChangePassView, self).get_context_data(**kwargs) | 297 | context = super(ChangePassView, self).get_context_data(**kwargs) |
| 298 | context['title'] = _("Change Password") | 298 | context['title'] = _("Change Password") |
| 299 | 299 | ||
| 300 | - return context | 300 | + return context |
| 301 | 301 | ||
| 302 | class Profile(LoginRequiredMixin, generic.DetailView): | 302 | class Profile(LoginRequiredMixin, generic.DetailView): |
| 303 | login_url = reverse_lazy("users:login") | 303 | login_url = reverse_lazy("users:login") |
| @@ -333,7 +333,7 @@ class UpdateProfile(LoginRequiredMixin, generic.edit.UpdateView): | @@ -333,7 +333,7 @@ class UpdateProfile(LoginRequiredMixin, generic.edit.UpdateView): | ||
| 333 | def get_context_data(self, **kwargs): | 333 | def get_context_data(self, **kwargs): |
| 334 | context = super(UpdateProfile, self).get_context_data(**kwargs) | 334 | context = super(UpdateProfile, self).get_context_data(**kwargs) |
| 335 | context['title'] = _('Update Profile') | 335 | context['title'] = _('Update Profile') |
| 336 | - | 336 | + |
| 337 | return context | 337 | return context |
| 338 | 338 | ||
| 339 | def form_valid(self, form): | 339 | def form_valid(self, form): |
| @@ -406,7 +406,7 @@ class ForgotPassword(generic.FormView): | @@ -406,7 +406,7 @@ class ForgotPassword(generic.FormView): | ||
| 406 | 406 | ||
| 407 | subject_template_name = 'registration/password_reset_subject.txt' | 407 | subject_template_name = 'registration/password_reset_subject.txt' |
| 408 | email_template_name = 'recover_pass_email_template.html' | 408 | email_template_name = 'recover_pass_email_template.html' |
| 409 | - | 409 | + |
| 410 | subject = loader.render_to_string(subject_template_name, c) | 410 | subject = loader.render_to_string(subject_template_name, c) |
| 411 | # Email subject *must not* contain newlines | 411 | # Email subject *must not* contain newlines |
| 412 | subject = ''.join(subject.splitlines()) | 412 | subject = ''.join(subject.splitlines()) |
| @@ -423,7 +423,7 @@ class ForgotPassword(generic.FormView): | @@ -423,7 +423,7 @@ class ForgotPassword(generic.FormView): | ||
| 423 | tls = False | 423 | tls = False |
| 424 | 424 | ||
| 425 | backend = EmailBackend( | 425 | backend = EmailBackend( |
| 426 | - host = mailsender.hostname, port = mailsender.port, username = mailsender.username, | 426 | + host = mailsender.hostname, port = mailsender.port, username = mailsender.username, |
| 427 | password = mailsender.password, use_tls = tls, fail_silently = False | 427 | password = mailsender.password, use_tls = tls, fail_silently = False |
| 428 | ) | 428 | ) |
| 429 | 429 | ||
| @@ -433,12 +433,12 @@ class ForgotPassword(generic.FormView): | @@ -433,12 +433,12 @@ class ForgotPassword(generic.FormView): | ||
| 433 | 433 | ||
| 434 | result = self.form_valid(form) | 434 | result = self.form_valid(form) |
| 435 | messages.success(request, _("Soon you'll receive an email with instructions to set your new password. If you don't receive it in 24 hours, please check your spam box.")) | 435 | messages.success(request, _("Soon you'll receive an email with instructions to set your new password. If you don't receive it in 24 hours, please check your spam box.")) |
| 436 | - | 436 | + |
| 437 | return result | 437 | return result |
| 438 | - | 438 | + messages.error(request, _('No user is associated with this email address')) |
| 439 | + | ||
| 439 | result = self.form_invalid(form) | 440 | result = self.form_invalid(form) |
| 440 | - messages.error(request, _('No user is associated with this email address')) | ||
| 441 | - | 441 | + |
| 442 | return result | 442 | return result |
| 443 | 443 | ||
| 444 | class PasswordResetConfirmView(generic.FormView): | 444 | class PasswordResetConfirmView(generic.FormView): |
| @@ -456,7 +456,7 @@ class PasswordResetConfirmView(generic.FormView): | @@ -456,7 +456,7 @@ class PasswordResetConfirmView(generic.FormView): | ||
| 456 | form = self.get_form() | 456 | form = self.get_form() |
| 457 | 457 | ||
| 458 | assert uidb64 is not None and token is not None | 458 | assert uidb64 is not None and token is not None |
| 459 | - | 459 | + |
| 460 | try: | 460 | try: |
| 461 | uid = urlsafe_base64_decode(uidb64) | 461 | uid = urlsafe_base64_decode(uidb64) |
| 462 | user = User._default_manager.get(pk=uid) | 462 | user = User._default_manager.get(pk=uid) |
| @@ -466,12 +466,12 @@ class PasswordResetConfirmView(generic.FormView): | @@ -466,12 +466,12 @@ class PasswordResetConfirmView(generic.FormView): | ||
| 466 | if user is not None and default_token_generator.check_token(user, token): | 466 | if user is not None and default_token_generator.check_token(user, token): |
| 467 | if form.is_valid(): | 467 | if form.is_valid(): |
| 468 | new_password = form.cleaned_data['new_password'] | 468 | new_password = form.cleaned_data['new_password'] |
| 469 | - | 469 | + |
| 470 | user.set_password(new_password) | 470 | user.set_password(new_password) |
| 471 | user.save() | 471 | user.save() |
| 472 | - | 472 | + |
| 473 | messages.success(request, _('Password reset successfully.')) | 473 | messages.success(request, _('Password reset successfully.')) |
| 474 | - | 474 | + |
| 475 | return self.form_valid(form) | 475 | return self.form_valid(form) |
| 476 | else: | 476 | else: |
| 477 | messages.error(request, _('We were not able to reset your password.')) | 477 | messages.error(request, _('We were not able to reset your password.')) |
| @@ -504,7 +504,7 @@ def login(request): | @@ -504,7 +504,7 @@ def login(request): | ||
| 504 | 504 | ||
| 505 | return redirect(reverse("home")) | 505 | return redirect(reverse("home")) |
| 506 | else: | 506 | else: |
| 507 | - messages.error(request, _('System under maintenance. Try again later')) | 507 | + messages.error(request, _('System under maintenance. Try again later')) |
| 508 | else: | 508 | else: |
| 509 | messages.error(request, _('E-mail or password are incorrect.')) | 509 | messages.error(request, _('E-mail or password are incorrect.')) |
| 510 | context["username"] = username | 510 | context["username"] = username |