Merge pull request #1431 from cisagov/za/1001-update-to-use-sentence-case

Ticket #1001: Update to use sentence case (NOT ON MY SANDBOX)
This commit is contained in:
zandercymatics 2023-12-11 09:03:56 -07:00 committed by GitHub
commit c43d1a88e9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 269 additions and 183 deletions

View file

@ -527,14 +527,14 @@ class DomainApplicationAdminForm(forms.ModelForm):
current_state = application.status current_state = application.status
# first option in status transitions is current state # first option in status transitions is current state
available_transitions = [(current_state, current_state)] available_transitions = [(current_state, application.get_status_display())]
transitions = get_available_FIELD_transitions( transitions = get_available_FIELD_transitions(
application, models.DomainApplication._meta.get_field("status") application, models.DomainApplication._meta.get_field("status")
) )
for transition in transitions: for transition in transitions:
available_transitions.append((transition.target, transition.target)) available_transitions.append((transition.target, transition.target.label))
# only set the available transitions if the user is not restricted # only set the available transitions if the user is not restricted
# from editing the domain application; otherwise, the form will be # from editing the domain application; otherwise, the form will be
@ -650,10 +650,10 @@ class DomainApplicationAdmin(ListHeaderAdmin):
if ( if (
obj obj
and original_obj.status == models.DomainApplication.APPROVED and original_obj.status == models.DomainApplication.ApplicationStatus.APPROVED
and ( and (
obj.status == models.DomainApplication.REJECTED obj.status == models.DomainApplication.ApplicationStatus.REJECTED
or obj.status == models.DomainApplication.INELIGIBLE or obj.status == models.DomainApplication.ApplicationStatus.INELIGIBLE
) )
and not obj.domain_is_not_active() and not obj.domain_is_not_active()
): ):
@ -675,14 +675,14 @@ class DomainApplicationAdmin(ListHeaderAdmin):
else: else:
if obj.status != original_obj.status: if obj.status != original_obj.status:
status_method_mapping = { status_method_mapping = {
models.DomainApplication.STARTED: None, models.DomainApplication.ApplicationStatus.STARTED: None,
models.DomainApplication.SUBMITTED: obj.submit, models.DomainApplication.ApplicationStatus.SUBMITTED: obj.submit,
models.DomainApplication.IN_REVIEW: obj.in_review, models.DomainApplication.ApplicationStatus.IN_REVIEW: obj.in_review,
models.DomainApplication.ACTION_NEEDED: obj.action_needed, models.DomainApplication.ApplicationStatus.ACTION_NEEDED: obj.action_needed,
models.DomainApplication.APPROVED: obj.approve, models.DomainApplication.ApplicationStatus.APPROVED: obj.approve,
models.DomainApplication.WITHDRAWN: obj.withdraw, models.DomainApplication.ApplicationStatus.WITHDRAWN: obj.withdraw,
models.DomainApplication.REJECTED: obj.reject, models.DomainApplication.ApplicationStatus.REJECTED: obj.reject,
models.DomainApplication.INELIGIBLE: (obj.reject_with_prejudice), models.DomainApplication.ApplicationStatus.INELIGIBLE: (obj.reject_with_prejudice),
} }
selected_method = status_method_mapping.get(obj.status) selected_method = status_method_mapping.get(obj.status)
if selected_method is None: if selected_method is None:

View file

