diff --git a/src/registrar/forms/contact.py b/src/registrar/forms/contact.py
index 1ddc1a2a0..d699087c9 100644
--- a/src/registrar/forms/contact.py
+++ b/src/registrar/forms/contact.py
@@ -6,9 +6,24 @@ from django.core.validators import MaxLengthValidator
class ContactForm(forms.Form):
"""Form for adding or editing a contact"""
- def __init__(self, *args, **kwargs):
- kwargs.setdefault("label_suffix", "")
- super(ContactForm, self).__init__(*args, **kwargs)
+ def to_database(self, obj):
+ """
+ Adds this form's cleaned data to `obj` and saves `obj`.
+
+ Does nothing if form is not valid.
+ """
+ if not self.is_valid():
+ return
+ for name, value in self.cleaned_data.items():
+ setattr(obj, name, value)
+ obj.save()
+
+ @classmethod
+ def from_database(cls, obj):
+ """Returns a dict of form field values gotten from `obj`."""
+ if obj is None:
+ return {}
+ return {name: getattr(obj, name) for name in cls.declared_fields.keys()} # type: ignore
first_name = forms.CharField(
label="First name / given name",
diff --git a/src/registrar/registrar_middleware.py b/src/registrar/registrar_middleware.py
index 064757d80..783951279 100644
--- a/src/registrar/registrar_middleware.py
+++ b/src/registrar/registrar_middleware.py
@@ -23,7 +23,7 @@ class CheckUserProfileMiddleware:
# Check if setup is not finished
finished_setup = hasattr(request.user, "finished_setup") and request.user.finished_setup
if request.user.is_authenticated and not finished_setup:
- setup_page = reverse("finish-contact-profile-setup", kwargs={'pk': request.user.pk})
+ setup_page = reverse("finish-contact-profile-setup", kwargs={'pk': request.user.contact.pk})
logout_page = reverse("logout")
excluded_pages = [
setup_page,
diff --git a/src/registrar/templates/finish_contact_setup.html b/src/registrar/templates/finish_contact_setup.html
index 1849889c8..1d04c6a8f 100644
--- a/src/registrar/templates/finish_contact_setup.html
+++ b/src/registrar/templates/finish_contact_setup.html
@@ -42,7 +42,7 @@
Your contact information
{{form.first_name}}
- {% comment %}
+
{% input_with_errors form.first_name %}
{% input_with_errors form.middle_name %}
@@ -56,7 +56,7 @@
{% with add_class="usa-input--medium" %}
{% input_with_errors form.phone %}
{% endwith %}
- {% endcomment %}
+
diff --git a/src/registrar/views/contact.py b/src/registrar/views/contact.py
index 110ee254f..c640c9150 100644
--- a/src/registrar/views/contact.py
+++ b/src/registrar/views/contact.py
@@ -1,10 +1,13 @@
+from django.urls import reverse
from registrar.forms.contact import ContactForm
+from registrar.models.contact import Contact
from registrar.views.utility.permission_views import ContactPermissionView
from django.views.generic.edit import FormMixin
# TODO we can and probably should generalize this at this rate.
class BaseContactView(ContactPermissionView):
+
def get(self, request, *args, **kwargs):
self._set_contact(request)
context = self.get_context_data(object=self.object)
@@ -38,6 +41,7 @@ class BaseContactView(ContactPermissionView):
class ContactFormBaseView(BaseContactView, FormMixin):
+
def post(self, request, *args, **kwargs):
"""Form submission posts to this view.
@@ -54,13 +58,6 @@ class ContactFormBaseView(BaseContactView, FormMixin):
def check_form(self, form):
return self.form_valid(form) if form.is_valid() else self.form_invalid(form)
- def form_valid(self, form):
- # updates session cache with contact
- self._update_session_with_contact()
-
- # superclass has the redirect
- return super().form_valid(form)
-
def form_invalid(self, form):
# updates session cache with contact
self._update_session_with_contact()
@@ -69,45 +66,33 @@ class ContactFormBaseView(BaseContactView, FormMixin):
return super().form_invalid(form)
-class ContactProfileSetupView(ContactPermissionView):
+class ContactProfileSetupView(ContactFormBaseView):
"""This view forces the user into providing additional details that
we may have missed from Login.gov"""
template_name = "finish_contact_setup.html"
form_class = ContactForm
+ model = Contact
- def get_form_kwargs(self, *args, **kwargs):
- """Add domain_info.organization_name instance to make a bound form."""
- form_kwargs = super().get_form_kwargs(*args, **kwargs)
- form_kwargs["instance"] = self.object
- return form_kwargs
+ def get_success_url(self):
+ """Redirect to the nameservers page for the domain."""
+ # TODO - some logic should exist that navigates them to the domain request page if
+ # they clicked it on get.gov
- def get(self, request, *args, **kwargs):
- self._get_contact(request)
- context = self.get_context_data(object=self.object)
- return self.render_to_response(context)
+ # The user has finished their setup
- def _get_contact(self, request):
- """
- get domain from session cache or from db and set
- to self.object
- set session to self for downstream functions to
- update session cache
- """
- self.session = request.session
- contact_pk = "contact:" + str(self.kwargs.get("pk"))
- cached_contact = self.session.get(contact_pk)
+ # Add a notification that the update was successful
+ return reverse("home")
- if cached_contact:
- self.object = cached_contact
- else:
- self.object = self.get_object()
- self._set_session_contact_pk()
+ def form_valid(self, form):
+ self.request.user.finished_setup = True
+ self.request.user.save()
- def _set_session_contact_pk(self):
- """
- Set contact pk in the session cache
- """
- domain_pk = "contact:" + str(self.kwargs.get("pk"))
- self.session[domain_pk] = self.object
+ form.to_database(self.object)
+ self._update_session_with_contact()
+ return super().form_valid(form)
+
+ def get_initial(self):
+ """The initial value for the form (which is a formset here)."""
+ return self.form_class.from_database(self.object)