Logic rewrite (performance) / Duplicates

This commit is contained in:
zandercymatics 2023-09-20 10:54:33 -06:00
parent 4fed857ea7
commit 2f9c37e8ee
No known key found for this signature in database
GPG key ID: FF4636ABEC9682B7
3 changed files with 64 additions and 30 deletions

View file

@ -1,6 +1,7 @@
from itertools import zip_longest from itertools import zip_longest
import logging import logging
from queue import Queue
from threading import Thread
from datetime import date from datetime import date
from string import digits from string import digits
from django_fsm import FSMField, transition # type: ignore from django_fsm import FSMField, transition # type: ignore
@ -22,6 +23,7 @@ from .utility.time_stamped_model import TimeStampedModel
from .public_contact import PublicContact from .public_contact import PublicContact
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -530,6 +532,13 @@ class Domain(TimeStampedModel, DomainHelper):
"Raising error after removing and adding a new contact" "Raising error after removing and adding a new contact"
) )
raise (err) raise (err)
elif alreadyExistsInRegistry:
filtered_contacts = PublicContact.objects.filter(
registry_id=contact.registry_id
)
if(filtered_contacts.count() > 1):
filtered_contacts.order_by('id').first().delete()
# update domain with contact or update the contact itself # update domain with contact or update the contact itself
if not isEmptySecurity: if not isEmptySecurity:
@ -537,12 +546,6 @@ class Domain(TimeStampedModel, DomainHelper):
self._update_domain_with_contact(contact=contact, rem=False) self._update_domain_with_contact(contact=contact, rem=False)
# if already exists just update # if already exists just update
elif alreadyExistsInRegistry: elif alreadyExistsInRegistry:
filtered_contacts = PublicContact.objects.filter(
registry_id=contact.registry_id
)
if(filtered_contacts.count() > 1):
filtered_contacts.order_by('id').first().delete()
current_contact = filtered_contacts.get() current_contact = filtered_contacts.get()
logger.debug(f"current contact was accessed {current_contact}") logger.debug(f"current contact was accessed {current_contact}")
@ -698,7 +701,6 @@ class Domain(TimeStampedModel, DomainHelper):
) )
logger.debug(f"map_epp_contact_to_public_contact contact -> {contact}") logger.debug(f"map_epp_contact_to_public_contact contact -> {contact}")
logger.debug(f"What is the type? {type(contact)}")
if not isinstance(contact, eppInfo.InfoContactResultData): if not isinstance(contact, eppInfo.InfoContactResultData):
raise ValueError("Contact must be of type InfoContactResultData") raise ValueError("Contact must be of type InfoContactResultData")
@ -794,28 +796,47 @@ class Domain(TimeStampedModel, DomainHelper):
cache_contact_helper(PublicContact.ContactTypeChoices.SECURITY), cache_contact_helper(PublicContact.ContactTypeChoices.SECURITY),
or cache_contact_helper("security") or cache_contact_helper("security")
""" """
items = PublicContact.objects.filter(domain=self, contact_type=contact_type_choice)
if(items.count() > 1):
raise ValueError(f"Multiple contacts exist for {contact_type_choice}")
# Grab the first item in an array of size 1.
# We use this instead of .get() as we can expect
# values of 'None' occasionally (such as when an object
# only exists on the registry)
current_contact = items.first()
# If we have an item in our DB,
# and if contacts hasn't been cleared (meaning data was set)...
if(current_contact is not None):
if("contacts" not in self._cache):
logger.info("Contact was not found in cache but was found in DB")
return current_contact
try: try:
# TODO - refactor # registrant_contact(s) are an edge case. They exist on
# the "registrant" property as opposed to contacts.
desired_property = "contacts" desired_property = "contacts"
# The contact type 'registrant' is stored under a different property
if contact_type_choice == PublicContact.ContactTypeChoices.REGISTRANT: if contact_type_choice == PublicContact.ContactTypeChoices.REGISTRANT:
desired_property = "registrant" desired_property = "registrant"
# If it for some reason doesn't exist in our local DB,
# but exists in our cache, grab that
if(self._cache and desired_property in self._cache):
return self.grab_contact_in_keys(self._cache[desired_property], contact_type_choice)
# Finally, if all else fails, grab from the registry
contacts = self._get_property(desired_property) contacts = self._get_property(desired_property)
if contact_type_choice == PublicContact.ContactTypeChoices.REGISTRANT:
contacts = [contacts] # Grab from cache after its been created
except KeyError as error:
logger.warning("generic_contact_getter -> Contact does not exist")
logger.warning(error)
# Should we just raise an error instead?
else:
print(f"generic_contact_getter -> contacts?? {contacts}")
# --> Map to public contact
cached_contact = self.grab_contact_in_keys(contacts, contact_type_choice) cached_contact = self.grab_contact_in_keys(contacts, contact_type_choice)
if cached_contact is None: if cached_contact is None:
raise ValueError("No contact was found in cache or the registry") raise ValueError("No contact was found in cache or the registry")
# Convert it from an EppLib object to PublicContact
return cached_contact return cached_contact
except RegistryError as error:
# Q: Should we be raising an error instead?
logger.error(error)
return None
def get_default_security_contact(self): def get_default_security_contact(self):
"""Gets the default security contact.""" """Gets the default security contact."""
@ -848,14 +869,28 @@ class Domain(TimeStampedModel, DomainHelper):
For example, check_type = 'security' For example, check_type = 'security'
""" """
# Registrant doesn't exist as an array
if(check_type == PublicContact.ContactTypeChoices.REGISTRANT):
if (
isinstance(contacts, PublicContact)
and contacts.contact_type is not None
and contacts.contact_type == check_type
):
if(contacts.registry_id is None):
raise ValueError("registry_id cannot be None")
return contacts
else:
raise ValueError("Invalid contact object for registrant_contact")
for contact in contacts: for contact in contacts:
print(f"grab_contact_in_keys -> contact item {contact.__dict__}") print(f"grab_contact_in_keys -> contact item {contact.__dict__}")
if ( if (
isinstance(contact, PublicContact) isinstance(contact, PublicContact)
and contact.registry_id is not None
and contact.contact_type is not None and contact.contact_type is not None
and contact.contact_type == check_type and contact.contact_type == check_type
): ):
if(contact.registry_id is None):
raise ValueError("registry_id cannot be None")
return contact return contact
# If the for loop didn't do a return, # If the for loop didn't do a return,
@ -1151,11 +1186,9 @@ class Domain(TimeStampedModel, DomainHelper):
# Registrant should be of type PublicContact # Registrant should be of type PublicContact
if "registrant" in cleaned.keys(): if "registrant" in cleaned.keys():
# For linter...
_ = cleaned["registrant"]
# Registrant, if it exists, should always exist in EppLib. # Registrant, if it exists, should always exist in EppLib.
# If it doesn't, that is bad. We expect this to exist, always. # If it doesn't, that is bad. We expect this to exist
cleaned["registrant"] = self._registrant_to_public_contact(_) cleaned["registrant"] = self._registrant_to_public_contact(cleaned["registrant"])
if ( if (
# fetch_contacts and # fetch_contacts and

View file

@ -21,7 +21,7 @@
<button <button
type="submit" type="submit"
class="usa-button" class="usa-button"
>{% if domain.security_email is None or domain.security_email.email != 'dotgov@cisa.dhs.gov'%}Add security email{% else %}Save{% endif %}</button> >{% if domain.security_email is None or domain.security_email.email == 'dotgov@cisa.dhs.gov'%}Add security email{% else %}Save{% endif %}</button>
</form> </form>
{% endblock %} {# domain_content #} {% endblock %} {# domain_content #}

View file

@ -492,15 +492,16 @@ class TestRegistrantContacts(MockEppLib):
self.mockedSendFunction.assert_has_calls(expected_calls, any_order=True) self.mockedSendFunction.assert_has_calls(expected_calls, any_order=True)
self.assertEqual(PublicContact.objects.filter(domain=self.domain).count(), 1) self.assertEqual(PublicContact.objects.filter(domain=self.domain).count(), 1)
# Check if security_contact is what we expect... # Check if security_contact is what we expect...
self.assertEqual(self.domain.security_contact.email, "changedEmailAgain@email.com") self.assertEqual(self.domain.security_contact.email, "changedEmail@email.com")
self.assertEqual(self.domain.security_contact, security_contact)
# If the item in PublicContact is as expected... # If the item in PublicContact is as expected...
current_item = PublicContact.objects.filter(domain=self.domain).get() current_item = PublicContact.objects.filter(domain=self.domain).get()
self.assertEqual(current_item.email, "changedEmail@email.com") self.assertEqual(current_item.email, "changedEmail@email.com")
# Check if cache stored it correctly... # Check if cache stored it correctly...
self.assertEqual("contacts" in self.domain._cache) self.assertTrue("contacts" in self.domain._cache)
cached_item = self.domain._cache["contacts"] cached_item = self.domain._cache["contacts"]
self.assertTrue(cached_item[0]) self.assertTrue(cached_item[0] == current_item)
@ -593,7 +594,7 @@ class TestRegistrantContacts(MockEppLib):
contact.email = "technical@mail.gov" contact.email = "technical@mail.gov"
contact.domain = self.domain_contact contact.domain = self.domain_contact
self.domain_contact.technical_contact = contact self.domain_contact.technical_contact = contact
logger.debug(f"here is the reason {self.domain_contact.technical_contact}")
expected_contact = PublicContact.objects.filter( expected_contact = PublicContact.objects.filter(
registry_id=self.domain_contact.technical_contact.registry_id, registry_id=self.domain_contact.technical_contact.registry_id,
contact_type = PublicContact.ContactTypeChoices.TECHNICAL contact_type = PublicContact.ContactTypeChoices.TECHNICAL