@ -49,28 +49,28 @@ class DomainApplicationFixture:
# }, # },
DA = [ DA = [
{ {
"status": "started", "status": DomainApplication.ApplicationStatus.STARTED,
"organization_name": "Example - Finished but not Submitted", "organization_name": "Example - Finished but not submitted",
}, },
{ {
"status": "submitted", "status": DomainApplication.ApplicationStatus.SUBMITTED,
"organization_name": "Example - Submitted but pending Investigation", "organization_name": "Example - Submitted but pending investigation",
}, },
{ {
"status": "in review", "status": DomainApplication.ApplicationStatus.IN_REVIEW,
"organization_name": "Example - In Investigation", "organization_name": "Example - In investigation",
}, },
{ {
"status": "in review", "status": DomainApplication.ApplicationStatus.IN_REVIEW,
"organization_name": "Example - Approved", "organization_name": "Example - Approved",
}, },
{ {
"status": "withdrawn", "status": DomainApplication.ApplicationStatus.WITHDRAWN,
"organization_name": "Example - Withdrawn", "organization_name": "Example - Withdrawn",
}, },
{ {
"status": "action needed", "status": DomainApplication.ApplicationStatus.ACTION_NEEDED,
"organization_name": "Example - Action Needed", "organization_name": "Example - Action needed",
}, },
{ {
"status": "rejected", "status": "rejected",
@ -214,7 +214,9 @@ class DomainFixture(DomainApplicationFixture):
for user in users: for user in users:
# approve one of each users in review status domains # approve one of each users in review status domains
application = DomainApplication.objects.filter(creator=user, status=DomainApplication.IN_REVIEW).last() application = DomainApplication.objects.filter(
creator=user, status=DomainApplication.ApplicationStatus.IN_REVIEW
).last()
logger.debug(f"Approving {application} for {user}") logger.debug(f"Approving {application} for {user}")
application.approve() application.approve()
application.save() application.save()

View file

@ -62,7 +62,7 @@ class Command(BaseCommand):
DomainInvitation( DomainInvitation(
email=email_address.lower(), email=email_address.lower(),
domain=domain, domain=domain,
status=DomainInvitation.INVITED, status=DomainInvitation.DomainInvitationStatus.INVITED,
) )
) )
logger.info("Creating %d invitations", len(to_create)) logger.info("Creating %d invitations", len(to_create))

View file

@ -0,0 +1,70 @@
# Generated by Django 4.2.7 on 2023-12-06 16:16
from django.db import migrations, models
import django_fsm
class Migration(migrations.Migration):
dependencies = [
("registrar", "0054_alter_domainapplication_federal_agency_and_more"),
]
operations = [
migrations.AlterField(
model_name="domain",
name="state",
field=django_fsm.FSMField(
choices=[
("unknown", "Unknown"),
("dns needed", "Dns needed"),
("ready", "Ready"),
("on hold", "On hold"),
("deleted", "Deleted"),
],
default="unknown",
help_text="Very basic info about the lifecycle of this domain object",
max_length=21,
protected=True,
),
),
migrations.AlterField(
model_name="domainapplication",
name="status",
field=django_fsm.FSMField(
choices=[
("started", "Started"),
("submitted", "Submitted"),
("in review", "In review"),
("action needed", "Action needed"),
("approved", "Approved"),
("withdrawn", "Withdrawn"),
("rejected", "Rejected"),
("ineligible", "Ineligible"),
],
default="started",
max_length=50,
),
),
migrations.AlterField(
model_name="domaininvitation",
name="status",
field=django_fsm.FSMField(
choices=[("invited", "Invited"), ("retrieved", "Retrieved")],
default="invited",
max_length=50,
protected=True,
),
),
migrations.AlterField(
model_name="transitiondomain",
name="status",
field=models.CharField(
blank=True,
choices=[("ready", "Ready"), ("on hold", "On hold"), ("unknown", "Unknown")],
default="ready",
help_text="domain status during the transfer",
max_length=255,
verbose_name="Status",
),
),
]

View file

@ -122,20 +122,20 @@ class Domain(TimeStampedModel, DomainHelper):
"""These capture (some of) the states a domain object can be in.""" """These capture (some of) the states a domain object can be in."""
# the state is indeterminate # the state is indeterminate
UNKNOWN = "unknown" UNKNOWN = "unknown", "Unknown"
# The domain object exists in the registry # The domain object exists in the registry
# but nameservers don't exist for it yet # but nameservers don't exist for it yet
DNS_NEEDED = "dns needed" DNS_NEEDED = "dns needed", "Dns needed"
# Domain has had nameservers set, may or may not be active # Domain has had nameservers set, may or may not be active
READY = "ready" READY = "ready", "Ready"
# Registrar manually changed state to client hold # Registrar manually changed state to client hold
ON_HOLD = "on hold" ON_HOLD = "on hold", "On hold"
# previously existed but has been deleted from the registry # previously existed but has been deleted from the registry
DELETED = "deleted" DELETED = "deleted", "Deleted"
class Cache(property): class Cache(property):
""" """

View file

@ -19,25 +19,16 @@ class DomainApplication(TimeStampedModel):
"""A registrant's application for a new domain.""" """A registrant's application for a new domain."""
# #### Constants for choice fields #### # Constants for choice fields
STARTED = "started" class ApplicationStatus(models.TextChoices):
SUBMITTED = "submitted" STARTED = "started", "Started"
IN_REVIEW = "in review" SUBMITTED = "submitted", "Submitted"
ACTION_NEEDED = "action needed" IN_REVIEW = "in review", "In review"
APPROVED = "approved" ACTION_NEEDED = "action needed", "Action needed"
WITHDRAWN = "withdrawn" APPROVED = "approved", "Approved"
REJECTED = "rejected" WITHDRAWN = "withdrawn", "Withdrawn"
INELIGIBLE = "ineligible" REJECTED = "rejected", "Rejected"
STATUS_CHOICES = [ INELIGIBLE = "ineligible", "Ineligible"
(STARTED, STARTED),
(SUBMITTED, SUBMITTED),
(IN_REVIEW, IN_REVIEW),
(ACTION_NEEDED, ACTION_NEEDED),
(APPROVED, APPROVED),
(WITHDRAWN, WITHDRAWN),
(REJECTED, REJECTED),
(INELIGIBLE, INELIGIBLE),
]
class StateTerritoryChoices(models.TextChoices): class StateTerritoryChoices(models.TextChoices):
ALABAMA = "AL", "Alabama (AL)" ALABAMA = "AL", "Alabama (AL)"
@ -363,8 +354,8 @@ class DomainApplication(TimeStampedModel):
# #### Internal fields about the application ##### # #### Internal fields about the application #####
status = FSMField( status = FSMField(
choices=STATUS_CHOICES, # possible states as an array of constants choices=ApplicationStatus.choices, # possible states as an array of constants
default=STARTED, # sensible default default=ApplicationStatus.STARTED, # sensible default
protected=False, # can change state directly, particularly in Django admin protected=False, # can change state directly, particularly in Django admin
) )
# This is the application user who created this application. The contact # This is the application user who created this application. The contact
@ -592,7 +583,11 @@ class DomainApplication(TimeStampedModel):
except EmailSendingError: except EmailSendingError:
logger.warning("Failed to send confirmation email", exc_info=True) logger.warning("Failed to send confirmation email", exc_info=True)
@transition(field="status", source=[STARTED, ACTION_NEEDED, WITHDRAWN], target=SUBMITTED) @transition(
field="status",
source=[ApplicationStatus.STARTED, ApplicationStatus.ACTION_NEEDED, ApplicationStatus.WITHDRAWN],
target=ApplicationStatus.SUBMITTED,
)
def submit(self): def submit(self):
"""Submit an application that is started. """Submit an application that is started.
@ -618,7 +613,7 @@ class DomainApplication(TimeStampedModel):
"emails/submission_confirmation_subject.txt", "emails/submission_confirmation_subject.txt",
) )
@transition(field="status", source=SUBMITTED, target=IN_REVIEW) @transition(field="status", source=ApplicationStatus.SUBMITTED, target=ApplicationStatus.IN_REVIEW)
def in_review(self): def in_review(self):
"""Investigate an application that has been submitted. """Investigate an application that has been submitted.
@ -630,7 +625,11 @@ class DomainApplication(TimeStampedModel):
"emails/status_change_in_review_subject.txt", "emails/status_change_in_review_subject.txt",
) )
@transition(field="status", source=[IN_REVIEW, REJECTED], target=ACTION_NEEDED) @transition(
field="status",
source=[ApplicationStatus.IN_REVIEW, ApplicationStatus.REJECTED],
target=ApplicationStatus.ACTION_NEEDED,
)
def action_needed(self): def action_needed(self):
"""Send back an application that is under investigation or rejected. """Send back an application that is under investigation or rejected.
@ -644,8 +643,13 @@ class DomainApplication(TimeStampedModel):
@transition( @transition(
field="status", field="status",
source=[SUBMITTED, IN_REVIEW, REJECTED, INELIGIBLE], source=[
target=APPROVED, ApplicationStatus.SUBMITTED,
ApplicationStatus.IN_REVIEW,
ApplicationStatus.REJECTED,
ApplicationStatus.INELIGIBLE,
],
target=ApplicationStatus.APPROVED,
) )
def approve(self): def approve(self):
"""Approve an application that has been submitted. """Approve an application that has been submitted.
@ -678,7 +682,11 @@ class DomainApplication(TimeStampedModel):
"emails/status_change_approved_subject.txt", "emails/status_change_approved_subject.txt",
) )
@transition(field="status", source=[SUBMITTED, IN_REVIEW], target=WITHDRAWN) @transition(
field="status",
source=[ApplicationStatus.SUBMITTED, ApplicationStatus.IN_REVIEW],
target=ApplicationStatus.WITHDRAWN,
)
def withdraw(self): def withdraw(self):
"""Withdraw an application that has been submitted.""" """Withdraw an application that has been submitted."""
self._send_status_update_email( self._send_status_update_email(
@ -689,8 +697,8 @@ class DomainApplication(TimeStampedModel):
@transition( @transition(
field="status", field="status",
source=[IN_REVIEW, APPROVED], source=[ApplicationStatus.IN_REVIEW, ApplicationStatus.APPROVED],
target=REJECTED, target=ApplicationStatus.REJECTED,
conditions=[domain_is_not_active], conditions=[domain_is_not_active],
) )
def reject(self): def reject(self):
@ -698,7 +706,7 @@ class DomainApplication(TimeStampedModel):
As side effects this will delete the domain and domain_information As side effects this will delete the domain and domain_information
(will cascade), and send an email notification.""" (will cascade), and send an email notification."""
if self.status == self.APPROVED: if self.status == self.ApplicationStatus.APPROVED:
domain_state = self.approved_domain.state domain_state = self.approved_domain.state
# Only reject if it exists on EPP # Only reject if it exists on EPP
if domain_state != Domain.State.UNKNOWN: if domain_state != Domain.State.UNKNOWN:
@ -714,8 +722,8 @@ class DomainApplication(TimeStampedModel):
@transition( @transition(
field="status", field="status",
source=[IN_REVIEW, APPROVED], source=[ApplicationStatus.IN_REVIEW, ApplicationStatus.APPROVED],
target=INELIGIBLE, target=ApplicationStatus.INELIGIBLE,
conditions=[domain_is_not_active], conditions=[domain_is_not_active],
) )
def reject_with_prejudice(self): def reject_with_prejudice(self):
@ -727,7 +735,7 @@ class DomainApplication(TimeStampedModel):
permissions classes test against. This will also delete the domain permissions classes test against. This will also delete the domain
and domain_information (will cascade) when they exist.""" and domain_information (will cascade) when they exist."""
if self.status == self.APPROVED: if self.status == self.ApplicationStatus.APPROVED:
domain_state = self.approved_domain.state domain_state = self.approved_domain.state
# Only reject if it exists on EPP # Only reject if it exists on EPP
if domain_state != Domain.State.UNKNOWN: if domain_state != Domain.State.UNKNOWN:

View file

@ -15,8 +15,10 @@ logger = logging.getLogger(__name__)
class DomainInvitation(TimeStampedModel): class DomainInvitation(TimeStampedModel):
INVITED = "invited" # Constants for status field
RETRIEVED = "retrieved" class DomainInvitationStatus(models.TextChoices):
INVITED = "invited", "Invited"
RETRIEVED = "retrieved", "Retrieved"
email = models.EmailField( email = models.EmailField(
null=False, null=False,
@ -31,18 +33,15 @@ class DomainInvitation(TimeStampedModel):
) )
status = FSMField( status = FSMField(
choices=[ choices=DomainInvitationStatus.choices,
(INVITED, INVITED), default=DomainInvitationStatus.INVITED,
(RETRIEVED, RETRIEVED),
],
default=INVITED,
protected=True, # can't alter state except through transition methods! protected=True, # can't alter state except through transition methods!
) )
def __str__(self): def __str__(self):
return f"Invitation for {self.email} on {self.domain} is {self.status}" return f"Invitation for {self.email} on {self.domain} is {self.status}"
@transition(field="status", source=INVITED, target=RETRIEVED) @transition(field="status", source=DomainInvitationStatus.INVITED, target=DomainInvitationStatus.RETRIEVED)
def retrieve(self): def retrieve(self):
"""When an invitation is retrieved, create the corresponding permission. """When an invitation is retrieved, create the corresponding permission.

View file

@ -4,7 +4,7 @@ from .utility.time_stamped_model import TimeStampedModel
class StatusChoices(models.TextChoices): class StatusChoices(models.TextChoices):
READY = "ready", "Ready" READY = "ready", "Ready"
ON_HOLD = "on hold", "On Hold" ON_HOLD = "on hold", "On hold"
UNKNOWN = "unknown", "Unknown" UNKNOWN = "unknown", "Unknown"

View file

@ -67,7 +67,9 @@ class User(AbstractUser):
def check_domain_invitations_on_login(self): def check_domain_invitations_on_login(self):
"""When a user first arrives on the site, we need to retrieve any domain """When a user first arrives on the site, we need to retrieve any domain
invitations that match their email address.""" invitations that match their email address."""
for invitation in DomainInvitation.objects.filter(email=self.email, status=DomainInvitation.INVITED): for invitation in DomainInvitation.objects.filter(
email=self.email, status=DomainInvitation.DomainInvitationStatus.INVITED
):
try: try:
invitation.retrieve() invitation.retrieve()
invitation.save() invitation.save()

View file

@ -31,7 +31,7 @@
Status: Status:
</span> </span>
{% if domainapplication.status == 'approved' %} Approved {% if domainapplication.status == 'approved' %} Approved
{% elif domainapplication.status == 'in review' %} In Review {% elif domainapplication.status == 'in review' %} In review
{% elif domainapplication.status == 'rejected' %} Rejected {% elif domainapplication.status == 'rejected' %} Rejected
{% elif domainapplication.status == 'submitted' %} Submitted {% elif domainapplication.status == 'submitted' %} Submitted
{% elif domainapplication.status == 'ineligible' %} Ineligible {% elif domainapplication.status == 'ineligible' %} Ineligible

View file

@ -18,7 +18,7 @@
Status: Status:
</span> </span>
{% if domain.state == domain.State.UNKNOWN or domain.state == domain.State.DNS_NEEDED%} {% if domain.state == domain.State.UNKNOWN or domain.state == domain.State.DNS_NEEDED%}
DNS Needed DNS needed
{% else %} {% else %}
{{ domain.state|title }} {{ domain.state|title }}
{% endif %} {% endif %}

View file

@ -53,7 +53,7 @@
<td data-sort-value="{{ domain.created_time|date:"U" }}" data-label="Date created">{{ domain.created_time|date }}</td> <td data-sort-value="{{ domain.created_time|date:"U" }}" data-label="Date created">{{ domain.created_time|date }}</td>
<td data-label="Status"> <td data-label="Status">
{% if domain.state == "unknown" or domain.state == "dns needed"%} {% if domain.state == "unknown" or domain.state == "dns needed"%}
DNS Needed DNS needed
{% else %} {% else %}
{{ domain.state|title }} {{ domain.state|title }}
{% endif %} {% endif %}
@ -111,7 +111,7 @@
{{ application.requested_domain.name|default:"New domain request" }} {{ application.requested_domain.name|default:"New domain request" }}
</th> </th>
<td data-sort-value="{{ application.created_at|date:"U" }}" data-label="Date created">{{ application.created_at|date }}</td> <td data-sort-value="{{ application.created_at|date:"U" }}" data-label="Date created">{{ application.created_at|date }}</td>
<td data-label="Status">{{ application.status|title }}</td> <td data-label="Status">{{ application.get_status_display }}</td>
<td> <td>
{% if application.status == "started" or application.status == "action needed" or application.status == "withdrawn" %} {% if application.status == "started" or application.status == "action needed" or application.status == "withdrawn" %}
<a href="{% url 'edit-application' application.pk %}"> <a href="{% url 'edit-application' application.pk %}">

View file

@ -294,7 +294,7 @@ class AuditedAdminMockData:
self, self,
domain_type, domain_type,
item_name, item_name,
status=DomainApplication.STARTED, status=DomainApplication.ApplicationStatus.STARTED,
org_type="federal", org_type="federal",
federal_type="executive", federal_type="executive",
purpose="Purpose of the site", purpose="Purpose of the site",
@ -311,7 +311,7 @@ class AuditedAdminMockData:
title, email, and username. title, email, and username.
status (str - optional): Defines the status for DomainApplication, status (str - optional): Defines the status for DomainApplication,
e.g. DomainApplication.STARTED e.g. DomainApplication.ApplicationStatus.STARTED
org_type (str - optional): Sets a domains org_type org_type (str - optional): Sets a domains org_type
@ -344,23 +344,23 @@ class AuditedAdminMockData:
full_arg_dict = dict( full_arg_dict = dict(
email="test_mail@mail.com", email="test_mail@mail.com",
domain=self.dummy_domain(item_name, True), domain=self.dummy_domain(item_name, True),
status=DomainInvitation.INVITED, status=DomainInvitation.DomainInvitationStatus.INVITED,
) )
return full_arg_dict return full_arg_dict
def create_full_dummy_domain_application(self, item_name, status=DomainApplication.STARTED): def create_full_dummy_domain_application(self, item_name, status=DomainApplication.ApplicationStatus.STARTED):
"""Creates a dummy domain application object""" """Creates a dummy domain application object"""
domain_application_kwargs = self.dummy_kwarg_boilerplate(self.APPLICATION, item_name, status) domain_application_kwargs = self.dummy_kwarg_boilerplate(self.APPLICATION, item_name, status)
application = DomainApplication.objects.get_or_create(**domain_application_kwargs)[0] application = DomainApplication.objects.get_or_create(**domain_application_kwargs)[0]
return application return application
def create_full_dummy_domain_information(self, item_name, status=DomainApplication.STARTED): def create_full_dummy_domain_information(self, item_name, status=DomainApplication.ApplicationStatus.STARTED):
"""Creates a dummy domain information object""" """Creates a dummy domain information object"""
domain_application_kwargs = self.dummy_kwarg_boilerplate(self.INFORMATION, item_name, status) domain_application_kwargs = self.dummy_kwarg_boilerplate(self.INFORMATION, item_name, status)
application = DomainInformation.objects.get_or_create(**domain_application_kwargs)[0] application = DomainInformation.objects.get_or_create(**domain_application_kwargs)[0]
return application return application
def create_full_dummy_domain_invitation(self, item_name, status=DomainApplication.STARTED): def create_full_dummy_domain_invitation(self, item_name, status=DomainApplication.ApplicationStatus.STARTED):
"""Creates a dummy domain invitation object""" """Creates a dummy domain invitation object"""
domain_application_kwargs = self.dummy_kwarg_boilerplate(self.INVITATION, item_name, status) domain_application_kwargs = self.dummy_kwarg_boilerplate(self.INVITATION, item_name, status)
application = DomainInvitation.objects.get_or_create(**domain_application_kwargs)[0] application = DomainInvitation.objects.get_or_create(**domain_application_kwargs)[0]
@ -374,7 +374,7 @@ class AuditedAdminMockData:
has_other_contacts=True, has_other_contacts=True,
has_current_website=True, has_current_website=True,
has_alternative_gov_domain=True, has_alternative_gov_domain=True,
status=DomainApplication.STARTED, status=DomainApplication.ApplicationStatus.STARTED,
): ):
"""A helper to create a dummy domain application object""" """A helper to create a dummy domain application object"""
application = None application = None
@ -455,7 +455,7 @@ def completed_application(
has_alternative_gov_domain=True, has_alternative_gov_domain=True,
has_about_your_organization=True, has_about_your_organization=True,
has_anything_else=True, has_anything_else=True,
status=DomainApplication.STARTED, status=DomainApplication.ApplicationStatus.STARTED,
user=False, user=False,
name="city.gov", name="city.gov",
): ):

