mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-09-09 10:19:48 -04:00
Consolidate callback forms and convert them to gov uk frontend
We had two identical callback form classes. One for delivery callbacks and one for inbound sms callbacks. Since they did not differ I consolidated them into one CallbackForm class that they both inherited from previously. I also substituted field classes for this form with new fields that cooperate with gov uk frontend.
This commit is contained in:
@@ -34,7 +34,6 @@ from wtforms import (
|
|||||||
TextAreaField,
|
TextAreaField,
|
||||||
ValidationError,
|
ValidationError,
|
||||||
validators,
|
validators,
|
||||||
widgets,
|
|
||||||
)
|
)
|
||||||
from wtforms.fields.html5 import EmailField, SearchField, TelField
|
from wtforms.fields.html5 import EmailField, SearchField, TelField
|
||||||
from wtforms.validators import URL, DataRequired, Length, Optional, Regexp
|
from wtforms.validators import URL, DataRequired, Length, Optional, Regexp
|
||||||
@@ -1804,10 +1803,6 @@ class PlaceholderForm(StripWhitespaceForm):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class PasswordFieldShowHasContent(StringField):
|
|
||||||
widget = widgets.PasswordInput(hide_value=False)
|
|
||||||
|
|
||||||
|
|
||||||
class ServiceInboundNumberForm(StripWhitespaceForm):
|
class ServiceInboundNumberForm(StripWhitespaceForm):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@@ -1820,37 +1815,21 @@ class ServiceInboundNumberForm(StripWhitespaceForm):
|
|||||||
|
|
||||||
|
|
||||||
class CallbackForm(StripWhitespaceForm):
|
class CallbackForm(StripWhitespaceForm):
|
||||||
|
url = GovukTextInputField(
|
||||||
|
"URL",
|
||||||
|
validators=[DataRequired(message='Cannot be empty'),
|
||||||
|
Regexp(regex="^https.*", message='Must be a valid https URL')]
|
||||||
|
)
|
||||||
|
bearer_token = GovukPasswordField(
|
||||||
|
"Bearer token",
|
||||||
|
validators=[DataRequired(message='Cannot be empty'),
|
||||||
|
Length(min=10, message='Must be at least 10 characters')]
|
||||||
|
)
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
return super().validate() or self.url.data == ''
|
return super().validate() or self.url.data == ''
|
||||||
|
|
||||||
|
|
||||||
class ServiceReceiveMessagesCallbackForm(CallbackForm):
|
|
||||||
url = StringField(
|
|
||||||
"URL",
|
|
||||||
validators=[DataRequired(message='Cannot be empty'),
|
|
||||||
Regexp(regex="^https.*", message='Must be a valid https URL')]
|
|
||||||
)
|
|
||||||
bearer_token = PasswordFieldShowHasContent(
|
|
||||||
"Bearer token",
|
|
||||||
validators=[DataRequired(message='Cannot be empty'),
|
|
||||||
Length(min=10, message='Must be at least 10 characters')]
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class ServiceDeliveryStatusCallbackForm(CallbackForm):
|
|
||||||
url = StringField(
|
|
||||||
"URL",
|
|
||||||
validators=[DataRequired(message='Cannot be empty'),
|
|
||||||
Regexp(regex="^https.*", message='Must be a valid https URL')]
|
|
||||||
)
|
|
||||||
bearer_token = PasswordFieldShowHasContent(
|
|
||||||
"Bearer token",
|
|
||||||
validators=[DataRequired(message='Cannot be empty'),
|
|
||||||
Length(min=10, message='Must be at least 10 characters')]
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class InternationalSMSForm(StripWhitespaceForm):
|
class InternationalSMSForm(StripWhitespaceForm):
|
||||||
enabled = RadioField(
|
enabled = RadioField(
|
||||||
'Send text messages to international phone numbers',
|
'Send text messages to international phone numbers',
|
||||||
|
|||||||
@@ -16,12 +16,7 @@ from app import (
|
|||||||
service_api_client,
|
service_api_client,
|
||||||
)
|
)
|
||||||
from app.main import main
|
from app.main import main
|
||||||
from app.main.forms import (
|
from app.main.forms import CallbackForm, CreateKeyForm, GuestList
|
||||||
CreateKeyForm,
|
|
||||||
GuestList,
|
|
||||||
ServiceDeliveryStatusCallbackForm,
|
|
||||||
ServiceReceiveMessagesCallbackForm,
|
|
||||||
)
|
|
||||||
from app.notify_client.api_key_api_client import (
|
from app.notify_client.api_key_api_client import (
|
||||||
KEY_TYPE_NORMAL,
|
KEY_TYPE_NORMAL,
|
||||||
KEY_TYPE_TEAM,
|
KEY_TYPE_TEAM,
|
||||||
@@ -195,7 +190,7 @@ def delivery_status_callback(service_id):
|
|||||||
else '.api_integration'
|
else '.api_integration'
|
||||||
)
|
)
|
||||||
|
|
||||||
form = ServiceDeliveryStatusCallbackForm(
|
form = CallbackForm(
|
||||||
url=delivery_status_callback.get('url') if delivery_status_callback else '',
|
url=delivery_status_callback.get('url') if delivery_status_callback else '',
|
||||||
bearer_token=dummy_bearer_token if delivery_status_callback else ''
|
bearer_token=dummy_bearer_token if delivery_status_callback else ''
|
||||||
)
|
)
|
||||||
@@ -255,7 +250,7 @@ def received_text_messages_callback(service_id):
|
|||||||
return redirect(url_for('.api_integration', service_id=service_id))
|
return redirect(url_for('.api_integration', service_id=service_id))
|
||||||
|
|
||||||
received_text_messages_callback = get_received_text_messages_callback()
|
received_text_messages_callback = get_received_text_messages_callback()
|
||||||
form = ServiceReceiveMessagesCallbackForm(
|
form = CallbackForm(
|
||||||
url=received_text_messages_callback.get('url') if received_text_messages_callback else '',
|
url=received_text_messages_callback.get('url') if received_text_messages_callback else '',
|
||||||
bearer_token=dummy_bearer_token if received_text_messages_callback else ''
|
bearer_token=dummy_bearer_token if received_text_messages_callback else ''
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -23,17 +23,17 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
{% call form_wrapper() %}
|
{% call form_wrapper() %}
|
||||||
{{ textbox(
|
{{ form.url(param_extensions={
|
||||||
form.url,
|
"classes": "govuk-!-width-full",
|
||||||
width='1-1',
|
"hint": {"text": "Must start with https://"}
|
||||||
hint='Must start with https://'
|
}) }}
|
||||||
) }}
|
|
||||||
{{ textbox(
|
{{ form.bearer_token(param_extensions={
|
||||||
form.bearer_token,
|
"classes": "govuk-!-width-full",
|
||||||
width='1-1',
|
"hint": {"text": "At least 10 characters"},
|
||||||
hint='At least 10 characters',
|
"autocomplete": "new-password"
|
||||||
autocomplete='new-password'
|
}) }}
|
||||||
) }}
|
|
||||||
{{ page_footer('Save') }}
|
{{ page_footer('Save') }}
|
||||||
{% endcall %}
|
{% endcall %}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -21,17 +21,16 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
{% call form_wrapper() %}
|
{% call form_wrapper() %}
|
||||||
{{ textbox(
|
{{ form.url(param_extensions={
|
||||||
form.url,
|
"classes": "govuk-!-width-full",
|
||||||
width='1-1',
|
"hint": {"text": "Must start with https://"}
|
||||||
hint='Must start with https://'
|
}) }}
|
||||||
) }}
|
|
||||||
{{ textbox(
|
{{ form.bearer_token(param_extensions={
|
||||||
form.bearer_token,
|
"classes": "govuk-!-width-full",
|
||||||
width='1-1',
|
"hint": {"text": "At least 10 characters"},
|
||||||
hint='At least 10 characters',
|
"autocomplete": "new-password"
|
||||||
autocomplete='new-password'
|
}) }}
|
||||||
) }}
|
|
||||||
{{ page_footer('Save') }}
|
{{ page_footer('Save') }}
|
||||||
{% endcall %}
|
{% endcall %}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -512,9 +512,9 @@ def test_callback_forms_validation(
|
|||||||
_data=data,
|
_data=data,
|
||||||
_expected_status=200
|
_expected_status=200
|
||||||
)
|
)
|
||||||
error_msgs = ' '.join(msg.text.strip() for msg in response.select(".error-message"))
|
error_msgs = ' '.join(msg.text.strip() for msg in response.select(".govuk-error-message"))
|
||||||
|
|
||||||
assert error_msgs == expected_errors
|
assert expected_errors in error_msgs
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('bearer_token', ['', 'some-bearer-token'])
|
@pytest.mark.parametrize('bearer_token', ['', 'some-bearer-token'])
|
||||||
|
|||||||
Reference in New Issue
Block a user