fixed domain information authorizing official

This commit is contained in:
David Kennedy 2024-01-12 15:29:52 -05:00
parent 4dae5ee23e
commit 9106fbb807
No known key found for this signature in database
GPG key ID: 6528A5386E66B96B
2 changed files with 70 additions and 0 deletions

View file

@ -1,9 +1,13 @@
"""Forms for domain management.""" """Forms for domain management."""
import logging
from django import forms from django import forms
from django.core.validators import MinValueValidator, MaxValueValidator, RegexValidator from django.core.validators import MinValueValidator, MaxValueValidator, RegexValidator
from django.forms import formset_factory from django.forms import formset_factory
from django.db.models.fields.related import ForeignObjectRel, OneToOneField
from phonenumber_field.widgets import RegionalPhoneNumberWidget from phonenumber_field.widgets import RegionalPhoneNumberWidget
from registrar.utility.errors import ( from registrar.utility.errors import (
NameserverError, NameserverError,
@ -22,6 +26,7 @@ from .common import (
import re import re
logger = logging.getLogger(__name__)
class DomainAddUserForm(forms.Form): class DomainAddUserForm(forms.Form):
"""Form for adding a user to a domain.""" """Form for adding a user to a domain."""
@ -209,6 +214,16 @@ class ContactForm(forms.ModelForm):
class AuthorizingOfficialContactForm(ContactForm): class AuthorizingOfficialContactForm(ContactForm):
"""Form for updating authorizing official contacts.""" """Form for updating authorizing official contacts."""
JOIN = "authorizing_official"
REVERSE_JOINS = [
"user",
"authorizing_official",
"submitted_applications",
"contact_applications",
"information_authorizing_official",
"submitted_applications_information",
"contact_applications_information",
]
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
@ -230,6 +245,60 @@ class AuthorizingOfficialContactForm(ContactForm):
self.fields["email"].error_messages = { self.fields["email"].error_messages = {
"required": "Enter an email address in the required format, like name@example.com." "required": "Enter an email address in the required format, like name@example.com."
} }
self.domainInfo = None
def setDomainInfo(self, domainInfo):
self.domainInfo = domainInfo
def save(self, commit=True):
logger.info(f"in save: {self.instance}")
logger.info(f"{self.instance.__class__.__name__}")
logger.info(f"{self.instance.id}")
logger.info(f"self.fields => {self.fields}")
logger.info(f"domain info: {self.instance.information_authorizing_official}")
# get db object
db_ao = Contact.objects.get(id=self.instance.id)
logger.info(f"db_ao.information_authorizing_official {db_ao.information_authorizing_official}")
if self.domainInfo and any(self.has_more_than_one_join(db_ao, rel, "information_authorizing_official") for rel in self.REVERSE_JOINS):
logger.info(f"domain info => {self.domainInfo}")
logger.info(f"authorizing official id => {self.domainInfo.authorizing_official.id}")
contact = Contact()
for name, value in self.cleaned_data.items():
setattr(contact, name, value)
contact.save()
self.domainInfo.authorizing_official = contact
self.domainInfo.save()
else:
super().save()
def has_more_than_one_join(self, db_obj, rel, related_name):
"""Helper for finding whether an object is joined more than once."""
# threshold is the number of related objects that are acceptable
# when determining if related objects exist. threshold is 0 for most
# relationships. if the relationship is related_name, we know that
# there is already exactly 1 acceptable relationship (the one we are
# attempting to delete), so the threshold is 1
threshold = 1 if rel == related_name else 0
# Raise a KeyError if rel is not a defined field on the db_obj model
# This will help catch any errors in reverse_join config on forms
if rel not in [field.name for field in db_obj._meta.get_fields()]:
raise KeyError(f"{rel} is not a defined field on the {db_obj._meta.model_name} model.")
# if attr rel in db_obj is not None, then test if reference object(s) exist
if getattr(db_obj, rel) is not None:
field = db_obj._meta.get_field(rel)
if isinstance(field, OneToOneField):
# if the rel field is a OneToOne field, then we have already
# determined that the object exists (is not None)
return True
elif isinstance(field, ForeignObjectRel):
# if the rel field is a ManyToOne or ManyToMany, then we need
# to determine if the count of related objects is greater than
# the threshold
return getattr(db_obj, rel).count() > threshold
return False
class DomainSecurityEmailForm(forms.Form): class DomainSecurityEmailForm(forms.Form):

View file

@ -222,6 +222,7 @@ class DomainAuthorizingOfficialView(DomainFormBaseView):
def form_valid(self, form): def form_valid(self, form):
"""The form is valid, save the authorizing official.""" """The form is valid, save the authorizing official."""
form.setDomainInfo(self.object.domain_info)
form.save() form.save()
messages.success(self.request, "The authorizing official for this domain has been updated.") messages.success(self.request, "The authorizing official for this domain has been updated.")