diff --git a/src/registrar/forms/application_wizard.py b/src/registrar/forms/application_wizard.py index f442df6a7..ff40ad3e4 100644 --- a/src/registrar/forms/application_wizard.py +++ b/src/registrar/forms/application_wizard.py @@ -417,6 +417,10 @@ class ApplicationWizard(LoginRequiredMixin, NamedUrlSessionWizardView): context["form_titles"] = TITLES if self.steps.current == Step.ORGANIZATION_CONTACT: context["is_federal"] = self._is_federal() + if self.steps.current == Step.REVIEW: + context["step_cls"] = Step + application = self.get_application_object() + context["application"] = application return context def get_application_object(self) -> DomainApplication: @@ -439,9 +443,7 @@ class ApplicationWizard(LoginRequiredMixin, NamedUrlSessionWizardView): self.storage.extra_data["application_id"] = application.id return application - def forms_to_database( - self, forms: dict = None, form: RegistrarForm = None - ) -> DomainApplication: + def form_to_database(self, form: RegistrarForm) -> DomainApplication: """ Unpack the form responses onto the model object properties. @@ -449,16 +451,8 @@ class ApplicationWizard(LoginRequiredMixin, NamedUrlSessionWizardView): """ application = self.get_application_object() - if forms: - itr = forms - elif form: - itr = {"form": form} - else: - raise TypeError("forms and form cannot both be None") - - for form in itr.values(): - if form is not None and hasattr(form, "to_database"): - form.to_database(application) + if form is not None and hasattr(form, "to_database"): + form.to_database(application) return application @@ -469,7 +463,7 @@ class ApplicationWizard(LoginRequiredMixin, NamedUrlSessionWizardView): Do not manipulate the form data here. """ # save progress - self.forms_to_database(form=form) + self.form_to_database(form=form) return self.get_form_step_data(form) def get_form(self, step=None, data=None, files=None): @@ -509,7 +503,7 @@ class ApplicationWizard(LoginRequiredMixin, NamedUrlSessionWizardView): def done(self, form_list, form_dict, **kwargs): """Called when the data for every form is submitted and validated.""" - application = self.forms_to_database(forms=form_dict) + application = self.get_application_object() application.submit() # change the status to submitted application.save() logger.debug("Application object saved: %s", application.id) diff --git a/src/registrar/migrations/0006_alter_domainapplication_federal_agency.py b/src/registrar/migrations/0006_alter_domainapplication_federal_agency.py new file mode 100644 index 000000000..a214b4666 --- /dev/null +++ b/src/registrar/migrations/0006_alter_domainapplication_federal_agency.py @@ -0,0 +1,20 @@ +# Generated by Django 4.1.3 on 2022-12-12 14:48 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("registrar", "0005_domainapplication_city_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="domainapplication", + name="federal_agency", + field=models.TextField( + blank=True, help_text="Top level federal agency", null=True + ), + ), + ] diff --git a/src/registrar/models/contact.py b/src/registrar/models/contact.py index 01cdcc769..6368a0101 100644 --- a/src/registrar/models/contact.py +++ b/src/registrar/models/contact.py @@ -40,9 +40,14 @@ class Contact(models.Model): db_index=True, ) + def get_formatted_name(self): + """Returns the contact's name in Western order.""" + names = [n for n in [self.first_name, self.middle_name, self.last_name] if n] + return " ".join(names) if names else "Unknown" + def __str__(self): if self.first_name or self.last_name: - return f"{self.title or ''} {self.first_name or ''} {self.last_name or ''}" + return self.get_formatted_name() elif self.email: return self.email elif self.pk: diff --git a/src/registrar/models/domain_application.py b/src/registrar/models/domain_application.py index 1f8fe5683..110f4fac2 100644 --- a/src/registrar/models/domain_application.py +++ b/src/registrar/models/domain_application.py @@ -287,7 +287,7 @@ class DomainApplication(TimeStampedModel): federal_agency = models.TextField( null=True, - blank=False, + blank=True, help_text="Top level federal agency", ) diff --git a/src/registrar/templates/application_review.html b/src/registrar/templates/application_review.html index c4ac67c6e..1be19cade 100644 --- a/src/registrar/templates/application_review.html +++ b/src/registrar/templates/application_review.html @@ -8,14 +8,69 @@ {{ wizard.management_form }} {% csrf_token %} - {% for this_step in wizard.steps.all|slice:":-1" %} + {% for step in wizard.steps.all|slice:":-1" %}
- {{ form_titles|get_item:this_step }} - Edit -
-
- <Answer value> +
+
{{ form_titles|get_item:step }}
+
+ {% if step == step_cls.ORGANIZATION_TYPE %} + {{ application.get_organization_type_display }} + {% endif %} + {% if step == step_cls.ORGANIZATION_FEDERAL %} + {{ application.get_federal_type_display }} + {% endif %} + {% if step == step_cls.ORGANIZATION_ELECTION %} + {{ application.is_election_board|yesno:"Yes,No,Maybe" }} + {% endif %} + {% if step == step_cls.ORGANIZATION_CONTACT %} + {% include "includes/organization_address.html" with organization=application %} + {% endif %} + {% if step == step_cls.AUTHORIZING_OFFICIAL %} + {% include "includes/contact.html" with contact=application.authorizing_official %} + {% endif %} + {% if step == step_cls.CURRENT_SITES %} +
    + {% for site in application.current_websites.all %} +
  • {{ site.website }}
  • + {% empty %} +
  • None
  • + {% endfor %} +
