Projet

Général

Profil

0004-add-sms-code-model-69223.patch

Paul Marillonnet, 13 octobre 2022 14:06

Télécharger (4,68 ko)

Voir les différences:

Subject: [PATCH 04/10] add sms code model (#69223)

 src/authentic2/migrations/0045_smscode.py | 51 +++++++++++++++++++++++
 src/authentic2/models.py                  | 35 +++++++++++++++-
 2 files changed, 84 insertions(+), 2 deletions(-)
 create mode 100644 src/authentic2/migrations/0045_smscode.py
src/authentic2/migrations/0045_smscode.py
1
# Generated by Django 2.2.26 on 2022-10-12 14:53
2

  
3
import uuid
4

  
5
from django.db import migrations, models
6

  
7
import authentic2.utils.misc
8
import authentic2.validators
9

  
10

  
11
class Migration(migrations.Migration):
12

  
13
    dependencies = [
14
        ('authentic2', '0044_migrate_phone_field'),
15
    ]
16

  
17
    operations = [
18
        migrations.CreateModel(
19
            name='SMSCode',
20
            fields=[
21
                (
22
                    'id',
23
                    models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
24
                ),
25
                (
26
                    'value',
27
                    models.CharField(
28
                        default=authentic2.utils.misc.create_sms_code,
29
                        editable=False,
30
                        max_length=32,
31
                        verbose_name='Identifier',
32
                    ),
33
                ),
34
                ('kind', models.CharField(max_length=32, verbose_name='Kind')),
35
                (
36
                    'phone',
37
                    models.CharField(
38
                        blank=True,
39
                        max_length=64,
40
                        null=True,
41
                        validators=[authentic2.validators.PhoneNumberValidator],
42
                        verbose_name='phone number',
43
                    ),
44
                ),
45
                ('url_token', models.UUIDField(default=uuid.uuid4, verbose_name='URL token')),
46
                ('created', models.DateTimeField(auto_now_add=True, verbose_name='Creation date')),
47
                ('expires', models.DateTimeField(verbose_name='Expires')),
48
                ('sent', models.BooleanField(default=False, verbose_name='SMS code sent')),
49
            ],
50
        ),
51
    ]
src/authentic2/models.py
42 42
from authentic2.a2_rbac.models import Role
43 43
from authentic2.a2_rbac.utils import get_default_ou_pk
44 44
from authentic2.utils.crypto import base64url_decode, base64url_encode
45
from authentic2.validators import HexaColourValidator
45
from authentic2.validators import HexaColourValidator, PhoneNumberValidator
46 46
from django_rbac.backends import DjangoRBACBackend
47 47

  
48 48
# install our natural_key implementation
49 49
from . import managers
50 50
from . import natural_key as unused_natural_key  # pylint: disable=unused-import
51
from .utils.misc import ServiceAccessDenied
51
from .utils.misc import ServiceAccessDenied, create_sms_code
52 52

  
53 53

  
54 54
class UserExternalId(models.Model):
......
732 732

  
733 733
    def get_absolute_url(self):
734 734
        return reverse('a2-manager-api-client-detail', kwargs={'pk': self.pk})
735

  
736

  
737
class SMSCode(models.Model):
738
    KIND_REGISTRATION = 'registration'
739
    KIND_PASSWORD_LOST = 'password-lost'
740
    value = models.CharField(
741
        verbose_name=_('Identifier'), default=create_sms_code, editable=False, max_length=32
742
    )
743
    kind = models.CharField(verbose_name=_('Kind'), max_length=32)
744
    phone = models.CharField(
745
        _('phone number'), null=True, blank=True, max_length=64, validators=[PhoneNumberValidator]
746
    )
747
    url_token = models.UUIDField(
748
        verbose_name=_('URL token'),
749
        default=uuid.uuid4,
750
    )
751
    created = models.DateTimeField(verbose_name=_('Creation date'), auto_now_add=True)
752
    expires = models.DateTimeField(verbose_name=_('Expires'))
753
    sent = models.BooleanField(default=False, verbose_name=_('SMS code sent'))
754

  
755
    @classmethod
756
    def cleanup(cls, now=None):
757
        now = now or timezone.now()
758
        cls.objects.filter(expires__lte=now).delete()
759

  
760
    @classmethod
761
    def create(cls, phone, kind=None, expires=None, duration=120):
762
        if not kind:
763
            kind = cls.KIND_REGISTRATION
764
        expires = expires or (timezone.now() + datetime.timedelta(seconds=duration))
765
        return cls.objects.create(kind=kind, phone=phone, expires=expires)
735
-