Merge pull request #2144 from cisagov/za/1988-investigate-indexes

Ticket #1988: Investigate indexes
This commit is contained in:
Alysia Broddrick 2024-06-05 15:26:18 -07:00 committed by GitHub
commit f468e6cd6e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 184 additions and 23 deletions

View file

@ -0,0 +1,131 @@
# Generated by Django 4.2.10 on 2024-05-28 14:40
from django.db import migrations, models
import phonenumber_field.modelfields
class Migration(migrations.Migration):
dependencies = [
("registrar", "0095_user_middle_name_user_title"),
]
operations = [
migrations.AlterField(
model_name="contact",
name="email",
field=models.EmailField(blank=True, max_length=320, null=True),
),
migrations.AlterField(
model_name="contact",
name="first_name",
field=models.CharField(blank=True, null=True, verbose_name="first name"),
),
migrations.AlterField(
model_name="contact",
name="last_name",
field=models.CharField(blank=True, null=True, verbose_name="last name"),
),
migrations.AlterField(
model_name="contact",
name="phone",
field=phonenumber_field.modelfields.PhoneNumberField(blank=True, max_length=128, null=True, region=None),
),
migrations.AlterField(
model_name="domaininformation",
name="organization_name",
field=models.CharField(blank=True, null=True),
),
migrations.AlterField(
model_name="domaininformation",
name="zipcode",
field=models.CharField(blank=True, max_length=10, null=True, verbose_name="zip code"),
),
migrations.AlterField(
model_name="domainrequest",
name="organization_name",
field=models.CharField(blank=True, null=True),
),
migrations.AlterField(
model_name="domainrequest",
name="zipcode",
field=models.CharField(blank=True, max_length=10, null=True, verbose_name="zip code"),
),
migrations.AlterField(
model_name="transitiondomain",
name="first_name",
field=models.CharField(
blank=True, help_text="First name / given name", null=True, verbose_name="first name"
),
),
migrations.AlterField(
model_name="transitiondomain",
name="organization_name",
field=models.CharField(blank=True, help_text="Organization name", null=True),
),
migrations.AlterField(
model_name="transitiondomain",
name="zipcode",
field=models.CharField(blank=True, help_text="Zip code", max_length=10, null=True, verbose_name="zip code"),
),
migrations.AlterField(
model_name="user",
name="phone",
field=phonenumber_field.modelfields.PhoneNumberField(
blank=True, help_text="Phone", max_length=128, null=True, region=None
),
),
migrations.AlterField(
model_name="verifiedbystaff",
name="email",
field=models.EmailField(max_length=254),
),
migrations.AddIndex(
model_name="contact",
index=models.Index(fields=["user"], name="registrar_c_user_id_4059c4_idx"),
),
migrations.AddIndex(
model_name="contact",
index=models.Index(fields=["email"], name="registrar_c_email_bde2de_idx"),
),
migrations.AddIndex(
model_name="domain",
index=models.Index(fields=["name"], name="registrar_d_name_5b1956_idx"),
),
migrations.AddIndex(
model_name="domain",
index=models.Index(fields=["state"], name="registrar_d_state_84c134_idx"),
),
migrations.AddIndex(
model_name="domaininformation",
index=models.Index(fields=["domain"], name="registrar_d_domain__88838a_idx"),
),
migrations.AddIndex(
model_name="domaininformation",
index=models.Index(fields=["domain_request"], name="registrar_d_domain__d1fba8_idx"),
),
migrations.AddIndex(
model_name="domaininvitation",
index=models.Index(fields=["status"], name="registrar_d_status_e84571_idx"),
),
migrations.AddIndex(
model_name="domainrequest",
index=models.Index(fields=["requested_domain"], name="registrar_d_request_6894eb_idx"),
),
migrations.AddIndex(
model_name="domainrequest",
index=models.Index(fields=["approved_domain"], name="registrar_d_approve_ac4c46_idx"),
),
migrations.AddIndex(
model_name="domainrequest",
index=models.Index(fields=["status"], name="registrar_d_status_a32b59_idx"),
),
migrations.AddIndex(
model_name="user",
index=models.Index(fields=["username"], name="registrar_u_usernam_964b1b_idx"),
),
migrations.AddIndex(
model_name="user",
index=models.Index(fields=["email"], name="registrar_u_email_c8f2c4_idx"),
),
]

