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>'
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()
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), )
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), )
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), )