WIP: API d’enregistrement par numéro de téléphone, permettre le préremplissage des champs de profil (#83227) #169

Closed
pmarillonnet wants to merge 1 commits from wip/83227-phone-based-registration-api-save-registration-data into wip/83190-phone-registration-api-endpoint
5 changed files with 26 additions and 3 deletions

View File

@ -308,6 +308,7 @@ class Register(BaseRpcView):
code = utils_sms.send_registration_sms(
phone,
validated_data['ou'],
**registration_data,
)
except utils_sms.SMSError as e:
response = {

View File

@ -0,0 +1,17 @@
# Generated by Django 3.2.18 on 2023-11-08 10:23
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('authentic2', '0049_apiclient_allowed_user_attributes'),
]
operations = [
migrations.AddField(
model_name='smscode',
name='extra_content',
field=models.JSONField(blank=True, null=True, verbose_name='Extra content'),
),
]

View File

@ -850,13 +850,15 @@ class SMSCode(models.Model):
# fake codes to avoid disclosing account existence info on unjustified password reset attempts
fake = models.BooleanField(default=False, verbose_name=_('Is a fake code'))
extra_content = JSONField(verbose_name=_('Extra content'), blank=True, null=True)
@classmethod
def cleanup(cls, now=None):
now = now or timezone.now()
cls.objects.filter(expires__lte=now).delete()
@classmethod
def create(cls, phone, user=None, kind=None, expires=None, fake=False, duration=None):
def create(cls, phone, user=None, kind=None, expires=None, fake=False, duration=None, **kwargs):
if not kind:
kind = cls.KIND_REGISTRATION
if not duration:

View File

@ -48,7 +48,7 @@ def create_sms_code():
)
def generate_code(phone_number, user=None, kind=None, fake=False):
def generate_code(phone_number, user=None, kind=None, fake=False, **kwargs):
from authentic2.models import SMSCode
return SMSCode.create(
@ -56,6 +56,7 @@ def generate_code(phone_number, user=None, kind=None, fake=False):
user=user,
kind=kind or SMSCode.KIND_REGISTRATION,
fake=fake or kind is SMSCode.KIND_PASSWORD_LOST and user is None,
**kwargs,
)
@ -87,7 +88,7 @@ def send_sms(phone_number, ou, user=None, template_names=None, context=None, kin
code = None
if kind is not None:
# SMS with a specific action requires generating a code
code = generate_code(phone_number, user=user, kind=kind)
code = generate_code(phone_number, user=user, kind=kind, **kwargs)
if code.fake is True:
return code
context.update({'code': code})

View File

@ -1643,6 +1643,8 @@ class InputSMSCodeView(cbv.ValidateCSRFMixin, FormView):
'phone': self.code.phone,
'user': self.code.user.pk if self.code.user else None,
}
if self.code.extra_content is not None:
content.update(extra_content)
# create token to process final account activation and user-defined attributes
token = models.Token.create(
kind=self.code.CODE_TO_TOKEN_KINDS[self.code.kind],