View file

@ -61,7 +61,7 @@ class TestDomainAdmin(MockEppLib):
Make sure the short name is displaying in admin on the list page Make sure the short name is displaying in admin on the list page
""" """
self.client.force_login(self.superuser) self.client.force_login(self.superuser)
application = completed_application(status=DomainApplication.IN_REVIEW) application = completed_application(status=DomainApplication.ApplicationStatus.IN_REVIEW)
application.approve() application.approve()
response = self.client.get("/admin/registrar/domain/") response = self.client.get("/admin/registrar/domain/")
@ -282,7 +282,7 @@ class TestDomainApplicationAdminForm(TestCase):
form = DomainApplicationAdminForm(instance=self.application) form = DomainApplicationAdminForm(instance=self.application)
# Verify that the form choices match the available transitions for started # Verify that the form choices match the available transitions for started
expected_choices = [("started", "started"), ("submitted", "submitted")] expected_choices = [("started", "Started"), ("submitted", "Submitted")]
self.assertEqual(form.fields["status"].widget.choices, expected_choices) self.assertEqual(form.fields["status"].widget.choices, expected_choices)
def test_form_choices_when_no_instance(self): def test_form_choices_when_no_instance(self):
@ -355,7 +355,7 @@ class TestDomainApplicationAdmin(MockEppLib):
request = self.factory.post("/admin/registrar/domainapplication/{}/change/".format(application.pk)) request = self.factory.post("/admin/registrar/domainapplication/{}/change/".format(application.pk))
# Modify the application's property # Modify the application's property
application.status = DomainApplication.SUBMITTED application.status = DomainApplication.ApplicationStatus.SUBMITTED
# Use the model admin's save_model method # Use the model admin's save_model method
self.admin.save_model(request, application, form=None, change=True) self.admin.save_model(request, application, form=None, change=True)
@ -390,13 +390,13 @@ class TestDomainApplicationAdmin(MockEppLib):
with boto3_mocking.clients.handler_for("sesv2", mock_client): with boto3_mocking.clients.handler_for("sesv2", mock_client):
# Create a sample application # Create a sample application
application = completed_application(status=DomainApplication.SUBMITTED) application = completed_application(status=DomainApplication.ApplicationStatus.SUBMITTED)
# Create a mock request # Create a mock request
request = self.factory.post("/admin/registrar/domainapplication/{}/change/".format(application.pk)) request = self.factory.post("/admin/registrar/domainapplication/{}/change/".format(application.pk))
# Modify the application's property # Modify the application's property
application.status = DomainApplication.IN_REVIEW application.status = DomainApplication.ApplicationStatus.IN_REVIEW
# Use the model admin's save_model method # Use the model admin's save_model method
self.admin.save_model(request, application, form=None, change=True) self.admin.save_model(request, application, form=None, change=True)
@ -431,13 +431,13 @@ class TestDomainApplicationAdmin(MockEppLib):
with boto3_mocking.clients.handler_for("sesv2", mock_client): with boto3_mocking.clients.handler_for("sesv2", mock_client):
# Create a sample application # Create a sample application
application = completed_application(status=DomainApplication.IN_REVIEW) application = completed_application(status=DomainApplication.ApplicationStatus.IN_REVIEW)
# Create a mock request # Create a mock request
request = self.factory.post("/admin/registrar/domainapplication/{}/change/".format(application.pk)) request = self.factory.post("/admin/registrar/domainapplication/{}/change/".format(application.pk))
# Modify the application's property # Modify the application's property
application.status = DomainApplication.APPROVED application.status = DomainApplication.ApplicationStatus.APPROVED
# Use the model admin's save_model method # Use the model admin's save_model method
self.admin.save_model(request, application, form=None, change=True) self.admin.save_model(request, application, form=None, change=True)
@ -467,13 +467,13 @@ class TestDomainApplicationAdmin(MockEppLib):
User.objects.filter(email=EMAIL).delete() User.objects.filter(email=EMAIL).delete()
# Create a sample application # Create a sample application
application = completed_application(status=DomainApplication.IN_REVIEW) application = completed_application(status=DomainApplication.ApplicationStatus.IN_REVIEW)
# Create a mock request # Create a mock request
request = self.factory.post("/admin/registrar/domainapplication/{}/change/".format(application.pk)) request = self.factory.post("/admin/registrar/domainapplication/{}/change/".format(application.pk))
# Modify the application's property # Modify the application's property
application.status = DomainApplication.APPROVED application.status = DomainApplication.ApplicationStatus.APPROVED
# Use the model admin's save_model method # Use the model admin's save_model method
self.admin.save_model(request, application, form=None, change=True) self.admin.save_model(request, application, form=None, change=True)
@ -492,13 +492,13 @@ class TestDomainApplicationAdmin(MockEppLib):
with boto3_mocking.clients.handler_for("sesv2", mock_client): with boto3_mocking.clients.handler_for("sesv2", mock_client):
# Create a sample application # Create a sample application
application = completed_application(status=DomainApplication.IN_REVIEW) application = completed_application(status=DomainApplication.ApplicationStatus.IN_REVIEW)
# Create a mock request # Create a mock request
request = self.factory.post("/admin/registrar/domainapplication/{}/change/".format(application.pk)) request = self.factory.post("/admin/registrar/domainapplication/{}/change/".format(application.pk))
# Modify the application's property # Modify the application's property
application.status = DomainApplication.ACTION_NEEDED application.status = DomainApplication.ApplicationStatus.ACTION_NEEDED
# Use the model admin's save_model method # Use the model admin's save_model method
self.admin.save_model(request, application, form=None, change=True) self.admin.save_model(request, application, form=None, change=True)
@ -533,13 +533,13 @@ class TestDomainApplicationAdmin(MockEppLib):
with boto3_mocking.clients.handler_for("sesv2", mock_client): with boto3_mocking.clients.handler_for("sesv2", mock_client):
# Create a sample application # Create a sample application
application = completed_application(status=DomainApplication.IN_REVIEW) application = completed_application(status=DomainApplication.ApplicationStatus.IN_REVIEW)
# Create a mock request # Create a mock request
request = self.factory.post("/admin/registrar/domainapplication/{}/change/".format(application.pk)) request = self.factory.post("/admin/registrar/domainapplication/{}/change/".format(application.pk))
# Modify the application's property # Modify the application's property
application.status = DomainApplication.REJECTED application.status = DomainApplication.ApplicationStatus.REJECTED
# Use the model admin's save_model method # Use the model admin's save_model method
self.admin.save_model(request, application, form=None, change=True) self.admin.save_model(request, application, form=None, change=True)
@ -569,13 +569,13 @@ class TestDomainApplicationAdmin(MockEppLib):
User.objects.filter(email=EMAIL).delete() User.objects.filter(email=EMAIL).delete()
# Create a sample application # Create a sample application
application = completed_application(status=DomainApplication.IN_REVIEW) application = completed_application(status=DomainApplication.ApplicationStatus.IN_REVIEW)
# Create a mock request # Create a mock request
request = self.factory.post("/admin/registrar/domainapplication/{}/change/".format(application.pk)) request = self.factory.post("/admin/registrar/domainapplication/{}/change/".format(application.pk))
# Modify the application's property # Modify the application's property
application.status = DomainApplication.INELIGIBLE application.status = DomainApplication.ApplicationStatus.INELIGIBLE
# Use the model admin's save_model method # Use the model admin's save_model method
self.admin.save_model(request, application, form=None, change=True) self.admin.save_model(request, application, form=None, change=True)
@ -584,7 +584,7 @@ class TestDomainApplicationAdmin(MockEppLib):
self.assertEqual(application.creator.status, "restricted") self.assertEqual(application.creator.status, "restricted")
def test_readonly_when_restricted_creator(self): def test_readonly_when_restricted_creator(self):
application = completed_application(status=DomainApplication.IN_REVIEW) application = completed_application(status=DomainApplication.ApplicationStatus.IN_REVIEW)
application.creator.status = User.RESTRICTED application.creator.status = User.RESTRICTED
application.creator.save() application.creator.save()
@ -662,7 +662,7 @@ class TestDomainApplicationAdmin(MockEppLib):
def test_saving_when_restricted_creator(self): def test_saving_when_restricted_creator(self):
# Create an instance of the model # Create an instance of the model
application = completed_application(status=DomainApplication.IN_REVIEW) application = completed_application(status=DomainApplication.ApplicationStatus.IN_REVIEW)
application.creator.status = User.RESTRICTED application.creator.status = User.RESTRICTED
application.creator.save() application.creator.save()
@ -681,11 +681,11 @@ class TestDomainApplicationAdmin(MockEppLib):
) )
# Assert that the status has not changed # Assert that the status has not changed
self.assertEqual(application.status, DomainApplication.IN_REVIEW) self.assertEqual(application.status, DomainApplication.ApplicationStatus.IN_REVIEW)
def test_change_view_with_restricted_creator(self): def test_change_view_with_restricted_creator(self):
# Create an instance of the model # Create an instance of the model
application = completed_application(status=DomainApplication.IN_REVIEW) application = completed_application(status=DomainApplication.ApplicationStatus.IN_REVIEW)
application.creator.status = User.RESTRICTED application.creator.status = User.RESTRICTED
application.creator.save() application.creator.save()
@ -704,7 +704,7 @@ class TestDomainApplicationAdmin(MockEppLib):
def test_error_when_saving_approved_to_rejected_and_domain_is_active(self): def test_error_when_saving_approved_to_rejected_and_domain_is_active(self):
# Create an instance of the model # Create an instance of the model
application = completed_application(status=DomainApplication.APPROVED) application = completed_application(status=DomainApplication.ApplicationStatus.APPROVED)
domain = Domain.objects.create(name=application.requested_domain.name) domain = Domain.objects.create(name=application.requested_domain.name)
application.approved_domain = domain application.approved_domain = domain
application.save() application.save()
@ -724,7 +724,7 @@ class TestDomainApplicationAdmin(MockEppLib):
stack.enter_context(patch.object(messages, "error")) stack.enter_context(patch.object(messages, "error"))
# Simulate saving the model # Simulate saving the model
application.status = DomainApplication.REJECTED application.status = DomainApplication.ApplicationStatus.REJECTED
self.admin.save_model(request, application, None, True) self.admin.save_model(request, application, None, True)
# Assert that the error message was called with the correct argument # Assert that the error message was called with the correct argument
@ -735,7 +735,7 @@ class TestDomainApplicationAdmin(MockEppLib):
def test_side_effects_when_saving_approved_to_rejected(self): def test_side_effects_when_saving_approved_to_rejected(self):
# Create an instance of the model # Create an instance of the model
application = completed_application(status=DomainApplication.APPROVED) application = completed_application(status=DomainApplication.ApplicationStatus.APPROVED)
domain = Domain.objects.create(name=application.requested_domain.name) domain = Domain.objects.create(name=application.requested_domain.name)
domain_information = DomainInformation.objects.create(creator=self.superuser, domain=domain) domain_information = DomainInformation.objects.create(creator=self.superuser, domain=domain)
application.approved_domain = domain application.approved_domain = domain
@ -756,7 +756,7 @@ class TestDomainApplicationAdmin(MockEppLib):
stack.enter_context(patch.object(messages, "error")) stack.enter_context(patch.object(messages, "error"))
# Simulate saving the model # Simulate saving the model
application.status = DomainApplication.REJECTED application.status = DomainApplication.ApplicationStatus.REJECTED
self.admin.save_model(request, application, None, True) self.admin.save_model(request, application, None, True)
# Assert that the error message was never called # Assert that the error message was never called
@ -774,7 +774,7 @@ class TestDomainApplicationAdmin(MockEppLib):
def test_error_when_saving_approved_to_ineligible_and_domain_is_active(self): def test_error_when_saving_approved_to_ineligible_and_domain_is_active(self):
# Create an instance of the model # Create an instance of the model
application = completed_application(status=DomainApplication.APPROVED) application = completed_application(status=DomainApplication.ApplicationStatus.APPROVED)
domain = Domain.objects.create(name=application.requested_domain.name) domain = Domain.objects.create(name=application.requested_domain.name)
application.approved_domain = domain application.approved_domain = domain
application.save() application.save()
@ -794,7 +794,7 @@ class TestDomainApplicationAdmin(MockEppLib):
stack.enter_context(patch.object(messages, "error")) stack.enter_context(patch.object(messages, "error"))
# Simulate saving the model # Simulate saving the model
application.status = DomainApplication.INELIGIBLE application.status = DomainApplication.ApplicationStatus.INELIGIBLE
self.admin.save_model(request, application, None, True) self.admin.save_model(request, application, None, True)
# Assert that the error message was called with the correct argument # Assert that the error message was called with the correct argument
@ -805,7 +805,7 @@ class TestDomainApplicationAdmin(MockEppLib):
def test_side_effects_when_saving_approved_to_ineligible(self): def test_side_effects_when_saving_approved_to_ineligible(self):
# Create an instance of the model # Create an instance of the model
application = completed_application(status=DomainApplication.APPROVED) application = completed_application(status=DomainApplication.ApplicationStatus.APPROVED)
domain = Domain.objects.create(name=application.requested_domain.name) domain = Domain.objects.create(name=application.requested_domain.name)
domain_information = DomainInformation.objects.create(creator=self.superuser, domain=domain) domain_information = DomainInformation.objects.create(creator=self.superuser, domain=domain)
application.approved_domain = domain application.approved_domain = domain
@ -826,7 +826,7 @@ class TestDomainApplicationAdmin(MockEppLib):
stack.enter_context(patch.object(messages, "error")) stack.enter_context(patch.object(messages, "error"))
# Simulate saving the model # Simulate saving the model
application.status = DomainApplication.INELIGIBLE application.status = DomainApplication.ApplicationStatus.INELIGIBLE
self.admin.save_model(request, application, None, True) self.admin.save_model(request, application, None, True)
# Assert that the error message was never called # Assert that the error message was never called
@ -877,12 +877,14 @@ class DomainInvitationAdminTest(TestCase):
) )
# Assert that the filters are added # Assert that the filters are added
self.assertContains(response, "invited", count=4) self.assertContains(response, "invited", count=2)
self.assertContains(response, "retrieved", count=4) self.assertContains(response, "Invited", count=2)
self.assertContains(response, "retrieved", count=2)
self.assertContains(response, "Retrieved", count=2)
# Check for the HTML context specificially # Check for the HTML context specificially
invited_html = '<a href="?status__exact=invited">invited</a>' invited_html = '<a href="?status__exact=invited">Invited</a>'
retrieved_html = '<a href="?status__exact=retrieved">retrieved</a>' retrieved_html = '<a href="?status__exact=retrieved">Retrieved</a>'
self.assertContains(response, invited_html, count=1) self.assertContains(response, invited_html, count=1)
self.assertContains(response, retrieved_html, count=1) self.assertContains(response, retrieved_html, count=1)