View file

@ -17,6 +17,14 @@ class Contact(TimeStampedModel):
will be updated if any updates are made to it through Login.gov. will be updated if any updates are made to it through Login.gov.
""" """
class Meta:
"""Contains meta information about this class"""
indexes = [
models.Index(fields=["user"]),
models.Index(fields=["email"]),
]
user = models.OneToOneField( user = models.OneToOneField(
"registrar.User", "registrar.User",
null=True, null=True,
@ -28,7 +36,6 @@ class Contact(TimeStampedModel):
null=True, null=True,
blank=True, blank=True,
verbose_name="first name", verbose_name="first name",
db_index=True,
) )
middle_name = models.CharField( middle_name = models.CharField(
null=True, null=True,
@ -38,7 +45,6 @@ class Contact(TimeStampedModel):
null=True, null=True,
blank=True, blank=True,
verbose_name="last name", verbose_name="last name",
db_index=True,
) )
title = models.CharField( title = models.CharField(
null=True, null=True,
@ -48,13 +54,11 @@ class Contact(TimeStampedModel):
email = models.EmailField( email = models.EmailField(
null=True, null=True,
blank=True, blank=True,
db_index=True,
max_length=320, max_length=320,
) )
phone = PhoneNumberField( phone = PhoneNumberField(
null=True, null=True,
blank=True, blank=True,
db_index=True,
) )
def _get_all_relations(self): def _get_all_relations(self):

View file

@ -65,6 +65,14 @@ class Domain(TimeStampedModel, DomainHelper):
domain meets the required checks. domain meets the required checks.
""" """
class Meta:
"""Contains meta information about this class"""
indexes = [
models.Index(fields=["name"]),
models.Index(fields=["state"]),
]
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self._cache = {} self._cache = {}
super(Domain, self).__init__(*args, **kwargs) super(Domain, self).__init__(*args, **kwargs)

View file

@ -22,6 +22,16 @@ class DomainInformation(TimeStampedModel):
the domain request once approved, so copying them that way we can make changes the domain request once approved, so copying them that way we can make changes
after its approved. Most fields here are copied from DomainRequest.""" after its approved. Most fields here are copied from DomainRequest."""
class Meta:
"""Contains meta information about this class"""
indexes = [
models.Index(fields=["domain"]),
models.Index(fields=["domain_request"]),
]
verbose_name_plural = "Domain information"
StateTerritoryChoices = DomainRequest.StateTerritoryChoices StateTerritoryChoices = DomainRequest.StateTerritoryChoices
# use the short names in Django admin # use the short names in Django admin
@ -111,7 +121,6 @@ class DomainInformation(TimeStampedModel):
organization_name = models.CharField( organization_name = models.CharField(
null=True, null=True,
blank=True, blank=True,
db_index=True,
) )
address_line1 = models.CharField( address_line1 = models.CharField(
null=True, null=True,
@ -138,7 +147,6 @@ class DomainInformation(TimeStampedModel):
max_length=10, max_length=10,
null=True, null=True,
blank=True, blank=True,
db_index=True,
verbose_name="zip code", verbose_name="zip code",
) )
urbanization = models.CharField( urbanization = models.CharField(
@ -336,6 +344,3 @@ class DomainInformation(TimeStampedModel):
def _get_many_to_many_fields(): def _get_many_to_many_fields():
"""Returns a set of each field.name that has the many to many relation""" """Returns a set of each field.name that has the many to many relation"""
return {field.name for field in DomainInformation._meta.many_to_many} # type: ignore return {field.name for field in DomainInformation._meta.many_to_many} # type: ignore
class Meta:
verbose_name_plural = "Domain information"

View file

@ -15,6 +15,13 @@ logger = logging.getLogger(__name__)
class DomainInvitation(TimeStampedModel): class DomainInvitation(TimeStampedModel):
class Meta:
"""Contains meta information about this class"""
indexes = [
models.Index(fields=["status"]),
]
# Constants for status field # Constants for status field
class DomainInvitationStatus(models.TextChoices): class DomainInvitationStatus(models.TextChoices):
INVITED = "invited", "Invited" INVITED = "invited", "Invited"

View file

@ -25,6 +25,15 @@ logger = logging.getLogger(__name__)
class DomainRequest(TimeStampedModel): class DomainRequest(TimeStampedModel):
"""A registrant's domain request for a new domain.""" """A registrant's domain request for a new domain."""
class Meta:
"""Contains meta information about this class"""
indexes = [
models.Index(fields=["requested_domain"]),
models.Index(fields=["approved_domain"]),
models.Index(fields=["status"]),
]
# https://django-auditlog.readthedocs.io/en/latest/usage.html#object-history # https://django-auditlog.readthedocs.io/en/latest/usage.html#object-history
# If we note any performace degradation due to this addition, # If we note any performace degradation due to this addition,
# we can query the auditlogs table in admin.py and add the results to # we can query the auditlogs table in admin.py and add the results to
@ -331,7 +340,6 @@ class DomainRequest(TimeStampedModel):
organization_name = models.CharField( organization_name = models.CharField(
null=True, null=True,
blank=True, blank=True,
db_index=True,
) )
address_line1 = models.CharField( address_line1 = models.CharField(
@ -360,7 +368,6 @@ class DomainRequest(TimeStampedModel):
null=True, null=True,
blank=True, blank=True,
verbose_name="zip code", verbose_name="zip code",
db_index=True,
) )
urbanization = models.CharField( urbanization = models.CharField(
null=True, null=True,

View file

@ -59,7 +59,6 @@ class TransitionDomain(TimeStampedModel):
null=True, null=True,
blank=True, blank=True,
help_text="Organization name", help_text="Organization name",
db_index=True,
) )
federal_type = models.CharField( federal_type = models.CharField(
max_length=50, max_length=50,
@ -85,7 +84,6 @@ class TransitionDomain(TimeStampedModel):
blank=True, blank=True,
help_text="First name / given name", help_text="First name / given name",
verbose_name="first name", verbose_name="first name",
db_index=True,
) )
middle_name = models.CharField( middle_name = models.CharField(
null=True, null=True,
@ -136,7 +134,6 @@ class TransitionDomain(TimeStampedModel):
blank=True, blank=True,
verbose_name="zip code", verbose_name="zip code",
help_text="Zip code", help_text="Zip code",
db_index=True,
) )
def __str__(self): def __str__(self):

View file

@ -31,6 +31,17 @@ class User(AbstractUser):
will be updated if any updates are made to it through Login.gov. will be updated if any updates are made to it through Login.gov.
""" """
class Meta:
indexes = [
models.Index(fields=["username"]),
models.Index(fields=["email"]),
]
permissions = [
("analyst_access_permission", "Analyst Access Permission"),
("full_access_permission", "Full Access Permission"),
]
class VerificationTypeChoices(models.TextChoices): class VerificationTypeChoices(models.TextChoices):
""" """
Users achieve access to our system in a few different ways. Users achieve access to our system in a few different ways.
@ -77,7 +88,6 @@ class User(AbstractUser):
null=True, null=True,
blank=True, blank=True,
help_text="Phone", help_text="Phone",
db_index=True,
) )
middle_name = models.CharField( middle_name = models.CharField(
@ -281,9 +291,3 @@ class User(AbstractUser):
""" """
self.check_domain_invitations_on_login() self.check_domain_invitations_on_login()
class Meta:
permissions = [
("analyst_access_permission", "Analyst Access Permission"),
("full_access_permission", "Full Access Permission"),
]

View file

@ -9,7 +9,6 @@ class VerifiedByStaff(TimeStampedModel):
email = models.EmailField( email = models.EmailField(
null=False, null=False,
blank=False, blank=False,
db_index=True,
) )
requestor = models.ForeignKey( requestor = models.ForeignKey(

View file

@ -455,7 +455,6 @@ def export_data_full_to_csv(csv_file):
def export_data_federal_to_csv(csv_file): def export_data_federal_to_csv(csv_file):
"""Federal domains report""" """Federal domains report"""
writer = csv.writer(csv_file) writer = csv.writer(csv_file)
# define columns to include in export # define columns to include in export
columns = [ columns = [