0001-custom_user-set-email-verification-sources-66053.patch
src/authentic2/csv_import.py | ||
---|---|---|
712 | 712 |
if getattr(user, cell.header.name) != cell.value: |
713 | 713 |
setattr(user, cell.header.name, cell.value) |
714 | 714 |
if cell.header.name == 'email' and cell.header.verified: |
715 |
user.set_email_verified(True) |
|
715 |
user.set_email_verified(True, source='csv')
|
|
716 | 716 |
cell.action = 'updated' |
717 | 717 |
continue |
718 | 718 |
cell.action = 'nothing' |
src/authentic2/custom_user/migrations/0032_user_email_verified_sources.py | ||
---|---|---|
1 |
# Generated by Django 2.2.26 on 2022-06-08 12:33 |
|
2 | ||
3 |
import django.contrib.postgres.fields |
|
4 |
from django.db import migrations, models |
|
5 | ||
6 | ||
7 |
class Migration(migrations.Migration): |
|
8 | ||
9 |
dependencies = [ |
|
10 |
('custom_user', '0031_profile_email'), |
|
11 |
] |
|
12 | ||
13 |
operations = [ |
|
14 |
migrations.AddField( |
|
15 |
model_name='user', |
|
16 |
name='email_verified_sources', |
|
17 |
field=django.contrib.postgres.fields.ArrayField( |
|
18 |
base_field=models.CharField(max_length=63), |
|
19 |
default=list, |
|
20 |
size=None, |
|
21 |
verbose_name='email verification sources', |
|
22 |
), |
|
23 |
), |
|
24 |
] |
src/authentic2/custom_user/models.py | ||
---|---|---|
20 | 20 |
import os |
21 | 21 |
import uuid |
22 | 22 | |
23 |
from django.contrib.postgres.fields import ArrayField |
|
23 | 24 |
from django.core.exceptions import MultipleObjectsReturned, ValidationError |
24 | 25 |
from django.core.mail import send_mail |
25 | 26 |
from django.db import models, transaction |
... | ... | |
168 | 169 |
email_verified_date = models.DateTimeField( |
169 | 170 |
default=None, blank=True, null=True, verbose_name=_('email verified date') |
170 | 171 |
) |
172 |
email_verified_sources = ArrayField( |
|
173 |
verbose_name=_('email verification sources'), |
|
174 |
base_field=models.CharField(max_length=63), |
|
175 |
default=list, |
|
176 |
) |
|
171 | 177 |
is_staff = models.BooleanField( |
172 | 178 |
_('staff status'), |
173 | 179 |
default=False, |
... | ... | |
449 | 455 |
def get_absolute_url(self): |
450 | 456 |
return reverse('a2-manager-user-detail', kwargs={'pk': self.pk}) |
451 | 457 | |
452 |
def set_email_verified(self, value): |
|
453 |
if isinstance(value, datetime.datetime): |
|
454 |
self.email_verified = True |
|
455 |
self.email_verified_date = value |
|
456 |
elif bool(value): |
|
457 |
self.email_verified = True |
|
458 |
self.email_verified_date = timezone.now() |
|
458 |
def set_email_verified(self, value, source=None): |
|
459 |
if bool(value): |
|
460 |
if isinstance(value, datetime.datetime): |
|
461 |
self.email_verified = True |
|
462 |
self.email_verified_date = value |
|
463 |
else: |
|
464 |
self.email_verified = True |
|
465 |
self.email_verified_date = timezone.now() |
|
466 |
if source and source not in self.email_verified_sources: |
|
467 |
self.email_verified_sources.append(source) |
|
459 | 468 |
else: |
460 |
self.email_verified = False |
|
461 |
self.email_verified_date = None |
|
469 |
if source and source in self.email_verified_sources: |
|
470 |
self.email_verified_sources.remove(source) |
|
471 |
if not source or not self.email_verified_sources: |
|
472 |
self.email_verified = False |
|
473 |
self.email_verified_date = None |
|
462 | 474 | |
463 | 475 | |
464 | 476 |
class DeletedUser(models.Model): |
src/authentic2/forms/registration.py | ||
---|---|---|
138 | 138 |
return BaseUserManager.normalize_email(email) |
139 | 139 | |
140 | 140 |
def save(self, commit=True): |
141 |
self.instance.set_email_verified(True) |
|
141 |
self.instance.set_email_verified(True, source='registration')
|
|
142 | 142 |
self.instance.is_active = True |
143 | 143 |
user = super().save(commit=commit) |
144 | 144 |
if commit and app_settings.A2_REGISTRATION_GROUPS: |
src/authentic2/views.py | ||
---|---|---|
293 | 293 |
raise ValidationError(_('This email is already used by another account.')) |
294 | 294 |
old_email = user.email |
295 | 295 |
user.email = email |
296 |
user.set_email_verified(True) |
|
296 |
user.set_email_verified(True, source='user')
|
|
297 | 297 |
user.save() |
298 | 298 |
messages.info( |
299 | 299 |
request, _('your request for changing your email for {0} is successful').format(email) |
... | ... | |
1041 | 1041 | |
1042 | 1042 |
def form_valid(self, form): |
1043 | 1043 |
# Changing password by mail validate the email |
1044 |
form.user.set_email_verified(True) |
|
1044 |
form.user.set_email_verified(True, source='user')
|
|
1045 | 1045 |
form.save() |
1046 | 1046 |
hooks.call_hooks('event', name='password-reset-confirm', user=form.user, token=self.token, form=form) |
1047 | 1047 |
logger.info('password reset for user %s with token %r', self.user, self.token.uuid) |
src/authentic2_auth_oidc/backends.py | ||
---|---|---|
349 | 349 |
logger.info('auth_oidc: set user %s attribute %s to value %s', user, attribute, value) |
350 | 350 |
setattr(user, attribute, value) |
351 | 351 |
if attribute == 'email': |
352 |
user.set_email_verified(verified) |
|
352 |
user.set_email_verified(verified, source='oidc')
|
|
353 | 353 |
save_user = True |
354 | 354 | |
355 | 355 |
if user.ou != user_ou: |
tests/test_custom_user.py | ||
---|---|---|
165 | 165 |
ServiceProfileType.objects.create(service=service, profile_type=pft) |
166 | 166 |
assert list(service.profile_types.all()) == [pft] |
167 | 167 |
assert list(pft.services.all()) == [service] |
168 | ||
169 | ||
170 |
def test_user_email_verified(app, simple_user, superuser_or_admin): |
|
171 |
simple_user.set_email_verified(True, source='tests') |
|
172 |
simple_user.save() |
|
173 |
user = User.objects.get(id=simple_user.id) |
|
174 |
assert user.email_verified |
|
175 |
assert user.email_verified_sources == ['tests'] |
|
176 | ||
177 |
simple_user.set_email_verified(True, source='other') |
|
178 |
simple_user.save() |
|
179 |
user = User.objects.get(id=simple_user.id) |
|
180 |
assert user.email_verified |
|
181 |
assert user.email_verified_sources == ['tests', 'other'] |
|
182 | ||
183 |
simple_user.set_email_verified(False, source='tests') |
|
184 |
simple_user.save() |
|
185 |
user = User.objects.get(id=simple_user.id) |
|
186 |
assert user.email_verified |
|
187 |
assert user.email_verified_sources == ['other'] |
|
188 | ||
189 |
simple_user.set_email_verified(True, source='other') |
|
190 |
simple_user.save() |
|
191 |
user = User.objects.get(id=simple_user.id) |
|
192 |
assert user.email_verified |
|
193 |
assert user.email_verified_sources == ['other'] |
|
194 | ||
195 |
simple_user.set_email_verified(False, source='other') |
|
196 |
user = User.objects.get(id=simple_user.id) |
|
197 |
assert not user.email_verified |
|
198 |
assert user.email_verified_sources == [] |
|
168 |
- |