View file

@ -35,7 +35,7 @@ class TestDomainApplication(TestCase):
"""Can create with just a creator.""" """Can create with just a creator."""
user, _ = User.objects.get_or_create() user, _ = User.objects.get_or_create()
application = DomainApplication.objects.create(creator=user) application = DomainApplication.objects.create(creator=user)
self.assertEqual(application.status, DomainApplication.STARTED) self.assertEqual(application.status, DomainApplication.ApplicationStatus.STARTED)
def test_full_create(self): def test_full_create(self):
"""Can create with all fields.""" """Can create with all fields."""
@ -108,7 +108,7 @@ class TestDomainApplication(TestCase):
# no submitter email so this emits a log warning # no submitter email so this emits a log warning
with less_console_noise(): with less_console_noise():
application.submit() application.submit()
self.assertEqual(application.status, application.SUBMITTED) self.assertEqual(application.status, application.ApplicationStatus.SUBMITTED)
def test_submit_sends_email(self): def test_submit_sends_email(self):
"""Create an application and submit it and see if email was sent.""" """Create an application and submit it and see if email was sent."""
@ -139,7 +139,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status submitted and call submit """Create an application with status submitted and call submit
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.SUBMITTED) application = completed_application(status=DomainApplication.ApplicationStatus.SUBMITTED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.submit() application.submit()
@ -148,7 +148,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status in review and call submit """Create an application with status in review and call submit
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.IN_REVIEW) application = completed_application(status=DomainApplication.ApplicationStatus.IN_REVIEW)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.submit() application.submit()
@ -157,7 +157,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status approved and call submit """Create an application with status approved and call submit
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.APPROVED) application = completed_application(status=DomainApplication.ApplicationStatus.APPROVED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.submit() application.submit()
@ -166,7 +166,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status rejected and call submit """Create an application with status rejected and call submit
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.REJECTED) application = completed_application(status=DomainApplication.ApplicationStatus.REJECTED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.submit() application.submit()
@ -175,7 +175,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status ineligible and call submit """Create an application with status ineligible and call submit
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.INELIGIBLE) application = completed_application(status=DomainApplication.ApplicationStatus.INELIGIBLE)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.submit() application.submit()
@ -184,7 +184,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status started and call in_review """Create an application with status started and call in_review
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.STARTED) application = completed_application(status=DomainApplication.ApplicationStatus.STARTED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.in_review() application.in_review()
@ -193,7 +193,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status in review and call in_review """Create an application with status in review and call in_review
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.IN_REVIEW) application = completed_application(status=DomainApplication.ApplicationStatus.IN_REVIEW)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.in_review() application.in_review()
@ -202,7 +202,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status approved and call in_review """Create an application with status approved and call in_review
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.APPROVED) application = completed_application(status=DomainApplication.ApplicationStatus.APPROVED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.in_review() application.in_review()
@ -211,7 +211,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status action needed and call in_review """Create an application with status action needed and call in_review
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.ACTION_NEEDED) application = completed_application(status=DomainApplication.ApplicationStatus.ACTION_NEEDED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.in_review() application.in_review()
@ -220,7 +220,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status rejected and call in_review """Create an application with status rejected and call in_review
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.REJECTED) application = completed_application(status=DomainApplication.ApplicationStatus.REJECTED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.in_review() application.in_review()
@ -229,7 +229,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status withdrawn and call in_review """Create an application with status withdrawn and call in_review
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.WITHDRAWN) application = completed_application(status=DomainApplication.ApplicationStatus.WITHDRAWN)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.in_review() application.in_review()
@ -238,7 +238,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status ineligible and call in_review """Create an application with status ineligible and call in_review
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.INELIGIBLE) application = completed_application(status=DomainApplication.ApplicationStatus.INELIGIBLE)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.in_review() application.in_review()
@ -247,7 +247,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status started and call action_needed """Create an application with status started and call action_needed
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.STARTED) application = completed_application(status=DomainApplication.ApplicationStatus.STARTED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.action_needed() application.action_needed()
@ -256,7 +256,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status submitted and call action_needed """Create an application with status submitted and call action_needed
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.SUBMITTED) application = completed_application(status=DomainApplication.ApplicationStatus.SUBMITTED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.action_needed() application.action_needed()
@ -265,7 +265,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status action needed and call action_needed """Create an application with status action needed and call action_needed
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.ACTION_NEEDED) application = completed_application(status=DomainApplication.ApplicationStatus.ACTION_NEEDED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.action_needed() application.action_needed()
@ -274,7 +274,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status approved and call action_needed """Create an application with status approved and call action_needed
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.APPROVED) application = completed_application(status=DomainApplication.ApplicationStatus.APPROVED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.action_needed() application.action_needed()
@ -283,7 +283,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status withdrawn and call action_needed """Create an application with status withdrawn and call action_needed
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.WITHDRAWN) application = completed_application(status=DomainApplication.ApplicationStatus.WITHDRAWN)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.action_needed() application.action_needed()
@ -292,7 +292,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status ineligible and call action_needed """Create an application with status ineligible and call action_needed
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.INELIGIBLE) application = completed_application(status=DomainApplication.ApplicationStatus.INELIGIBLE)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.action_needed() application.action_needed()
@ -301,7 +301,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status started and call approve """Create an application with status started and call approve
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.STARTED) application = completed_application(status=DomainApplication.ApplicationStatus.STARTED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.approve() application.approve()
@ -310,7 +310,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status approved and call approve """Create an application with status approved and call approve
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.APPROVED) application = completed_application(status=DomainApplication.ApplicationStatus.APPROVED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.approve() application.approve()
@ -319,7 +319,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status action needed and call approve """Create an application with status action needed and call approve
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.ACTION_NEEDED) application = completed_application(status=DomainApplication.ApplicationStatus.ACTION_NEEDED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.approve() application.approve()
@ -328,7 +328,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status withdrawn and call approve """Create an application with status withdrawn and call approve
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.WITHDRAWN) application = completed_application(status=DomainApplication.ApplicationStatus.WITHDRAWN)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.approve() application.approve()
@ -337,7 +337,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status started and call withdraw """Create an application with status started and call withdraw
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.STARTED) application = completed_application(status=DomainApplication.ApplicationStatus.STARTED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.withdraw() application.withdraw()
@ -346,7 +346,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status approved and call withdraw """Create an application with status approved and call withdraw
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.APPROVED) application = completed_application(status=DomainApplication.ApplicationStatus.APPROVED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.withdraw() application.withdraw()
@ -355,7 +355,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status action needed and call withdraw """Create an application with status action needed and call withdraw
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.ACTION_NEEDED) application = completed_application(status=DomainApplication.ApplicationStatus.ACTION_NEEDED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.withdraw() application.withdraw()
@ -364,7 +364,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status rejected and call withdraw """Create an application with status rejected and call withdraw
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.REJECTED) application = completed_application(status=DomainApplication.ApplicationStatus.REJECTED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.withdraw() application.withdraw()
@ -373,7 +373,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status withdrawn and call withdraw """Create an application with status withdrawn and call withdraw
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.WITHDRAWN) application = completed_application(status=DomainApplication.ApplicationStatus.WITHDRAWN)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.withdraw() application.withdraw()
@ -382,7 +382,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status ineligible and call withdraw """Create an application with status ineligible and call withdraw
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.INELIGIBLE) application = completed_application(status=DomainApplication.ApplicationStatus.INELIGIBLE)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.withdraw() application.withdraw()
@ -391,7 +391,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status started and call reject """Create an application with status started and call reject
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.STARTED) application = completed_application(status=DomainApplication.ApplicationStatus.STARTED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.reject() application.reject()
@ -400,7 +400,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status submitted and call reject """Create an application with status submitted and call reject
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.SUBMITTED) application = completed_application(status=DomainApplication.ApplicationStatus.SUBMITTED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.reject() application.reject()
@ -409,7 +409,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status action needed and call reject """Create an application with status action needed and call reject
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.ACTION_NEEDED) application = completed_application(status=DomainApplication.ApplicationStatus.ACTION_NEEDED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.reject() application.reject()
@ -418,7 +418,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status withdrawn and call reject """Create an application with status withdrawn and call reject
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.WITHDRAWN) application = completed_application(status=DomainApplication.ApplicationStatus.WITHDRAWN)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.reject() application.reject()
@ -427,7 +427,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status rejected and call reject """Create an application with status rejected and call reject
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.REJECTED) application = completed_application(status=DomainApplication.ApplicationStatus.REJECTED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.reject() application.reject()
@ -436,7 +436,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status ineligible and call reject """Create an application with status ineligible and call reject
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.INELIGIBLE) application = completed_application(status=DomainApplication.ApplicationStatus.INELIGIBLE)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.reject() application.reject()
@ -445,7 +445,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status approved, create a matching domain that """Create an application with status approved, create a matching domain that
is active, and call reject against transition rules""" is active, and call reject against transition rules"""
application = completed_application(status=DomainApplication.APPROVED) application = completed_application(status=DomainApplication.ApplicationStatus.APPROVED)
domain = Domain.objects.create(name=application.requested_domain.name) domain = Domain.objects.create(name=application.requested_domain.name)
application.approved_domain = domain application.approved_domain = domain
application.save() application.save()
@ -464,7 +464,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status started and call reject """Create an application with status started and call reject
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.STARTED) application = completed_application(status=DomainApplication.ApplicationStatus.STARTED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.reject_with_prejudice() application.reject_with_prejudice()
@ -473,7 +473,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status submitted and call reject """Create an application with status submitted and call reject
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.SUBMITTED) application = completed_application(status=DomainApplication.ApplicationStatus.SUBMITTED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.reject_with_prejudice() application.reject_with_prejudice()
@ -482,7 +482,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status action needed and call reject """Create an application with status action needed and call reject
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.ACTION_NEEDED) application = completed_application(status=DomainApplication.ApplicationStatus.ACTION_NEEDED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.reject_with_prejudice() application.reject_with_prejudice()
@ -491,7 +491,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status withdrawn and call reject """Create an application with status withdrawn and call reject
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.WITHDRAWN) application = completed_application(status=DomainApplication.ApplicationStatus.WITHDRAWN)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.reject_with_prejudice() application.reject_with_prejudice()
@ -500,7 +500,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status rejected and call reject """Create an application with status rejected and call reject
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.REJECTED) application = completed_application(status=DomainApplication.ApplicationStatus.REJECTED)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.reject_with_prejudice() application.reject_with_prejudice()
@ -509,7 +509,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status ineligible and call reject """Create an application with status ineligible and call reject
against transition rules""" against transition rules"""
application = completed_application(status=DomainApplication.INELIGIBLE) application = completed_application(status=DomainApplication.ApplicationStatus.INELIGIBLE)
with self.assertRaises(TransitionNotAllowed): with self.assertRaises(TransitionNotAllowed):
application.reject_with_prejudice() application.reject_with_prejudice()
@ -518,7 +518,7 @@ class TestDomainApplication(TestCase):
"""Create an application with status approved, create a matching domain that """Create an application with status approved, create a matching domain that
is active, and call reject_with_prejudice against transition rules""" is active, and call reject_with_prejudice against transition rules"""
application = completed_application(status=DomainApplication.APPROVED) application = completed_application(status=DomainApplication.ApplicationStatus.APPROVED)
domain = Domain.objects.create(name=application.requested_domain.name) domain = Domain.objects.create(name=application.requested_domain.name)
application.approved_domain = domain application.approved_domain = domain
application.save() application.save()
@ -543,7 +543,7 @@ class TestPermissions(TestCase):
user, _ = User.objects.get_or_create() user, _ = User.objects.get_or_create()
application = DomainApplication.objects.create(creator=user, requested_domain=draft_domain) application = DomainApplication.objects.create(creator=user, requested_domain=draft_domain)
# skip using the submit method # skip using the submit method
application.status = DomainApplication.SUBMITTED application.status = DomainApplication.ApplicationStatus.SUBMITTED
application.approve() application.approve()
# should be a role for this user # should be a role for this user
@ -560,7 +560,7 @@ class TestDomainInfo(TestCase):
user, _ = User.objects.get_or_create() user, _ = User.objects.get_or_create()
application = DomainApplication.objects.create(creator=user, requested_domain=draft_domain) application = DomainApplication.objects.create(creator=user, requested_domain=draft_domain)
# skip using the submit method # skip using the submit method
application.status = DomainApplication.SUBMITTED application.status = DomainApplication.ApplicationStatus.SUBMITTED
application.approve() application.approve()
# should be an information present for this domain # should be an information present for this domain
@ -597,7 +597,7 @@ class TestInvitations(TestCase):
# this is not an error but does produce a console warning # this is not an error but does produce a console warning
with less_console_noise(): with less_console_noise():
self.invitation.retrieve() self.invitation.retrieve()
self.assertEqual(self.invitation.status, DomainInvitation.RETRIEVED) self.assertEqual(self.invitation.status, DomainInvitation.DomainInvitationStatus.RETRIEVED)
def test_retrieve_on_each_login(self): def test_retrieve_on_each_login(self):
"""A user's authenticate on_each_login callback retrieves their invitations.""" """A user's authenticate on_each_login callback retrieves their invitations."""

View file

@ -261,7 +261,7 @@ class TestDomainCreation(MockEppLib):
user, _ = User.objects.get_or_create() user, _ = User.objects.get_or_create()
application = DomainApplication.objects.create(creator=user, requested_domain=draft_domain) application = DomainApplication.objects.create(creator=user, requested_domain=draft_domain)
# skip using the submit method # skip using the submit method
application.status = DomainApplication.SUBMITTED application.status = DomainApplication.ApplicationStatus.SUBMITTED
# transition to approve state # transition to approve state
application.approve() application.approve()
# should have information present for this domain # should have information present for this domain
@ -1506,7 +1506,7 @@ class TestRegistrantNameservers(MockEppLib):
] ]
def test_setting_not_allowed(self): def test_setting_not_allowed(self):
"""Scenario: A domain state is not Ready or DNS Needed """Scenario: A domain state is not Ready or DNS needed
then setting nameservers is not allowed""" then setting nameservers is not allowed"""
domain, _ = Domain.objects.get_or_create(name="onholdDomain.gov", state=Domain.State.ON_HOLD) domain, _ = Domain.objects.get_or_create(name="onholdDomain.gov", state=Domain.State.ON_HOLD)
with self.assertRaises(ActionNotAllowed): with self.assertRaises(ActionNotAllowed):

View file

@ -258,7 +258,6 @@ class ExportDataTest(TestCase):
) )
def tearDown(self): def tearDown(self):
# Dummy push - will remove
Domain.objects.all().delete() Domain.objects.all().delete()
DomainInformation.objects.all().delete() DomainInformation.objects.all().delete()
User.objects.all().delete() User.objects.all().delete()

View file

@ -100,7 +100,7 @@ class LoggedInTests(TestWithUser):
response = self.client.get("/") response = self.client.get("/")
# count = 2 because it is also in screenreader content # count = 2 because it is also in screenreader content
self.assertContains(response, "igorville.gov", count=2) self.assertContains(response, "igorville.gov", count=2)
self.assertContains(response, "DNS Needed") self.assertContains(response, "DNS needed")
# clean up # clean up
role.delete() role.delete()
@ -1079,7 +1079,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
Make sure the long name is displaying in the application summary Make sure the long name is displaying in the application summary
page (manage your application) page (manage your application)
""" """
completed_application(status=DomainApplication.SUBMITTED, user=self.user) completed_application(status=DomainApplication.ApplicationStatus.SUBMITTED, user=self.user)
home_page = self.app.get("/") home_page = self.app.get("/")
self.assertContains(home_page, "city.gov") self.assertContains(home_page, "city.gov")
# click the "Edit" link # click the "Edit" link
@ -2117,7 +2117,7 @@ class TestApplicationStatus(TestWithUser, WebTest):
def test_application_status(self): def test_application_status(self):
"""Checking application status page""" """Checking application status page"""
application = completed_application(status=DomainApplication.SUBMITTED, user=self.user) application = completed_application(status=DomainApplication.ApplicationStatus.SUBMITTED, user=self.user)
application.save() application.save()
home_page = self.app.get("/") home_page = self.app.get("/")
@ -2137,7 +2137,7 @@ class TestApplicationStatus(TestWithUser, WebTest):
self.user.status = "ineligible" self.user.status = "ineligible"
self.user.save() self.user.save()
application = completed_application(status=DomainApplication.SUBMITTED, user=self.user) application = completed_application(status=DomainApplication.ApplicationStatus.SUBMITTED, user=self.user)
application.save() application.save()
home_page = self.app.get("/") home_page = self.app.get("/")
@ -2152,7 +2152,7 @@ class TestApplicationStatus(TestWithUser, WebTest):
def test_application_withdraw(self): def test_application_withdraw(self):
"""Checking application status page""" """Checking application status page"""
application = completed_application(status=DomainApplication.SUBMITTED, user=self.user) application = completed_application(status=DomainApplication.ApplicationStatus.SUBMITTED, user=self.user)
application.save() application.save()
home_page = self.app.get("/") home_page = self.app.get("/")
@ -2182,7 +2182,7 @@ class TestApplicationStatus(TestWithUser, WebTest):
def test_application_status_no_permissions(self): def test_application_status_no_permissions(self):
"""Can't access applications without being the creator.""" """Can't access applications without being the creator."""
application = completed_application(status=DomainApplication.SUBMITTED, user=self.user) application = completed_application(status=DomainApplication.ApplicationStatus.SUBMITTED, user=self.user)
other_user = User() other_user = User()
other_user.save() other_user.save()
application.creator = other_user application.creator = other_user
@ -2202,7 +2202,7 @@ class TestApplicationStatus(TestWithUser, WebTest):
def test_approved_application_not_in_active_requests(self): def test_approved_application_not_in_active_requests(self):
"""An approved application is not shown in the Active """An approved application is not shown in the Active
Requests table on home.html.""" Requests table on home.html."""
application = completed_application(status=DomainApplication.APPROVED, user=self.user) application = completed_application(status=DomainApplication.ApplicationStatus.APPROVED, user=self.user)
application.save() application.save()
home_page = self.app.get("/") home_page = self.app.get("/")

View file

@ -293,9 +293,9 @@ class ApplicationWizard(ApplicationWizardPermissionView, TemplateView):
return self.pending_applications() return self.pending_applications()
def approved_applications_exist(self): def approved_applications_exist(self):
"""Checks if user is creator of applications with APPROVED status""" """Checks if user is creator of applications with ApplicationStatus.APPROVED status"""
approved_application_count = DomainApplication.objects.filter( approved_application_count = DomainApplication.objects.filter(
creator=self.request.user, status=DomainApplication.APPROVED creator=self.request.user, status=DomainApplication.ApplicationStatus.APPROVED
).count() ).count()
return approved_application_count > 0 return approved_application_count > 0
@ -308,11 +308,15 @@ class ApplicationWizard(ApplicationWizardPermissionView, TemplateView):
def pending_applications(self): def pending_applications(self):
"""Returns a List of user's applications with one of the following states: """Returns a List of user's applications with one of the following states:
SUBMITTED, IN_REVIEW, ACTION_NEEDED""" ApplicationStatus.SUBMITTED, ApplicationStatus.IN_REVIEW, ApplicationStatus.ACTION_NEEDED"""
# if the current application has ACTION_NEEDED status, this check should not be performed # if the current application has ApplicationStatus.ACTION_NEEDED status, this check should not be performed
if self.application.status == DomainApplication.ACTION_NEEDED: if self.application.status == DomainApplication.ApplicationStatus.ACTION_NEEDED:
return [] return []
check_statuses = [DomainApplication.SUBMITTED, DomainApplication.IN_REVIEW, DomainApplication.ACTION_NEEDED] check_statuses = [
DomainApplication.ApplicationStatus.SUBMITTED,
DomainApplication.ApplicationStatus.IN_REVIEW,
DomainApplication.ApplicationStatus.ACTION_NEEDED,
]
return DomainApplication.objects.filter(creator=self.request.user, status__in=check_statuses) return DomainApplication.objects.filter(creator=self.request.user, status__in=check_statuses)
def get_context_data(self): def get_context_data(self):

View file

@ -101,10 +101,10 @@ class DomainPermission(PermissionsLoginMixin):
# Analysts may manage domains, when they are in these statuses: # Analysts may manage domains, when they are in these statuses:
valid_domain_statuses = [ valid_domain_statuses = [
DomainApplication.APPROVED, DomainApplication.ApplicationStatus.APPROVED,
DomainApplication.IN_REVIEW, DomainApplication.ApplicationStatus.IN_REVIEW,
DomainApplication.REJECTED, DomainApplication.ApplicationStatus.REJECTED,
DomainApplication.ACTION_NEEDED, DomainApplication.ApplicationStatus.ACTION_NEEDED,
# Edge case - some domains do not have # Edge case - some domains do not have
# a status or DomainInformation... aka a status of 'None'. # a status or DomainInformation... aka a status of 'None'.
# It is necessary to access those to correct errors. # It is necessary to access those to correct errors.