def test_form_class_not_mutated(app_):

    with app_.test_request_context(
        method='POST',
        data={'placeholder_value': ''}
    ):
        form1 = get_placeholder_form_instance('name', {}, 'sms', optional_placeholder=False)
        form2 = get_placeholder_form_instance('city', {}, 'sms', optional_placeholder=True)

        assert not form1.validate_on_submit()
        assert form2.validate_on_submit()

        assert str(form1.placeholder_value.label) == '<label for="placeholder_value">name</label>'
        assert str(form2.placeholder_value.label) == '<label for="placeholder_value">city</label>'
Example #2
0
def test_validates_recipients(
    app_,
    placeholder_name,
    value,
    service_can_send_international_sms,
    expected_error,
):
    with app_.test_request_context(
        method='POST',
        data={'placeholder_value': value}
    ):
        form = get_placeholder_form_instance(
            placeholder_name,
            {},
            allow_international_phone_numbers=service_can_send_international_sms,
        )

        if expected_error:
            assert not form.validate_on_submit()
            assert form.placeholder_value.errors[0] == expected_error
        else:
            assert form.validate_on_submit()
Example #3
0
def send_test_step(service_id, template_id, step_index):
    if {'recipient', 'placeholders'} - set(session.keys()):
        return redirect(
            url_for(
                {
                    'main.send_test_step': '.send_test',
                    'main.send_one_off_step': '.send_one_off',
                }[request.endpoint],
                service_id=service_id,
                template_id=template_id,
            ))

    db_template = current_service.get_template_with_user_permission_or_403(
        template_id, current_user)

    if not session.get('send_test_letter_page_count'):
        session['send_test_letter_page_count'] = get_page_count_for_letter(
            db_template)
    email_reply_to = None
    sms_sender = None
    if db_template['template_type'] == 'email':
        email_reply_to = get_email_reply_to_address_from_session()
    elif db_template['template_type'] == 'sms':
        sms_sender = get_sms_sender_from_session()
    template = get_template(db_template,
                            current_service,
                            show_recipient=True,
                            letter_preview_url=url_for(
                                '.send_test_preview',
                                service_id=service_id,
                                template_id=template_id,
                                filetype='png',
                            ),
                            page_count=session['send_test_letter_page_count'],
                            email_reply_to=email_reply_to,
                            sms_sender=sms_sender)

    placeholders = fields_to_fill_in(
        template,
        prefill_current_user=(request.endpoint == 'main.send_test_step'),
    )

    # used to set the back link in the check_notification screen
    session['send_step'] = request.endpoint

    try:
        current_placeholder = placeholders[step_index]
    except IndexError:
        if all_placeholders_in_session(placeholders):
            return get_notification_check_endpoint(service_id, template)
        return redirect(
            url_for(
                {
                    'main.send_test_step': '.send_test',
                    'main.send_one_off_step': '.send_one_off',
                }[request.endpoint],
                service_id=service_id,
                template_id=template_id,
            ))

    optional_placeholder = (current_placeholder in optional_address_columns)
    form = get_placeholder_form_instance(
        current_placeholder,
        dict_to_populate_from=get_normalised_placeholders_from_session(),
        template_type=template.template_type,
        optional_placeholder=optional_placeholder,
        allow_international_phone_numbers=current_service.has_permission(
            'international_sms'),
    )

    if form.validate_on_submit():
        # if it's the first input (phone/email), we store against `recipient` as well, for easier extraction.
        # Only if it's not a letter.
        # And only if we're not on the test route, since that will already have the user's own number set
        if (step_index == 0 and template.template_type != 'letter'
                and request.endpoint != 'main.send_test_step'):
            session['recipient'] = form.placeholder_value.data

        session['placeholders'][
            current_placeholder] = form.placeholder_value.data

        if all_placeholders_in_session(placeholders):
            return get_notification_check_endpoint(service_id, template)

        return redirect(
            url_for(
                request.endpoint,
                service_id=service_id,
                template_id=template_id,
                step_index=step_index + 1,
                help=get_help_argument(),
            ))

    back_link = get_back_link(service_id, template, step_index)

    template.values = get_recipient_and_placeholders_from_session(
        template.template_type)
    template.values[current_placeholder] = None

    if (request.endpoint == 'main.send_one_off_step' and step_index == 0
            and template.template_type != 'letter'
            and not (template.template_type == 'sms'
                     and current_user.mobile_number is None)
            and current_user.has_permissions('manage_templates',
                                             'manage_service')):

        type = first_column_headings[template.template_type][0]

        if (type == "email address"):
            type = _l("email address")
        elif (type == "phone number"):
            type = _l("phone number")

        skip_link = (
            '{} {}'.format(_l("Use my"), type),
            url_for('.send_test',
                    service_id=service_id,
                    template_id=template.id),
        )
    else:
        skip_link = None
    return render_template(
        'views/send-test.html',
        page_title=get_send_test_page_title(
            template.template_type,
            get_help_argument(),
            entering_recipient=not session['recipient'],
            name=template.name,
        ),
        template=template,
        form=form,
        skip_link=skip_link,
        optional_placeholder=optional_placeholder,
        back_link=back_link,
        help=get_help_argument(),
        link_to_upload=(request.endpoint == 'main.send_one_off_step'
                        and step_index == 0),
    )
