0004-add-sms-code-model-69223.patch
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 |
- |