Ejemplo n.º 1
0
def new_phone_number(wallet, request):

    user = wallet.user

    if has_pending_phone_number_request(request, user):
        return httpexceptions.HTTPFound(request.resource_url(wallet, "confirm-phone-number"))

    schema = NewPhoneNumber().bind(request=request)

    b = deform.Button(name='process', title="Send verification code", css_class="btn-primary btn-block btn-lg")
    form = deform.Form(schema, buttons=(b,))

    # User submitted this form
    if request.method == "POST":
        if 'process' in request.POST:

            try:
                appstruct = form.validate(request.POST.items())

                # Save form data from appstruct
                phone_number = normalize_international_phone_number(appstruct["phone_number"])

                assert phone_number, "Could not normalizer phone number: {}".format(appstruct["phone_number"])

                UserNewPhoneNumberConfirmation.require_confirmation(user, phone_number)

                return httpexceptions.HTTPFound(request.resource_url(wallet, "confirm-phone-number"))

            except deform.ValidationFailure as e:
                # Render a form version where errors are visible next to the fields,
                # and the submitted values are posted back
                rendered_form = e.render()
        else:
            # We don't know which control caused form submission
            raise httpexceptions.HTTPInternalServerError("Unknown form button pressed")
    else:
        # Render a form with initial values
        rendered_form = form.render()

    return locals()
Ejemplo n.º 2
0
def new_phone_number(wallet, request):

    user = wallet.user

    if has_pending_phone_number_request(request, user):
        return httpexceptions.HTTPFound(request.resource_url(wallet, "confirm-phone-number"))

    schema = NewPhoneNumber().bind(request=request)

    b = deform.Button(name='process', title="Send verification code", css_class="btn-block btn-lg")
    form = deform.Form(schema, buttons=(b,))

    # User submitted this form
    if request.method == "POST":
        if 'process' in request.POST:

            try:
                appstruct = form.validate(request.POST.items())

                # Save form data from appstruct
                phone_number = normalize_international_phone_number(appstruct["phone_number"])

                assert phone_number, "Could not normalizer phone number: {}".format(appstruct["phone_number"])

                UserNewPhoneNumberConfirmation.require_confirmation(user, phone_number)

                return httpexceptions.HTTPFound(request.resource_url(wallet, "confirm-phone-number"))

            except deform.ValidationFailure as e:
                # Render a form version where errors are visible next to the fields,
                # and the submitted values are posted back
                rendered_form = e.render()
        else:
            # We don't know which control caused form submission
            raise httpexceptions.HTTPInternalServerError("Unknown form button pressed")
    else:
        # Render a form with initial values
        rendered_form = form.render()

    return locals()
def test_confirm_user_phone_number_cancel(dbsession, user_id):
    """SMS confirmation success."""

    # Prepare confirmation
    with transaction.manager:
        user = dbsession.query(User).get(user_id)
        confirmation = UserNewPhoneNumberConfirmation.require_confirmation(user, "+15551231234")
        assert confirmation.created_at
        assert confirmation.confirmation_type == ManualConfirmationType.sms
        assert confirmation.state == ManualConfirmationState.pending
        assert UserNewPhoneNumberConfirmation.get_pending_confirmation(user)

    # Resolve confirmation and see user gets a phone number
    with transaction.manager:
        user = dbsession.query(User).get(user_id)
        confirmation = dbsession.query(UserNewPhoneNumberConfirmation).first()
        confirmation.cancel()

        assert confirmation.action_taken_at
        assert confirmation.state == ManualConfirmationState.cancelled
        assert "phone_number" not in user.user_data
        assert not UserNewPhoneNumberConfirmation.get_pending_confirmation(user)
def test_confirm_user_phone_number_success(dbsession, user_id):
    """SMS confirmation success."""

    # Prepare confirmation
    with transaction.manager:
        user = dbsession.query(User).get(user_id)
        confirmation = UserNewPhoneNumberConfirmation.require_confirmation(user, "+15551231234")
        assert confirmation.created_at
        assert confirmation.confirmation_type == ManualConfirmationType.sms
        assert confirmation.state == ManualConfirmationState.pending
        assert UserNewPhoneNumberConfirmation.get_pending_confirmation(user)

    # Resolve confirmation and see user gets a phone number
    with transaction.manager:
        user = dbsession.query(User).get(user_id)
        confirmation = dbsession.query(UserNewPhoneNumberConfirmation).first()
        code = confirmation.other_data["sms_code"]
        confirmation.resolve_sms(code, None)

        assert confirmation.action_taken_at
        assert confirmation.state == ManualConfirmationState.resolved
        assert user.user_data["phone_number"] == "+15551231234"
        assert not UserNewPhoneNumberConfirmation.get_pending_confirmation(user)