Example #4
0
def send_one_off_step(service_id, template_id, step_index):
    if {'recipient', 'placeholders'} - set(session.keys()):
        return redirect(
            url_for(
                ".send_one_off",
                service_id=service_id,
                template_id=template_id,
            ))

    db_template = current_service.get_template_with_user_permission_or_403(
        template_id, current_user)

    email_reply_to = None
    sms_sender = None
    if db_template['template_type'] == 'email':
        email_reply_to = get_email_reply_to_address_from_session()
    elif db_template['template_type'] == 'sms':
        sms_sender = get_sms_sender_from_session()

    template_values = get_recipient_and_placeholders_from_session(
        db_template['template_type'])

    template = get_template(db_template,
                            current_service,
                            show_recipient=True,
                            letter_preview_url=url_for(
                                'no_cookie.send_test_preview',
                                service_id=service_id,
                                template_id=template_id,
                                filetype='png',
                            ),
                            page_count=get_page_count_for_letter(
                                db_template, values=template_values),
                            email_reply_to=email_reply_to,
                            sms_sender=sms_sender)

    placeholders = fields_to_fill_in(template)

    try:
        current_placeholder = placeholders[step_index]
    except IndexError:
        if all_placeholders_in_session(placeholders):
            return get_notification_check_endpoint(service_id, template)
        return redirect(
            url_for(
                '.send_one_off',
                service_id=service_id,
                template_id=template_id,
            ))

    # if we're in a letter, we should show address block rather than "address line #" or "postcode"
    if template.template_type == 'letter':
        if step_index < len(address_lines_1_to_7_keys):
            return redirect(
                url_for(
                    '.send_one_off_letter_address',
                    service_id=service_id,
                    template_id=template_id,
                ))
        if current_placeholder in Columns(
                PostalAddress('').as_personalisation):
            return redirect(
                url_for(
                    request.endpoint,
                    service_id=service_id,
                    template_id=template_id,
                    step_index=step_index + 1,
                ))

    form = get_placeholder_form_instance(
        current_placeholder,
        dict_to_populate_from=get_normalised_placeholders_from_session(),
        template_type=template.template_type,
        allow_international_phone_numbers=current_service.has_permission(
            'international_sms'),
    )

    if form.validate_on_submit():
        # if it's the first input (phone/email), we store against `recipient` as well, for easier extraction.
        # Only if it's not a letter.
        # And only if we're not on the test route, since that will already have the user's own number set
        if (step_index == 0 and template.template_type != 'letter'):
            session['recipient'] = form.placeholder_value.data

        session['placeholders'][
            current_placeholder] = form.placeholder_value.data

        if all_placeholders_in_session(placeholders):
            return get_notification_check_endpoint(service_id, template)

        return redirect(
            url_for(
                request.endpoint,
                service_id=service_id,
                template_id=template_id,
                step_index=step_index + 1,
            ))

    back_link = get_back_link(service_id, template, step_index, placeholders)

    template.values = template_values
    template.values[current_placeholder] = None

    return render_template(
        'views/send-test.html',
        page_title=get_send_test_page_title(
            template.template_type,
            entering_recipient=not session['recipient'],
            name=template.name,
        ),
        template=template,
        form=form,
        skip_link=get_skip_link(step_index, template),
        back_link=back_link,
        link_to_upload=(request.endpoint == 'main.send_one_off_step'
                        and step_index == 0),
    )
