diff --git a/src/registrar/admin.py b/src/registrar/admin.py index ecf4aa522..c0d21f60e 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -985,8 +985,8 @@ class DomainAdmin(ListHeaderAdmin): "state", "expiration_date", "created_at", - "first_ready_at", - "deleted_at", + "first_ready", + "deleted", ] # this ordering effects the ordering of results @@ -1005,7 +1005,7 @@ class DomainAdmin(ListHeaderAdmin): search_help_text = "Search by domain name." change_form_template = "django/admin/domain_change_form.html" change_list_template = "django/admin/domain_change_list.html" - readonly_fields = ["state", "expiration_date", "first_ready_at", "deleted_at"] + readonly_fields = ["state", "expiration_date", "first_ready", "deleted"] # Table ordering ordering = ["name"] diff --git a/src/registrar/migrations/0059_domain_deleted_at_domain_first_ready_at.py b/src/registrar/migrations/0059_domain_deleted_domain_first_ready.py similarity index 90% rename from src/registrar/migrations/0059_domain_deleted_at_domain_first_ready_at.py rename to src/registrar/migrations/0059_domain_deleted_domain_first_ready.py index ebbd291a8..f061c3669 100644 --- a/src/registrar/migrations/0059_domain_deleted_at_domain_first_ready_at.py +++ b/src/registrar/migrations/0059_domain_deleted_domain_first_ready.py @@ -11,12 +11,12 @@ class Migration(migrations.Migration): operations = [ migrations.AddField( model_name="domain", - name="deleted_at", + name="deleted", field=models.DateField(editable=False, help_text="Deleted at date", null=True), ), migrations.AddField( model_name="domain", - name="first_ready_at", + name="first_ready", field=models.DateField( editable=False, help_text="The last time this domain moved into the READY state", null=True ), diff --git a/src/registrar/models/domain.py b/src/registrar/models/domain.py index 30ea87266..a32f8d386 100644 --- a/src/registrar/models/domain.py +++ b/src/registrar/models/domain.py @@ -969,13 +969,13 @@ class Domain(TimeStampedModel, DomainHelper): help_text=("Duplication of registry's expiration date saved for ease of reporting"), ) - deleted_at = DateField( + deleted = DateField( null=True, editable=False, help_text="Deleted at date", ) - first_ready_at = DateField( + first_ready = DateField( null=True, editable=False, help_text="The last time this domain moved into the READY state", @@ -1310,7 +1310,7 @@ class Domain(TimeStampedModel, DomainHelper): try: logger.info("deletedInEpp()-> inside _delete_domain") self._delete_domain() - self.deleted_at = timezone.now() + self.deleted = timezone.now() except RegistryError as err: logger.error(f"Could not delete domain. Registry returned error: {err}") raise err @@ -1354,11 +1354,11 @@ class Domain(TimeStampedModel, DomainHelper): """ logger.info("Changing to ready state") logger.info("able to transition to ready state") - # if self.first_ready_at is not None, this means that this + # if self.first_ready is not None, this means that this # domain was READY, then not READY, then is READY again. - # We do not want to overwrite first_ready_at. - if self.first_ready_at is None: - self.first_ready_at = timezone.now() + # We do not want to overwrite first_ready. + if self.first_ready is None: + self.first_ready = timezone.now() @transition( field="state", diff --git a/src/registrar/tests/test_models_domain.py b/src/registrar/tests/test_models_domain.py index 01df1a6bd..3eb372d6c 100644 --- a/src/registrar/tests/test_models_domain.py +++ b/src/registrar/tests/test_models_domain.py @@ -385,22 +385,22 @@ class TestDomainStatuses(MockEppLib): """Domain 'revert_client_hold' method causes the registry to change statuses""" raise - def test_first_ready_at(self): + def test_first_ready(self): """ - first_ready_at is set when a domain is first transitioned to READY. It does not get overwritten + first_ready is set when a domain is first transitioned to READY. It does not get overwritten in case the domain gets out of and back into READY. """ domain, _ = Domain.objects.get_or_create(name="pig-knuckles.gov", state=Domain.State.DNS_NEEDED) - self.assertEqual(domain.first_ready_at, None) + self.assertEqual(domain.first_ready, None) domain.ready() # check that status is READY self.assertTrue(domain.is_active()) - self.assertNotEqual(domain.first_ready_at, None) + self.assertNotEqual(domain.first_ready, None) - # Capture the value of first_ready_at - first_ready_at = domain.first_ready_at + # Capture the value of first_ready + first_ready = domain.first_ready # change domain status domain.dns_needed() @@ -410,8 +410,8 @@ class TestDomainStatuses(MockEppLib): domain.ready() self.assertTrue(domain.is_active()) - # assert that the value of first_ready_at has not changed - self.assertEqual(domain.first_ready_at, first_ready_at) + # assert that the value of first_ready has not changed + self.assertEqual(domain.first_ready, first_ready) def tearDown(self) -> None: PublicContact.objects.all().delete() @@ -1139,7 +1139,7 @@ class TestRegistrantNameservers(MockEppLib): Then `commands.CreateHost` and `commands.UpdateDomain` is sent to the registry And `domain.is_active` returns False - And domain.first_ready_at is null + And domain.first_ready is null """ # set 1 nameserver @@ -1166,7 +1166,7 @@ class TestRegistrantNameservers(MockEppLib): # as you have less than 2 nameservers self.assertFalse(self.domain.is_active()) - self.assertEqual(self.domain.first_ready_at, None) + self.assertEqual(self.domain.first_ready, None) def test_user_adds_two_nameservers(self): """ @@ -1176,7 +1176,7 @@ class TestRegistrantNameservers(MockEppLib): Then `commands.CreateHost` and `commands.UpdateDomain` is sent to the registry And `domain.is_active` returns True - And domain.first_ready_at is not null + And domain.first_ready is not null """ # set 2 nameservers @@ -1207,7 +1207,7 @@ class TestRegistrantNameservers(MockEppLib): self.assertEqual(4, self.mockedSendFunction.call_count) # check that status is READY self.assertTrue(self.domain.is_active()) - self.assertNotEqual(self.domain.first_ready_at, None) + self.assertNotEqual(self.domain.first_ready, None) def test_user_adds_too_many_nameservers(self): """ @@ -2331,7 +2331,7 @@ class TestAnalystDelete(MockEppLib): Then `commands.DeleteDomain` is sent to the registry And `state` is set to `DELETED` - The deleted_at date is set. + The deleted date is set. """ # Put the domain in client hold self.domain.place_client_hold() @@ -2353,8 +2353,8 @@ class TestAnalystDelete(MockEppLib): # Domain should have the right state self.assertEqual(self.domain.state, Domain.State.DELETED) - # Domain should have a deleted_at - self.assertNotEqual(self.domain.deleted_at, None) + # Domain should have a deleted + self.assertNotEqual(self.domain.deleted, None) # Cache should be invalidated self.assertEqual(self.domain._cache, {}) @@ -2399,7 +2399,7 @@ class TestAnalystDelete(MockEppLib): Then an FSM error is returned And `state` is not set to `DELETED` - The deleted_at date is still null. + The deleted date is still null. """ self.assertEqual(self.domain.state, Domain.State.READY) with self.assertRaises(TransitionNotAllowed) as err: @@ -2411,5 +2411,5 @@ class TestAnalystDelete(MockEppLib): # Domain should have the right state self.assertEqual(self.domain.state, Domain.State.READY) - # deleted_at should be null - self.assertEqual(self.domain.deleted_at, None) + # deleted should be null + self.assertEqual(self.domain.deleted, None) diff --git a/src/registrar/tests/test_reports.py b/src/registrar/tests/test_reports.py index d1bba9e46..85e24ce33 100644 --- a/src/registrar/tests/test_reports.py +++ b/src/registrar/tests/test_reports.py @@ -232,23 +232,23 @@ class ExportDataTest(TestCase): ) self.domain_1, _ = Domain.objects.get_or_create( - name="cdomain1.gov", state=Domain.State.READY, first_ready_at=timezone.now() + name="cdomain1.gov", state=Domain.State.READY, first_ready=timezone.now() ) self.domain_2, _ = Domain.objects.get_or_create(name="adomain2.gov", state=Domain.State.DNS_NEEDED) self.domain_3, _ = Domain.objects.get_or_create(name="ddomain3.gov", state=Domain.State.ON_HOLD) self.domain_4, _ = Domain.objects.get_or_create(name="bdomain4.gov", state=Domain.State.UNKNOWN) self.domain_4, _ = Domain.objects.get_or_create(name="bdomain4.gov", state=Domain.State.UNKNOWN) self.domain_5, _ = Domain.objects.get_or_create( - name="bdomain5.gov", state=Domain.State.DELETED, deleted_at=timezone.make_aware(datetime(2023, 11, 1)) + name="bdomain5.gov", state=Domain.State.DELETED, deleted=timezone.make_aware(datetime(2023, 11, 1)) ) self.domain_6, _ = Domain.objects.get_or_create( - name="bdomain6.gov", state=Domain.State.DELETED, deleted_at=timezone.make_aware(datetime(1980, 10, 16)) + name="bdomain6.gov", state=Domain.State.DELETED, deleted=timezone.make_aware(datetime(1980, 10, 16)) ) self.domain_7, _ = Domain.objects.get_or_create( - name="xdomain7.gov", state=Domain.State.DELETED, deleted_at=timezone.now() + name="xdomain7.gov", state=Domain.State.DELETED, deleted=timezone.now() ) self.domain_8, _ = Domain.objects.get_or_create( - name="sdomain8.gov", state=Domain.State.DELETED, deleted_at=timezone.now() + name="sdomain8.gov", state=Domain.State.DELETED, deleted=timezone.now() ) # We use timezone.make_aware to sync to server time a datetime object with the current date (using date.today()) # and a specific time (using datetime.min.time()). @@ -256,13 +256,13 @@ class ExportDataTest(TestCase): self.domain_9, _ = Domain.objects.get_or_create( name="zdomain9.gov", state=Domain.State.DELETED, - deleted_at=timezone.make_aware(datetime.combine(date.today() - timedelta(days=1), datetime.min.time())), + deleted=timezone.make_aware(datetime.combine(date.today() - timedelta(days=1), datetime.min.time())), ) # ready tomorrow self.domain_10, _ = Domain.objects.get_or_create( name="adomain10.gov", state=Domain.State.READY, - first_ready_at=timezone.make_aware(datetime.combine(date.today() + timedelta(days=1), datetime.min.time())), + first_ready=timezone.make_aware(datetime.combine(date.today() + timedelta(days=1), datetime.min.time())), ) self.domain_information_1, _ = DomainInformation.objects.get_or_create( @@ -451,10 +451,10 @@ class ExportDataTest(TestCase): def test_write_body_with_date_filter_pulls_domains_in_range(self): """Test that domains that are - 1. READY and their first_ready_at dates are in range - 2. DELETED and their deleted_at dates are in range + 1. READY and their first_ready dates are in range + 2. DELETED and their deleted dates are in range are pulled when the growth report conditions are applied to export_domains_to_writed. - Test that ready domains are sorted by first_ready_at/deleted_at dates first, names second. + Test that ready domains are sorted by first_ready/deleted dates first, names second. We considered testing export_data_growth_to_csv which calls write_body and would have been easy to set up, but expected_content would contain created_at dates @@ -486,22 +486,22 @@ class ExportDataTest(TestCase): "domain__name", ] sort_fields_for_deleted_domains = [ - "domain__deleted_at", + "domain__deleted", "domain__name", ] filter_condition = { "domain__state__in": [ Domain.State.READY, ], - "domain__first_ready_at__lte": end_date, - "domain__first_ready_at__gte": start_date, + "domain__first_ready__lte": end_date, + "domain__first_ready__gte": start_date, } filter_conditions_for_deleted_domains = { "domain__state__in": [ Domain.State.DELETED, ], - "domain__deleted_at__lte": end_date, - "domain__deleted_at__gte": start_date, + "domain__deleted__lte": end_date, + "domain__deleted__gte": start_date, } # Call the export functions @@ -526,7 +526,7 @@ class ExportDataTest(TestCase): csv_content = csv_file.read() # We expect READY domains first, created between today-2 and today+2, sorted by created_at then name - # and DELETED domains deleted between today-2 and today+2, sorted by deleted_at then name + # and DELETED domains deleted between today-2 and today+2, sorted by deleted then name expected_content = ( "Domain name,Domain type,Agency,Organization name,City," "State,Status,Expiration date\n" diff --git a/src/registrar/utility/csv_export.py b/src/registrar/utility/csv_export.py index 0ed943613..4c46ee3a3 100644 --- a/src/registrar/utility/csv_export.py +++ b/src/registrar/utility/csv_export.py @@ -48,8 +48,8 @@ def write_row(writer, columns, domain_info): "Status": domain_info.domain.get_state_display(), "Expiration date": domain_info.domain.expiration_date, "Created at": domain_info.domain.created_at, - "First ready at": domain_info.domain.first_ready_at, - "Deleted at": domain_info.domain.deleted_at, + "First ready": domain_info.domain.first_ready, + "Deleted": domain_info.domain.deleted, } writer.writerow([FIELDS.get(column, "") for column in columns]) @@ -214,30 +214,30 @@ def export_data_growth_to_csv(csv_file, start_date, end_date): "City", "State", "Status", - "Created at", - "First ready at", - "Deleted at", "Expiration date", + "Created at", + "First ready", + "Deleted", ] sort_fields = [ - "domain__first_ready_at", + "domain__first_ready", "domain__name", ] filter_condition = { "domain__state__in": [Domain.State.READY], - "domain__first_ready_at__lte": end_date_formatted, - "domain__first_ready_at__gte": start_date_formatted, + "domain__first_ready__lte": end_date_formatted, + "domain__first_ready__gte": start_date_formatted, } # We also want domains deleted between sar and end dates, sorted sort_fields_for_deleted_domains = [ - "domain__deleted_at", + "domain__deleted", "domain__name", ] filter_condition_for_deleted_domains = { "domain__state__in": [Domain.State.DELETED], - "domain__deleted_at__lte": end_date_formatted, - "domain__deleted_at__gte": start_date_formatted, + "domain__deleted__lte": end_date_formatted, + "domain__deleted__gte": start_date_formatted, } write_header(writer, columns)