+ {% endif %} + {% if step == step_cls.DOTGOV_DOMAIN %} +
    +
  • {{ application.requested_domain.name }}
  • + {% for site in application.alternative_domains.all %} +
  • {{ site.website }}
  • + {% endfor %} +
+ {% endif %} + {% if step == step_cls.PURPOSE %} + {{ application.purpose }} + {% endif %} + {% if step == step_cls.YOUR_CONTACT %} + {% include "includes/contact.html" with contact=application.submitter %} + {% endif %} + {% if step == step_cls.OTHER_CONTACTS %} + {% for other in application.other_contacts.all %} + {% include "includes/contact.html" with contact=other %} + {% empty %} + None + {% endfor %} + {% endif %} + {% if step == step_cls.SECURITY_EMAIL %} + {{ application.security_email }} + {% endif %} + {% if step == step_cls.ANYTHING_ELSE %} + {{ application.anything_else }} + {% endif %} +
+
+ Edit {{ form_titles|get_item:step }}
{% endfor %} diff --git a/src/registrar/templates/includes/contact.html b/src/registrar/templates/includes/contact.html new file mode 100644 index 000000000..193de3187 --- /dev/null +++ b/src/registrar/templates/includes/contact.html @@ -0,0 +1,6 @@ +
+ {{ contact.get_formatted_name }}
+ {% if contact.title %}{{ contact.title }}
{% endif %} + {% if contact.email %}{{ contact.email }}
{% endif %} + {% if contact.phone %}{{ contact.phone }}{% endif %} +
\ No newline at end of file diff --git a/src/registrar/templates/includes/organization_address.html b/src/registrar/templates/includes/organization_address.html new file mode 100644 index 000000000..52f0d437a --- /dev/null +++ b/src/registrar/templates/includes/organization_address.html @@ -0,0 +1,25 @@ +
+ {% if organization.organization_name %} + {{ organization.organization_name }} + {% endif %} + {% if organization.address_line1 %} +
{{ organization.address_line1 }} + {% endif %} + {% if organization.address_line2 %} +
{{ organization.address_line2 }} + {% endif %} + {% if organization.city %} +
{{ organization.city }}{% if organization.state_territory %},  + {% else %}
+ {% endif %} + {% endif %} + {% if organization.state_territory %} + {{ organization.state_territory }} + {% endif %} + {% if organization.zipcode %} +
{{ organization.zipcode }} + {% endif %} + {% if organization.urbanization %} +
{{ organization.urbanization }} + {% endif %} +
\ No newline at end of file diff --git a/src/registrar/tests/test_views.py b/src/registrar/tests/test_views.py index 8e051d30b..534cf4130 100644 --- a/src/registrar/tests/test_views.py +++ b/src/registrar/tests/test_views.py @@ -218,8 +218,8 @@ class DomainApplicationTests(TestWithUser, WebTest): # Follow the redirect to the next form page ao_page = org_contact_result.follow() ao_form = ao_page.form - ao_form["authorizing_official-first_name"] = "Testy" - ao_form["authorizing_official-last_name"] = "Tester" + ao_form["authorizing_official-first_name"] = "Testy ATO" + ao_form["authorizing_official-last_name"] = "Tester ATO" ao_form["authorizing_official-title"] = "Chief Tester" ao_form["authorizing_official-email"] = "testy@town.com" ao_form["authorizing_official-phone"] = "(555) 555 5555" @@ -231,8 +231,8 @@ class DomainApplicationTests(TestWithUser, WebTest): self.assertEquals(result["Location"], "/register/authorizing_official/") # should see results in db application = DomainApplication.objects.get() # there's only one - self.assertEquals(application.authorizing_official.first_name, "Testy") - self.assertEquals(application.authorizing_official.last_name, "Tester") + self.assertEquals(application.authorizing_official.first_name, "Testy ATO") + self.assertEquals(application.authorizing_official.last_name, "Tester ATO") self.assertEquals(application.authorizing_official.title, "Chief Tester") self.assertEquals(application.authorizing_official.email, "testy@town.com") self.assertEquals(application.authorizing_official.phone, "(555) 555 5555") @@ -300,7 +300,7 @@ class DomainApplicationTests(TestWithUser, WebTest): # Follow the redirect to the next form page purpose_page = dotgov_result.follow() purpose_form = purpose_page.form - purpose_form["purpose-purpose"] = "Purpose of the site" + purpose_form["purpose-purpose"] = "For all kinds of things." # test saving the page self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) @@ -309,7 +309,7 @@ class DomainApplicationTests(TestWithUser, WebTest): self.assertEquals(result["Location"], "/register/purpose/") # should see results in db application = DomainApplication.objects.get() # there's only one - self.assertEquals(application.purpose, "Purpose of the site") + self.assertEquals(application.purpose, "For all kinds of things.") # test next button self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) @@ -419,7 +419,7 @@ class DomainApplicationTests(TestWithUser, WebTest): anything_else_page = security_email_result.follow() anything_else_form = anything_else_page.form - anything_else_form["anything_else-anything_else"] = "No" + anything_else_form["anything_else-anything_else"] = "Nothing else." # test saving the page self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) @@ -428,7 +428,7 @@ class DomainApplicationTests(TestWithUser, WebTest): self.assertEquals(result["Location"], "/register/anything_else/") # should see results in db application = DomainApplication.objects.get() # there's only one - self.assertEquals(application.anything_else, "No") + self.assertEquals(application.anything_else, "Nothing else.") # test next button self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) @@ -464,9 +464,42 @@ class DomainApplicationTests(TestWithUser, WebTest): # ---- REVIEW AND FINSIHED PAGES ---- # Follow the redirect to the next form page + self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) review_page = requirements_result.follow() review_form = review_page.form + # Review page contains all the previously entered data + self.assertContains(review_page, "Federal") + self.assertContains(review_page, "Executive") + self.assertContains(review_page, "Testorg") + self.assertContains(review_page, "address 1") + self.assertContains(review_page, "address 2") + self.assertContains(review_page, "NYC") + self.assertContains(review_page, "NY") + self.assertContains(review_page, "10002") + self.assertContains(review_page, "URB Royal Oaks") + self.assertContains(review_page, "Testy ATO") + self.assertContains(review_page, "Tester ATO") + self.assertContains(review_page, "Chief Tester") + self.assertContains(review_page, "testy@town.com") + self.assertContains(review_page, "(555) 555 5555") + self.assertContains(review_page, "city.com") + self.assertContains(review_page, "city.gov") + self.assertContains(review_page, "city1.gov") + self.assertContains(review_page, "For all kinds of things.") + self.assertContains(review_page, "Testy you") + self.assertContains(review_page, "Tester you") + self.assertContains(review_page, "Admin Tester") + self.assertContains(review_page, "testy-admin@town.com") + self.assertContains(review_page, "(555) 555 5556") + self.assertContains(review_page, "Testy2") + self.assertContains(review_page, "Tester2") + self.assertContains(review_page, "Another Tester") + self.assertContains(review_page, "testy2@town.com") + self.assertContains(review_page, "(555) 555 5557") + self.assertContains(review_page, "security@city.com") + self.assertContains(review_page, "Nothing else.") + # test saving the page self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) result = review_page.form.submit("submit_button", value="save")