Example #5
0
def send_test_step(service_id, template_id, step_index):
    if {"recipient", "placeholders"} - set(session.keys()):
        return redirect(
            url_for(
                {
                    "main.send_test_step": ".send_test",
                    "main.send_one_off_step": ".send_one_off",
                }[request.endpoint],
                service_id=service_id,
                template_id=template_id,
            ))

    db_template = current_service.get_template_with_user_permission_or_403(
        template_id, current_user)

    if not session.get("send_test_letter_page_count"):
        session["send_test_letter_page_count"] = get_page_count_for_letter(
            db_template)
    email_reply_to = None
    sms_sender = None
    if db_template["template_type"] == "email":
        email_reply_to = get_email_reply_to_address_from_session()
    elif db_template["template_type"] == "sms":
        sms_sender = get_sms_sender_from_session()
    template = get_template(
        db_template,
        current_service,
        show_recipient=True,
        letter_preview_url=url_for(
            ".send_test_preview",
            service_id=service_id,
            template_id=template_id,
            filetype="png",
        ),
        page_count=session["send_test_letter_page_count"],
        email_reply_to=email_reply_to,
        sms_sender=sms_sender,
    )

    placeholders = fields_to_fill_in(
        template,
        prefill_current_user=(request.endpoint == "main.send_test_step"),
    )

    # used to set the back link in the check_notification screen
    session["send_step"] = request.endpoint

    try:
        current_placeholder = placeholders[step_index]
    except IndexError:
        if all_placeholders_in_session(placeholders):
            return get_notification_check_endpoint(service_id, template)
        return redirect(
            url_for(
                {
                    "main.send_test_step": ".send_test",
                    "main.send_one_off_step": ".send_one_off",
                }[request.endpoint],
                service_id=service_id,
                template_id=template_id,
            ))

    optional_placeholder = current_placeholder in optional_address_columns
    form = get_placeholder_form_instance(
        current_placeholder,
        dict_to_populate_from=get_normalised_placeholders_from_session(),
        template_type=template.template_type,
        optional_placeholder=optional_placeholder,
        allow_international_phone_numbers=current_service.has_permission(
            "international_sms"),
    )

    if form.validate_on_submit():
        # if it's the first input (phone/email), we store against `recipient` as well, for easier extraction.
        # Only if it's not a letter.
        # And only if we're not on the test route, since that will already have the user's own number set
        if step_index == 0 and template.template_type != "letter" and request.endpoint != "main.send_test_step":
            session["recipient"] = form.placeholder_value.data

        session["placeholders"][
            current_placeholder] = form.placeholder_value.data

        if all_placeholders_in_session(placeholders):
            return get_notification_check_endpoint(service_id, template)

        return redirect(
            url_for(
                request.endpoint,
                service_id=service_id,
                template_id=template_id,
                step_index=step_index + 1,
                help=get_help_argument(),
            ))

    back_link = get_back_link(service_id, template, step_index)

    template.values = get_recipient_and_placeholders_from_session(
        template.template_type)
    template.values[current_placeholder] = None

    return render_template(
        "views/send-test.html",
        page_title=get_send_test_page_title(
            template.template_type,
            get_help_argument(),
            entering_recipient=not session["recipient"],
        ),
        template=template,
        form=form,
        optional_placeholder=optional_placeholder,
        back_link=back_link,
        help=get_help_argument(),
        link_to_upload=(request.endpoint == "main.send_one_off_step"
                        and step_index == 0),
        bulk_send_allowed=service_can_bulk_send(service_id),
    )