From 4e45d8e5dce18dc43e692a16d9391a19d9268404 Mon Sep 17 00:00:00 2001 From: Morgan Rees <65167892+morganmaerees@users.noreply.github.com> Date: Wed, 28 Aug 2024 14:58:18 +0100 Subject: [PATCH] DST-608: split out address forms only (#44) * Splitting out forms * Updating yourself address and address tests --------- Co-authored-by: Morgan Rees --- .../forms/forms_business.py | 95 +++++++++----- .../forms/forms_individual.py | 74 +++++++---- .../forms/forms_recipients.py | 118 +++++++++++++----- .../forms/forms_yourself.py | 54 ++++++-- .../views/views_business.py | 14 ++- .../views/views_individual.py | 16 ++- .../views/views_recipients.py | 12 +- .../views/views_yourself.py | 12 +- django_app/core/forms/base_forms.py | 90 ++++++++++--- .../test_forms/test_forms_business.py | 41 +++--- .../test_forms/test_forms_individual.py | 2 - .../test_forms/test_forms_recipients.py | 36 +++--- .../test_forms/test_forms_yourself.py | 36 +++--- 13 files changed, 402 insertions(+), 198 deletions(-) diff --git a/django_app/apply_for_a_licence/forms/forms_business.py b/django_app/apply_for_a_licence/forms/forms_business.py index 87867db9..10541da3 100644 --- a/django_app/apply_for_a_licence/forms/forms_business.py +++ b/django_app/apply_for_a_licence/forms/forms_business.py @@ -5,7 +5,12 @@ CompaniesHouseException, ) from apply_for_a_licence.models import Licence, Organisation -from core.forms.base_forms import BaseBusinessDetailsForm, BaseForm, BaseModelForm +from core.forms.base_forms import ( + BaseForm, + BaseModelForm, + BaseNonUKBusinessDetailsForm, + BaseUKBusinessDetailsForm, +) from core.utils import is_request_ratelimited from crispy_forms_gds.choices import Choice from crispy_forms_gds.layout import ( @@ -176,53 +181,81 @@ class WhereIsTheBusinessLocatedForm(BaseForm): ) -class AddABusinessForm(BaseBusinessDetailsForm): +class AddAUKBusinessForm(BaseUKBusinessDetailsForm): form_h1_header = "Add a business" - class Meta(BaseBusinessDetailsForm.Meta): + class Meta(BaseUKBusinessDetailsForm.Meta): model = Organisation fields = ( "name", "town_or_city", - "country", "address_line_1", "address_line_2", - "address_line_3", - "address_line_4", "county", "postcode", + "country", ) - widgets = BaseBusinessDetailsForm.Meta.widgets - labels = BaseBusinessDetailsForm.Meta.labels - error_messages = BaseBusinessDetailsForm.Meta.error_messages + widgets = BaseUKBusinessDetailsForm.Meta.widgets + labels = BaseUKBusinessDetailsForm.Meta.labels + error_messages = BaseUKBusinessDetailsForm.Meta.error_messages def __init__(self, *args: object, **kwargs: object) -> None: super().__init__(*args, **kwargs) - if self.is_uk_address: - address_layout = Fieldset( - Field.text("country", field_width=Fluid.ONE_THIRD), - Field.text("address_line_1", field_width=Fluid.ONE_THIRD), - Field.text("address_line_2", field_width=Fluid.ONE_THIRD), - Field.text("town_or_city", field_width=Fluid.ONE_THIRD), - Field.text("county", field_width=Fluid.ONE_THIRD), - Field.text("postcode", field_width=Fluid.ONE_THIRD), - legend="Address", - legend_size=Size.MEDIUM, - legend_tag="h2", - ) - else: - address_layout = Fieldset( - Field.text("town_or_city", field_width=Fluid.ONE_THIRD), - Field.text("country", field_width=Fluid.ONE_THIRD), - Field.text("address_line_1", field_width=Fluid.ONE_THIRD), - Field.text("address_line_2", field_width=Fluid.ONE_THIRD), - Field.text("address_line_3", field_width=Fluid.ONE_THIRD), - Field.text("address_line_4", field_width=Fluid.ONE_THIRD), - legend="Address", + address_layout = Fieldset( + Field.text("address_line_1", field_width=Fluid.ONE_THIRD), + Field.text("address_line_2", field_width=Fluid.ONE_THIRD), + Field.text("town_or_city", field_width=Fluid.ONE_THIRD), + Field.text("county", field_width=Fluid.ONE_THIRD), + Field.text("postcode", field_width=Fluid.ONE_THIRD), + legend="Address", + legend_size=Size.MEDIUM, + legend_tag="h2", + ) + + self.helper.layout = Layout( + Fieldset( + Field.text("name", field_width=Fluid.ONE_HALF), + legend="Name", legend_size=Size.MEDIUM, legend_tag="h2", - ) + ), + address_layout, + ) + + +class AddANonUKBusinessForm(BaseNonUKBusinessDetailsForm): + form_h1_header = "Add a business" + + class Meta(BaseNonUKBusinessDetailsForm.Meta): + model = Organisation + fields = ( + "name", + "town_or_city", + "country", + "address_line_1", + "address_line_2", + "address_line_3", + "address_line_4", + ) + widgets = BaseNonUKBusinessDetailsForm.Meta.widgets + labels = BaseNonUKBusinessDetailsForm.Meta.labels + error_messages = BaseNonUKBusinessDetailsForm.Meta.error_messages + + def __init__(self, *args: object, **kwargs: object) -> None: + super().__init__(*args, **kwargs) + + address_layout = Fieldset( + Field.text("town_or_city", field_width=Fluid.ONE_THIRD), + Field.text("country", field_width=Fluid.ONE_THIRD), + Field.text("address_line_1", field_width=Fluid.ONE_THIRD), + Field.text("address_line_2", field_width=Fluid.ONE_THIRD), + Field.text("address_line_3", field_width=Fluid.ONE_THIRD), + Field.text("address_line_4", field_width=Fluid.ONE_THIRD), + legend="Address", + legend_size=Size.MEDIUM, + legend_tag="h2", + ) self.helper.layout = Layout( Fieldset( diff --git a/django_app/apply_for_a_licence/forms/forms_individual.py b/django_app/apply_for_a_licence/forms/forms_individual.py index 6cfef858..12a40d41 100644 --- a/django_app/apply_for_a_licence/forms/forms_individual.py +++ b/django_app/apply_for_a_licence/forms/forms_individual.py @@ -1,5 +1,11 @@ from apply_for_a_licence.models import Individual, Organisation -from core.forms.base_forms import BaseBusinessDetailsForm, BaseForm, BaseModelForm +from core.forms.base_forms import ( + BaseBusinessDetailsForm, + BaseForm, + BaseModelForm, + BaseNonUKBusinessDetailsForm, + BaseUKBusinessDetailsForm, +) from crispy_forms_gds.choices import Choice from crispy_forms_gds.layout import Field, Fieldset, Fluid, Layout, Size from django import forms @@ -116,42 +122,64 @@ def __init__(self, *args: object, **kwargs: object) -> None: ) -class IndividualAddressForm(BaseBusinessDetailsForm): +class IndividualUKAddressForm(BaseUKBusinessDetailsForm): form_h1_header = "What is the individual's address?" - class Meta: + class Meta(BaseUKBusinessDetailsForm.Meta): model = Individual fields = ( "town_or_city", "country", "address_line_1", "address_line_2", - "address_line_3", - "address_line_4", "county", "postcode", ) - widgets = {"country": forms.Select} + widgets = BaseUKBusinessDetailsForm.Meta.widgets + labels = BaseUKBusinessDetailsForm.Meta.labels + error_messages = BaseUKBusinessDetailsForm.Meta.error_messages + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.helper.layout = Layout( + Field.text("address_line_1", field_width=Fluid.TWO_THIRDS), + Field.text("address_line_2", field_width=Fluid.TWO_THIRDS), + Field.text("town_or_city", field_width=Fluid.ONE_HALF), + Field.text("county", field_width=Fluid.ONE_HALF), + Field.text("postcode", field_width=Fluid.ONE_THIRD), + ) + + self.helper.label_size = None + + +class IndividualNonUKAddressForm(BaseNonUKBusinessDetailsForm): + form_h1_header = "What is the individual's address?" + + class Meta(BaseNonUKBusinessDetailsForm.Meta): + model = Individual + fields = ( + "town_or_city", + "country", + "address_line_1", + "address_line_2", + "address_line_3", + "address_line_4", + ) + widgets = BaseUKBusinessDetailsForm.Meta.widgets + labels = BaseUKBusinessDetailsForm.Meta.labels + error_messages = BaseUKBusinessDetailsForm.Meta.error_messages def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - if self.is_uk_address: - self.helper.layout = Layout( - Field.text("address_line_1", field_width=Fluid.TWO_THIRDS), - Field.text("address_line_2", field_width=Fluid.TWO_THIRDS), - Field.text("town_or_city", field_width=Fluid.ONE_HALF), - Field.text("county", field_width=Fluid.ONE_HALF), - Field.text("postcode", field_width=Fluid.ONE_THIRD), - ) - else: - self.helper.layout = Layout( - Field.text("country", field_width=Fluid.TWO_THIRDS), - Field.text("town_or_city", field_width=Fluid.TWO_THIRDS), - Field.text("address_line_1", field_width=Fluid.TWO_THIRDS), - Field.text("address_line_2", field_width=Fluid.TWO_THIRDS), - Field.text("address_line_3", field_width=Fluid.TWO_THIRDS), - Field.text("address_line_4", field_width=Fluid.TWO_THIRDS), - ) + self.helper.layout = Layout( + Field.text("country", field_width=Fluid.TWO_THIRDS), + Field.text("town_or_city", field_width=Fluid.TWO_THIRDS), + Field.text("address_line_1", field_width=Fluid.TWO_THIRDS), + Field.text("address_line_2", field_width=Fluid.TWO_THIRDS), + Field.text("address_line_3", field_width=Fluid.TWO_THIRDS), + Field.text("address_line_4", field_width=Fluid.TWO_THIRDS), + ) self.helper.label_size = None diff --git a/django_app/apply_for_a_licence/forms/forms_recipients.py b/django_app/apply_for_a_licence/forms/forms_recipients.py index 5602e872..d79190dd 100644 --- a/django_app/apply_for_a_licence/forms/forms_recipients.py +++ b/django_app/apply_for_a_licence/forms/forms_recipients.py @@ -1,5 +1,10 @@ from apply_for_a_licence.models import Organisation -from core.forms.base_forms import BaseBusinessDetailsForm, BaseForm +from core.forms.base_forms import ( + BaseBusinessDetailsForm, + BaseForm, + BaseNonUKBusinessDetailsForm, + BaseUKBusinessDetailsForm, +) from crispy_forms_gds.choices import Choice from crispy_forms_gds.layout import Field, Fieldset, Fluid, Layout, Size from django import forms @@ -17,7 +22,7 @@ class WhereIsTheRecipientLocatedForm(BaseForm): ) -class AddARecipientForm(BaseBusinessDetailsForm): +class AddAUKRecipientForm(BaseUKBusinessDetailsForm): form_h1_header = "About the recipient" labels = { "name": "Name of recipient", @@ -34,18 +39,17 @@ class AddARecipientForm(BaseBusinessDetailsForm): "name": "This could be a business, an individual or a ship", } - class Meta(BaseBusinessDetailsForm.Meta): + class Meta(BaseUKBusinessDetailsForm.Meta): model = Organisation fields = ( "name", + "name_of_person", "website", "email", "town_or_city", "country", "address_line_1", "address_line_2", - "address_line_3", - "address_line_4", "county", "postcode", ) @@ -56,37 +60,83 @@ class Meta(BaseBusinessDetailsForm.Meta): def __init__(self, *args: object, **kwargs: object) -> None: super().__init__(*args, **kwargs) - self.fields["town_or_city"].required = True - self.fields["address_line_1"].required = True - - if self.is_uk_address: - address_layout = Fieldset( - Field.text("country", field_width=Fluid.ONE_HALF), - Field.text("address_line_1", field_width=Fluid.TWO_THIRDS), - Field.text("address_line_2", field_width=Fluid.TWO_THIRDS), - Field.text("town_or_city", field_width=Fluid.ONE_HALF), - Field.text("county", field_width=Fluid.ONE_HALF), - Field.text("postcode", field_width=Fluid.ONE_THIRD), - legend="Address", - legend_size=Size.MEDIUM, - legend_tag="h2", - ) - - else: - address_layout = Fieldset( - Field.text("country", field_width=Fluid.TWO_THIRDS), - Field.text("town_or_city", field_width=Fluid.TWO_THIRDS), - Field.text("address_line_1", field_width=Fluid.TWO_THIRDS), - Field.text("address_line_2", field_width=Fluid.TWO_THIRDS), - Field.text("address_line_3", field_width=Fluid.TWO_THIRDS), - Field.text("address_line_4", field_width=Fluid.TWO_THIRDS), - legend="Address", + address_layout = Fieldset( + Field.text("address_line_1", field_width=Fluid.TWO_THIRDS), + Field.text("address_line_2", field_width=Fluid.TWO_THIRDS), + Field.text("town_or_city", field_width=Fluid.ONE_HALF), + Field.text("county", field_width=Fluid.ONE_HALF), + Field.text("postcode", field_width=Fluid.ONE_THIRD), + legend="Address", + legend_size=Size.MEDIUM, + legend_tag="h2", + ) + + self.helper.layout = Layout( + Fieldset( + Field.text("name_of_person", field_width=Fluid.TWO_THIRDS), + Field.text("name", field_width=Fluid.TWO_THIRDS), + Field.text("email", field_width=Fluid.TWO_THIRDS), + Field.text("website", field_width=Fluid.TWO_THIRDS), + legend="Name", legend_size=Size.MEDIUM, legend_tag="h2", - ) - self.fields["additional_contact_details"].help_text = ( - "This could be a phone number, or details of a jurisdiction instead of a country" - ) + ), + address_layout, + Field.textarea("additional_contact_details", field_width=Fluid.FULL, rows=5, label_tag="h2", label_size=Size.MEDIUM), + ) + + +class AddANonUKRecipientForm(BaseNonUKBusinessDetailsForm): + form_h1_header = "About the recipient" + labels = { + "name_of_person": "Name of person (optional)", + "email": "Email address (optional)", + "website": "Website address (optional)", + "additional_contact_details": "Additional contact details (optional)", + } + additional_contact_details = forms.CharField( + widget=forms.Textarea, + label="Additional contact details", + required=False, + ) + help_texts = { + "name": "If the recipient is a ship, enter the ship's name", + } + + class Meta(BaseNonUKBusinessDetailsForm.Meta): + model = Organisation + fields = ( + "name", + "website", + "email", + "town_or_city", + "country", + "address_line_1", + "address_line_2", + "address_line_3", + "address_line_4", + ) + widgets = BaseBusinessDetailsForm.Meta.widgets + labels = BaseBusinessDetailsForm.Meta.labels + error_messages = BaseBusinessDetailsForm.Meta.error_messages + + def __init__(self, *args: object, **kwargs: object) -> None: + super().__init__(*args, **kwargs) + + address_layout = Fieldset( + Field.text("country", field_width=Fluid.TWO_THIRDS), + Field.text("town_or_city", field_width=Fluid.TWO_THIRDS), + Field.text("address_line_1", field_width=Fluid.TWO_THIRDS), + Field.text("address_line_2", field_width=Fluid.TWO_THIRDS), + Field.text("address_line_3", field_width=Fluid.TWO_THIRDS), + Field.text("address_line_4", field_width=Fluid.TWO_THIRDS), + legend="Address", + legend_size=Size.MEDIUM, + legend_tag="h2", + ) + self.fields["additional_contact_details"].help_text = ( + "This could be a phone number, or details of a jurisdiction instead of a country" + ) self.helper.layout = Layout( Fieldset( diff --git a/django_app/apply_for_a_licence/forms/forms_yourself.py b/django_app/apply_for_a_licence/forms/forms_yourself.py index 2760e13f..320fa9b5 100644 --- a/django_app/apply_for_a_licence/forms/forms_yourself.py +++ b/django_app/apply_for_a_licence/forms/forms_yourself.py @@ -1,5 +1,10 @@ from apply_for_a_licence.models import Individual, Organisation -from core.forms.base_forms import BaseBusinessDetailsForm, BaseForm, BaseModelForm +from core.forms.base_forms import ( + BaseForm, + BaseModelForm, + BaseNonUKBusinessDetailsForm, + BaseUKBusinessDetailsForm, +) from crispy_forms_gds.layout import Field, Fluid, Layout, Size from django import forms @@ -43,31 +48,26 @@ def clean(self): return cleaned_data -class AddYourselfAddressForm(BaseBusinessDetailsForm): +class AddYourselfUKAddressForm(BaseUKBusinessDetailsForm): form_h1_header = "What is your work address?" - class Meta(BaseBusinessDetailsForm.Meta): + class Meta(BaseUKBusinessDetailsForm.Meta): model = Organisation fields = ( "town_or_city", "country", "address_line_1", "address_line_2", - "address_line_3", - "address_line_4", "county", "postcode", ) - widgets = BaseBusinessDetailsForm.Meta.widgets - labels = BaseBusinessDetailsForm.Meta.labels - error_messages = BaseBusinessDetailsForm.Meta.error_messages + widgets = BaseUKBusinessDetailsForm.Meta.widgets + labels = BaseUKBusinessDetailsForm.Meta.labels + error_messages = BaseUKBusinessDetailsForm.Meta.error_messages def __init__(self, *args: object, **kwargs: object) -> None: super().__init__(*args, **kwargs) - self.fields["town_or_city"].required = True - self.fields["address_line_1"].required = True - self.helper.layout = Layout( Field.text("town_or_city", field_width=Fluid.ONE_THIRD), Field.text("country", field_width=Fluid.ONE_THIRD), @@ -80,6 +80,38 @@ def __init__(self, *args: object, **kwargs: object) -> None: ) +class AddYourselfNonUKAddressForm(BaseNonUKBusinessDetailsForm): + form_h1_header = "What is your work address?" + + class Meta(BaseNonUKBusinessDetailsForm.Meta): + model = Organisation + fields = ( + "town_or_city", + "country", + "address_line_1", + "address_line_2", + "address_line_3", + "address_line_4", + "county", + "postcode", + ) + widgets = BaseNonUKBusinessDetailsForm.Meta.widgets + labels = BaseNonUKBusinessDetailsForm.Meta.labels + error_messages = BaseNonUKBusinessDetailsForm.Meta.error_messages + + def __init__(self, *args: object, **kwargs: object) -> None: + super().__init__(*args, **kwargs) + + self.helper.layout = Layout( + Field.text("town_or_city", field_width=Fluid.ONE_THIRD), + Field.text("country", field_width=Fluid.ONE_THIRD), + Field.text("address_line_1", field_width=Fluid.ONE_THIRD), + Field.text("address_line_2", field_width=Fluid.ONE_THIRD), + Field.text("address_line_3", field_width=Fluid.ONE_THIRD), + Field.text("address_line_4", field_width=Fluid.ONE_THIRD), + ) + + class DeclarationForm(BaseForm): declaration = forms.BooleanField( label="I agree and accept", required=True, error_messages={"required": "Confirm if you agree and accept the declaration"} diff --git a/django_app/apply_for_a_licence/views/views_business.py b/django_app/apply_for_a_licence/views/views_business.py index c1550cdd..9d17221c 100644 --- a/django_app/apply_for_a_licence/views/views_business.py +++ b/django_app/apply_for_a_licence/views/views_business.py @@ -16,7 +16,6 @@ class AddABusinessView(BaseFormView): - form_class = forms.AddABusinessForm template_name = "core/base_form_step.html" success_url = reverse_lazy("business_added") redirect_after_post = False @@ -33,11 +32,16 @@ def get_form_kwargs(self): if business_uuid := self.request.GET.get("business_uuid", None): if businesses_dict := self.request.session.get("businesses", {}).get(business_uuid, None): kwargs["data"] = businesses_dict["dirty_data"] - if self.location == "in_the_uk": - kwargs["is_uk_address"] = True return kwargs - def form_valid(self, form: forms.AddABusinessForm) -> HttpResponse: + def get_form_class(self): + if self.location == "in_the_uk": + form_class = forms.AddAUKBusinessForm + else: + form_class = forms.AddANonUKBusinessForm + return form_class + + def form_valid(self, form: forms.AddAUKBusinessForm | forms.AddANonUKBusinessForm) -> HttpResponse: current_businesses = self.request.session.get("businesses", {}) # get the business_uuid if it exists, otherwise create it if business_uuid := self.request.GET.get("business_uuid", self.kwargs.get("business_uuid", str(uuid.uuid4()))): @@ -101,7 +105,7 @@ def get_success_url(self) -> str: class DoYouKnowTheRegisteredCompanyNumberView(BaseFormView): form_class = forms.DoYouKnowTheRegisteredCompanyNumberForm - def form_valid(self, form: forms.AddABusinessForm) -> HttpResponse: + def form_valid(self, form: forms.DoYouKnowTheRegisteredCompanyNumberForm) -> HttpResponse: # Want to add companies house businesses to the business list current_businesses = self.request.session.get("businesses", {}) # get the business_uuid if it exists, otherwise create it diff --git a/django_app/apply_for_a_licence/views/views_individual.py b/django_app/apply_for_a_licence/views/views_individual.py index b4a85c53..c00f261e 100644 --- a/django_app/apply_for_a_licence/views/views_individual.py +++ b/django_app/apply_for_a_licence/views/views_individual.py @@ -72,14 +72,13 @@ def get_success_url(self): class WhatIsIndividualsAddressView(BaseFormView): - form_class = forms.IndividualAddressForm + + def setup(self, request, *args, **kwargs): + self.location = kwargs["location"] + return super().setup(request, *args, **kwargs) def get_form_kwargs(self): kwargs = super().get_form_kwargs() - if self.kwargs["location"] == "in_the_uk": - kwargs["is_uk_address"] = True - else: - kwargs["is_uk_address"] = False self.has_address_data = False if self.request.method == "GET": @@ -90,6 +89,13 @@ def get_form_kwargs(self): self.has_address_data = True return kwargs + def get_form_class(self) -> [forms.IndividualUKAddressForm | forms.IndividualNonUKAddressForm]: + if self.location == "in_the_uk": + form_class = forms.IndividualUKAddressForm + else: + form_class = forms.IndividualNonUKAddressForm + return form_class + def get_form(self, form_class=None): form = super().get_form(form_class) if self.request.method == "GET" and not self.has_address_data: diff --git a/django_app/apply_for_a_licence/views/views_recipients.py b/django_app/apply_for_a_licence/views/views_recipients.py index 066deeab..1ec2d71f 100644 --- a/django_app/apply_for_a_licence/views/views_recipients.py +++ b/django_app/apply_for_a_licence/views/views_recipients.py @@ -27,7 +27,6 @@ def get_success_url(self) -> str: class AddARecipientView(BaseFormView): - form_class = forms.AddARecipientForm template_name = "core/base_form_step.html" redirect_after_post = False @@ -43,11 +42,16 @@ def get_form_kwargs(self): if recipient_uuid := self.request.GET.get("recipient_uuid", None): if recipient_dict := self.request.session.get("recipients", {}).get(recipient_uuid, None): kwargs["data"] = recipient_dict["dirty_data"] - if self.location == "in_the_uk": - kwargs["is_uk_address"] = True return kwargs - def form_valid(self, form: forms.AddARecipientForm) -> HttpResponse: + def get_form_class(self) -> [forms.AddAUKRecipientForm | forms.AddANonUKRecipientForm]: + if self.location == "in_the_uk": + form_class = forms.AddAUKRecipientForm + else: + form_class = forms.AddANonUKRecipientForm + return form_class + + def form_valid(self, form: forms.AddAUKRecipientForm) -> HttpResponse: current_recipients = self.request.session.get("recipients", {}) # get the recipient_uuid if it exists, otherwise create it if recipient_uuid := self.request.GET.get("recipient_uuid", self.kwargs.get("recipient_uuid", str(uuid.uuid4()))): diff --git a/django_app/apply_for_a_licence/views/views_yourself.py b/django_app/apply_for_a_licence/views/views_yourself.py index 04a52914..6d7567e1 100644 --- a/django_app/apply_for_a_licence/views/views_yourself.py +++ b/django_app/apply_for_a_licence/views/views_yourself.py @@ -1,5 +1,4 @@ import logging -from typing import Any from apply_for_a_licence.forms import forms_individual as individual_forms from apply_for_a_licence.forms import forms_yourself as forms @@ -18,11 +17,10 @@ class AddYourselfView(BaseFormView): class AddYourselfAddressView(BaseFormView): - form_class = forms.AddYourselfAddressForm success_url = reverse_lazy("yourself_and_individual_added") - def get_form_kwargs(self) -> dict[str, Any]: - kwargs = super().get_form_kwargs() + def get_form_class(self) -> [forms.AddYourselfUKAddressForm | forms.AddYourselfNonUKAddressForm]: + form_class = forms.AddYourselfNonUKAddressForm if add_yourself_view := self.request.session.get("add_yourself", False): if add_yourself_view.get("nationality_and_location") in [ @@ -30,10 +28,10 @@ def get_form_kwargs(self) -> dict[str, Any]: "dual_national_uk_location", "non_uk_national_uk_location", ]: - kwargs["is_uk_address"] = True - return kwargs + form_class = forms.AddYourselfUKAddressForm + return form_class - def form_valid(self, form: forms.AddYourselfAddressForm) -> HttpResponse: + def form_valid(self, form: forms.AddYourselfUKAddressForm | forms.AddYourselfNonUKAddressForm) -> HttpResponse: your_address = { "cleaned_data": form.cleaned_data, "dirty_data": form.data, diff --git a/django_app/core/forms/base_forms.py b/django_app/core/forms/base_forms.py index 4bc75bf9..5bc3a6d2 100644 --- a/django_app/core/forms/base_forms.py +++ b/django_app/core/forms/base_forms.py @@ -106,36 +106,54 @@ class Meta: readable_address = forms.CharField(widget=forms.HiddenInput, required=False) def __init__(self, *args: object, **kwargs: object) -> None: - self.is_uk_address = kwargs.pop("is_uk_address", False) super().__init__(*args, **kwargs) - if self.is_uk_address: - self.fields["postcode"].required = True - self.fields["country"].initial = "GB" - self.fields["country"].widget = forms.HiddenInput() - del self.fields["address_line_3"] - del self.fields["address_line_4"] - else: - del self.fields["postcode"] - del self.fields["county"] - self.fields["town_or_city"].required = False - self.fields["address_line_1"].required = False - self.fields["country"].required = True - self.fields["country"].empty_label = "Select country" - self.helper.label_size = None + self.fields["town_or_city"].required = True + self.fields["address_line_1"].required = True def clean(self) -> dict[str, Any]: cleaned_data = super().clean() - if self.is_uk_address: - cleaned_data["country"] = "GB" cleaned_data["readable_address"] = get_formatted_address(cleaned_data) + return cleaned_data + + +class BaseUKBusinessDetailsForm(BaseBusinessDetailsForm): + """A base form for capturing UK business details. Such as the AddAUKBusiness Form""" + + class Meta(BaseBusinessDetailsForm.Meta): + widgets = BaseBusinessDetailsForm.Meta.widgets + labels = BaseBusinessDetailsForm.Meta.labels + error_messages = BaseBusinessDetailsForm.Meta.error_messages + fields = ( + "name", + "name_of_person", + "website", + "email", + "town_or_city", + "country", + "address_line_1", + "address_line_2", + "county", + "postcode", + ) + + def __init__(self, *args: object, **kwargs: object) -> None: + super().__init__(*args, **kwargs) + self.fields["postcode"].required = True + self.fields["country"].initial = "GB" + self.fields["country"].widget = forms.HiddenInput() + + self.helper.label_size = None - cleaned_data["url_location"] = "in_the_uk" if self.is_uk_address else "outside_the_uk" + def clean(self) -> dict[str, Any]: + cleaned_data = super().clean() + cleaned_data["country"] = "GB" + cleaned_data["url_location"] = "in_the_uk" return cleaned_data def clean_postcode(self) -> dict[str, Any]: postcode = self.cleaned_data.get("postcode") - if self.is_uk_address and postcode: + if postcode: # we want to validate a UK postcode pattern = re.compile(r"^[A-Za-z]{1,2}\d[A-Za-z\d]? ?\d[A-Za-z]{2}$") if not pattern.match(postcode): @@ -143,6 +161,40 @@ def clean_postcode(self) -> dict[str, Any]: return postcode +class BaseNonUKBusinessDetailsForm(BaseBusinessDetailsForm): + """A base form for capturing non-UK business details. Such as the AddANonUKBusiness Form""" + + class Meta(BaseBusinessDetailsForm.Meta): + widgets = BaseBusinessDetailsForm.Meta.widgets + labels = BaseBusinessDetailsForm.Meta.labels + error_messages = BaseBusinessDetailsForm.Meta.error_messages + fields = ( + "name", + "name_of_person", + "website", + "email", + "town_or_city", + "country", + "address_line_1", + "address_line_2", + "address_line_3", + "address_line_4", + ) + + def __init__(self, *args: object, **kwargs: object) -> None: + super().__init__(*args, **kwargs) + + self.fields["country"].required = True + self.fields["country"].empty_label = "Select country" + + self.helper.label_size = None + + def clean(self) -> dict[str, Any]: + cleaned_data = super().clean() + cleaned_data["url_location"] = "outside_the_uk" + return cleaned_data + + class GenericForm(BaseForm): """Generic form when we're using a FormView which doesn't actually require a form""" diff --git a/tests/test_unit/test_apply_for_a_licence/test_forms/test_forms_business.py b/tests/test_unit/test_apply_for_a_licence/test_forms/test_forms_business.py index 95a41f04..a5e75b5e 100644 --- a/tests/test_unit/test_apply_for_a_licence/test_forms/test_forms_business.py +++ b/tests/test_unit/test_apply_for_a_licence/test_forms/test_forms_business.py @@ -92,48 +92,45 @@ def test_required(self, request_object): assert form.errors.as_data()["where_is_the_address"][0].code == "required" -class TestAddABusinessForm: - def test_uk_required(self): - form = forms.AddABusinessForm(data={}, is_uk_address=True) +class TestAddAUKBusinessForm: + def test_required(self): + form = forms.AddAUKBusinessForm(data={}) assert not form.is_valid() assert "name" in form.errors assert "postcode" in form.errors assert form.errors.as_data()["name"][0].code == "required" assert form.errors.as_data()["postcode"][0].code == "required" - def test_uk_valid(self): - form = forms.AddABusinessForm( + def test_valid(self): + form = forms.AddAUKBusinessForm( data={"name": "Business", "town_or_city": "London", "address_line_1": "40 Hollyhead", "postcode": "SW1A 1AA"}, - is_uk_address=True, ) assert form.is_valid() assert form.cleaned_data["url_location"] == "in_the_uk" - def test_non_uk_required(self): - form = forms.AddABusinessForm(data={}, is_uk_address=False) + def test_incorrect_postcode_validation(self): + + form = forms.AddAUKBusinessForm(data={"postcode": "123"}) + assert not form.is_valid() + assert "postcode" in form.errors + assert form.errors.as_data()["postcode"][0].code == "invalid" + + +class TestAddANonUKBusinessForm: + def test_required(self): + form = forms.AddANonUKBusinessForm(data={}) assert not form.is_valid() assert "name" in form.errors assert "country" in form.errors assert form.errors.as_data()["name"][0].code == "required" assert form.errors.as_data()["country"][0].code == "required" - def test_non_uk_valid(self): - form = forms.AddABusinessForm( - data={ - "name": "Business", - "country": "BE", - }, - is_uk_address=False, + def test_valid(self): + form = forms.AddANonUKBusinessForm( + data={"name": "Business", "country": "BE", "address_line_1": "40 Hollyhead", "town_or_city": "Brussels"}, ) assert form.is_valid() - def test_incorrect_postcode_validation(self): - - form = forms.AddABusinessForm(data={"postcode": "123"}, is_uk_address=True) - assert not form.is_valid() - assert "postcode" in form.errors - assert form.errors.as_data()["postcode"][0].code == "invalid" - class TestBusinessAddedForm: def test_required(self, post_request_object): diff --git a/tests/test_unit/test_apply_for_a_licence/test_forms/test_forms_individual.py b/tests/test_unit/test_apply_for_a_licence/test_forms/test_forms_individual.py index a0f4a1b3..fd1f994d 100644 --- a/tests/test_unit/test_apply_for_a_licence/test_forms/test_forms_individual.py +++ b/tests/test_unit/test_apply_for_a_licence/test_forms/test_forms_individual.py @@ -28,6 +28,4 @@ def test_required(self, request_object): form = forms.BusinessEmployingIndividualForm(data={}, request=request_object) assert not form.is_valid() assert "name" in form.errors - assert "country" in form.errors assert form.errors.as_data()["name"][0].code == "required" - assert form.errors.as_data()["country"][0].code == "required" diff --git a/tests/test_unit/test_apply_for_a_licence/test_forms/test_forms_recipients.py b/tests/test_unit/test_apply_for_a_licence/test_forms/test_forms_recipients.py index 1c5d8e6a..65c77d2c 100644 --- a/tests/test_unit/test_apply_for_a_licence/test_forms/test_forms_recipients.py +++ b/tests/test_unit/test_apply_for_a_licence/test_forms/test_forms_recipients.py @@ -9,9 +9,9 @@ def test_required(self, request_object): assert form.errors.as_data()["where_is_the_address"][0].code == "required" -class TestAddARecipientForm: - def test_uk_required(self): - form = forms.AddARecipientForm(data={}, is_uk_address=True) +class TestAddAUKRecipientForm: + def test_required(self): + form = forms.AddAUKRecipientForm(data={}) assert not form.is_valid() assert "name" in form.errors assert "town_or_city" in form.errors @@ -22,40 +22,40 @@ def test_uk_required(self): assert form.errors.as_data()["address_line_1"][0].code == "required" assert form.errors.as_data()["postcode"][0].code == "required" - def test_uk_valid(self): - form = forms.AddARecipientForm( + def test_valid(self): + form = forms.AddAUKRecipientForm( data={"name": "Business", "town_or_city": "London", "address_line_1": "40 Hollyhead", "postcode": "SW1A 1AA"}, - is_uk_address=True, ) assert form.is_valid() - def test_non_uk_required(self): - form = forms.AddARecipientForm(data={}, is_uk_address=False) + def test_incorrect_postcode_validation(self): + + form = forms.AddAUKRecipientForm(data={"postcode": "123"}) + assert not form.is_valid() + assert "postcode" in form.errors + assert form.errors.as_data()["postcode"][0].code == "invalid" + + +class TestAddNonUKRecipientForm: + def test_required(self): + form = forms.AddANonUKRecipientForm(data={}) assert not form.is_valid() assert "name" in form.errors assert "country" in form.errors assert form.errors.as_data()["name"][0].code == "required" assert form.errors.as_data()["country"][0].code == "required" - def test_non_uk_valid(self): - form = forms.AddARecipientForm( + def test_valid(self): + form = forms.AddANonUKRecipientForm( data={ "name": "Business", "country": "BE", "town_or_city": "Leuven", "address_line_1": "Sesteenweg", }, - is_uk_address=False, ) assert form.is_valid() - def test_incorrect_postcode_validation(self): - - form = forms.AddARecipientForm(data={"postcode": "123"}, is_uk_address=True) - assert not form.is_valid() - assert "postcode" in form.errors - assert form.errors.as_data()["postcode"][0].code == "invalid" - class TestRecipientAddedForm: def test_required(self, post_request_object): diff --git a/tests/test_unit/test_apply_for_a_licence/test_forms/test_forms_yourself.py b/tests/test_unit/test_apply_for_a_licence/test_forms/test_forms_yourself.py index dbf8453a..8d345a5e 100644 --- a/tests/test_unit/test_apply_for_a_licence/test_forms/test_forms_yourself.py +++ b/tests/test_unit/test_apply_for_a_licence/test_forms/test_forms_yourself.py @@ -15,9 +15,9 @@ def test_required(self, request_object): assert form.errors.as_data()["nationality_and_location"][0].code == "required" -class TestAddYourselfAddressForm: - def test_uk_required(self): - form = forms.AddYourselfAddressForm(data={}, is_uk_address=True) +class TestAddYourselfUKAddressForm: + def test_required(self): + form = forms.AddYourselfUKAddressForm(data={}) assert not form.is_valid() assert "town_or_city" in form.errors assert "address_line_1" in form.errors @@ -26,14 +26,23 @@ def test_uk_required(self): assert form.errors.as_data()["address_line_1"][0].code == "required" assert form.errors.as_data()["postcode"][0].code == "required" - def test_uk_valid(self): - form = forms.AddYourselfAddressForm( - data={"town_or_city": "London", "address_line_1": "40 Hollyhead", "postcode": "SW1A 1AA"}, is_uk_address=True + def test_valid(self): + form = forms.AddYourselfUKAddressForm( + data={"town_or_city": "London", "address_line_1": "40 Hollyhead", "postcode": "SW1A 1AA"} ) assert form.is_valid() - def test_non_uk_required(self): - form = forms.AddYourselfAddressForm(data={"country": None}, is_uk_address=False) + def test_incorrect_postcode_validation(self): + + form = forms.AddYourselfUKAddressForm(data={"postcode": "123"}) + assert not form.is_valid() + assert "postcode" in form.errors + assert form.errors.as_data()["postcode"][0].code == "invalid" + + +class TestAddYourselfNonUKAddressForm: + def test_required(self): + form = forms.AddYourselfNonUKAddressForm(data={"country": None}) assert not form.is_valid() assert "town_or_city" in form.errors assert "address_line_1" in form.errors @@ -43,14 +52,7 @@ def test_non_uk_required(self): assert form.errors.as_data()["address_line_1"][0].code == "required" def test_non_uk_valid(self): - form = forms.AddYourselfAddressForm( - data={"country": "BE", "town_or_city": "Brussels", "address_line_1": "Rue Neuve"}, is_uk_address=False + form = forms.AddYourselfNonUKAddressForm( + data={"country": "BE", "town_or_city": "Brussels", "address_line_1": "Rue Neuve"} ) assert form.is_valid() - - def test_incorrect_postcode_validation(self): - - form = forms.AddYourselfAddressForm(data={"postcode": "123"}, is_uk_address=True) - assert not form.is_valid() - assert "postcode" in form.errors - assert form.errors.as_data()["postcode"][0].code == "invalid"