Projet

Général

Profil

0001-custom_user-set-email-verification-sources-66053.patch

Paul Marillonnet, 08 juin 2022 15:30

Télécharger (8,64 ko)

Voir les différences:

Subject: [PATCH] custom_user: set email verification sources (#66053)

 src/authentic2/csv_import.py                  |  2 +-
 .../0032_user_email_verified_sources.py       | 24 ++++++++++++++
 src/authentic2/custom_user/models.py          | 30 ++++++++++++------
 src/authentic2/forms/registration.py          |  2 +-
 src/authentic2/views.py                       |  4 +--
 src/authentic2_auth_oidc/backends.py          |  2 +-
 tests/test_custom_user.py                     | 31 +++++++++++++++++++
 7 files changed, 81 insertions(+), 14 deletions(-)
 create mode 100644 src/authentic2/custom_user/migrations/0032_user_email_verified_sources.py
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
-